Skip to content

Commit 6212a3e

Browse files
committed
test CoberturaUtil / further FileLineCoverage tests
1 parent f21d026 commit 6212a3e

25 files changed

+533
-131
lines changed
Lines changed: 263 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,263 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using AutoMoq;
4+
using FineCodeCoverage.Core.Utilities;
5+
using FineCodeCoverage.Engine.Cobertura;
6+
using FineCodeCoverage.Engine.Model;
7+
using FineCodeCoverageTests.TestHelpers;
8+
using Moq;
9+
using NUnit.Framework;
10+
11+
namespace FineCodeCoverageTests
12+
{
13+
public class CoberturaUtil_Tests
14+
{
15+
[Test]
16+
public void Should_Populate_And_Sort_FileLineCoverage_From_Deserialized_Report()
17+
{
18+
var autoMoqer = new AutoMoqer();
19+
var reportPath = "reportpath";
20+
21+
var noHitsLine = new Line
22+
{
23+
Hits = 0,
24+
Number = 1
25+
};
26+
var partialHitsLine = new Line
27+
{
28+
Hits = 1,
29+
ConditionCoverage = "99% .....",
30+
Number = 2
31+
};
32+
var coveredLine = new Line
33+
{
34+
Hits = 1,
35+
ConditionCoverage = "100% .....",
36+
Number = 3
37+
};
38+
var noConditionCoverageLine = new Line
39+
{
40+
Hits = 1,
41+
Number = 4
42+
};
43+
var coverageReport = new CoverageReport
44+
{
45+
Packages = new Packages
46+
{
47+
Package = new List<Package>
48+
{
49+
new Package
50+
{
51+
Classes = new Classes
52+
{
53+
Class = new List<Class>
54+
{
55+
new Class
56+
{
57+
Filename = "filename",
58+
Lines = new Lines
59+
{
60+
Line = new List<Line>
61+
{
62+
noHitsLine,
63+
partialHitsLine,
64+
coveredLine,
65+
noConditionCoverageLine
66+
}
67+
}
68+
}
69+
}
70+
}
71+
}
72+
}
73+
}
74+
};
75+
autoMoqer.Setup<ICoberturaDeserializer, CoverageReport>(x => x.Deserialize(reportPath)).Returns(coverageReport);
76+
var mockFileLineCoverage = new Mock<IFileLineCoverage>();
77+
var expectedLines = new List<ILine>
78+
{
79+
CreateExpectedLine(1, CoverageType.NotCovered),
80+
CreateExpectedLine(2, CoverageType.Partial),
81+
CreateExpectedLine(3, CoverageType.Covered),
82+
CreateExpectedLine(4, CoverageType.Covered)
83+
};
84+
var sorted = false;
85+
mockFileLineCoverage.Setup(fileLineCoverage => fileLineCoverage.Add("filename", MoqMatchers.EnumerableExpected(
86+
expectedLines,
87+
(a, b) => a.Number == b.Number && a.CoverageType == b.CoverageType)
88+
)).Callback(() => Assert.That(sorted, Is.False));
89+
mockFileLineCoverage.Setup(fileLineCoverage => fileLineCoverage.Sort()).Callback(() => sorted = true);
90+
91+
autoMoqer.Setup<IFileLineCoverageFactory, IFileLineCoverage>(fileLineCoverageFactory => fileLineCoverageFactory.Create())
92+
.Returns(mockFileLineCoverage.Object);
93+
var coberturaUtil = autoMoqer.Create<CoberturaUtil>();
94+
95+
var processed = coberturaUtil.ProcessCoberturaXml(reportPath);
96+
97+
98+
Assert.That(processed, Is.SameAs(mockFileLineCoverage.Object));
99+
mockFileLineCoverage.VerifyAll();
100+
}
101+
102+
[Test]
103+
public void Should_Update_FileLineCoverage_When_File_Renamed()
104+
{
105+
var autoMoqer = new AutoMoqer();
106+
var mockFileRenameListener = autoMoqer.GetMock<IFileRenameListener>();
107+
Action<string, string> fileRenamedCallback = null;
108+
mockFileRenameListener.Setup(fileRenameListener => fileRenameListener.ListenForFileRename(It.IsAny<Action<string,string>>()))
109+
.Callback<Action<string, string>>(action => fileRenamedCallback = action);
110+
111+
var coverageReport = new CoverageReport
112+
{
113+
Packages = new Packages
114+
{
115+
Package = new List<Package>
116+
{
117+
118+
}
119+
}
120+
};
121+
autoMoqer.Setup<ICoberturaDeserializer, CoverageReport>(x => x.Deserialize(It.IsAny<string>())).Returns(coverageReport);
122+
var mockFileLineCoverage = new Mock<IFileLineCoverage>();
123+
autoMoqer.Setup<IFileLineCoverageFactory, IFileLineCoverage>(fileLineCoverageFactory => fileLineCoverageFactory.Create())
124+
.Returns(mockFileLineCoverage.Object);
125+
var coberturaUtil = autoMoqer.Create<CoberturaUtil>();
126+
127+
coberturaUtil.ProcessCoberturaXml("");
128+
fileRenamedCallback("oldfile", "newfile");
129+
130+
mockFileLineCoverage.Verify(fileLineCoverage => fileLineCoverage.UpdateRenamed("oldfile", "newfile"), Times.Once);
131+
132+
}
133+
134+
[Test]
135+
public void Should_Not_Throw_When_File_Renamed_And_No_Coverage()
136+
{
137+
var autoMoqer = new AutoMoqer();
138+
var mockFileRenameListener = autoMoqer.GetMock<IFileRenameListener>();
139+
mockFileRenameListener.Setup(fileRenameListener => fileRenameListener.ListenForFileRename(It.IsAny<Action<string, string>>()))
140+
.Callback<Action<string, string>>(action => action("",""));
141+
142+
var coberturaUtil = autoMoqer.Create<CoberturaUtil>();
143+
144+
145+
}
146+
147+
private void SourceFilesTest(
148+
Action<string[]> sourceFilesAssertion,
149+
List<Package> packages,
150+
string assemblyName,
151+
string qualifiedClassName,
152+
int file = -1)
153+
{
154+
var autoMoqer = new AutoMoqer();
155+
autoMoqer.Setup<IFileLineCoverageFactory, IFileLineCoverage>(fileLineCoverageFactory => fileLineCoverageFactory.Create())
156+
.Returns(new Mock<IFileLineCoverage>().Object);
157+
158+
var coverageReport = new CoverageReport
159+
{
160+
Packages = new Packages
161+
{
162+
Package = packages
163+
}
164+
};
165+
autoMoqer.Setup<ICoberturaDeserializer, CoverageReport>(x => x.Deserialize(It.IsAny<string>())).Returns(coverageReport);
166+
167+
var coberturaUtil = autoMoqer.Create<CoberturaUtil>();
168+
coberturaUtil.ProcessCoberturaXml("");
169+
170+
var sourceFiles = coberturaUtil.GetSourceFiles(assemblyName, qualifiedClassName, file);
171+
sourceFilesAssertion(sourceFiles);
172+
}
173+
174+
[Test]
175+
public void Should_Return_Empty_Source_Files_If_Assembly_Not_In_The_CoverageReport()
176+
{
177+
var packages = new List<Package>
178+
{
179+
new Package
180+
{
181+
Name = "otherassembly",
182+
Classes = new Classes
183+
{
184+
Class = new List<Class>
185+
{
186+
187+
}
188+
}
189+
}
190+
};
191+
192+
SourceFilesTest(sourceFiles => Assert.That(sourceFiles, Is.Empty), packages, "missingassembly", "qcn");
193+
}
194+
195+
private void AssemblyInReportTest(Action<string[]> sourceFilesAssertion, int fileIndex = -1)
196+
{
197+
var packages = new List<Package>
198+
{
199+
new Package
200+
{
201+
Name = "assembly",
202+
Classes = new Classes
203+
{
204+
Class = new List<Class>
205+
{
206+
new Class
207+
{
208+
Name = "qcn",
209+
Filename = "file1",
210+
Lines = new Lines
211+
{
212+
Line = new List<Line>{ }
213+
}
214+
},
215+
new Class
216+
{
217+
Name = "qcn",
218+
Filename = "file2",
219+
Lines = new Lines
220+
{
221+
Line = new List<Line>{ }
222+
}
223+
},
224+
new Class
225+
{
226+
Name = "other",
227+
Filename = "file3",
228+
Lines = new Lines
229+
{
230+
Line = new List<Line>{ }
231+
}
232+
}
233+
}
234+
}
235+
}
236+
};
237+
238+
SourceFilesTest(sourceFilesAssertion, packages, "assembly", "qcn",fileIndex);
239+
}
240+
241+
[Test]
242+
public void Should_Return_Source_Files_Of_All_Matching_Classes_When_FileIndex_Is_Minus1()
243+
{
244+
AssemblyInReportTest(sourceFiles => Assert.That(sourceFiles, Is.EqualTo(new List<string> { "file1", "file2"})));
245+
}
246+
247+
[TestCase(0)]
248+
[TestCase(1)]
249+
public void Should_Return_Single_SourceFile_When_FileIndex_Is_Not_Minus1(int fileIndex)
250+
{
251+
var expectedFile = fileIndex == 0 ? "file1" : "file2";
252+
AssemblyInReportTest(sourceFiles => Assert.That(sourceFiles, Is.EqualTo(new List<string> { expectedFile })),fileIndex);
253+
}
254+
255+
private static ILine CreateExpectedLine(int number, CoverageType coverageType)
256+
{
257+
var mockLine = new Mock<ILine>();
258+
mockLine.SetupGet(x => x.Number).Returns(number);
259+
mockLine.SetupGet(x => x.CoverageType).Returns(coverageType);
260+
return mockLine.Object;
261+
}
262+
}
263+
}

FineCodeCoverageTests/FileLineCoverage_Tests.cs

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,68 @@
1-
using System;
2-
using System.Collections.Generic;
1+
using System.Collections.Generic;
32
using System.Linq;
43
using FineCodeCoverage.Engine.Model;
4+
using Moq;
55
using NUnit.Framework;
66

77
namespace FineCodeCoverageTests
88
{
99
internal class FileLineCoverage_Tests
1010
{
11-
[TestCaseSource(nameof(Cases))]
11+
private static ILine CreateLine(int lineNumber, CoverageType coverageType = CoverageType.Covered)
12+
{
13+
var mockLine = new Mock<ILine>();
14+
mockLine.Setup(l => l.Number).Returns(lineNumber);
15+
mockLine.Setup(l => l.CoverageType).Returns(coverageType);
16+
return mockLine.Object;
17+
}
18+
19+
[TestCaseSource(nameof(Cases))]
1220
public void GetLines_Test(IEnumerable<int> lineNumbers, int startLineNumber, int endLineNumber, IEnumerable<int> expectedLineNumbers)
1321
{
1422
var fileLineCoverage = new FileLineCoverage();
15-
fileLineCoverage.Add("fp", lineNumbers.Select(n => new FineCodeCoverage.Engine.Cobertura.Line { Number = n }));
16-
fileLineCoverage.Completed();
23+
fileLineCoverage.Add("fp", lineNumbers.Select((n => CreateLine(n))));
24+
fileLineCoverage.Sort();
1725

1826
var lines = fileLineCoverage.GetLines("fp", startLineNumber, endLineNumber);
1927
Assert.That(lines.Select(l => l.Number), Is.EqualTo(expectedLineNumbers));
2028
}
2129

30+
[Test]
31+
public void Should_Get_Empty_Lines_For_File_Not_In_Report()
32+
{
33+
var fileLineCoverage = new FileLineCoverage();
34+
35+
var lines = fileLineCoverage.GetLines("", 1, 2);
36+
37+
Assert.That(lines, Is.Empty);
38+
}
39+
40+
[Test]
41+
public void Should_Should_Not_Throw_When_File_Renamed_Not_In_Report()
42+
{
43+
var fileLineCoverage = new FileLineCoverage();
44+
fileLineCoverage.UpdateRenamed("old", "new");
45+
}
46+
47+
[Test]
48+
public void Should_Rename_When_FileName_Changes()
49+
{
50+
var fileLineCoverage = new FileLineCoverage();
51+
var lines = new[] { CreateLine(1), CreateLine(2) };
52+
fileLineCoverage.Add("old", lines);
53+
AssertLines("old");
54+
55+
fileLineCoverage.UpdateRenamed("old", "new");
56+
AssertLines("new");
57+
Assert.That(fileLineCoverage.GetLines("old"), Is.Empty);
58+
59+
void AssertLines(string fileName)
60+
{
61+
var allLines = fileLineCoverage.GetLines(fileName);
62+
Assert.That(allLines, Is.EqualTo(lines));
63+
}
64+
}
65+
2266
static readonly object[] Cases =
2367
{
2468
new object[] { new int[] { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}, 19, 20, new int[]{ 19,20} },

FineCodeCoverageTests/FineCodeCoverageTests.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
<Reference Include="WindowsBase" />
6161
</ItemGroup>
6262
<ItemGroup>
63+
<Compile Include="CoberturaUtil_Tests.cs" />
6364
<Compile Include="CoverageToolOutput_Tests\AppOptionsCoverageToolOutputFolderSolutionProvider_Tests.cs" />
6465
<Compile Include="CoverageToolOutput_Tests\CoverageToolOutputFolderFromSolutionProvider_Tests.cs" />
6566
<Compile Include="CoverageToolOutput_Tests\CoverageToolOutputManager_Tests.cs" />
@@ -149,6 +150,7 @@
149150
<Compile Include="TestHelpers\MefOrderAssertions.cs" />
150151
<Compile Include="TestHelpers\MoqAssertionsHelper.cs" />
151152
<Compile Include="TestHelpers\MoqExtensions.cs" />
153+
<Compile Include="TestHelpers\MoqMatchers.cs" />
152154
<Compile Include="TestHelpers\TestThreadHelper.cs" />
153155
<Compile Include="TestHelpers\XmlAssert.cs" />
154156
<Compile Include="ToolFolder_Tests.cs" />
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using Moq;
5+
6+
namespace FineCodeCoverageTests.TestHelpers
7+
{
8+
internal static class MoqMatchers
9+
{
10+
internal static IEnumerable<T> EnumerableExpected<T>(IEnumerable<T> expected, Func<T, T, bool> comparer)
11+
{
12+
return Match.Create<IEnumerable<T>>(enumerableArg =>
13+
{
14+
var list = enumerableArg.ToList();
15+
var expectedList = expected.ToList();
16+
if (list.Count != expectedList.Count)
17+
{
18+
return false;
19+
}
20+
for (var i = 0; i < list.Count; i++)
21+
{
22+
if (!comparer(list[i], expectedList[i]))
23+
{
24+
return false;
25+
}
26+
}
27+
return true;
28+
});
29+
}
30+
}
31+
}

0 commit comments

Comments
 (0)