Skip to content

Commit e997af3

Browse files
authored
Merge pull request #431 from tonyhallett/fix-nested-class-colouring
remove duplicate coverage lines
2 parents 7d401cf + dce078f commit e997af3

File tree

3 files changed

+49
-40
lines changed

3 files changed

+49
-40
lines changed

FineCodeCoverageTests/FileLineCoverage_Tests.cs

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,24 @@ private static ILine CreateLine(int lineNumber, CoverageType coverageType = Cove
1616
return mockLine.Object;
1717
}
1818

19-
[TestCaseSource(nameof(Cases))]
20-
public void GetLines_Test(IEnumerable<int> lineNumbers, int startLineNumber, int endLineNumber, IEnumerable<int> expectedLineNumbers)
19+
[Test]
20+
public void Should_Return_Distinct_Sorted_Lines()
2121
{
2222
var fileLineCoverage = new FileLineCoverage();
23-
fileLineCoverage.Add("fp", lineNumbers.Select((n => CreateLine(n))));
23+
fileLineCoverage.Add("file1", new[] { CreateLine(2), CreateLine(1), CreateLine(3),CreateLine(1) });
2424
fileLineCoverage.Sort();
2525

26-
var lines = fileLineCoverage.GetLines("fp", startLineNumber, endLineNumber);
27-
Assert.That(lines.Select(l => l.Number), Is.EqualTo(expectedLineNumbers));
26+
var lines = fileLineCoverage.GetLines("file1");
27+
28+
Assert.That(lines.Select(l => l.Number), Is.EqualTo(new int[] { 1,2,3}));
2829
}
2930

3031
[Test]
3132
public void Should_Get_Empty_Lines_For_File_Not_In_Report()
3233
{
3334
var fileLineCoverage = new FileLineCoverage();
3435

35-
var lines = fileLineCoverage.GetLines("", 1, 2);
36+
var lines = fileLineCoverage.GetLines("");
3637

3738
Assert.That(lines, Is.Empty);
3839
}
@@ -50,6 +51,7 @@ public void Should_Rename_When_FileName_Changes()
5051
var fileLineCoverage = new FileLineCoverage();
5152
var lines = new[] { CreateLine(1), CreateLine(2) };
5253
fileLineCoverage.Add("old", lines);
54+
fileLineCoverage.Sort();
5355
AssertLines("old");
5456

5557
fileLineCoverage.UpdateRenamed("old", "new");
@@ -62,18 +64,5 @@ void AssertLines(string fileName)
6264
Assert.That(allLines, Is.EqualTo(lines));
6365
}
6466
}
65-
66-
static readonly object[] Cases =
67-
{
68-
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} },
69-
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}, 12, 13, new int[]{ 12,13} },
70-
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}, 6, 7, new int[]{ 6,7} },
71-
new object[] {Enumerable.Empty<int>(), 0, 4,Enumerable.Empty<int>() },
72-
new object[] { new int[] { 3,2,1}, 0, 4, new int[]{ 1,2,3} },
73-
new object[] { new int[] { 3,2,1}, 0, 3, new int[]{ 1,2,3} },
74-
new object[] { new int[] { 3,2,1}, 1, 2, new int[]{ 1,2} },
75-
new object[] { new int[] { 3,2,1}, 2, 2, new int[]{ 2} },
76-
new object[] { new int[] { 3,2,1}, 4, 5, Enumerable.Empty<int>() }
77-
};
7867
}
7968
}

SharedProject/Core/Cobertura/FileLineCoverage.cs

Lines changed: 41 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,54 @@
1-
using FineCodeCoverage.Core.Utilities;
2-
using FineCodeCoverage.Impl;
3-
using System;
1+
using System;
42
using System.Collections.Generic;
53
using System.Linq;
64

75
namespace FineCodeCoverage.Engine.Model
86
{
7+
8+
internal class UniqueCoverageLines : HashSet<ILine>
9+
{
10+
public UniqueCoverageLines() : base(new LineComparer())
11+
{
12+
}
13+
14+
public void AddRange(IEnumerable<ILine> lines)
15+
{
16+
foreach (var line in lines)
17+
Add(line);
18+
}
19+
20+
private IEnumerable<ILine> sortedLines;
21+
public IEnumerable<ILine> SortedLines => sortedLines;
22+
23+
public void Sort()
24+
{
25+
sortedLines = this.OrderBy(l => l.Number).ToList();
26+
}
27+
28+
class LineComparer : IEqualityComparer<ILine>
29+
{
30+
public bool Equals(ILine x, ILine y)
31+
{
32+
return x.Number == y.Number;
33+
}
34+
35+
public int GetHashCode(ILine obj)
36+
{
37+
return obj.Number;
38+
}
39+
}
40+
}
41+
942
// FileLineCoverage maps from a filename to the list of lines in the file
1043
internal class FileLineCoverage : IFileLineCoverage
1144
{
12-
private readonly Dictionary<string, List<ILine>> m_coverageLines = new Dictionary<string, List<ILine>>(StringComparer.OrdinalIgnoreCase);
45+
private readonly Dictionary<string, UniqueCoverageLines> m_coverageLines = new Dictionary<string, UniqueCoverageLines>(StringComparer.OrdinalIgnoreCase);
1346

1447
public void Add(string filename, IEnumerable<ILine> lines)
1548
{
1649
if (!m_coverageLines.TryGetValue(filename, out var fileCoverageLines))
1750
{
18-
fileCoverageLines = new List<ILine>();
51+
fileCoverageLines = new UniqueCoverageLines();
1952
m_coverageLines.Add(filename, fileCoverageLines);
2053
}
2154

@@ -25,30 +58,18 @@ public void Add(string filename, IEnumerable<ILine> lines)
2558
public void Sort()
2659
{
2760
foreach (var lines in m_coverageLines.Values)
28-
lines.Sort((a, b) => a.Number - b.Number);
61+
lines.Sort();
2962
}
3063

3164
public IEnumerable<ILine> GetLines(string filePath)
3265
{
3366
if (!m_coverageLines.TryGetValue(filePath, out var lines))
3467
{
35-
lines = Enumerable.Empty<ILine>().ToList();
68+
return Enumerable.Empty<ILine>().ToList();
3669
}
37-
return lines;
70+
return lines.SortedLines;
3871

3972
}
40-
public IEnumerable<ILine> GetLines(string filePath, int startLineNumber, int endLineNumber)
41-
{
42-
if (!m_coverageLines.TryGetValue(filePath, out var lines))
43-
yield break;
44-
45-
int first = lines.LowerBound(line => startLineNumber - line.Number);
46-
if (first != -1)
47-
{
48-
for (int it = first; it < lines.Count && lines[it].Number <= endLineNumber; ++it)
49-
yield return lines[it];
50-
}
51-
}
5273

5374
public void UpdateRenamed(string oldFilePath, string newFilePath)
5475
{

SharedProject/Core/Cobertura/IFileLineCoverage.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ namespace FineCodeCoverage.Engine.Model
55
internal interface IFileLineCoverage
66
{
77
void Add(string filename, IEnumerable<ILine> line);
8-
IEnumerable<ILine> GetLines(string filePath, int startLineNumber, int endLineNumber);
98
IEnumerable<ILine> GetLines(string filePath);
109
void Sort();
1110
void UpdateRenamed(string oldFile, string newFile);

0 commit comments

Comments
 (0)