From 3c896c24cdd134197a4c41d0e343e18b5fe8ee3e Mon Sep 17 00:00:00 2001 From: Costin Zaharia Date: Sat, 21 Mar 2020 23:56:10 +0100 Subject: [PATCH] Add support for line branch coverage for OpenCover Fixes #769 --- .../Reporters/OpenCoverReporter.cs | 8 ++- .../Reporters/OpenCoverReporterTests.cs | 67 ++++++++++++++++++- 2 files changed, 71 insertions(+), 4 deletions(-) diff --git a/src/coverlet.core/Reporters/OpenCoverReporter.cs b/src/coverlet.core/Reporters/OpenCoverReporter.cs index 4a5c61005..3c4c66b45 100644 --- a/src/coverlet.core/Reporters/OpenCoverReporter.cs +++ b/src/coverlet.core/Reporters/OpenCoverReporter.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; @@ -113,6 +112,9 @@ public string Report(CoverageResult result) foreach (var lines in meth.Value.Lines) { + var lineBranches = meth.Value.Branches.Where(branchInfo => branchInfo.Line == lines.Key).ToArray(); + var branchCoverage = summary.CalculateBranchCoverage(lineBranches); + XElement sequencePoint = new XElement("SequencePoint"); sequencePoint.Add(new XAttribute("vc", lines.Value.ToString())); sequencePoint.Add(new XAttribute("uspid", lines.Key.ToString())); @@ -121,8 +123,8 @@ public string Report(CoverageResult result) sequencePoint.Add(new XAttribute("sc", "1")); sequencePoint.Add(new XAttribute("el", lines.Key.ToString())); sequencePoint.Add(new XAttribute("ec", "2")); - sequencePoint.Add(new XAttribute("bec", "0")); - sequencePoint.Add(new XAttribute("bev", "0")); + sequencePoint.Add(new XAttribute("bec", branchCoverage.Total)); + sequencePoint.Add(new XAttribute("bev", branchCoverage.Covered)); sequencePoint.Add(new XAttribute("fileid", i.ToString())); sequencePoints.Add(sequencePoint); diff --git a/test/coverlet.core.tests/Reporters/OpenCoverReporterTests.cs b/test/coverlet.core.tests/Reporters/OpenCoverReporterTests.cs index 7d3e520bd..f614d72b4 100644 --- a/test/coverlet.core.tests/Reporters/OpenCoverReporterTests.cs +++ b/test/coverlet.core.tests/Reporters/OpenCoverReporterTests.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; @@ -45,6 +44,30 @@ public void TestFilesHaveUniqueIdsOverMultipleModules() Assert.Contains(@"", xml); } + [Fact] + public void TestLineBranchCoverage() + { + var result = new CoverageResult + { + Identifier = Guid.NewGuid().ToString(), + Modules = new Modules { {"Coverlet.Core.Reporters.Tests", CreateBranchCoverageDocuments()} } + }; + + var xml = new OpenCoverReporter().Report(result); + + // Line 1: Two branches, no coverage (bec = 2, bev = 0) + Assert.Contains(@"", xml); + + // Line 2: Two branches, one covered (bec = 2, bev = 1) + Assert.Contains(@"", xml); + + // Line 3: Two branches, all covered (bec = 2, bev = 2) + Assert.Contains(@"", xml); + + // Line 4: Three branches, two covered (bec = 3, bev = 2) + Assert.Contains(@"", xml); + } + private static Documents CreateFirstDocuments() { Lines lines = new Lines(); @@ -92,5 +115,47 @@ private static Documents CreateSecondDocuments() return documents; } + + private static Documents CreateBranchCoverageDocuments() + { + var lines = new Lines + { + {1, 1}, + {2, 1}, + {3, 1}, + {4, 1}, + }; + + var branches = new Branches + { + // Two branches, no coverage + new BranchInfo {Line = 1, Hits = 0, Offset = 23, EndOffset = 24, Path = 0, Ordinal = 1}, + new BranchInfo {Line = 1, Hits = 0, Offset = 23, EndOffset = 27, Path = 1, Ordinal = 2}, + + // Two branches, one covered + new BranchInfo {Line = 2, Hits = 1, Offset = 40, EndOffset = 41, Path = 0, Ordinal = 3}, + new BranchInfo {Line = 2, Hits = 0, Offset = 40, EndOffset = 44, Path = 1, Ordinal = 4}, + + // Two branches, all covered + new BranchInfo {Line = 3, Hits = 1, Offset = 40, EndOffset = 41, Path = 0, Ordinal = 3}, + new BranchInfo {Line = 3, Hits = 3, Offset = 40, EndOffset = 44, Path = 1, Ordinal = 4}, + + // Three branches, two covered + new BranchInfo {Line = 4, Hits = 5, Offset = 40, EndOffset = 44, Path = 1, Ordinal = 4}, + new BranchInfo {Line = 4, Hits = 2, Offset = 40, EndOffset = 44, Path = 1, Ordinal = 4}, + new BranchInfo {Line = 4, Hits = 0, Offset = 40, EndOffset = 44, Path = 1, Ordinal = 4} + }; + + const string methodString = "System.Void Coverlet.Core.Reporters.Tests.OpenCoverReporterTests.TestReport()"; + var methods = new Methods + { + {methodString, new Method { Lines = lines, Branches = branches}} + }; + + return new Documents + { + {"doc.cs", new Classes {{"Coverlet.Core.Reporters.Tests.OpenCoverReporterTests", methods}}} + }; + } } } \ No newline at end of file