Skip to content

Commit 7e0dd27

Browse files
committed
refactor and tests for OpenCover
1 parent bae106d commit 7e0dd27

File tree

2 files changed

+53
-16
lines changed

2 files changed

+53
-16
lines changed

FineCodeCoverageTests/OpenCoverExeArgumentsProvider_Tests.cs

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
using FineCodeCoverage.Engine.Model;
22
using FineCodeCoverage.Engine.OpenCover;
33
using FineCodeCoverage.Options;
4+
using Microsoft.VisualStudio.Experimentation;
45
using Moq;
56
using NUnit.Framework;
7+
using System;
68
using System.Collections.Generic;
79
using System.Linq;
810

@@ -95,16 +97,62 @@ public void Should_Safely_Include_The_TestDLLFile_In_The_TargetArgs()
9597
}
9698

9799
[Test]
98-
public void Should_Include_The_Test_Assembly_In_The_Filter_When_AppOptions_IncludeTestAssembly()
100+
public void Should_Include_The_Test_Assembly_In_The_Filter_When_AppOptions_IncludeTestAssembly_And_Required()
99101
{
100102
var openCoverExeArgumentsProvider = new OpenCoverExeArgumentsProvider();
101103
var mockCoverageProject = SafeMockCoverageProject();
102104
mockCoverageProject.SetupGet(coverageProject => coverageProject.Settings.IncludeTestAssembly).Returns(true);
105+
mockCoverageProject.SetupGet(coverageProject => coverageProject.Settings.Include).Returns(new string[] { "[anassembly]*"});
103106
mockCoverageProject.SetupGet(coverageProject => coverageProject.ProjectName).Returns("TheTestName");
104107

105108
var arguments = openCoverExeArgumentsProvider.Provide(mockCoverageProject.Object, "");
106109

107-
AssertHasEscapedSetting(arguments, "-filter:+[TheTestName]*");
110+
var filters = GetFilters(arguments);
111+
Assert.That(filters, Is.EquivalentTo(new string[] { "+[TheTestName]*", "+[anassembly]*" }));
112+
}
113+
114+
[Test]
115+
public void Should_Not_Include_The_Test_Assembly_In_The_Filter_When_AppOptions_IncludeTestAssembly_And_No_Other_Includes()
116+
{
117+
var openCoverExeArgumentsProvider = new OpenCoverExeArgumentsProvider();
118+
var mockCoverageProject = SafeMockCoverageProject();
119+
mockCoverageProject.SetupGet(coverageProject => coverageProject.Settings.IncludeTestAssembly).Returns(true);
120+
mockCoverageProject.SetupGet(coverageProject => coverageProject.ProjectName).Returns("TheTestName");
121+
122+
var arguments = openCoverExeArgumentsProvider.Provide(mockCoverageProject.Object, "");
123+
124+
var filters = GetFilters(arguments);
125+
Assert.IsEmpty(GetFilters(arguments));
126+
}
127+
128+
[Test]
129+
public void Should_Not_Include_The_Test_Assembly_In_The_Filter_When_AppOptions_IncludeTestAssembly_And_Explicitly_Excluded()
130+
{
131+
var openCoverExeArgumentsProvider = new OpenCoverExeArgumentsProvider();
132+
var mockCoverageProject = SafeMockCoverageProject();
133+
mockCoverageProject.SetupGet(coverageProject => coverageProject.Settings.IncludeTestAssembly).Returns(true);
134+
mockCoverageProject.SetupGet(coverageProject => coverageProject.Settings.Include).Returns(new string[] { "[anassembly]*" });
135+
mockCoverageProject.SetupGet(coverageProject => coverageProject.Settings.Exclude).Returns(new string[] { "[TheTestName]*" });
136+
mockCoverageProject.SetupGet(coverageProject => coverageProject.ProjectName).Returns("TheTestName");
137+
138+
var arguments = openCoverExeArgumentsProvider.Provide(mockCoverageProject.Object, "");
139+
var filters = GetFilters(arguments);
140+
Assert.That(filters, Is.EquivalentTo(new string[] { "+[anassembly]*", "-[TheTestName]*" }));
141+
}
142+
143+
private IEnumerable<string> GetFilters(IEnumerable<string> arguments)
144+
{
145+
var filterMatch = "-filter:";
146+
var filter = arguments.FirstOrDefault(arg => arg.StartsWith($@"""{filterMatch}"));
147+
if (filter == null)
148+
{
149+
return Enumerable.Empty<string>();
150+
}
151+
if (!filter.EndsWith("\""))
152+
{
153+
throw new Exception("filter should be escaped");
154+
}
155+
return filter.Replace("\"", "").Substring(filterMatch.Length).Split(' ');
108156
}
109157

110158
[Test]

SharedProject/Core/OpenCover/OpenCoverExeArgumentsProvider.cs

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,6 @@ private static bool HasInclusions(IEnumerable<string> includes, List<IReferenced
6262
return includes.Any() || includedReferencedProjects.Any();
6363
}
6464

65-
66-
6765
private void AddFilter(ICoverageProject project, List<string> opencoverSettings)
6866
{
6967
var includes = SanitizeExcludesOrIncludes(project.Settings.Include);
@@ -94,28 +92,19 @@ List<string> GetExcludesOrIncludes(
9492
IEnumerable<string> excludesOrIncludes,IEnumerable<string> moduleExcludesOrIncludes, bool isInclude)
9593
{
9694
var excludeOrIncludeFilters = new List<string>();
97-
var prefix = IncludeSymbol(isInclude);
98-
//var sanitizedExcludesOrIncludes = SanitizeExcludesOrIncludes(excludesOrIncludes);
95+
var includeExcludeSymbol = isInclude ? "+" : "-";
9996

10097
foreach (var value in excludesOrIncludes)
10198
{
102-
excludeOrIncludeFilters.Add($@"{prefix}{value}");
99+
excludeOrIncludeFilters.Add($@"{includeExcludeSymbol}{value}");
103100
}
104101

105102
foreach (var moduleExcludeOrInclude in moduleExcludesOrIncludes)
106103
{
107-
excludeOrIncludeFilters.Add(IncludeOrExcludeModule(isInclude, moduleExcludeOrInclude));
104+
excludeOrIncludeFilters.Add($"{includeExcludeSymbol}[{moduleExcludeOrInclude}]*");
108105
}
109106
return excludeOrIncludeFilters.Distinct().ToList();
110107
}
111-
112-
string IncludeOrExcludeModule(bool include,string moduleFilter,string classFilter = "*")
113-
{
114-
var filter = IncludeSymbol(include);
115-
return $"{filter}[{moduleFilter}]{classFilter}";
116-
}
117-
118-
string IncludeSymbol(bool include) => include ? "+" : "-";
119108
}
120109

121110
private IEnumerable<string> SanitizeExcludesOrIncludes(IEnumerable<string> excludesOrIncludes)

0 commit comments

Comments
 (0)