Skip to content

Commit d4acf1a

Browse files
committed
Coverlet console
1 parent 7e0dd27 commit d4acf1a

File tree

2 files changed

+138
-20
lines changed

2 files changed

+138
-20
lines changed

FineCodeCoverageTests/CoverletConsole_Tests.cs

Lines changed: 88 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515

1616
namespace Test
1717
{
18-
1918
public class CoverletExeArgumentsProvider_Tests
2019
{
20+
private const string testProjectName = "TestProject";
2121
[Test]
2222
public void Should_Have_ExcludeByAttribute_Setting_For_Each_ExcludeByAttribute()
2323
{
@@ -43,12 +43,99 @@ public void Should_Unqualified_Qualified_ExcludeByAttribute()
4343
AssertHasSetting(coverletSettings, "--exclude-by-attribute ExcludeByAttribute1");
4444
}
4545

46+
[Test]
47+
public void Should_Not_Add_Test_Test_Assembly_To_Includes_When_IncludeTestAssembly_And_No_Other_Includes()
48+
{
49+
var mockCoverageProject = SafeMockCoverageProject();
50+
mockCoverageProject.SetupGet(cp => cp.Settings.IncludeTestAssembly).Returns(true);
51+
52+
var coverletExeArgumentsProvider = new CoverletExeArgumentsProvider();
53+
var coverletSettings = coverletExeArgumentsProvider.GetArguments(mockCoverageProject.Object);
54+
55+
Assert.IsFalse(HasIncludedTestAssemblySetting(coverletSettings));
56+
}
57+
58+
private bool HasIncludedTestAssemblySetting(List<string> coverletSettings)
59+
{
60+
return coverletSettings.Any(coverletSetting => coverletSetting == $@"--include ""[{testProjectName}]*""");
61+
}
62+
63+
[Test]
64+
public void Should_Add_Test_Test_Assembly_To_Includes_When_IncludeTestAssembly_And_Other_Includes()
65+
{
66+
var mockCoverageProject = SafeMockCoverageProject();
67+
mockCoverageProject.SetupGet(cp => cp.Settings.IncludeTestAssembly).Returns(true);
68+
mockCoverageProject.SetupGet(cp => cp.Settings.Include).Returns(new string[] { "[anassembly]*" });
69+
70+
var coverletExeArgumentsProvider = new CoverletExeArgumentsProvider();
71+
var coverletSettings = coverletExeArgumentsProvider.GetArguments(mockCoverageProject.Object);
72+
73+
Assert.IsTrue(HasIncludedTestAssemblySetting(coverletSettings));
74+
}
75+
76+
[Test]
77+
public void Should_Add_IncludedReferencedProjects_As_Include()
78+
{
79+
var mockCoverageProject = SafeMockCoverageProject();
80+
var mockReferencedProject = new Mock<IReferencedProject>();
81+
mockReferencedProject.SetupGet(rp => rp.AssemblyName).Returns("ReferencedProject");
82+
mockCoverageProject.SetupGet(cp => cp.IncludedReferencedProjects).Returns(new List<IReferencedProject> { mockReferencedProject.Object});
83+
84+
var coverletExeArgumentsProvider = new CoverletExeArgumentsProvider();
85+
var coverletSettings = coverletExeArgumentsProvider.GetArguments(mockCoverageProject.Object);
86+
87+
Assert.True(coverletSettings.Contains($@"--include ""[ReferencedProject]*"""));
88+
89+
}
90+
91+
[Test]
92+
public void Should_Include_From_Settings()
93+
{
94+
var mockCoverageProject = SafeMockCoverageProject();
95+
mockCoverageProject.SetupGet(cp => cp.Settings.Include).Returns(new string[]{ "[Include]*" });
96+
97+
var coverletExeArgumentsProvider = new CoverletExeArgumentsProvider();
98+
var coverletSettings = coverletExeArgumentsProvider.GetArguments(mockCoverageProject.Object);
99+
100+
Assert.True(coverletSettings.Contains($@"--include ""[Include]*"""));
101+
102+
}
103+
104+
public void Should_Add_ExcludedReferencedProjects_As_Exclude()
105+
{
106+
var mockCoverageProject = SafeMockCoverageProject();
107+
var mockReferencedProject = new Mock<IReferencedProject>();
108+
mockReferencedProject.SetupGet(rp => rp.AssemblyName).Returns("ReferencedProject");
109+
mockCoverageProject.SetupGet(cp => cp.ExcludedReferencedProjects).Returns(new List<IReferencedProject> { mockReferencedProject.Object });
110+
111+
var coverletExeArgumentsProvider = new CoverletExeArgumentsProvider();
112+
var coverletSettings = coverletExeArgumentsProvider.GetArguments(mockCoverageProject.Object);
113+
114+
Assert.True(coverletSettings.Contains($@"--exclude ""[ReferencedProject]*"""));
115+
116+
}
117+
118+
[Test]
119+
public void Should_Exclude_From_Settings()
120+
{
121+
var mockCoverageProject = SafeMockCoverageProject();
122+
mockCoverageProject.SetupGet(cp => cp.Settings.Exclude).Returns(new string[] { "[Exclude]*" });
123+
124+
var coverletExeArgumentsProvider = new CoverletExeArgumentsProvider();
125+
var coverletSettings = coverletExeArgumentsProvider.GetArguments(mockCoverageProject.Object);
126+
127+
Assert.True(coverletSettings.Contains($@"--exclude ""[Exclude]*"""));
128+
129+
}
130+
131+
46132
private Mock<ICoverageProject> SafeMockCoverageProject()
47133
{
48134
var mockCoverageProject = new Mock<ICoverageProject>();
49135
mockCoverageProject.SetupGet(coverageProject => coverageProject.IncludedReferencedProjects).Returns(new List<IReferencedProject>());
50136
mockCoverageProject.SetupGet(coverageProject => coverageProject.ExcludedReferencedProjects).Returns(new List<IReferencedProject>());
51137
mockCoverageProject.SetupGet(coverageProject => coverageProject.Settings).Returns(new Mock<IAppOptions>().Object);
138+
mockCoverageProject.Setup(coverageProject => coverageProject.ProjectName).Returns(testProjectName);
52139
return mockCoverageProject;
53140
}
54141

SharedProject/Core/Coverlet/Console/CoverletConsoleUtil.cs

Lines changed: 50 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,47 +18,78 @@ internal interface ICoverletExeArgumentsProvider
1818
[Export(typeof(ICoverletExeArgumentsProvider))]
1919
internal class CoverletExeArgumentsProvider : ICoverletExeArgumentsProvider
2020
{
21-
private IEnumerable<string> SanitizeExcludesOrIncludes(string[] excludesOrIncludes)
21+
private static IEnumerable<string> SanitizeExcludesByAttribute(string[] excludes)
2222
{
23-
return (excludesOrIncludes ?? new string[0])
23+
return (excludes ?? new string[0])
2424
.Where(x => x != null)
2525
.Select(x => x.Trim(' ', '\'', '\"'))
2626
.Where(x => !string.IsNullOrWhiteSpace(x));
2727
}
28-
public List<string> GetArguments(ICoverageProject project)
29-
{
30-
var coverletSettings = new List<string>();
31-
32-
coverletSettings.Add($@"""{project.TestDllFile}""");
33-
34-
coverletSettings.Add($@"--format ""cobertura""");
3528

36-
foreach (var value in (project.Settings.Exclude ?? new string[0]).Where(x => !string.IsNullOrWhiteSpace(x)))
29+
private static IEnumerable<string> SantitizeExcludeInclude(string[] excludesOrIncludes)
30+
{
31+
return (excludesOrIncludes ?? new string[0]).Where(x => !string.IsNullOrWhiteSpace(x)).Select(value =>
3732
{
38-
coverletSettings.Add($@"--exclude ""{value.Replace("\"", "\\\"").Trim(' ', '\'')}""");
39-
}
33+
return value.Replace("\"", "\\\"").Trim(' ', '\'');
34+
});
35+
}
4036

41-
foreach (var referencedProjectExcludedFromCodeCoverage in project.ExcludedReferencedProjects.Select(rp => rp.AssemblyName))
37+
private static void AddExcludesOrIncludes(List<string> coverletSettings, IEnumerable<string> excludesOrIncludes, bool isInclude)
38+
{
39+
foreach (var value in excludesOrIncludes)
4240
{
43-
coverletSettings.Add($@"--exclude ""[{referencedProjectExcludedFromCodeCoverage}]*""");
41+
coverletSettings.Add($@"--{(isInclude ? "include" : "exclude")} ""{value}""");
4442
}
43+
}
4544
46-
foreach (var value in (project.Settings.Include ?? new string[0]).Where(x => !string.IsNullOrWhiteSpace(x)))
45+
private static IEnumerable<string> AddTestAssemblyIfNecessary(
46+
IEnumerable<string> projectIncludes,
47+
IEnumerable<string> includes,
48+
string projectName)
49+
{
50+
var hasIncludes = projectIncludes.Any() || includes.Any();
51+
if(!hasIncludes)
4752
{
48-
coverletSettings.Add($@"--include ""{value.Replace("\"", "\\\"").Trim(' ', '\'')}""");
53+
return projectIncludes;
4954
}
55+
return projectIncludes.Concat(new string[] { projectName });
56+
}
5057
51-
foreach (var includedReferencedProject in project.IncludedReferencedProjects.Select(rp => rp.AssemblyName))
58+
private static void AddProjectExcludesOrIncludes(List<string> coverletSettings, IEnumerable<string> excludesOrIncludes, bool isInclude)
59+
{
60+
AddExcludesOrIncludes(coverletSettings, excludesOrIncludes.Select(excludeOrInclude => $"[{excludeOrInclude}]*"), isInclude);
61+
}
62+
63+
private static void AddExcludesIncludes(List<string> coverletSettings,ICoverageProject project)
64+
{
65+
AddExcludesOrIncludes(coverletSettings, SantitizeExcludeInclude(project.Settings.Exclude), false);
66+
AddProjectExcludesOrIncludes(coverletSettings, project.ExcludedReferencedProjects.Select(rp => rp.AssemblyName), false);
67+
var includes = SantitizeExcludeInclude(project.Settings.Include);
68+
AddExcludesOrIncludes(coverletSettings, includes, true);
69+
var projectIncludes = project.IncludedReferencedProjects.Select(rp => rp.AssemblyName);
70+
if (project.Settings.IncludeTestAssembly)
5271
{
53-
coverletSettings.Add($@"--include ""[{includedReferencedProject}]*""");
72+
projectIncludes = AddTestAssemblyIfNecessary(projectIncludes, includes, project.ProjectName);
5473
}
74+
AddProjectExcludesOrIncludes(coverletSettings, projectIncludes, true);
75+
}
76+
77+
public List<string> GetArguments(ICoverageProject project)
78+
{
79+
var coverletSettings = new List<string>();
80+
81+
coverletSettings.Add($@"""{project.TestDllFile}""");
82+
83+
coverletSettings.Add($@"--format ""cobertura""");
84+
85+
AddExcludesIncludes(coverletSettings, project);
5586
5687
foreach (var value in (project.Settings.ExcludeByFile ?? new string[0]).Where(x => !string.IsNullOrWhiteSpace(x)))
5788
{
5889
coverletSettings.Add($@"--exclude-by-file ""{value.Replace("\"", "\\\"").Trim(' ', '\'')}""");
5990
}
6091
61-
foreach (var value in SanitizeExcludesOrIncludes(project.Settings.ExcludeByAttribute).Select(EnsureAttributeTypeUnqualified))
92+
foreach (var value in SanitizeExcludesByAttribute(project.Settings.ExcludeByAttribute).Select(EnsureAttributeTypeUnqualified))
6293
{
6394
var withoutAttributeBrackets = value.Trim('[', ']');
6495
coverletSettings.Add($@"--exclude-by-attribute {value}");

0 commit comments

Comments
 (0)