Skip to content

Commit 8806100

Browse files
author
Kester Maddock
committed
Moved FileLineCoverage to FineCodeCoverage.Engine.Model namespace. Extracted LowerBound extension method
1 parent 7708ee8 commit 8806100

File tree

11 files changed

+40
-31
lines changed

11 files changed

+40
-31
lines changed

FineCodeCoverageTests/FCCEngine_Tests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
using FineCodeCoverage.Options;
1616
using Moq;
1717
using NUnit.Framework;
18-
using SharedProject.Core.Model;
1918

2019
namespace Test
2120
{
@@ -355,6 +354,7 @@ private void VerifyLogsReloadCoverageStatus(ReloadCoverageStatus reloadCoverageS
355354
mockReportGenerator.Setup(rg => rg.ProcessUnifiedHtml("Unified", It.IsAny<string>())).Returns(reportGeneratedHtmlContent);
356355
var coverageLines = new FileLineCoverage();
357356
coverageLines.Add("test", new[] { new Line() });
357+
coverageLines.Completed();
358358
mocker.GetMock<ICoberturaUtil>().Setup(coberturaUtil => coberturaUtil.ProcessCoberturaXml(It.IsAny<string>())).Returns(coverageLines);
359359
if (noCoverageProjects)
360360
{
@@ -388,6 +388,7 @@ private async Task ThrowReadingReportHtml()
388388

389389
var coverageLines = new FileLineCoverage();
390390
coverageLines.Add("test", new[] { new Line() });
391+
coverageLines.Completed();
391392
mocker.GetMock<ICoberturaUtil>().Setup(coberturaUtil => coberturaUtil.ProcessCoberturaXml(It.IsAny<string>())).Returns(coverageLines);
392393

393394
await ReloadInitializedCoverage(passedProject.Object);

SharedProject/Core/Cobertura/CoberturaUtil.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
using System.IO;
88
using System.Windows.Documents;
99
using System;
10-
using SharedProject.Core.Model;
1110

1211
namespace FineCodeCoverage.Engine.Cobertura
1312
{
@@ -85,7 +84,8 @@ public FileLineCoverage ProcessCoberturaXml(string xmlFile)
8584
}
8685
}
8786

88-
return coverageLines;
87+
coverageLines.Completed();
88+
return coverageLines;
8989
}
9090

9191
public string[] GetSourceFiles(string assemblyName, string qualifiedClassName, int file)

SharedProject/Core/Cobertura/ICoberturaUtil.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System.Collections.Generic;
22
using FineCodeCoverage.Engine.Model;
3-
using SharedProject.Core.Model;
43

54
namespace FineCodeCoverage.Engine.Cobertura
65
{

SharedProject/Core/FCCEngine.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,14 @@
1212
using FineCodeCoverage.Impl;
1313
using FineCodeCoverage.Options;
1414
using FineCodeCoverage.Output;
15-
using SharedProject.Core.Model;
1615

1716
namespace FineCodeCoverage.Engine
1817
{
1918
internal enum ReloadCoverageStatus { Start, Done, Cancelled, Error, Initializing };
2019

2120
internal class NewCoverageLinesMessage
2221
{
23-
public SharedProject.Core.Model.FileLineCoverage CoverageLines { get; set; }
22+
public FileLineCoverage CoverageLines { get; set; }
2423
}
2524

2625
internal class DisplayCoverageResultState
@@ -225,11 +224,11 @@ private void UpdateUI(FileLineCoverage coverageLines, string reportHtml)
225224
var result = await reportGeneratorUtil.GenerateAsync(coverOutputFiles,reportOutputFolder,vsShutdownLinkedCancellationToken);
226225

227226
vsShutdownLinkedCancellationToken.ThrowIfCancellationRequested();
228-
logger.Log($"Processing cobertura");
227+
logger.Log("Processing cobertura");
229228
var coverageLines = coberturaUtil.ProcessCoberturaXml(result.UnifiedXmlFile);
230229

231230
vsShutdownLinkedCancellationToken.ThrowIfCancellationRequested();
232-
logger.Log($"Processing report");
231+
logger.Log("Processing report");
233232
string processedReport = reportGeneratorUtil.ProcessUnifiedHtml(result.UnifiedHtml, reportOutputFolder);
234233
return (coverageLines, processedReport);
235234
}
Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
11
using FineCodeCoverage.Engine.Cobertura;
2-
using FineCodeCoverage.Engine.Model;
3-
using Newtonsoft.Json.Linq;
42
using System;
53
using System.Collections.Generic;
64
using System.Linq;
7-
using System.Text;
8-
using System.Windows.Documents;
9-
using System.Windows.Media;
105

11-
namespace SharedProject.Core.Model
6+
namespace FineCodeCoverage.Engine.Model
127
{
138
// FileLineCoverage maps from a filename to the list of lines in the file
149
internal class FileLineCoverage
@@ -18,29 +13,48 @@ internal class FileLineCoverage
1813

1914
public void Add(string filename, IEnumerable<Line> lines)
2015
{
21-
if (!m_coverageLines.TryGetValue(filename, out var classCoverageLines))
16+
if (!m_coverageLines.TryGetValue(filename, out var fileCoverageLines))
2217
{
23-
classCoverageLines = new List<Line>();
24-
m_coverageLines.Add(filename, classCoverageLines);
18+
fileCoverageLines = new List<Line>();
19+
m_coverageLines.Add(filename, fileCoverageLines);
2520
}
2621

27-
classCoverageLines.AddRange(lines);
28-
classCoverageLines.Sort((a, b) => a.Number - b.Number);
22+
fileCoverageLines.AddRange(lines);
23+
}
24+
25+
internal void Completed()
26+
{
27+
foreach (var lines in m_coverageLines.Values)
28+
lines.Sort((a, b) => a.Number - b.Number);
2929
}
3030

3131
public IEnumerable<Line> GetLines(string filePath, int startLineNumber, int endLineNumber)
3232
{
3333
if (!m_coverageLines.TryGetValue(filePath, out var lines))
34-
yield break;
34+
return Enumerable.Empty<Line>();
3535

36+
int first = lines.LowerBound(line => line.Number < startLineNumber);
37+
int last = first;
38+
while (last < lines.Count && lines[last].Number <= endLineNumber)
39+
++last;
40+
41+
return lines.GetRange(first, last);
42+
}
43+
}
44+
45+
public static class ListExtensions
46+
{
47+
// Returns the index of the first element in a sorted list where the comparison function is false
48+
public static int LowerBound<T>(this IList<T> list, Func<T, bool> compare)
49+
{
3650
// binary search to find the first line
3751
int first = 0;
38-
int count = lines.Count;
52+
int count = list.Count;
3953
while (count > 0)
4054
{
4155
int step = count / 2;
4256
int it = first + step;
43-
if (lines[it].Number < startLineNumber)
57+
if (compare(list[it]))
4458
{
4559
first = ++it;
4660
count -= step + 1;
@@ -51,8 +65,7 @@ public IEnumerable<Line> GetLines(string filePath, int startLineNumber, int endL
5165
}
5266
}
5367

54-
for (int it = first; it < lines.Count && lines[it].Number <= endLineNumber; ++it)
55-
yield return lines[it];
68+
return first;
5669
}
5770
}
5871
}

SharedProject/Impl/CoverageColour/GlyphMargin/CoverageLineGlyphTagger.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace FineCodeCoverage.Impl
88
{
99
internal class CoverageLineGlyphTagger : CoverageLineTaggerBase<CoverageLineGlyphTag>, IListener<RefreshCoverageGlyphsMessage>
1010
{
11-
public CoverageLineGlyphTagger(ITextBuffer textBuffer, SharedProject.Core.Model.FileLineCoverage lastCoverageLines) : base(textBuffer, lastCoverageLines)
11+
public CoverageLineGlyphTagger(ITextBuffer textBuffer, FileLineCoverage lastCoverageLines) : base(textBuffer, lastCoverageLines)
1212
{
1313
}
1414

SharedProject/Impl/CoverageColour/GlyphMargin/CoverageLineGlyphTaggerProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ protected override void NewCoverageLinesMessageReceived()
4141
});
4242
}
4343

44-
protected override CoverageLineGlyphTagger CreateTagger(ITextBuffer textBuffer, SharedProject.Core.Model.FileLineCoverage lastCoverageLines)
44+
protected override CoverageLineGlyphTagger CreateTagger(ITextBuffer textBuffer, FileLineCoverage lastCoverageLines)
4545
{
4646
return new CoverageLineGlyphTagger(textBuffer, lastCoverageLines);
4747
}

SharedProject/Impl/CoverageColour/MarginBase/CoverageLineTaggerBase.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using FineCodeCoverage.Engine.Model;
33
using Microsoft.VisualStudio.Text;
44
using Microsoft.VisualStudio.Text.Tagging;
5-
using SharedProject.Core.Model;
65
using System;
76
using System.Collections.Generic;
87
using System.Linq;
@@ -34,7 +33,7 @@ protected virtual void RaiseTagsChanged()
3433
}
3534

3635
private IEnumerable<Engine.Cobertura.Line> GetApplicableLines(string filePath, int startLineNumber, int endLineNumber)
37-
=> coverageLines.GetLines(filePath, startLineNumber, endLineNumber).ToArray();
36+
=> coverageLines.GetLines(filePath, startLineNumber, endLineNumber);
3837

3938
public void Handle(NewCoverageLinesMessage message)
4039
{

SharedProject/Impl/CoverageColour/MarginBase/CoverageLineTaggerProviderBase.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using FineCodeCoverage.Engine.Model;
44
using Microsoft.VisualStudio.Text;
55
using Microsoft.VisualStudio.Text.Tagging;
6-
using SharedProject.Core.Model;
76
using System.Collections.Generic;
87

98
namespace FineCodeCoverage.Impl

SharedProject/Impl/CoverageColour/OverviewMargin/CoverageLineMarkTagger.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace FineCodeCoverage.Impl
1010
internal class CoverageLineMarkTagger : CoverageLineTaggerBase<OverviewMarkTag>, IListener<CoverageMarginOptionsChangedMessage>
1111
{
1212
private ICoverageMarginOptions coverageMarginOptions;
13-
public CoverageLineMarkTagger(ITextBuffer textBuffer, SharedProject.Core.Model.FileLineCoverage lastCoverageLines, ICoverageMarginOptions coverageMarginOptions) :
13+
public CoverageLineMarkTagger(ITextBuffer textBuffer, FileLineCoverage lastCoverageLines, ICoverageMarginOptions coverageMarginOptions) :
1414
base(textBuffer, lastCoverageLines)
1515
{
1616
this.coverageMarginOptions = coverageMarginOptions;

0 commit comments

Comments
 (0)