Skip to content

Commit 7324da1

Browse files
authored
Merge pull request #401 from tonyhallett/fix-include-test-assembly
Fix include test assembly
2 parents 6a6fce2 + 146dbcb commit 7324da1

File tree

4 files changed

+102
-65
lines changed

4 files changed

+102
-65
lines changed

FineCodeCoverageTests/MsCodeCoverage/RunSettingsTemplateReplacementsFactory_Tests.cs

Lines changed: 41 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ public void Should_Set_The_TestAdapter()
8989
new TestUserRunSettingsProjectDetails
9090
{
9191
CoverageOutputFolder = "",
92+
TestDllFile = "",
9293
Settings = new TestMsCodeCoverageOptions{ IncludeTestAssembly = true},
9394
ExcludedReferencedProjects = new List<string>(),
9495
IncludedReferencedProjects = new List<string>(),
@@ -116,6 +117,7 @@ public void Should_Set_The_ResultsDirectory_To_The_First_OutputFolder(string out
116117
new TestUserRunSettingsProjectDetails
117118
{
118119
CoverageOutputFolder = outputFolder1,
120+
TestDllFile = "",
119121
Settings = new TestMsCodeCoverageOptions{ IncludeTestAssembly = true},
120122
ExcludedReferencedProjects = new List<string>(),
121123
IncludedReferencedProjects = new List<string>(),
@@ -126,6 +128,7 @@ public void Should_Set_The_ResultsDirectory_To_The_First_OutputFolder(string out
126128
new TestUserRunSettingsProjectDetails
127129
{
128130
CoverageOutputFolder = outputFolder2,
131+
TestDllFile = "",
129132
Settings = new TestMsCodeCoverageOptions{ IncludeTestAssembly = true},
130133
ExcludedReferencedProjects = new List<string>(),
131134
IncludedReferencedProjects = new List<string>(),
@@ -157,7 +160,6 @@ TestMsCodeCoverageOptions CreateSettings(string id)
157160
return new TestMsCodeCoverageOptions
158161
{
159162
IncludeTestAssembly = true,
160-
161163
AttributesExclude = new string[] { $"AttributeExclude{id}" },
162164
AttributesInclude = new string[] { $"AttributeInclude{id}" },
163165
CompanyNamesExclude = new string[] { $"CompanyNameExclude{id}" },
@@ -178,6 +180,7 @@ TestMsCodeCoverageOptions CreateSettings(string id)
178180
new TestUserRunSettingsProjectDetails
179181
{
180182
CoverageOutputFolder = "",
183+
TestDllFile = "",
181184
Settings = CreateSettings("1"),
182185
ExcludedReferencedProjects = new List<string>(),
183186
IncludedReferencedProjects = new List<string>(),
@@ -188,6 +191,7 @@ TestMsCodeCoverageOptions CreateSettings(string id)
188191
new TestUserRunSettingsProjectDetails
189192
{
190193
CoverageOutputFolder = "",
194+
TestDllFile = "",
191195
Settings = CreateSettings("2"),
192196
ExcludedReferencedProjects = new List<string>(),
193197
IncludedReferencedProjects = new List<string>(),
@@ -276,8 +280,9 @@ string GetModulePathExcludeWhenExcludingTestAssembly(bool first)
276280
Assert.AreEqual(expectedModulePathExcludes, replacements.ModulePathsExclude);
277281
}
278282

279-
[Test]
280-
public void Should_Add_Regexed_IncludedExcluded_Referenced_Projects_To_ModulePaths()
283+
[TestCase(true)]
284+
[TestCase(false)]
285+
public void Should_Add_Regexed_IncludedExcluded_Referenced_Projects_To_ModulePaths(bool included)
281286
{
282287
var testContainers = new List<ITestContainer>()
283288
{
@@ -290,48 +295,47 @@ public void Should_Add_Regexed_IncludedExcluded_Referenced_Projects_To_ModulePat
290295
{
291296
"Source1",
292297
new TestUserRunSettingsProjectDetails
293-
{
294-
CoverageOutputFolder = "",
295-
Settings = new TestMsCodeCoverageOptions{
296-
IncludeTestAssembly = true,
297-
ModulePathsExclude = new string[]{ "ModulePathExclude"},
298-
ModulePathsInclude = new string[]{ "ModulePathInclude"}
299-
},
300-
ExcludedReferencedProjects = new List<string>{ "ExcludedReferenced1"},
301-
IncludedReferencedProjects = new List<string>{ "IncludedReferenced1" },
302-
}
298+
{
299+
CoverageOutputFolder = "",
300+
TestDllFile = "",
301+
Settings = new TestMsCodeCoverageOptions
302+
{
303+
IncludeTestAssembly = !included,
304+
ModulePathsExclude = new string[] { "ModulePathExclude" },
305+
ModulePathsInclude = new string[] { "ModulePathInclude" }
306+
},
307+
ExcludedReferencedProjects = new List<string> { "ExcludedReferenced1" },
308+
IncludedReferencedProjects = new List<string> { "IncludedReferenced1" },
309+
}
303310
},
304311
{
305312
"Source2",
306313
new TestUserRunSettingsProjectDetails
307314
{
308315
CoverageOutputFolder = "",
309-
Settings = new TestMsCodeCoverageOptions{ IncludeTestAssembly = true},
310-
ExcludedReferencedProjects = new List<string>{ "ExcludedReferenced2"},
311-
IncludedReferencedProjects = new List<string>{ "IncludedReferenced2" },
316+
TestDllFile = "",
317+
Settings = new TestMsCodeCoverageOptions { IncludeTestAssembly = !included },
318+
ExcludedReferencedProjects = new List<string> { "ExcludedReferenced2" },
319+
IncludedReferencedProjects = new List<string> { "IncludedReferenced2" },
312320
}
313321
},
314322
};
315323

316324
var projectDetails = userRunSettingsProjectDetailsLookup.Select(kvp => kvp.Value).ToList();
317-
var allExcludedReferencesProjects = projectDetails.SelectMany(pd => pd.ExcludedReferencedProjects);
318-
var allIncludedReferencesProjects = projectDetails.SelectMany(pd => pd.IncludedReferencedProjects);
325+
IEnumerable<string> allReferencedProjects = projectDetails.SelectMany(pd => included ? pd.IncludedReferencedProjects : pd.ExcludedReferencedProjects);
319326

320327
string GetExpectedExcludedOrIncludedEscaped(IEnumerable<string> excludedOrIncludedReferenced)
321328
{
322329
return string.Join("", excludedOrIncludedReferenced.Select(referenced => ModulePathElement(MsCodeCoverageRegex.RegexModuleName(referenced))));
323330
}
324-
325-
var expectedModulePathExcludes = GetExpectedExcludedOrIncludedEscaped(allExcludedReferencesProjects) + ModulePathElement("ModulePathExclude");
326-
var expectedModulePathIncludes = GetExpectedExcludedOrIncludedEscaped(allIncludedReferencesProjects) + ModulePathElement("ModulePathInclude");
331+
var expectedExcludes = GetExpectedExcludedOrIncludedEscaped(allReferencedProjects) + ModulePathElement(included ? "ModulePathInclude" : "ModulePathExclude");
327332

328333
var replacements = runSettingsTemplateReplacementsFactory.Create(testContainers, userRunSettingsProjectDetailsLookup, null);
329-
Assert.AreEqual(expectedModulePathExcludes, replacements.ModulePathsExclude);
330-
Assert.AreEqual(expectedModulePathIncludes, replacements.ModulePathsInclude);
334+
Assert.AreEqual(expectedExcludes, included ? replacements.ModulePathsInclude : replacements.ModulePathsExclude);
331335
}
332336

333337
[Test]
334-
public void Should_Be_Empty_String_Replacement_When_Null()
338+
public void Should_Be_Null_TestAdapter_Replacement_When_Null()
335339
{
336340
var testContainers = new List<ITestContainer>()
337341
{
@@ -346,6 +350,7 @@ public void Should_Be_Empty_String_Replacement_When_Null()
346350
new TestUserRunSettingsProjectDetails
347351
{
348352
CoverageOutputFolder = "",
353+
TestDllFile = "",
349354
Settings = new TestMsCodeCoverageOptions{ IncludeTestAssembly = true},
350355
ExcludedReferencedProjects = new List<string>(),
351356
IncludedReferencedProjects = new List<string>(),
@@ -356,14 +361,15 @@ public void Should_Be_Empty_String_Replacement_When_Null()
356361
new TestUserRunSettingsProjectDetails
357362
{
358363
CoverageOutputFolder = "",
364+
TestDllFile = "",
359365
Settings = new TestMsCodeCoverageOptions{ IncludeTestAssembly = true},
360366
ExcludedReferencedProjects = new List<string>(),
361367
IncludedReferencedProjects = new List<string>(),
362368
}
363369
}
364370
};
365371
var replacements = runSettingsTemplateReplacementsFactory.Create(testContainers, userRunSettingsProjectDetailsLookup, null);
366-
ReplacementsAssertions.AssertAllEmpty(replacements);
372+
Assert.That(replacements.TestAdapter, Is.Null);
367373
}
368374

369375
[TestCase(true,true,"true")]
@@ -386,6 +392,7 @@ public void Should_Be_Disabled_When_All_Projects_Are_Disabled(bool project1Enabl
386392
new TestUserRunSettingsProjectDetails
387393
{
388394
CoverageOutputFolder = "",
395+
TestDllFile = "",
389396
Settings = new TestMsCodeCoverageOptions{ Enabled = project1Enabled, IncludeTestAssembly = true},
390397
ExcludedReferencedProjects = new List<string>(),
391398
IncludedReferencedProjects = new List<string>(),
@@ -396,6 +403,7 @@ public void Should_Be_Disabled_When_All_Projects_Are_Disabled(bool project1Enabl
396403
new TestUserRunSettingsProjectDetails
397404
{
398405
CoverageOutputFolder = "",
406+
TestDllFile = "",
399407
Settings = new TestMsCodeCoverageOptions{ Enabled = project2Enabled, IncludeTestAssembly = true},
400408
ExcludedReferencedProjects = new List<string>(),
401409
IncludedReferencedProjects = new List<string>(),
@@ -438,13 +446,14 @@ public void Should_Set_The_TestAdapter()
438446
Assert.AreEqual("MsTestAdapterPath", replacements.TestAdapter);
439447
}
440448

441-
private ICoverageProject CreateCoverageProject(Action<Mock<ICoverageProject>> furtherSetup = null)
449+
private ICoverageProject CreateCoverageProject(Action<Mock<ICoverageProject>> furtherSetup = null, bool includeTestAssembly = true)
442450
{
443451
var mockSettings = new Mock<IAppOptions>();
444-
mockSettings.Setup(settings => settings.IncludeTestAssembly).Returns(true);
452+
mockSettings.Setup(settings => settings.IncludeTestAssembly).Returns(includeTestAssembly);
445453
var mockCoverageProject = new Mock<ICoverageProject>();
446454
mockCoverageProject.Setup(cp => cp.ExcludedReferencedProjects).Returns(new List<string>());
447455
mockCoverageProject.Setup(cp => cp.IncludedReferencedProjects).Returns(new List<string>());
456+
mockCoverageProject.Setup(cp => cp.TestDllFile).Returns("");
448457
mockCoverageProject.Setup(cp => cp.Settings).Returns(mockSettings.Object);
449458
furtherSetup?.Invoke(mockCoverageProject);
450459
return mockCoverageProject.Object;
@@ -498,7 +507,6 @@ void AssertReplacement(string replacement, string replacementProperty, bool isIn
498507
}
499508

500509
AssertReplacement(replacements.ModulePathsExclude, "ModulePath", false);
501-
AssertReplacement(replacements.ModulePathsInclude, "ModulePath", true);
502510
AssertReplacement(replacements.FunctionsExclude, "Function", false);
503511
AssertReplacement(replacements.FunctionsInclude, "Function", true);
504512
AssertReplacement(replacements.CompanyNamesExclude, "CompanyName", false);
@@ -541,7 +549,6 @@ void AssertReplacement(string replacement, string replacementProperty, bool isIn
541549
}
542550

543551
AssertReplacement(replacements.ModulePathsExclude, "ModulePath", false);
544-
AssertReplacement(replacements.ModulePathsInclude, "ModulePath", true);
545552

546553
AssertReplacement(replacements.FunctionsExclude, "Function", false);
547554
AssertReplacement(replacements.FunctionsInclude, "Function", true);
@@ -556,7 +563,7 @@ void AssertReplacement(string replacement, string replacementProperty, bool isIn
556563
}
557564

558565
[Test]
559-
public void Should_Be_Empty_String_Replacement_When_Null()
566+
public void Should_Be_Null_TestAdapter_Replacement_When_Null()
560567
{
561568
var msCodeCoverageOptions = new TestCoverageProjectOptions
562569
{
@@ -565,9 +572,7 @@ public void Should_Be_Empty_String_Replacement_When_Null()
565572

566573
var coverageProject = CreateCoverageProject(mock => mock.Setup(cp => cp.Settings).Returns(msCodeCoverageOptions));
567574
var replacements = runSettingsTemplateReplacementsFactory.Create(coverageProject, null);
568-
569-
570-
ReplacementsAssertions.AssertAllEmpty(replacements);
575+
Assert.That(replacements.TestAdapter, Is.Null);
571576
}
572577

573578
[Test]
@@ -595,7 +600,7 @@ public void Should_Have_ModulePathsExclude_Replacements_From_ExcludedReferencedP
595600
}
596601

597602
[Test]
598-
public void Should_Have_ModulePathsInclude_Replacements_From_IncludedReferencedProjects_And_Settings()
603+
public void Should_Have_ModulePathsInclude_Replacements_From_IncludedReferencedProjects_Settings_And_Included_Test_Assembly()
599604
{
600605
var msCodeCoverageOptions = new TestCoverageProjectOptions
601606
{
@@ -610,10 +615,11 @@ public void Should_Have_ModulePathsInclude_Replacements_From_IncludedReferencedP
610615
{
611616
"ModuleName"
612617
});
618+
mock.Setup(cp => cp.TestDllFile).Returns(@"Path\To\Test.dll");
613619
});
614620

615621
var replacements = runSettingsTemplateReplacementsFactory.Create(coverageProject, null);
616-
var expectedModulePathsInclude = $"{ModulePathElement(MsCodeCoverageRegex.RegexModuleName("ModuleName"))}{ModulePathElement("FromSettings")}";
622+
var expectedModulePathsInclude = $"{ModulePathElement(MsCodeCoverageRegex.RegexModuleName("ModuleName"))}{ModulePathElement(MsCodeCoverageRegex.RegexEscapePath(@"Path\To\Test.dll"))}{ModulePathElement("FromSettings")}";
617623
Assert.AreEqual(expectedModulePathsInclude, replacements.ModulePathsInclude);
618624
}
619625

FineCodeCoverageTests/OpenCoverExeArgumentsProvider_Tests.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,19 @@ public void Should_Safely_Include_The_TestDLLFile_In_The_TargetArgs()
9494
AssertHasEscapedSetting(arguments, $"-targetargs:{CommandLineArguments.AddEscapeQuotes("testDllFile")}");
9595
}
9696

97+
[Test]
98+
public void Should_Include_The_Test_Assembly_In_The_Filter_When_AppOptions_IncludeTestAssembly()
99+
{
100+
var openCoverExeArgumentsProvider = new OpenCoverExeArgumentsProvider();
101+
var mockCoverageProject = SafeMockCoverageProject();
102+
mockCoverageProject.SetupGet(coverageProject => coverageProject.Settings.IncludeTestAssembly).Returns(true);
103+
mockCoverageProject.SetupGet(coverageProject => coverageProject.ProjectName).Returns("TheTestName");
104+
105+
var arguments = openCoverExeArgumentsProvider.Provide(mockCoverageProject.Object, "");
106+
107+
AssertHasEscapedSetting(arguments, "-filter:+[TheTestName]*");
108+
}
109+
97110
[Test]
98111
public void Should_Safely_Include_The_Project_RunSettingsFile_In_The_TargetArgs_When_Present()
99112
{

SharedProject/Core/MsTestPlatform/CodeCoverage/RunSettingsTemplateReplacementsFactory.cs

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using FineCodeCoverage.Engine.Model;
1+
using FineCodeCoverage.Core.Model;
2+
using FineCodeCoverage.Engine.Model;
23
using FineCodeCoverage.Options;
34
using Microsoft.VisualStudio.TestWindow.Extensibility;
45
using System;
@@ -151,33 +152,46 @@ public IRunSettingsTemplateReplacements Create(
151152

152153

153154
var additionalModulePathsExclude = allProjectDetails.SelectMany(pd =>
154-
{
155-
var additional = pd.ExcludedReferencedProjects.Select(rp => MsCodeCoverageRegex.RegexModuleName(rp)).ToList();
156-
if (!pd.Settings.IncludeTestAssembly)
157-
{
158-
additional.Add(MsCodeCoverageRegex.RegexEscapePath(pd.TestDllFile));
159-
}
160-
return additional;
161-
162-
});
163-
164-
var additionalModulePathsInclude = allProjectDetails.SelectMany(projectDetails => projectDetails.IncludedReferencedProjects.Select(rp => MsCodeCoverageRegex.RegexModuleName(rp)));
155+
GetAdditionalModulePaths(pd.ExcludedReferencedProjects, pd.TestDllFile, pd.Settings.IncludeTestAssembly, false));
156+
var additionalModulePathsInclude = allProjectDetails.SelectMany(pd =>
157+
GetAdditionalModulePaths(pd.IncludedReferencedProjects, pd.TestDllFile, pd.Settings.IncludeTestAssembly, true));
165158
var settings = new CombinedIncludesExcludesOptions(mergedSettings, additionalModulePathsInclude, additionalModulePathsExclude);
166159
return new RunSettingsTemplateReplacements(settings, resultsDirectory, (!allProjectsDisabled).ToString().ToLower(), testAdapter);
167160
}
168161

169-
public IRunSettingsTemplateReplacements Create(ICoverageProject coverageProject, string testAdapter)
162+
private IEnumerable<string> GetAdditionalModulePaths(
163+
IEnumerable<string> referencedProjects,
164+
string testDllFile,
165+
bool includeTestAssembly,
166+
bool isInclude
167+
)
170168
{
171-
var projectSettings = coverageProject.Settings;
172-
var additionalModulePathsExclude = coverageProject.ExcludedReferencedProjects.Select(
173-
rp => MsCodeCoverageRegex.RegexModuleName(rp)).ToList();
174-
175-
if (!projectSettings.IncludeTestAssembly)
169+
var additionalReferenced = referencedProjects.Select(
170+
rp => MsCodeCoverageRegex.RegexModuleName(rp));
171+
if(includeTestAssembly == isInclude)
176172
{
177-
additionalModulePathsExclude.Add(MsCodeCoverageRegex.RegexEscapePath(coverageProject.TestDllFile));
173+
additionalReferenced = additionalReferenced.Append(MsCodeCoverageRegex.RegexEscapePath(testDllFile));
178174
}
175+
return additionalReferenced;
176+
177+
}
179178

180-
var additionalModulePathsInclude = coverageProject.IncludedReferencedProjects.Select(rp => MsCodeCoverageRegex.RegexModuleName(rp)).ToList();
179+
public IRunSettingsTemplateReplacements Create(ICoverageProject coverageProject, string testAdapter)
180+
{
181+
var projectSettings = coverageProject.Settings;
182+
var additionalModulePathsExclude = GetAdditionalModulePaths(
183+
coverageProject.ExcludedReferencedProjects,
184+
coverageProject.TestDllFile,
185+
projectSettings.IncludeTestAssembly,
186+
false);
187+
188+
189+
var additionalModulePathsInclude = GetAdditionalModulePaths(
190+
coverageProject.IncludedReferencedProjects,
191+
coverageProject.TestDllFile,
192+
projectSettings.IncludeTestAssembly,
193+
true);
194+
181195
var settings = new CombinedIncludesExcludesOptions(projectSettings, additionalModulePathsInclude, additionalModulePathsExclude);
182196
return new RunSettingsTemplateReplacements(settings, coverageProject.CoverageOutputFolder, projectSettings.Enabled.ToString(), testAdapter);
183197
}

0 commit comments

Comments
 (0)