Skip to content

Commit 7a8d551

Browse files
committed
Expanded code coverage for issue #611; closes #623;
1 parent c5a453f commit 7a8d551

File tree

4 files changed

+100
-41
lines changed

4 files changed

+100
-41
lines changed

RetailCoder.VBE/UnitTesting/NewUnitTestModuleCommand.cs

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,12 @@
11
using System;
2-
using System.IO;
32
using System.Linq;
4-
using System.Reflection;
53
using Microsoft.Vbe.Interop;
64
using Rubberduck.VBEditor.Extensions;
75

86
namespace Rubberduck.UnitTesting
97
{
108
public static class NewUnitTestModuleCommand
119
{
12-
public static void EnsureReferenceToAddInLibrary(this VBProject project)
13-
{
14-
var assembly = Assembly.GetExecutingAssembly();
15-
16-
var name = assembly.GetName().Name.Replace('.', '_');
17-
var referencePath = Path.ChangeExtension(assembly.Location, ".tlb");
18-
19-
var references = project.References.Cast<Reference>().ToList();
20-
21-
var reference = references.SingleOrDefault(r => r.Name == name);
22-
if (reference != null)
23-
{
24-
references.Remove(reference);
25-
project.References.Remove(reference);
26-
}
27-
28-
if (references.All(r => r.FullPath != referencePath))
29-
{
30-
project.References.AddFromFile(referencePath);
31-
}
32-
}
33-
3410
private static readonly string TestModuleEmptyTemplate = String.Concat(
3511
"'@TestModule\n"
3612
, "'' uncomment for late-binding:\n"
@@ -82,6 +58,7 @@ public static void NewUnitTestModule(VBE vbe)
8258
}
8359
catch (Exception exception)
8460
{
61+
//can we please comment when we swallow every possible exception?
8562
}
8663
}
8764

RetailCoder.VBE/UnitTesting/ProjectTestExtensions.cs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
using Rubberduck.Parsing.Reflection;
77
using Rubberduck.Reflection;
88
using Rubberduck.VBEditor.Extensions;
9-
using Rubberduck.VBEditor.VBEHost;
9+
using System.Reflection;
10+
using System.IO;
1011

1112
namespace Rubberduck.UnitTesting
1213
{
@@ -87,5 +88,27 @@ private static bool IsTestMethod(Member member)
8788

8889
return result;
8990
}
91+
92+
public static void EnsureReferenceToAddInLibrary(this VBProject project)
93+
{
94+
var assembly = Assembly.GetExecutingAssembly();
95+
96+
var name = assembly.GetName().Name.Replace('.', '_');
97+
var referencePath = Path.ChangeExtension(assembly.Location, ".tlb");
98+
99+
var references = project.References.Cast<Reference>().ToList();
100+
101+
var reference = references.SingleOrDefault(r => r.Name == name);
102+
if (reference != null)
103+
{
104+
references.Remove(reference);
105+
project.References.Remove(reference);
106+
}
107+
108+
if (references.All(r => r.FullPath != referencePath))
109+
{
110+
project.References.AddFromFile(referencePath);
111+
}
112+
}
90113
}
91114
}

RetailCoder.VBE/UnitTesting/TestEngine.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ private void RunMethodCleanup(QualifiedModuleName qualifiedModuleName)
8484

8585
public void Run(IEnumerable<TestMethod> tests, VBProject project)
8686
{
87+
//todo: move this to the "UI" layer. This code doesn't have to run for COM clients.
88+
// COM clients will have to either already have a good reference, or be late bound.
89+
// This is problematic for late bound code, because now we've *forced* them into early binding.
8790
project.EnsureReferenceToAddInLibrary();
8891

8992
var testMethods = tests as IList<TestMethod> ?? tests.ToList();

RubberduckTests/UnitTesting/EngineTests.cs

Lines changed: 72 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -63,25 +63,26 @@ public void Initialize()
6363

6464
private static IEnumerator<Reference> ReferenceList()
6565
{
66-
var ref1 = new Mock<Reference>();
67-
ref1.SetupGet(r => r.Name).Returns("VBA");
68-
ref1.SetupGet(r => r.FullPath).Returns("C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA7.1\\VBE7.DLL");
69-
yield return ref1.Object;
66+
yield return
67+
CreateMockReference("VBA", @"C:\Program Files\Common Files\Microsoft Shared\VBA\VBA7.1\VBE7.DLL").Object;
7068

71-
var ref2 = new Mock<Reference>();
72-
ref2.SetupGet(r => r.Name).Returns("Excel");
73-
ref2.SetupGet(r => r.FullPath).Returns("C:\\Program Files\\Microsoft Office 15\\Root\\Office15\\EXCEL.EXE");
74-
yield return ref2.Object;
69+
yield return
70+
CreateMockReference("Excel", @"C:\Program Files\Microsoft Office 15\Root\Office15\EXCEL.EXE").Object;
7571

76-
var ref3 = new Mock<Reference>();
77-
ref3.SetupGet(r => r.Name).Returns("stdole");
78-
ref3.SetupGet(r => r.FullPath).Returns("C:\\Windows\\System32\\stdole2.tlb");
79-
yield return ref3.Object;
72+
yield return
73+
CreateMockReference("stdole", @"C:\Windows\System32\stdole2.tlb").Object;
8074

81-
var ref4 = new Mock<Reference>();
82-
ref4.SetupGet(r => r.Name).Returns("Office");
83-
ref4.SetupGet(r => r.FullPath).Returns("C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE15\\MSO.DLL");
84-
yield return ref4.Object;
75+
yield return
76+
CreateMockReference("Office", @"C:\Program Files\Common Files\Microsoft Shared\Office15\MSO.DLL").Object;
77+
}
78+
79+
private static Mock<Reference> CreateMockReference(string name, string filePath)
80+
{
81+
var reference = new Mock<Reference>();
82+
reference.SetupGet(r => r.Name).Returns(name);
83+
reference.SetupGet(r => r.FullPath).Returns(filePath);
84+
85+
return reference;
8586
}
8687

8788
[TestMethod]
@@ -231,6 +232,61 @@ public void TestEngine_Run_WhenTestListIsEmpty_Bail()
231232
Assert.IsFalse(_wasEventRaised, "No methods should run when passed an empty list of tests.");
232233
}
233234

235+
//todo: move this to the "UI" layer. This code doesn't have to run for COM clients.
236+
// COM clients will have to either already have a good reference, or be late bound.
237+
// This is problematic for late bound code, because now we've *forced* them into early binding.
238+
[TestMethod]
239+
public void TestEngine_AfterRun_OldRubberduckReferenceIsRemoved()
240+
{
241+
var vbaRef = CreateMockReference("VBA", @"C:\Path\To\VBA.DLL");
242+
var rubberduckPath = @"C:\Path\To\Rubberduck.dll";
243+
var oldRubberduckRef = CreateMockReference("Rubberduck", rubberduckPath);
244+
245+
var refrenceList = new List<Reference>() {vbaRef.Object, oldRubberduckRef.Object};
246+
247+
var references = new Mock<References>();
248+
references.Setup(r => r.GetEnumerator()).Returns(refrenceList.GetEnumerator());
249+
references.As<IEnumerable>().Setup(r => r.GetEnumerator()).Returns(refrenceList.GetEnumerator());
250+
references.Setup(r => r.AddFromFile(It.IsAny<string>()));
251+
252+
var project = new Mock<VBProject>();
253+
project.SetupProperty(p => p.Name, "VBAProject");
254+
project.SetupGet(p => p.References).Returns(references.Object);
255+
256+
//act
257+
_engine.Run(_engine.AllTests.Keys, project.Object);
258+
259+
//assert
260+
references.Verify(r => r.Remove(It.Is<Reference>(arg => arg == oldRubberduckRef.Object)));
261+
}
262+
263+
//todo: move this to the "UI" layer. This code doesn't have to run for COM clients.
264+
// COM clients will have to either already have a good reference, or be late bound.
265+
// This is problematic for late bound code, because now we've *forced* them into early binding.
266+
[TestMethod]
267+
public void TestEngine_AfterRun_NewRubberduckReferenceExists()
268+
{
269+
var vbaRef = CreateMockReference("VBA", @"C:\Path\To\VBA.DLL");
270+
var rubberduckPath = @"C:\Path\To\Rubberduck.dll";
271+
var oldRubberduckRef = CreateMockReference("Rubberduck", rubberduckPath);
272+
273+
var refrenceList = new List<Reference>() { vbaRef.Object, oldRubberduckRef.Object };
274+
275+
var references = new Mock<References>();
276+
references.Setup(r => r.GetEnumerator()).Returns(refrenceList.GetEnumerator());
277+
references.As<IEnumerable>().Setup(r => r.GetEnumerator()).Returns(refrenceList.GetEnumerator());
278+
279+
var project = new Mock<VBProject>();
280+
project.SetupProperty(p => p.Name, "VBAProject");
281+
project.SetupGet(p => p.References).Returns(references.Object);
282+
283+
//act
284+
_engine.Run(_engine.AllTests.Keys, project.Object);
285+
286+
//assert
287+
references.Verify(r => r.AddFromFile(It.IsAny<string>()));
288+
}
289+
234290
private void EngineOnTestComplete(object sender, TestCompletedEventArgs testCompletedEventArgs)
235291
{
236292
CatchEvent();

0 commit comments

Comments
 (0)