Skip to content

Commit b72ec45

Browse files
authored
Merge pull request #1805 from ThunderFrame/next
Various fixes to allow Unit Tests in multiple projects to run
2 parents 67f39a3 + f7f5063 commit b72ec45

File tree

4 files changed

+48
-14
lines changed

4 files changed

+48
-14
lines changed

RetailCoder.VBE/UnitTesting/TestEngine.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,8 @@ public void Run(IEnumerable<TestMethod> tests)
6767
var testCleanup = module.Key.FindTestCleanupMethods(_state).ToList();
6868

6969
var moduleTestMethods = testMethods
70-
.Where(test => test.QualifiedMemberName.QualifiedModuleName.ComponentName == module.Key.ComponentName);
70+
.Where(test => test.QualifiedMemberName.QualifiedModuleName.ProjectId == module.Key.ProjectId
71+
&& test.QualifiedMemberName.QualifiedModuleName.ComponentName == module.Key.ComponentName);
7172

7273
Run(module.Key.FindModuleInitializeMethods(_state));
7374
foreach (var test in moduleTestMethods)

Rubberduck.VBEEditor/QualifiedModuleName.cs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,6 @@ public struct QualifiedModuleName
1212
{
1313
private static string GetDisplayName(VBProject project)
1414
{
15-
//Try reading the filename first
16-
try
17-
{
18-
if (!string.IsNullOrEmpty(Path.GetDirectoryName(project.BuildFileName)))
19-
{
20-
return Path.GetFileName(project.FileName);
21-
}
22-
}
23-
catch
24-
{ //The GetFileName getter probably threw
25-
}
2615

2716
if (project.Protection == vbext_ProjectProtection.vbext_pp_none)
2817
{
@@ -77,6 +66,19 @@ private static string GetDisplayName(VBProject project)
7766
//The Properties collection either wasn't available, or didn't have the expected properties
7867
}
7968
}
69+
70+
//Try reading the filename
71+
try
72+
{
73+
if (!string.IsNullOrEmpty(Path.GetDirectoryName(project.BuildFileName)))
74+
{
75+
return Path.GetFileName(project.FileName);
76+
}
77+
}
78+
catch
79+
{ //The GetFileName getter probably threw
80+
}
81+
8082
return null;
8183
}
8284

Rubberduck.VBEEditor/VBEHost/ExcelApp.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,14 @@ public ExcelApp(VBE vbe) : base(vbe, "Excel") { }
99

1010
public override void Run(QualifiedMemberName qualifiedMemberName)
1111
{
12-
Application.Run(qualifiedMemberName.ToString());
12+
string call = GenerateMethodCall(qualifiedMemberName);
13+
Application.Run(call);
14+
}
15+
16+
protected virtual string GenerateMethodCall(QualifiedMemberName qualifiedMemberName)
17+
{
18+
var documentName = qualifiedMemberName.QualifiedModuleName.ProjectDisplayName;
19+
return string.Concat(documentName, "!", qualifiedMemberName.ToString());
1320
}
1421
}
1522
}

Rubberduck.VBEEditor/VBEHost/WordApp.cs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
using Microsoft.Vbe.Interop;
2+
using Microsoft.Office.Interop.Word;
3+
using System.Linq;
24

35
namespace Rubberduck.VBEditor.VBEHost
46
{
@@ -10,13 +12,35 @@ public WordApp(VBE vbe) : base(vbe, "Word") { }
1012
public override void Run(QualifiedMemberName qualifiedMemberName)
1113
{
1214
var call = GenerateMethodCall(qualifiedMemberName);
13-
Application.Run(call);
15+
16+
ActivateProjectDocument(qualifiedMemberName);
17+
//Prevent TE hanging should Application.Run fail
18+
try
19+
{
20+
Application.Run(call);
21+
}
22+
//TODO - Let TestEngine know that the method failed
23+
catch { };
1424
}
1525

1626
protected virtual string GenerateMethodCall(QualifiedMemberName qualifiedMemberName)
1727
{
1828
var moduleName = qualifiedMemberName.QualifiedModuleName.Component.Name;
1929
return string.Concat(moduleName, ".", qualifiedMemberName.MemberName);
2030
}
31+
32+
protected virtual void ActivateProjectDocument(QualifiedMemberName qualifiedMemberName)
33+
{
34+
// Word requires that the document be active for Application.Run to find the target Method in scope.
35+
// Check the project's document or a document referring to a project's template is active.
36+
var activeDoc = Application.ActiveDocument;
37+
var template = activeDoc.get_AttachedTemplate();
38+
var targetDoc = Application.Documents.Cast<Document>()
39+
.FirstOrDefault(doc => doc.Name == qualifiedMemberName.QualifiedModuleName.ProjectDisplayName
40+
|| doc.get_AttachedTemplate().Name == qualifiedMemberName.QualifiedModuleName.ProjectDisplayName);
41+
if (activeDoc != targetDoc) {
42+
targetDoc.Activate();
43+
}
44+
}
2145
}
2246
}

0 commit comments

Comments
 (0)