diff --git a/AltCover.Engine/Visitor.fs b/AltCover.Engine/Visitor.fs index 9c953d266..7794c0544 100644 --- a/AltCover.Engine/Visitor.fs +++ b/AltCover.Engine/Visitor.fs @@ -495,7 +495,7 @@ module internal CoverageParameters = String.Empty ] configurationHash <- - String.Join("\n", components) + String.Join("\n", components).TrimEnd() |> System.Text.Encoding.ASCII.GetBytes |> hash.ComputeHash |> Convert.ToBase64String @@ -1444,7 +1444,8 @@ module internal Visitor = OpCodes.Br OpCodes.Br_S OpCodes.Leave - OpCodes.Leave_S ] + OpCodes.Leave_S + OpCodes.Nop ] ) let internal isNonTrivialSeqPnt (dbg: MethodDebugInformation) (x: Instruction) = @@ -1452,16 +1453,21 @@ module internal Visitor = let rest = Seq.unfold (fun (i: Instruction) -> - if i |> dbg.GetSequencePoint |> isNull then + if + i |> isNull + || i |> dbg.GetSequencePoint |> isNull |> not + then None else - Some(i, i)) + Some(i, i.Next)) x.Next - x :: (rest |> Seq.toList) - |> List.forall (fun v -> trivial.Contains v.OpCode) - |> not + let nt = + x :: (rest |> Seq.toList) + |> List.filter (fun v -> v.OpCode |> trivial.Contains |> not) + |> List.tryHead + Option.isSome nt else true diff --git a/AltCover.Tests/Expecto.fs b/AltCover.Tests/Expecto.fs index 9b64812cc..8ba670d53 100644 --- a/AltCover.Tests/Expecto.fs +++ b/AltCover.Tests/Expecto.fs @@ -418,6 +418,8 @@ module ExpectoTestManifest = "Tests.FullMethodNamesAreExtracted" Tests.AltCoverTests.ShouldGenerateExpectedXmlReportFromDotNet, "Tests.ShouldGenerateExpectedXmlReportFromDotNet" + Tests.AltCoverTests.ShouldGenerateExpectedXmlReportWithoutTriviaFromDotNet, + "Tests.ShouldGenerateExpectedXmlReportWithoutTriviaFromDotNet" Tests.AltCoverTests.ShouldGenerateExpectedXmlReportWithEmbeds, "Tests.ShouldGenerateExpectedXmlReportFromWithEmbeds" Tests.AltCoverTests.ShouldGenerateExpectedXmlReportWithPartials, diff --git a/AltCover.Tests/Tests.fs b/AltCover.Tests/Tests.fs index b6af6c3cf..e5f7e3358 100644 --- a/AltCover.Tests/Tests.fs +++ b/AltCover.Tests/Tests.fs @@ -3347,6 +3347,20 @@ module AltCoverTests = +" + + let TriviaBaseline = + " + + + + + + + + + + " let rec private recursiveValidate result expected depth zero = @@ -3441,6 +3455,60 @@ module AltCoverTests = finally CoverageParameters.nameFilters.Clear() + [] + let ShouldGenerateExpectedXmlReportWithoutTriviaFromDotNet () = + let visitor, document = + Report.reportGenerator () + + let path = sample1path + + try + "Main" + |> (Regex + >> FilterRegex.Exclude + >> FilterClass.Build FilterScope.Method + >> CoverageParameters.nameFilters.Add) + + CoverageParameters.trivia.Value <- true + + Visitor.visit + [ visitor ] + (Visitor.I.toSeq + { AssemblyPath = path + Identity = Hallmark.Build() + Destinations = [] }) + + use def = AssemblyResolver.ReadAssembly path + + let xml = TriviaBaseline + + let xml' = + xml.Replace("Version=1.0.0.0", "Version=" + def.Name.Version.ToString()) + + let xml'' = + xml'.Replace("name=\"Sample1.exe\"", "name=\"" + path + "\"") + + let baseline = + XDocument.Load(new System.IO.StringReader(xml'')) + + let result = + (makeDocument document).Elements() + + let expected = baseline.Elements() + recursiveValidate result expected 0 true + + CoverageParameters.makeConfiguration () + + test + <@ + CoverageParameters.configurationHash = Some + "2QsURwpbBG6MQhnmFGfWowB0iwhnatSDEy5d7h6d6X0=" + @> + finally + CoverageParameters.nameFilters.Clear() + CoverageParameters.trivia.Value <- false + CoverageParameters.configurationHash <- None + [] let ShouldGenerateExpectedXmlReportWithEmbeds () = let visitor, document =