Skip to content

Commit b23a1d7

Browse files
committed
Bandaid-fix Version requirement in VBEInteraction
1 parent a71aa66 commit b23a1d7

File tree

9 files changed

+131
-70
lines changed

9 files changed

+131
-70
lines changed

Rubberduck.Core/UI/UnitTesting/Commands/AddTestModuleCommand.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,16 @@ public class AddTestModuleCommand : CommandBase
2626
private readonly RubberduckParserState _state;
2727
private readonly IGeneralConfigService _configLoader;
2828
private readonly IMessageBox _messageBox;
29+
private readonly IVBEInteraction _interaction;
2930

30-
public AddTestModuleCommand(IVBE vbe, RubberduckParserState state, IGeneralConfigService configLoader, IMessageBox messageBox)
31+
public AddTestModuleCommand(IVBE vbe, RubberduckParserState state, IGeneralConfigService configLoader, IMessageBox messageBox, IVBEInteraction interaction)
3132
: base(LogManager.GetCurrentClassLogger())
3233
{
3334
_vbe = vbe;
3435
_state = state;
3536
_configLoader = configLoader;
3637
_messageBox = messageBox;
38+
_interaction = interaction;
3739
}
3840

3941
private readonly string _testModuleEmptyTemplate = new StringBuilder()
@@ -164,7 +166,8 @@ protected override void OnExecute(object parameter)
164166

165167
if (settings.BindingMode == BindingMode.EarlyBinding)
166168
{
167-
VBEInteraction.EnsureProjectReferencesUnitTesting(project);
169+
// FIXME: Push the actual adding of TestModules into UnitTesting, which sidesteps VBEInteraction being inaccessble here
170+
_interaction.EnsureProjectReferencesUnitTesting(project);
168171
}
169172

170173
try
@@ -245,6 +248,7 @@ protected override void OnExecute(object parameter)
245248
_state.OnParseRequested(this);
246249
}
247250

251+
// FIXME push this into Rubberduck.UnitTesting assembly
248252
private string GetNextTestModuleName(IVBProject project)
249253
{
250254
var names = new HashSet<string>(project.ComponentNames().Where(module => module.StartsWith(TestModuleBaseName)));

Rubberduck.Main/Root/RubberduckIoCInstaller.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ public void Install(IWindsorContainer container, IConfigurationStore store)
123123

124124
container.Register(Component.For<TestExplorerModel>()
125125
.LifestyleSingleton());
126+
container.Register(Component.For<VBEInteraction>().LifestyleSingleton());
126127

127128
RegisterRefactoringDialogs(container);
128129

Rubberduck.UnitTesting/Rubberduck.UnitTesting.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
<Compile Include="UnitTesting\ITestEngine.cs" />
6464
<Compile Include="ComClientHelpers\PermissiveObjectComparer.cs" />
6565
<Compile Include="ComClientHelpers\ReturnTypeConverter.cs" />
66+
<Compile Include="UnitTesting\IVBEInteraction.cs" />
6667
<Compile Include="UnitTesting\TestCategory.cs" />
6768
<Compile Include="UnitTesting\TestEngine.cs" />
6869
<Compile Include="UnitTesting\TestMethod.cs" />
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using Rubberduck.Parsing.Symbols;
4+
using Rubberduck.VBEditor.ComManagement.TypeLibs;
5+
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
6+
7+
namespace Rubberduck.UnitTesting
8+
{
9+
public interface IVBEInteraction
10+
{
11+
void EnsureProjectReferencesUnitTesting(IVBProject project);
12+
void RunDeclarations(ITypeLibWrapper typeLib, IEnumerable<Declaration> declarations);
13+
void RunTestMethod(ITypeLibWrapper typeLib, TestMethod test, EventHandler<AssertCompletedEventArgs> assertCompletionHandler, out long duration);
14+
}
15+
}

Rubberduck.UnitTesting/UnitTesting/TestEngine.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ internal class TestEngine : ITestEngine
2929

3030
private readonly RubberduckParserState _state;
3131
private readonly IFakesFactory _fakesFactory;
32-
private readonly IVBETypeLibsAPI _typeLibApi;
32+
private readonly IVBEInteraction _declarationRunner;
3333
private readonly ITypeLibWrapperProvider _wrapperProvider;
3434
private readonly IUiDispatcher _uiDispatcher;
3535
private readonly IVBE _vbe;
@@ -43,12 +43,12 @@ internal class TestEngine : ITestEngine
4343
private bool refreshBackoff;
4444

4545

46-
public TestEngine(RubberduckParserState state, IFakesFactory fakesFactory, IVBETypeLibsAPI typeLibApi, ITypeLibWrapperProvider wrapperProvider, IUiDispatcher uiDispatcher, IVBE vbe)
46+
public TestEngine(RubberduckParserState state, IFakesFactory fakesFactory, IVBEInteraction declarationRunner, ITypeLibWrapperProvider wrapperProvider, IUiDispatcher uiDispatcher, IVBE vbe)
4747
{
4848
Debug.WriteLine("TestEngine created.");
4949
_state = state;
5050
_fakesFactory = fakesFactory;
51-
_typeLibApi = typeLibApi;
51+
_declarationRunner = declarationRunner;
5252
_wrapperProvider = wrapperProvider;
5353
_uiDispatcher = uiDispatcher;
5454
_vbe = vbe;
@@ -147,7 +147,7 @@ private void EnsureRubberduckIsReferencedForEarlyBoundTests()
147147

148148
foreach (var project in projectsUsingAddInLibrary)
149149
{
150-
VBEInteraction.EnsureProjectReferencesUnitTesting(project);
150+
_declarationRunner.EnsureProjectReferencesUnitTesting(project);
151151
}
152152
}
153153

@@ -196,7 +196,7 @@ private void RunWhileSuspended(IEnumerable<TestMethod> tests)
196196
{
197197
try
198198
{
199-
VBEInteraction.RunDeclarations(_typeLibApi, typeLibWrapper, TestDiscovery.FindModuleInitializeMethods(moduleName, _state));
199+
_declarationRunner.RunDeclarations(typeLibWrapper, TestDiscovery.FindModuleInitializeMethods(moduleName, _state));
200200
}
201201
catch (COMException ex)
202202
{
@@ -221,7 +221,7 @@ private void RunWhileSuspended(IEnumerable<TestMethod> tests)
221221
fakes.StartTest();
222222
try
223223
{
224-
VBEInteraction.RunDeclarations(_typeLibApi, typeLibWrapper, testInitialize);
224+
_declarationRunner.RunDeclarations(typeLibWrapper, testInitialize);
225225
}
226226
catch (COMException trace)
227227
{
@@ -234,7 +234,7 @@ private void RunWhileSuspended(IEnumerable<TestMethod> tests)
234234
OnTestCompleted(test, result);
235235
try
236236
{
237-
VBEInteraction.RunDeclarations(_typeLibApi, typeLibWrapper, testCleanup);
237+
_declarationRunner.RunDeclarations(typeLibWrapper, testCleanup);
238238
}
239239
catch (COMException cleanupFail)
240240
{
@@ -249,7 +249,7 @@ private void RunWhileSuspended(IEnumerable<TestMethod> tests)
249249
}
250250
try
251251
{
252-
VBEInteraction.RunDeclarations(_typeLibApi, typeLibWrapper, TestDiscovery.FindModuleCleanupMethods(moduleName, _state));
252+
_declarationRunner.RunDeclarations(typeLibWrapper, TestDiscovery.FindModuleCleanupMethods(moduleName, _state));
253253
}
254254
catch (COMException ex)
255255
{
@@ -277,7 +277,7 @@ private TestResult RunTestMethod(ITypeLibWrapper typeLib, TestMethod test)
277277
try
278278
{
279279
var assertResults = new List<AssertCompletedEventArgs>();
280-
VBEInteraction.RunTestMethod(_typeLibApi, typeLib, test, (s, e) => assertResults.Add(e), out duration);
280+
_declarationRunner.RunTestMethod(typeLib, test, (s, e) => assertResults.Add(e), out duration);
281281
return EvaluateResults(assertResults, duration);
282282
}
283283
catch (COMException e)

Rubberduck.UnitTesting/UnitTesting/VBEInteraction.cs

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,33 @@
99
using System;
1010
using System.Collections.Generic;
1111
using System.Diagnostics;
12-
using System.Reflection;
1312

1413
namespace Rubberduck.UnitTesting
1514
{
1615
// FIXME litter some logging around here
17-
public class VBEInteraction
16+
internal class VBEInteraction : IVBEInteraction
1817
{
1918
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
2019

21-
internal static void RunDeclarations(IVBETypeLibsAPI typeLibApi, ITypeLibWrapper typeLib, IEnumerable<Declaration> declarations)
20+
private readonly Version _rubberduckVersion;
21+
private readonly IVBETypeLibsAPI _typeLibsApi;
22+
23+
public VBEInteraction(IVBETypeLibsAPI typeLibsApi, Version rubberduckVersion)
24+
{
25+
_typeLibsApi = typeLibsApi;
26+
_rubberduckVersion = rubberduckVersion;
27+
}
28+
29+
public void RunDeclarations(ITypeLibWrapper typeLib, IEnumerable<Declaration> declarations)
2230
{
2331
foreach (var declaration in declarations)
2432
{
25-
typeLibApi.ExecuteCode(typeLib, declaration.QualifiedModuleName.ComponentName,
33+
_typeLibsApi.ExecuteCode(typeLib, declaration.QualifiedModuleName.ComponentName,
2634
declaration.QualifiedName.MemberName);
2735
}
2836
}
2937

30-
internal static void RunTestMethod(IVBETypeLibsAPI tlApi, ITypeLibWrapper typeLib, TestMethod test, EventHandler<AssertCompletedEventArgs> assertCompletionHandler, out long duration)
38+
public void RunTestMethod(ITypeLibWrapper typeLib, TestMethod test, EventHandler<AssertCompletedEventArgs> assertCompletionHandler, out long duration)
3139
{
3240
AssertHandler.OnAssertCompleted += assertCompletionHandler;
3341
var stopwatch = new Stopwatch();
@@ -36,7 +44,7 @@ internal static void RunTestMethod(IVBETypeLibsAPI tlApi, ITypeLibWrapper typeLi
3644
var testDeclaration = test.Declaration;
3745

3846
stopwatch.Start();
39-
tlApi.ExecuteCode(typeLib, testDeclaration.ComponentName, testDeclaration.QualifiedName.MemberName);
47+
_typeLibsApi.ExecuteCode(typeLib, testDeclaration.ComponentName, testDeclaration.QualifiedName.MemberName);
4048
stopwatch.Stop();
4149

4250
duration = stopwatch.ElapsedMilliseconds;
@@ -54,22 +62,20 @@ internal static void RunTestMethod(IVBETypeLibsAPI tlApi, ITypeLibWrapper typeLi
5462
}
5563

5664

57-
public static void EnsureProjectReferencesUnitTesting(IVBProject project)
65+
public void EnsureProjectReferencesUnitTesting(IVBProject project)
5866
{
5967
if (project == null || project.IsWrappingNullReference) { return; }
6068
var libFolder = IntPtr.Size == 8 ? "win64" : "win32";
61-
// FIXME: This assumes the current assembly is same major/minor as the TLB!!!
62-
var libVersion = Assembly.GetExecutingAssembly().GetName().Version;
6369
const string libGuid = RubberduckGuid.RubberduckTypeLibGuid;
64-
var pathKey = Registry.ClassesRoot.OpenSubKey($@"TypeLib\{{{libGuid}}}\{libVersion.Major}.{libVersion.Minor}\0\{libFolder}");
70+
var pathKey = Registry.ClassesRoot.OpenSubKey($@"TypeLib\{{{libGuid}}}\{_rubberduckVersion.Major}.{_rubberduckVersion.Minor}\0\{libFolder}");
6571

6672
var referencePath = pathKey?.GetValue(string.Empty, string.Empty) as string;
6773
string name = null;
6874

6975
if (!string.IsNullOrWhiteSpace(referencePath))
7076
{
7177
var tlbKey =
72-
Registry.ClassesRoot.OpenSubKey($@"TypeLib\{{{libGuid}}}\{libVersion.Major}.{libVersion.Minor}");
78+
Registry.ClassesRoot.OpenSubKey($@"TypeLib\{{{libGuid}}}\{_rubberduckVersion.Major}.{_rubberduckVersion.Minor}");
7379

7480
name = tlbKey?.GetValue(string.Empty, string.Empty) as string;
7581
}
@@ -95,9 +101,9 @@ public static void EnsureProjectReferencesUnitTesting(IVBProject project)
95101
}
96102
}
97103

98-
private static IReference FindReferenceByName(IReferences refernences, string name)
104+
private static IReference FindReferenceByName(IReferences references, string name)
99105
{
100-
foreach (var reference in refernences)
106+
foreach (var reference in references)
101107
{
102108
if (reference.Name == name)
103109
{

RubberduckTests/CodeExplorer/CodeExplorerTests.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
using Rubberduck.VBEditor.ComManagement;
2222
using Rubberduck.Interaction;
2323
using Rubberduck.UI.UnitTesting.Commands;
24+
using Rubberduck.UnitTesting;
2425

2526
namespace RubberduckTests.CodeExplorer
2627
{
@@ -652,9 +653,10 @@ public void AddTestModule()
652653
var removeCommand = new RemoveCommand(saveFileDialog.Object, messageBox.Object, state.ProjectsProvider);
653654
var vbeWrapper = vbe.Object;
654655
var uiDispatcher = new Mock<IUiDispatcher>();
656+
var interaction = new Mock<IVBEInteraction>();
655657

656658
var vm = new CodeExplorerViewModel(new FolderHelper(state), state, removeCommand, _generalSettingsProvider.Object, _windowSettingsProvider.Object, uiDispatcher.Object, vbe.Object);
657-
vm.AddTestModuleCommand = new AddTestModuleCommand(vbeWrapper, state, configLoader.Object, messageBox.Object);
659+
vm.AddTestModuleCommand = new AddTestModuleCommand(vbeWrapper, state, configLoader.Object, messageBox.Object, interaction.Object);
658660

659661
var parser = MockParser.Create(vbe.Object, state, projectRepository);
660662
parser.Parse(new CancellationTokenSource());
@@ -691,10 +693,11 @@ public void AddTestModuleWithStubs()
691693
{
692694
var vbeWrapper = vbe.Object;
693695
var uiDispatcher = new Mock<IUiDispatcher>();
696+
var interaction = new Mock<IVBEInteraction>();
694697
var removeCommand = new RemoveCommand(saveFileDialog.Object, messageBox.Object, state.ProjectsProvider);
695698

696699
var vm = new CodeExplorerViewModel(new FolderHelper(state), state, removeCommand, _generalSettingsProvider.Object, _windowSettingsProvider.Object, uiDispatcher.Object, vbe.Object);
697-
vm.AddTestModuleWithStubsCommand = new AddTestModuleWithStubsCommand(vbeWrapper, new AddTestModuleCommand(vbeWrapper, state, configLoader.Object, messageBox.Object));
700+
vm.AddTestModuleWithStubsCommand = new AddTestModuleWithStubsCommand(vbeWrapper, new AddTestModuleCommand(vbeWrapper, state, configLoader.Object, messageBox.Object, interaction.Object));
698701

699702
var parser = MockParser.Create(vbe.Object, state, projectRepository);
700703
parser.Parse(new CancellationTokenSource());
@@ -729,10 +732,11 @@ public void AddTestModuleWithStubs_DisabledWhenParameterIsProject()
729732
{
730733
var vbeWrapper = vbe.Object;
731734
var uiDispatcher = new Mock<IUiDispatcher>();
735+
var interaction = new Mock<IVBEInteraction>();
732736
var removeCommand = new RemoveCommand(saveFileDialog.Object, messageBox.Object, state.ProjectsProvider);
733737

734738
var vm = new CodeExplorerViewModel(new FolderHelper(state), state, removeCommand, _generalSettingsProvider.Object, _windowSettingsProvider.Object, uiDispatcher.Object, vbe.Object);
735-
vm.AddTestModuleWithStubsCommand = new AddTestModuleWithStubsCommand(vbeWrapper, new AddTestModuleCommand(vbeWrapper, state, configLoader.Object, messageBox.Object));
739+
vm.AddTestModuleWithStubsCommand = new AddTestModuleWithStubsCommand(vbeWrapper, new AddTestModuleCommand(vbeWrapper, state, configLoader.Object, messageBox.Object, interaction.Object));
736740

737741
var parser = MockParser.Create(vbe.Object, state, projectRepository);
738742
parser.Parse(new CancellationTokenSource());
@@ -766,10 +770,11 @@ public void AddTestModuleWithStubs_DisabledWhenParameterIsFolder()
766770
using (var state = new RubberduckParserState(vbe.Object, projectRepository, new DeclarationFinderFactory(), vbeEvents.Object))
767771
{
768772
var vbeWrapper = vbe.Object;
773+
var interaction = new Mock<IVBEInteraction>();
769774
var removeCommand = new RemoveCommand(saveFileDialog.Object, messageBox.Object, state.ProjectsProvider);
770775

771776
var vm = new CodeExplorerViewModel(new FolderHelper(state), state, removeCommand, _generalSettingsProvider.Object, _windowSettingsProvider.Object, uiDispatcher.Object, vbe.Object);
772-
vm.AddTestModuleWithStubsCommand = new AddTestModuleWithStubsCommand(vbeWrapper, new AddTestModuleCommand(vbeWrapper, state, configLoader.Object, messageBox.Object));
777+
vm.AddTestModuleWithStubsCommand = new AddTestModuleWithStubsCommand(vbeWrapper, new AddTestModuleCommand(vbeWrapper, state, configLoader.Object, messageBox.Object, interaction.Object));
773778

774779
var parser = MockParser.Create(vbe.Object, state, projectRepository);
775780
parser.Parse(new CancellationTokenSource());
@@ -803,10 +808,11 @@ public void AddTestModuleWithStubs_DisabledWhenParameterIsModuleMember()
803808
{
804809
var vbeWrapper = vbe.Object;
805810
var uiDispatcher = new Mock<IUiDispatcher>();
811+
var interaction = new Mock<IVBEInteraction>();
806812
var removeCommand = new RemoveCommand(saveFileDialog.Object, messageBox.Object, state.ProjectsProvider);
807813

808814
var vm = new CodeExplorerViewModel(new FolderHelper(state), state, removeCommand, _generalSettingsProvider.Object, _windowSettingsProvider.Object, uiDispatcher.Object, vbe.Object);
809-
vm.AddTestModuleWithStubsCommand = new AddTestModuleWithStubsCommand(vbeWrapper, new AddTestModuleCommand(vbeWrapper, state, configLoader.Object, messageBox.Object));
815+
vm.AddTestModuleWithStubsCommand = new AddTestModuleWithStubsCommand(vbeWrapper, new AddTestModuleCommand(vbeWrapper, state, configLoader.Object, messageBox.Object, interaction.Object));
810816

811817
var parser = MockParser.Create(vbe.Object, state, projectRepository);
812818
parser.Parse(new CancellationTokenSource());

0 commit comments

Comments
 (0)