diff --git a/Documentation/Changelog.md b/Documentation/Changelog.md index 787b935f5..16945f29d 100644 --- a/Documentation/Changelog.md +++ b/Documentation/Changelog.md @@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased ### Fixed - +-Fix branch coverage for targetframework net472 [#1167](https://github.com/coverlet-coverage/coverlet/issues/1167) -Fix F# projects with `unkown` source [#1145](https://github.com/coverlet-coverage/coverlet/issues/1145) -Fix SkipAutoProps for inline assigned properties [#1139](https://github.com/coverlet-coverage/coverlet/issues/1139) -Fix partially covered throw statement [#1144](https://github.com/coverlet-coverage/coverlet/pull/1144) diff --git a/coverlet.sln b/coverlet.sln index 40dfd8966..34e7257db 100644 --- a/coverlet.sln +++ b/coverlet.sln @@ -55,6 +55,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{9A8B19D4 EndProject Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "coverlet.tests.projectsample.fsharp", "test\coverlet.tests.projectsample.fsharp\coverlet.tests.projectsample.fsharp.fsproj", "{1CBF6966-2A67-4D2C-8598-D174B83072F4}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "coverlet.tests.projectsample.netframework", "test\coverlet.tests.projectsample.netframework\coverlet.tests.projectsample.netframework.csproj", "{E69D68C9-78ED-4076-A14B-D07295A4B2A5}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -121,6 +123,10 @@ Global {1CBF6966-2A67-4D2C-8598-D174B83072F4}.Debug|Any CPU.Build.0 = Debug|Any CPU {1CBF6966-2A67-4D2C-8598-D174B83072F4}.Release|Any CPU.ActiveCfg = Release|Any CPU {1CBF6966-2A67-4D2C-8598-D174B83072F4}.Release|Any CPU.Build.0 = Release|Any CPU + {E69D68C9-78ED-4076-A14B-D07295A4B2A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E69D68C9-78ED-4076-A14B-D07295A4B2A5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E69D68C9-78ED-4076-A14B-D07295A4B2A5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E69D68C9-78ED-4076-A14B-D07295A4B2A5}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -142,6 +148,7 @@ Global {F8199E19-FA9A-4559-9101-CAD7028121B4} = {2FEBDE1B-83E3-445B-B9F8-5644B0E0E134} {9A8B19D4-4A24-4217-AEFE-159B68F029A1} = {2FEBDE1B-83E3-445B-B9F8-5644B0E0E134} {1CBF6966-2A67-4D2C-8598-D174B83072F4} = {2FEBDE1B-83E3-445B-B9F8-5644B0E0E134} + {E69D68C9-78ED-4076-A14B-D07295A4B2A5} = {2FEBDE1B-83E3-445B-B9F8-5644B0E0E134} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {9CA57C02-97B0-4C38-A027-EA61E8741F10} diff --git a/src/coverlet.core/Symbols/CecilSymbolHelper.cs b/src/coverlet.core/Symbols/CecilSymbolHelper.cs index 44942fab1..25909720c 100644 --- a/src/coverlet.core/Symbols/CecilSymbolHelper.cs +++ b/src/coverlet.core/Symbols/CecilSymbolHelper.cs @@ -197,6 +197,7 @@ instruction.Previous.Operand is MethodReference operand && ( operand.DeclaringType.Scope.Name == "System.Runtime" || operand.DeclaringType.Scope.Name == "netstandard" || + operand.DeclaringType.Scope.Name == "mscorlib" || operand.DeclaringType.Scope.Name == "System.Threading.Tasks.Extensions" ) ) diff --git a/test/coverlet.core.tests/Symbols/CecilSymbolHelperTests.cs b/test/coverlet.core.tests/Symbols/CecilSymbolHelperTests.cs index 3107db0a3..bfd659a61 100644 --- a/test/coverlet.core.tests/Symbols/CecilSymbolHelperTests.cs +++ b/test/coverlet.core.tests/Symbols/CecilSymbolHelperTests.cs @@ -4,6 +4,7 @@ using Xunit; using Coverlet.Core.Samples.Tests; +using coverlet.tests.projectsample.netframework; using Mono.Cecil; using Mono.Cecil.Cil; @@ -11,16 +12,18 @@ namespace Coverlet.Core.Symbols.Tests { public class CecilSymbolHelperTests { - private readonly ModuleDefinition _module; + private ModuleDefinition _module; private readonly CecilSymbolHelper _cecilSymbolHelper; + private readonly DefaultAssemblyResolver _resolver; + private readonly ReaderParameters _parameters; public CecilSymbolHelperTests() { var location = GetType().Assembly.Location; - var resolver = new DefaultAssemblyResolver(); - resolver.AddSearchDirectory(Path.GetDirectoryName(location)); - var parameters = new ReaderParameters { ReadSymbols = true, AssemblyResolver = resolver }; - _module = ModuleDefinition.ReadModule(location, parameters); + _resolver = new DefaultAssemblyResolver(); + _resolver.AddSearchDirectory(Path.GetDirectoryName(location)); + _parameters = new ReaderParameters { ReadSymbols = true, AssemblyResolver = _resolver }; + _module = ModuleDefinition.ReadModule(location, _parameters); _cecilSymbolHelper = new CecilSymbolHelper(); } @@ -294,6 +297,26 @@ public void GetBranchPoints_IgnoresBranchesIn_AsyncAwaitStateMachine() Assert.Empty(points); } + [Fact] + public void GetBranchPoints_IgnoresBranchesIn_AsyncAwaitStateMachineNetFramework() + { + // arrange + string location = Directory.GetFiles(Directory.GetCurrentDirectory(), "coverlet.tests.projectsample.netframework.dll").First(); + _resolver.AddSearchDirectory(Path.GetDirectoryName(location)); + _module = ModuleDefinition.ReadModule(location, _parameters); + + var nestedName = typeof(AsyncAwaitStateMachineNetFramework).GetNestedTypes(BindingFlags.NonPublic).First().Name; + var type = _module.Types.FirstOrDefault(x => x.FullName == typeof(AsyncAwaitStateMachineNetFramework).FullName); + var nestedType = type.NestedTypes.FirstOrDefault(x => x.FullName.EndsWith(nestedName)); + var method = nestedType.Methods.First(x => x.FullName.EndsWith("::MoveNext()")); + + // act + var points = _cecilSymbolHelper.GetBranchPoints(method); + + // assert + Assert.Empty(points); + } + [Fact] public void GetBranchPoints_IgnoresBranchesIn_AsyncAwaitValueTaskStateMachine() { diff --git a/test/coverlet.core.tests/coverlet.core.tests.csproj b/test/coverlet.core.tests/coverlet.core.tests.csproj index b7cd119b3..d5fdc3257 100644 --- a/test/coverlet.core.tests/coverlet.core.tests.csproj +++ b/test/coverlet.core.tests/coverlet.core.tests.csproj @@ -5,6 +5,7 @@ net5.0 false $(NoWarn);CS8002 + NU1702 true @@ -27,6 +28,7 @@ + diff --git a/test/coverlet.tests.projectsample.netframework/AsyncAwaitStateMachineNetFramework.cs b/test/coverlet.tests.projectsample.netframework/AsyncAwaitStateMachineNetFramework.cs new file mode 100644 index 000000000..ac07e5a7f --- /dev/null +++ b/test/coverlet.tests.projectsample.netframework/AsyncAwaitStateMachineNetFramework.cs @@ -0,0 +1,12 @@ +using System.Threading.Tasks; + +namespace coverlet.tests.projectsample.netframework +{ + public class AsyncAwaitStateMachineNetFramework + { + public async Task AsyncAwait() + { + await Task.CompletedTask; + } + } +} diff --git a/test/coverlet.tests.projectsample.netframework/coverlet.tests.projectsample.netframework.csproj b/test/coverlet.tests.projectsample.netframework/coverlet.tests.projectsample.netframework.csproj new file mode 100644 index 000000000..822b965de --- /dev/null +++ b/test/coverlet.tests.projectsample.netframework/coverlet.tests.projectsample.netframework.csproj @@ -0,0 +1,14 @@ + + + + net472 + false + false + + + + + all + + + \ No newline at end of file