diff --git a/src/coverlet.core/CoverageDetails.cs b/src/coverlet.core/CoverageDetails.cs new file mode 100644 index 0000000..e83cfdb --- /dev/null +++ b/src/coverlet.core/CoverageDetails.cs @@ -0,0 +1,14 @@ +using System; + +namespace Coverlet.Core +{ + public class CoverageDetails + { + public double Covered { get; internal set; } + public int Total { get; internal set; } + public double Percent + { + get => Math.Round(Total == 0 ? Total : Covered / Total, 3); + } + } +} \ No newline at end of file diff --git a/src/coverlet.core/CoverageSummary.cs b/src/coverlet.core/CoverageSummary.cs index 4bf5a1f..81155c6 100644 --- a/src/coverlet.core/CoverageSummary.cs +++ b/src/coverlet.core/CoverageSummary.cs @@ -4,12 +4,6 @@ using System.Linq; namespace Coverlet.Core { - public class CoverageDetails - { - public double Covered { get; set; } - public int Total { get; set; } - public double Percent { get; set; } - } public class CoverageSummary { public CoverageDetails CalculateLineCoverage(Lines lines) @@ -17,8 +11,6 @@ namespace Coverlet.Core var details = new CoverageDetails(); details.Covered = lines.Where(l => l.Value.Hits > 0).Count(); details.Total = lines.Count; - double coverage = details.Total == 0 ? details.Total : details.Covered / details.Total; - details.Percent = Math.Round(coverage, 3); return details; } @@ -31,9 +23,6 @@ namespace Coverlet.Core details.Covered += methodCoverage.Covered; details.Total += methodCoverage.Total; } - - double coverage = details.Total == 0 ? details.Total : details.Covered / details.Total; - details.Percent = Math.Round(coverage, 3); return details; } @@ -46,9 +35,6 @@ namespace Coverlet.Core details.Covered += classCoverage.Covered; details.Total += classCoverage.Total; } - - double coverage = details.Total == 0 ? details.Total : details.Covered / details.Total; - details.Percent = Math.Round(coverage, 3); return details; } @@ -61,9 +47,6 @@ namespace Coverlet.Core details.Covered += documentCoverage.Covered; details.Total += documentCoverage.Total; } - - double coverage = details.Total == 0 ? details.Total : details.Covered / details.Total; - details.Percent = Math.Round(coverage, 3); return details; } @@ -76,9 +59,6 @@ namespace Coverlet.Core details.Covered += moduleCoverage.Covered; details.Total += moduleCoverage.Total; } - - double coverage = details.Total == 0 ? details.Total : details.Covered / details.Total; - details.Percent = Math.Round(coverage, 3); return details; } @@ -87,8 +67,6 @@ namespace Coverlet.Core var details = new CoverageDetails(); details.Covered = branchInfo.Count(bi => bi.Hits > 0); details.Total = branchInfo.Count; - double coverage = details.Total == 0 ? details.Total : details.Covered / details.Total; - details.Percent = Math.Round(coverage, 3); return details; } @@ -97,8 +75,6 @@ namespace Coverlet.Core var details = new CoverageDetails(); details.Covered = branches.Sum(b => b.Value.Where(bi => bi.Hits > 0).Count()); details.Total = branches.Sum(b => b.Value.Count()); - double coverage = details.Total == 0 ? details.Total : details.Covered / details.Total; - details.Percent = Math.Round(coverage, 3); return details; } @@ -111,9 +87,6 @@ namespace Coverlet.Core details.Covered += methodCoverage.Covered; details.Total += methodCoverage.Total; } - - double coverage = details.Total == 0 ? details.Total : details.Covered / details.Total; - details.Percent = Math.Round(coverage, 3); return details; } @@ -126,9 +99,6 @@ namespace Coverlet.Core details.Covered += classCoverage.Covered; details.Total += classCoverage.Total; } - - double coverage = details.Total == 0 ? details.Total : details.Covered / details.Total; - details.Percent = Math.Round(coverage, 3); return details; } @@ -141,9 +111,6 @@ namespace Coverlet.Core details.Covered += documentCoverage.Covered; details.Total += documentCoverage.Total; } - - double coverage = details.Total == 0 ? details.Total : details.Covered / details.Total; - details.Percent = Math.Round(coverage, 3); return details; } @@ -156,9 +123,6 @@ namespace Coverlet.Core details.Covered += moduleCoverage.Covered; details.Total += moduleCoverage.Total; } - - double coverage = details.Total == 0 ? details.Total : details.Covered / details.Total; - details.Percent = Math.Round(coverage, 3); return details; } @@ -167,7 +131,6 @@ namespace Coverlet.Core var details = new CoverageDetails(); details.Covered = lines.Any(l => l.Value.Hits > 0) ? 1 : 0; details.Total = 1; - details.Percent = details.Covered; return details; } @@ -181,9 +144,6 @@ namespace Coverlet.Core details.Covered += methodCoverage.Covered; } details.Total = methodsWithLines.Count(); - - double coverage = details.Total == 0 ? details.Total : details.Covered / details.Total; - details.Percent = Math.Round(coverage, 3); return details; } @@ -196,9 +156,6 @@ namespace Coverlet.Core details.Covered += classCoverage.Covered; details.Total += classCoverage.Total; } - - double coverage = details.Total == 0 ? details.Total : details.Covered / details.Total; - details.Percent = Math.Round(coverage, 3); return details; } @@ -211,9 +168,6 @@ namespace Coverlet.Core details.Covered += documentCoverage.Covered; details.Total += documentCoverage.Total; } - - double coverage = details.Total == 0 ? details.Total : details.Covered / details.Total; - details.Percent = Math.Round(coverage, 3); return details; } @@ -226,9 +180,6 @@ namespace Coverlet.Core details.Covered += moduleCoverage.Covered; details.Total += moduleCoverage.Total; } - - double coverage = details.Total == 0 ? details.Total : details.Covered / details.Total; - details.Percent = Math.Round(coverage, 3); return details; } } diff --git a/src/coverlet.core/Instrumentation/Instrumenter.cs b/src/coverlet.core/Instrumentation/Instrumenter.cs index 72a4b58..d6dd052 100644 --- a/src/coverlet.core/Instrumentation/Instrumenter.cs +++ b/src/coverlet.core/Instrumentation/Instrumenter.cs @@ -126,28 +126,25 @@ namespace Coverlet.Core.Instrumentation index += 3; } - if (targetedBranchPoints.Count() > 0) + foreach (var _branchTarget in targetedBranchPoints) { - foreach (var _branchTarget in targetedBranchPoints) - { - /* - * Skip branches with no sequence point reference for now. - * In this case for an anonymous class the compiler will dynamically create an Equals 'utility' method. - * The CecilSymbolHelper will create branch points with a start line of -1 and no document, which - * I am currently not sure how to handle. - */ - if (_branchTarget.StartLine == -1 || _branchTarget.Document == null) - continue; - - var target = AddInstrumentationCode(method, processor, instruction, _branchTarget); - foreach (var _instruction in processor.Body.Instructions) - ReplaceInstructionTarget(_instruction, instruction, target); + /* + * Skip branches with no sequence point reference for now. + * In this case for an anonymous class the compiler will dynamically create an Equals 'utility' method. + * The CecilSymbolHelper will create branch points with a start line of -1 and no document, which + * I am currently not sure how to handle. + */ + if (_branchTarget.StartLine == -1 || _branchTarget.Document == null) + continue; + + var target = AddInstrumentationCode(method, processor, instruction, _branchTarget); + foreach (var _instruction in processor.Body.Instructions) + ReplaceInstructionTarget(_instruction, instruction, target); - foreach (ExceptionHandler handler in processor.Body.ExceptionHandlers) - ReplaceExceptionHandlerBoundary(handler, instruction, target); + foreach (ExceptionHandler handler in processor.Body.ExceptionHandlers) + ReplaceExceptionHandlerBoundary(handler, instruction, target); - index += 3; - } + index += 3; } index++; @@ -171,7 +168,6 @@ namespace Coverlet.Core.Instrumentation document.Lines.Add(new Line { Number = i, Class = method.DeclaringType.FullName, Method = method.FullName }); } - // string flag = branchPoints.Count > 0 ? "B" : "L"; string marker = $"L,{document.Path},{sequencePoint.StartLine},{sequencePoint.EndLine}"; var pathInstr = Instruction.Create(OpCodes.Ldstr, _result.HitsFilePath); diff --git a/src/coverlet.core/Symbols/CecilSymbolHelper.cs b/src/coverlet.core/Symbols/CecilSymbolHelper.cs index 5925673..7b36e57 100644 --- a/src/coverlet.core/Symbols/CecilSymbolHelper.cs +++ b/src/coverlet.core/Symbols/CecilSymbolHelper.cs @@ -19,6 +19,7 @@ namespace Coverlet.Core.Symbols { private const int StepOverLineCode = 0xFEEFEE; private static readonly Regex IsMovenext = new Regex(@"\<[^\s>]+\>\w__\w(\w)?::MoveNext\(\)$", RegexOptions.Compiled | RegexOptions.ExplicitCapture); + public static List GetBranchPoints(MethodDefinition methodDefinition) { var list = new List(); @@ -56,7 +57,7 @@ namespace Coverlet.Core.Symbols var branchingInstructionLine = closestSeqPt.Maybe(x => x.StartLine, -1); var document = closestSeqPt.Maybe(x => x.Document.Url); - if (null == instruction.Next) + if (instruction.Next == null) return; if (!BuildPointsForConditionalBranch(list, instruction, branchingInstructionLine, document, branchOffset, pathCounter, instructions, ref ordinal, methodDefinition))