diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c02b4c51..996b9a74 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,8 +6,8 @@ env: solution: 'src\ReportGenerator.sln' buildPlatform: Any CPU buildConfiguration: Release - version: 4.8.13 - dotnetSDKVersion: 5.0.301 + version: 4.9.0 + dotnetSDKVersion: 6.0.100 nodeVersion: 14 jobs: @@ -50,34 +50,30 @@ jobs: - name: 'Compile Solution' run: msbuild '${{ env.solution }}' /p:configuration='${{ env.buildConfiguration }}' /p:platform='${{ env.buildPlatform }}' - - name: dotnet publish Console.NetCore 2.0 - run: dotnet publish -c ${{ env.BuildConfiguration }} -f netcoreapp2.0 ReportGenerator.Console.NetCore.csproj - working-directory: src/ReportGenerator.Console.NetCore - - - name: dotnet publish Console.NetCore 2.1 - run: dotnet publish -c ${{ env.BuildConfiguration }} -f netcoreapp2.1 ReportGenerator.Console.NetCore.csproj - working-directory: src/ReportGenerator.Console.NetCore - - - name: dotnet publish Console.NetCore 3.0 - run: dotnet publish -c ${{ env.BuildConfiguration }} -f netcoreapp3.0 ReportGenerator.Console.NetCore.csproj + - name: dotnet publish Console.NetCore 3.1 + run: dotnet publish -c ${{ env.BuildConfiguration }} -f netcoreapp3.1 ReportGenerator.Console.NetCore.csproj working-directory: src/ReportGenerator.Console.NetCore - name: dotnet publish Console.NetCore 5.0 run: dotnet publish -c ${{ env.BuildConfiguration }} -f net5.0 ReportGenerator.Console.NetCore.csproj working-directory: src/ReportGenerator.Console.NetCore - - name: dotnet publish DotnetGlobalTool 2.1 - run: dotnet publish -c ${{ env.BuildConfiguration }} -f netcoreapp2.1 ReportGenerator.DotnetGlobalTool.csproj - working-directory: src/ReportGenerator.DotnetGlobalTool + - name: dotnet publish Console.NetCore 6.0 + run: dotnet publish -c ${{ env.BuildConfiguration }} -f net6.0 ReportGenerator.Console.NetCore.csproj + working-directory: src/ReportGenerator.Console.NetCore - - name: dotnet publish DotnetGlobalTool 3.0 - run: dotnet publish -c ${{ env.BuildConfiguration }} -f netcoreapp3.0 ReportGenerator.DotnetGlobalTool.csproj + - name: dotnet publish DotnetGlobalTool 3.1 + run: dotnet publish -c ${{ env.BuildConfiguration }} -f netcoreapp3.1 ReportGenerator.DotnetGlobalTool.csproj working-directory: src/ReportGenerator.DotnetGlobalTool - name: dotnet publish DotnetGlobalTool 5.0 run: dotnet publish -c ${{ env.BuildConfiguration }} -f net5.0 ReportGenerator.DotnetGlobalTool.csproj working-directory: src/ReportGenerator.DotnetGlobalTool + - name: dotnet publish DotnetGlobalTool 6.0 + run: dotnet publish -c ${{ env.BuildConfiguration }} -f net6.0 ReportGenerator.DotnetGlobalTool.csproj + working-directory: src/ReportGenerator.DotnetGlobalTool + - name: Test run: dotnet test src\ReportGenerator.Core.Test\ReportGenerator.Core.Test.csproj --configuration ${{ env.BuildConfiguration }} --no-build /p:CollectCoverage=true /p:DeterministicSourcePaths=true /p:IncludeTestAssembly=true /p:CoverletOutputFormat=opencover%2ccobertura /p:CoverletOutput=../target/reports/coverage/ @@ -97,8 +93,8 @@ jobs: - name: 'Prepare VSIX release: NetCore' run: | - mkdir src/AzureDevopsTask/ReportGenerator/tools/netcoreapp2.1 - xcopy 'src\ReportGenerator.Console.NetCore\bin\Release\netcoreapp2.1\publish' 'src\AzureDevopsTask\ReportGenerator\tools\netcoreapp2.1' /s + mkdir src/AzureDevopsTask/ReportGenerator/tools/netcoreapp3.1 + xcopy 'src\ReportGenerator.Console.NetCore\bin\Release\netcoreapp3.1\publish' 'src\AzureDevopsTask\ReportGenerator\tools\netcoreapp3.1' /s - name: 'Prepare VSIX release: Install TFS Cross Platform Command Line Interface (tfx-cli)' run: npm install -g tfx-cli @@ -119,10 +115,9 @@ jobs: run: | mkdir tmpzip mkdir tmpzip\net47 - mkdir tmpzip\netcoreapp2.0 - mkdir tmpzip\netcoreapp2.1 - mkdir tmpzip\netcoreapp3.0 + mkdir tmpzip\netcoreapp3.1 mkdir tmpzip\net5.0 + mkdir tmpzip\net6.0 - name: 'Prepare ZIP release' run: | @@ -132,10 +127,9 @@ jobs: xcopy "src\ReportGenerator.Console\bin\Release\*.dll" "tmpzip\net47" xcopy "src\ReportGenerator.Console\bin\Release\ReportGenerator.exe" "tmpzip\net47" xcopy "src\ReportGenerator.Console\bin\Release\ReportGenerator.exe.config" "tmpzip\net47" - xcopy 'src\ReportGenerator.Console.NetCore\bin\Release\netcoreapp2.0\publish\*' 'tmpzip\netcoreapp2.0' /s - xcopy 'src\ReportGenerator.Console.NetCore\bin\Release\netcoreapp2.1\publish\*' 'tmpzip\netcoreapp2.1' /s - xcopy 'src\ReportGenerator.Console.NetCore\bin\Release\netcoreapp3.0\publish\*' 'tmpzip\netcoreapp3.0' /s + xcopy 'src\ReportGenerator.Console.NetCore\bin\Release\netcoreapp3.1\publish\*' 'tmpzip\netcoreapp3.1' /s xcopy 'src\ReportGenerator.Console.NetCore\bin\Release\net5.0\publish\*' 'tmpzip\net5.0' /s + xcopy 'src\ReportGenerator.Console.NetCore\bin\Release\net6.0\publish\*' 'tmpzip\net6.0' /s - name: 'Pack ZIP release' run: Compress-Archive -Path tmpzip/* -DestinationPath src/target/packages/ReportGenerator_${{ env.Version }}.zip diff --git a/README.md b/README.md index f25432f4..fb1fbccb 100644 --- a/README.md +++ b/README.md @@ -40,11 +40,11 @@ Use the online [configuration tool](https://danielpalme.github.io/ReportGenerato |**Package**|**Platforms**|**Installation/Usage**| |:----------|:------------|:---------------------| -|[ReportGenerator](https://www.nuget.org/packages/ReportGenerator)

[![Nuget](https://img.shields.io/nuget/v/ReportGenerator.svg)![Nuget](https://img.shields.io/nuget/dt/ReportGenerator.svg)](https://www.nuget.org/packages/ReportGenerator)|.NET Core 2.x, 3.x, 5.x
.NET Framework 4.7|Use this package if your project is based on *.NET Framework* or *.NET Core* and you want to use *ReportGenerator* via the command line or a build script.

**Usage**
```dotnet $(UserProfile).nuget\packages\reportgenerator\x.y.z\tools\net5.0\ReportGenerator.dll [options]```
```$(UserProfile).nuget\packages\reportgenerator\x.y.z\tools\net5.0\ReportGenerator.exe [options]```

```$(UserProfile)\.nuget\packages\reportgenerator\x.y.z\tools\net47\ReportGenerator.exe [options]```| -|[dotnet-reportgenerator-globaltool](https://www.nuget.org/packages/dotnet-reportgenerator-globaltool)

[![Nuget](https://img.shields.io/nuget/v/dotnet-reportgenerator-globaltool.svg)![Nuget](https://img.shields.io/nuget/dt/dotnet-reportgenerator-globaltool.svg)](https://www.nuget.org/packages/dotnet-reportgenerator-globaltool)|.NET Core 2.1, 3.x, 5.x |Use this package if your project is based on *.NET Core* and you want to use *ReportGenerator* as a (global) 'DotnetTool'.

**Installation**
```dotnet tool install -g dotnet-reportgenerator-globaltool```

```dotnet tool install dotnet-reportgenerator-globaltool --tool-path tools```

```dotnet new tool-manifest```
```dotnet tool install dotnet-reportgenerator-globaltool```

**Usage**
```reportgenerator [options]```
```tools\reportgenerator.exe [options]```
```dotnet reportgenerator [options]```| +|[ReportGenerator](https://www.nuget.org/packages/ReportGenerator)

[![Nuget](https://img.shields.io/nuget/v/ReportGenerator.svg)![Nuget](https://img.shields.io/nuget/dt/ReportGenerator.svg)](https://www.nuget.org/packages/ReportGenerator)|.NET Core >=3.1
.NET Framework 4.7|Use this package if your project is based on *.NET Framework* or *.NET Core* and you want to use *ReportGenerator* via the command line or a build script.

**Usage**
```dotnet $(UserProfile).nuget\packages\reportgenerator\x.y.z\tools\net6.0\ReportGenerator.dll [options]```
```$(UserProfile).nuget\packages\reportgenerator\x.y.z\tools\net6.0\ReportGenerator.exe [options]```

```$(UserProfile)\.nuget\packages\reportgenerator\x.y.z\tools\net47\ReportGenerator.exe [options]```| +|[dotnet-reportgenerator-globaltool](https://www.nuget.org/packages/dotnet-reportgenerator-globaltool)

[![Nuget](https://img.shields.io/nuget/v/dotnet-reportgenerator-globaltool.svg)![Nuget](https://img.shields.io/nuget/dt/dotnet-reportgenerator-globaltool.svg)](https://www.nuget.org/packages/dotnet-reportgenerator-globaltool)|.NET Core >=3.1 |Use this package if your project is based on *.NET Core* and you want to use *ReportGenerator* as a (global) 'DotnetTool'.

**Installation**
```dotnet tool install -g dotnet-reportgenerator-globaltool```

```dotnet tool install dotnet-reportgenerator-globaltool --tool-path tools```

```dotnet new tool-manifest```
```dotnet tool install dotnet-reportgenerator-globaltool```

**Usage**
```reportgenerator [options]```
```tools\reportgenerator.exe [options]```
```dotnet reportgenerator [options]```| |[ReportGenerator.Core](https://www.nuget.org/packages/ReportGenerator.Core)

[![Nuget](https://img.shields.io/nuget/v/ReportGenerator.Core.svg)![Nuget](https://img.shields.io/nuget/dt/ReportGenerator.Core.svg)](https://www.nuget.org/packages/ReportGenerator.Core)|.NET Standard 2.0|Use this package if you want to write a custom **plugin** for *ReportGenerator* or if you want to call/execute *ReportGenerator* within your code base.

**Plugin development**
[Custom reports](https://github.com/danielpalme/ReportGenerator/wiki/Custom-reports)
[Custom history storage](https://github.com/danielpalme/ReportGenerator/wiki/Custom-history-storage)| -|[Azure DevOps extension](https://marketplace.visualstudio.com/items?itemName=Palmmedia.reportgenerator)

[![Visual Studio Marketplace Version](https://img.shields.io/visual-studio-marketplace/v/Palmmedia.reportgenerator.svg)![Visual Studio Marketplace Installs - Azure DevOps Extension](https://img.shields.io/visual-studio-marketplace/azure-devops/installs/total/Palmmedia.reportgenerator.svg)](https://marketplace.visualstudio.com/items?itemName=Palmmedia.reportgenerator)|.NET Core >=2.1| Add the Azure DevOps extension to your build pipeline.
[Learn more](https://github.com/danielpalme/ReportGenerator/wiki/Integration#azure-devops-extension)| -|[GitHub Actions](https://github.com/marketplace/actions/reportgenerator)|.NET Core >=2.1| Add the GitHub Action to your build pipeline.
[Learn more](https://github.com/danielpalme/ReportGenerator/wiki/Integration#github-actions)| +|[Azure DevOps extension](https://marketplace.visualstudio.com/items?itemName=Palmmedia.reportgenerator)

[![Visual Studio Marketplace Version](https://img.shields.io/visual-studio-marketplace/v/Palmmedia.reportgenerator.svg)![Visual Studio Marketplace Installs - Azure DevOps Extension](https://img.shields.io/visual-studio-marketplace/azure-devops/installs/total/Palmmedia.reportgenerator.svg)](https://marketplace.visualstudio.com/items?itemName=Palmmedia.reportgenerator)|.NET Core >=3.1| Add the Azure DevOps extension to your build pipeline.
[Learn more](https://github.com/danielpalme/ReportGenerator/wiki/Integration#azure-devops-extension)| +|[GitHub Actions](https://github.com/marketplace/actions/reportgenerator)|.NET Core >=3.1| Add the GitHub Action to your build pipeline.
[Learn more](https://github.com/danielpalme/ReportGenerator/wiki/Integration#github-actions)| ### Usage / Command line parameters ``` diff --git a/docs/resources/SampleReports.zip b/docs/resources/SampleReports.zip index f9ec1b6a..78ad1dcf 100644 Binary files a/docs/resources/SampleReports.zip and b/docs/resources/SampleReports.zip differ diff --git a/docs/usage.html b/docs/usage.html index b01a9428..45f34c6e 100644 --- a/docs/usage.html +++ b/docs/usage.html @@ -217,7 +217,7 @@

Usage

], executables: [ { runtime: '.NET Framework', tool: '$(UserProfile)\\.nuget\\packages\\reportgenerator\\x.y.z\\tools\\net47\\ReportGenerator.exe' }, - { runtime: '.NET Core', tool: 'dotnet $(UserProfile)\\.nuget\\packages\\reportgenerator\\x.y.z\\tools\\net5.0\\ReportGenerator.dll' } + { runtime: '.NET Core', tool: 'dotnet $(UserProfile)\\.nuget\\packages\\reportgenerator\\x.y.z\\tools\\net6.0\\ReportGenerator.dll' } ] }, { diff --git a/global.json b/global.json index 5c567a92..cf440a72 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { - "sdk": { - "version": "5.0.301", - "rollForward": "latestMajor" - } + "sdk": { + "version": "6.0.100", + "rollForward": "latestMajor" + } } \ No newline at end of file diff --git a/src/AzureDevopsTask/ReportGenerator/reportgenerator.ts b/src/AzureDevopsTask/ReportGenerator/reportgenerator.ts index e4058bab..403431d5 100644 --- a/src/AzureDevopsTask/ReportGenerator/reportgenerator.ts +++ b/src/AzureDevopsTask/ReportGenerator/reportgenerator.ts @@ -3,7 +3,7 @@ import tl = require('azure-pipelines-task-lib/task'); async function executeReportGenerator(): Promise { var tool = tl.tool('dotnet') - .arg(path.join(__dirname, 'tools/netcoreapp2.1/ReportGenerator.dll')) + .arg(path.join(__dirname, 'tools/netcoreapp3.1/ReportGenerator.dll')) .arg('-reports:' + (tl.getInput('reports') || '')) .arg('-targetdir:' + (tl.getInput('targetdir') || '')) .arg('-reporttypes:' + (tl.getInput('reporttypes') || '')) diff --git a/src/Deployment/chocolatey/reportgenerator.portable.nuspec b/src/Deployment/chocolatey/reportgenerator.portable.nuspec index ca1b55f3..f4a1288f 100644 --- a/src/Deployment/chocolatey/reportgenerator.portable.nuspec +++ b/src/Deployment/chocolatey/reportgenerator.portable.nuspec @@ -24,17 +24,14 @@ - - - - - - - - + + + + + diff --git a/src/Deployment/nuget/ReportGenerator.Core.nuspec b/src/Deployment/nuget/ReportGenerator.Core.nuspec index 00c85673..8958d0b4 100644 --- a/src/Deployment/nuget/ReportGenerator.Core.nuspec +++ b/src/Deployment/nuget/ReportGenerator.Core.nuspec @@ -24,24 +24,22 @@ https://github.com/danielpalme/ReportGenerator/wiki/Custom-history-storage - - - - - + + + + - - - - - + + + + - + @@ -54,23 +52,23 @@ https://github.com/danielpalme/ReportGenerator/wiki/Custom-history-storage - - - - - - - - - - + + + + + + + + + + diff --git a/src/Deployment/nuget/ReportGenerator.nuspec b/src/Deployment/nuget/ReportGenerator.nuspec index ae994b03..732c169a 100644 --- a/src/Deployment/nuget/ReportGenerator.nuspec +++ b/src/Deployment/nuget/ReportGenerator.nuspec @@ -17,8 +17,8 @@ Use this package if your project is based on .NET Framework or .NET Core and you want to use ReportGenerator via the command line or a build script. Usage: -dotnet $(UserProfile)\.nuget\packages\reportgenerator\x.y.z\tools\net5.0\ReportGenerator.dll [options] -$(UserProfile)\.nuget\packages\reportgenerator\x.y.z\tools\net5.0\ReportGenerator.exe [options] +dotnet $(UserProfile)\.nuget\packages\reportgenerator\x.y.z\tools\net6.0\ReportGenerator.dll [options] +$(UserProfile)\.nuget\packages\reportgenerator\x.y.z\tools\net6.0\ReportGenerator.exe [options] $(UserProfile)\.nuget\packages\reportgenerator\x.y.z\tools\net47\ReportGenerator.exe [options] en-US Code Coverage Reporting Testing TDD Utility @@ -32,17 +32,14 @@ $(UserProfile)\.nuget\packages\reportgenerator\x.y.z\tools\net47\ReportGenerator - - - - - - - - + + + + + diff --git a/src/Deployment/nuget/ReportGenerator.props b/src/Deployment/nuget/ReportGenerator.props index 47a50200..c6141fc6 100644 --- a/src/Deployment/nuget/ReportGenerator.props +++ b/src/Deployment/nuget/ReportGenerator.props @@ -1,7 +1,7 @@ - $(MSBuildThisFileDirectory)..\..\tools\netcoreapp2.1\ReportGenerator.MSBuild.dll + $(MSBuildThisFileDirectory)..\..\tools\netcoreapp3.1\ReportGenerator.MSBuild.dll $(MSBuildThisFileDirectory)..\..\tools\net47\ReportGenerator.MSBuild.dll diff --git a/src/Deployment/nuget/dotnet-reportgenerator-globaltool.nuspec b/src/Deployment/nuget/dotnet-reportgenerator-globaltool.nuspec index 9cece427..eec456c9 100644 --- a/src/Deployment/nuget/dotnet-reportgenerator-globaltool.nuspec +++ b/src/Deployment/nuget/dotnet-reportgenerator-globaltool.nuspec @@ -39,17 +39,17 @@ dotnet reportgenerator [options] - - - - - - - + + + + + + + \ No newline at end of file diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 7285a6ca..78c717ed 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -8,7 +8,7 @@ - + diff --git a/src/Readme.txt b/src/Readme.txt index a6a4f729..95507efc 100644 --- a/src/Readme.txt +++ b/src/Readme.txt @@ -64,6 +64,12 @@ For further details take a look at LICENSE.txt. CHANGELOG +5.0.0.0 + + * New: #397: Added .NET 6 support, dropped support for .NET Core 2.x and 3.0 + * New: #457: Added support for altcover embedded files + * Fix: #461: Fixed namespace color in dark mode + 4.8.14.0 * Fix: #459: Improved support for C++/CLI for OpenCover coverage files diff --git a/src/ReportGenerator.Console.NetCore/ReportGenerator.Console.NetCore.csproj b/src/ReportGenerator.Console.NetCore/ReportGenerator.Console.NetCore.csproj index 2ab217bc..f6f6aac1 100644 --- a/src/ReportGenerator.Console.NetCore/ReportGenerator.Console.NetCore.csproj +++ b/src/ReportGenerator.Console.NetCore/ReportGenerator.Console.NetCore.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.0;netcoreapp2.1;netcoreapp3.0;net5.0 + netcoreapp3.1;net5.0;net6.0 ProgramIcon.ico ReportGenerator Palmmedia.ReportGenerator diff --git a/src/ReportGenerator.Console/ReportGenerator.Console.Net.csproj b/src/ReportGenerator.Console/ReportGenerator.Console.Net.csproj index 69bce722..3cab39c8 100644 --- a/src/ReportGenerator.Console/ReportGenerator.Console.Net.csproj +++ b/src/ReportGenerator.Console/ReportGenerator.Console.Net.csproj @@ -98,7 +98,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all - + \ No newline at end of file diff --git a/src/ReportGenerator.Core.Test/Common/GlobbingFileSearchTest.cs b/src/ReportGenerator.Core.Test/Common/GlobbingFileSearchTest.cs index 3faafe41..b2232dde 100644 --- a/src/ReportGenerator.Core.Test/Common/GlobbingFileSearchTest.cs +++ b/src/ReportGenerator.Core.Test/Common/GlobbingFileSearchTest.cs @@ -28,7 +28,7 @@ public void GetFiles_EmptyDirectory_NoFilesFound() public void GetFiles_SingleDirectory_XmlFilesFound() { var files = GlobbingFileSearch.GetFiles(Path.Combine(FileManager.GetCSharpReportDirectory(), "*.xml")).ToArray(); - Assert.Equal(20, files.Length); + Assert.Equal(21, files.Length); } [Fact] diff --git a/src/ReportGenerator.Core.Test/Common/WildCardFileSearchTest.cs b/src/ReportGenerator.Core.Test/Common/WildCardFileSearchTest.cs index 7d5ca399..edf93cc6 100644 --- a/src/ReportGenerator.Core.Test/Common/WildCardFileSearchTest.cs +++ b/src/ReportGenerator.Core.Test/Common/WildCardFileSearchTest.cs @@ -58,7 +58,7 @@ public void GetFiles_EmptyDirectory_NoFilesFound() public void GetFiles_SingleDirectory_XmlFilesFound() { var files = WildCardFileSearch.GetFiles(Path.Combine(FileManager.GetCSharpReportDirectory(), "*.xml")).ToArray(); - Assert.Equal(20, files.Length); + Assert.Equal(21, files.Length); } [Fact] diff --git a/src/ReportGenerator.Core.Test/MsBuildTest.cs b/src/ReportGenerator.Core.Test/MsBuildTest.cs index 89412a2f..92b3b9d7 100644 --- a/src/ReportGenerator.Core.Test/MsBuildTest.cs +++ b/src/ReportGenerator.Core.Test/MsBuildTest.cs @@ -7,8 +7,7 @@ namespace Palmmedia.ReportGenerator.Core.Test { public class MsBuildTest { - - [Fact] + [Fact (Skip = "Not working with Github Action")] public void ExecuteMSBuildScript_NetFull() { string configuration = "Release"; @@ -19,9 +18,9 @@ public void ExecuteMSBuildScript_NetFull() var paths = new[] { - @"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe", - @"C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\MSBuild.exe", - @"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\MSBuild.exe" + @"C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe", + @"C:\Program Files\Microsoft Visual Studio\2022\Professional\MSBuild\Current\Bin\MSBuild.exe", + @"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Current\Bin\MSBuild.exe" }; bool found = false; diff --git a/src/ReportGenerator.Core.Test/MsBuildTestScript_NetCore.proj b/src/ReportGenerator.Core.Test/MsBuildTestScript_NetCore.proj index 38458e17..06c580ec 100644 --- a/src/ReportGenerator.Core.Test/MsBuildTestScript_NetCore.proj +++ b/src/ReportGenerator.Core.Test/MsBuildTestScript_NetCore.proj @@ -2,11 +2,11 @@ Exe - net5.0 + net6.0 - + diff --git a/src/ReportGenerator.Core.Test/Parser/Analysis/CodeFileTest.cs b/src/ReportGenerator.Core.Test/Parser/Analysis/CodeFileTest.cs index 3b21d5da..87a15273 100644 --- a/src/ReportGenerator.Core.Test/Parser/Analysis/CodeFileTest.cs +++ b/src/ReportGenerator.Core.Test/Parser/Analysis/CodeFileTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using Moq; using Palmmedia.ReportGenerator.Core.Parser.Analysis; using Palmmedia.ReportGenerator.Core.Parser.FileReading; using Xunit; @@ -260,6 +261,63 @@ public void AnalyzeFile_NonExistingFile_AnalysisIsReturned() Assert.Empty(fileAnalysis.Lines); } + /// + /// A test for AnalyzeFile + /// + [Fact] + public void AnalyzeFile_AdditionFileReaderNoError_RegularFileReaderIgnored() + { + var additionalFileReaderMock = new Mock(); + string error = null; + additionalFileReaderMock.Setup(f => f.LoadFile(It.IsAny(), out error)) + .Returns(new[] { "Test" }); + + var fileReaderMock = new Mock(); + + var sut = new CodeFile("C:\\temp\\Other.cs", new int[] { -2, -1, 0, 1 }, new LineVisitStatus[] { LineVisitStatus.NotCoverable, LineVisitStatus.NotCoverable, LineVisitStatus.NotCovered, LineVisitStatus.Covered }, additionalFileReaderMock.Object); + + Assert.Null(sut.TotalLines); + + var fileAnalysis = sut.AnalyzeFile(fileReaderMock.Object); + + Assert.NotNull(fileAnalysis); + Assert.Null(fileAnalysis.Error); + + additionalFileReaderMock.Verify(f => f.LoadFile(It.IsAny(), out error), Times.Once); + fileReaderMock.Verify(f => f.LoadFile(It.IsAny(), out error), Times.Never); + } + + /// + /// A test for AnalyzeFile + /// + [Fact] + public void AnalyzeFile_AdditionFileReaderReturnsError_RegularFileReaderUsed() + { + var additionalFileReaderMock = new Mock(); + string error = "Some error"; + additionalFileReaderMock.Setup(f => f.LoadFile(It.IsAny(), out error)) + .Returns((string[])null); + + var fileReaderMock = new Mock(); + fileReaderMock.Setup(f => f.LoadFile(It.IsAny(), out error)) + .Returns(new[] { "Test" }); + + var sut = new CodeFile("C:\\temp\\Other.cs", new int[] { -2, -1, 0, 1 }, new LineVisitStatus[] { LineVisitStatus.NotCoverable, LineVisitStatus.NotCoverable, LineVisitStatus.NotCovered, LineVisitStatus.Covered }, additionalFileReaderMock.Object); + + Assert.Null(sut.TotalLines); + + var fileAnalysis = sut.AnalyzeFile(fileReaderMock.Object); + + Assert.NotNull(fileAnalysis); + Assert.NotNull(fileAnalysis.Error); + Assert.Equal(fileAnalysis.Path, fileAnalysis.Path); + Assert.Null(sut.TotalLines); + Assert.Empty(fileAnalysis.Lines); + + additionalFileReaderMock.Verify(f => f.LoadFile(It.IsAny(), out error), Times.Once); + fileReaderMock.Verify(f => f.LoadFile(It.IsAny(), out error), Times.Once); + } + /// /// A test for Equals /// diff --git a/src/ReportGenerator.Core.Test/Parser/FileReading/AltCoverEmbeddedFileReaderTest.cs b/src/ReportGenerator.Core.Test/Parser/FileReading/AltCoverEmbeddedFileReaderTest.cs new file mode 100644 index 00000000..afbef3b6 --- /dev/null +++ b/src/ReportGenerator.Core.Test/Parser/FileReading/AltCoverEmbeddedFileReaderTest.cs @@ -0,0 +1,32 @@ +using Palmmedia.ReportGenerator.Core.Parser.FileReading; +using Xunit; + +namespace Palmmedia.ReportGenerator.Core.Test.Parser.FileReading +{ + /// + /// This is a test class for AltCoverEmbeddedFileReader and is intended + /// to contain all AltCoverEmbeddedFileReader Unit Tests + /// + public class AltCoverEmbeddedFileReaderTest + { + [Fact] + public void ValidEncodedFile_CorrectContentAndNoError() + { + var sut = new AltCoverEmbeddedFileReader("hY7BCoJQEEX3Qf8wS4XoAxIDd21qk62ixWiDCqOJM4+Q6Mta9En9Qs+eGRTS3TyYd++593G7Tydgtd+2olTOI9WmSIzSTjAj7/saY5ORyjwSoTLhdgYR8+m8NqxFzRRqY8g/OGRRKTUVMggh0xFSRhFYG1FMcxqQC/gucfGLezrVJuEiBbH/VQYbLAkuYHcEcB0zxVTWjPrfuELJx00/a70+VtkRszdD+7LhkFuo/4F1CpfgbV6heHB33T6E4DnaB/PKBw5gRz0B"); + + string[] lines = sut.LoadFile("DoesNotMatter", out string error); + Assert.Null(error); + Assert.True(lines.Length > 0); + } + + [Fact] + public void InvalidEncodedFile_InvalidContent_Error() + { + var sut = new AltCoverEmbeddedFileReader("xyz"); + + string[] lines = sut.LoadFile("DoesNotMatter", out string error); + Assert.NotNull(error); + Assert.Null(lines); + } + } +} diff --git a/src/ReportGenerator.Core.Test/Parser/FileReading/LocalFileReaderTest.cs b/src/ReportGenerator.Core.Test/Parser/FileReading/LocalFileReaderTest.cs index 5931410e..bf92a5af 100644 --- a/src/ReportGenerator.Core.Test/Parser/FileReading/LocalFileReaderTest.cs +++ b/src/ReportGenerator.Core.Test/Parser/FileReading/LocalFileReaderTest.cs @@ -5,8 +5,8 @@ namespace Palmmedia.ReportGenerator.Core.Test.Parser.FileReading { /// - /// This is a test class for CloverParser and is intended - /// to contain all CloverParser Unit Tests + /// This is a test class for LocalFileReader and is intended + /// to contain all LocalFileReader Unit Tests /// [Collection("FileManager")] public class LocalFileReaderTest diff --git a/src/ReportGenerator.Core.Test/ReportGenerator.Core.Test.csproj b/src/ReportGenerator.Core.Test/ReportGenerator.Core.Test.csproj index 4470d7e1..94c763e7 100644 --- a/src/ReportGenerator.Core.Test/ReportGenerator.Core.Test.csproj +++ b/src/ReportGenerator.Core.Test/ReportGenerator.Core.Test.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 false Palmmedia.ReportGenerator.Core.Test 4.8.13.0 diff --git a/src/ReportGenerator.Core/Parser/Analysis/CodeFile.cs b/src/ReportGenerator.Core/Parser/Analysis/CodeFile.cs index 70d32ed4..1ac27e10 100644 --- a/src/ReportGenerator.Core/Parser/Analysis/CodeFile.cs +++ b/src/ReportGenerator.Core/Parser/Analysis/CodeFile.cs @@ -50,6 +50,11 @@ public class CodeFile /// private IDictionary> branches; + /// + /// The optional additional file reader. + /// + private IFileReader additionalFileReader; + /// /// Initializes a new instance of the class. /// @@ -57,7 +62,19 @@ public class CodeFile /// The line coverage. /// The line visit status. internal CodeFile(string path, int[] lineCoverage, LineVisitStatus[] lineVisitStatus) - : this(path, lineCoverage, lineVisitStatus, null) + : this(path, lineCoverage, lineVisitStatus, null, null) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The path of the file. + /// The line coverage. + /// The line visit status. + /// The optional additional file reader. + internal CodeFile(string path, int[] lineCoverage, LineVisitStatus[] lineVisitStatus, IFileReader additionalFileReader) + : this(path, lineCoverage, lineVisitStatus, null, additionalFileReader) { } @@ -69,6 +86,24 @@ internal CodeFile(string path, int[] lineCoverage, LineVisitStatus[] lineVisitSt /// The line visit status. /// The branches. internal CodeFile(string path, int[] lineCoverage, LineVisitStatus[] lineVisitStatus, IDictionary> branches) + : this(path, lineCoverage, lineVisitStatus, branches, null) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The path. + /// The line coverage. + /// The line visit status. + /// The branches. + /// The optional additional file reader. + internal CodeFile( + string path, + int[] lineCoverage, + LineVisitStatus[] lineVisitStatus, + IDictionary> branches, + IFileReader additionalFileReader) { if (lineCoverage == null) { @@ -89,6 +124,7 @@ internal CodeFile(string path, int[] lineCoverage, LineVisitStatus[] lineVisitSt this.lineCoverage = lineCoverage; this.lineVisitStatus = lineVisitStatus; this.branches = branches; + this.additionalFileReader = additionalFileReader; } /// @@ -347,7 +383,19 @@ internal void AddCodeElement(CodeElement codeElement) internal FileAnalysis AnalyzeFile(IFileReader fileReader) { string error = null; - string[] lines = fileReader.LoadFile(this.Path, out error); + + string[] lines = null; + + if (this.additionalFileReader != null) + { + lines = this.additionalFileReader.LoadFile(this.Path, out error); + } + + if (this.additionalFileReader == null || error != null) + { + error = null; + lines = fileReader.LoadFile(this.Path, out error); + } if (error != null) { @@ -548,6 +596,11 @@ internal void Merge(CodeFile file) { codeElement.ApplyMaximumCoverageQuota(this.CoverageQuota(codeElement.FirstLine, codeElement.LastLine)); } + + if (file.additionalFileReader == null) + { + file.additionalFileReader = this.additionalFileReader; + } } /// diff --git a/src/ReportGenerator.Core/Parser/FileReading/AltCoverEmbeddedFileReader.cs b/src/ReportGenerator.Core/Parser/FileReading/AltCoverEmbeddedFileReader.cs new file mode 100644 index 00000000..05e2b630 --- /dev/null +++ b/src/ReportGenerator.Core/Parser/FileReading/AltCoverEmbeddedFileReader.cs @@ -0,0 +1,89 @@ +using System; +using System.Globalization; +using System.IO; +using System.IO.Compression; +using System.Text; +using Palmmedia.ReportGenerator.Core.Common; +using Palmmedia.ReportGenerator.Core.Properties; + +namespace Palmmedia.ReportGenerator.Core.Parser.FileReading +{ + /// + /// File reader for reading files from local disk. + /// + internal class AltCoverEmbeddedFileReader : IFileReader + { + /// + /// Line endings to split lines on Windows and Unix. + /// + private static readonly string[] LineEndings = new string[] + { + "\r\n", + "\n" + }; + + /// + /// The Base64 and deflate compressed file. + /// + private readonly string base64DeflateCompressedFile; + + /// + /// Initializes a new instance of the class. + /// + /// The Base64 and deflate compressed file. + public AltCoverEmbeddedFileReader(string base64DeflateCompressedFile) + { + if (base64DeflateCompressedFile == null) + { + throw new ArgumentNullException(nameof(base64DeflateCompressedFile)); + } + + this.base64DeflateCompressedFile = base64DeflateCompressedFile; + } + + /// + /// Loads the file with the given path. + /// + /// The path. + /// Error message if file reading failed, otherwise null. + /// null if an error occurs, otherwise the lines of the file. + public string[] LoadFile(string path, out string error) + { + try + { + byte[] base64Decoded = Convert.FromBase64String(this.base64DeflateCompressedFile); + byte[] decompressed = this.Decompress(base64Decoded); + string content = Encoding.UTF8.GetString(decompressed); + + string[] lines = content.Split(LineEndings, StringSplitOptions.None); + + error = null; + return lines; + } + catch (Exception ex) + { + error = string.Format(CultureInfo.InvariantCulture, Resources.ErrorDuringReadingFile, path, ex.GetExceptionMessageForDisplay()); + return null; + } + } + + private byte[] Decompress(byte[] data) + { + byte[] decompressedArray = null; + using (MemoryStream decompressedStream = new MemoryStream()) + { + using (MemoryStream compressStream = new MemoryStream(data)) + { + using (DeflateStream deflateStream = new DeflateStream(compressStream, CompressionMode.Decompress)) + { + deflateStream.CopyTo(decompressedStream); + } + } + + decompressedArray = decompressedStream.ToArray(); + } + + return decompressedArray; + } + } +} diff --git a/src/ReportGenerator.Core/Parser/OpenCoverParser.cs b/src/ReportGenerator.Core/Parser/OpenCoverParser.cs index b373a399..bc62237c 100644 --- a/src/ReportGenerator.Core/Parser/OpenCoverParser.cs +++ b/src/ReportGenerator.Core/Parser/OpenCoverParser.cs @@ -9,6 +9,7 @@ using Palmmedia.ReportGenerator.Core.Common; using Palmmedia.ReportGenerator.Core.Logging; using Palmmedia.ReportGenerator.Core.Parser.Analysis; +using Palmmedia.ReportGenerator.Core.Parser.FileReading; using Palmmedia.ReportGenerator.Core.Parser.Filtering; using Palmmedia.ReportGenerator.Core.Properties; @@ -130,8 +131,8 @@ private Assembly ProcessAssembly(IDictionary assemblyModules var fileIdsByFilename = assemblyModules[assemblyName] .Elements("Files") .Elements("File") - .GroupBy(f => f.Attribute("fullPath").Value, f => f.Attribute("uid").Value) - .ToDictionary(g => g.Key, g => g.ToHashSet()); + .GroupBy(f => f.Attribute("fullPath").Value) + .ToDictionary(g => g.Key, g => new FileElement(g)); var classNames = assemblyModules[assemblyName] .Elements("Classes") @@ -166,7 +167,7 @@ private Assembly ProcessAssembly(IDictionary assemblyModules /// Dictionary containing the file ids by filename. /// The assembly. /// Name of the class. - private void ProcessClass(IDictionary assemblyModules, XElement[] files, IDictionary trackedMethods, Dictionary> fileIdsByFilename, Assembly assembly, string className) + private void ProcessClass(IDictionary assemblyModules, XElement[] files, IDictionary trackedMethods, Dictionary fileIdsByFilename, Assembly assembly, string className) { var methods = assemblyModules[assembly.Name] .Elements("Classes") @@ -230,15 +231,15 @@ private void ProcessClass(IDictionary assemblyModules, XElem /// The file path. /// The methods. /// The . - private static CodeFile ProcessFile(IDictionary trackedMethods, HashSet fileIds, string filePath, XElement[] methods) + private static CodeFile ProcessFile(IDictionary trackedMethods, FileElement fileIds, string filePath, XElement[] methods) { var seqpntsOfFile = methods .Elements("SequencePoints") .Elements("SequencePoint") .Where(seqpnt => (seqpnt.Attribute("fileid") != null - && fileIds.Contains(seqpnt.Attribute("fileid").Value)) + && fileIds.Uids.Contains(seqpnt.Attribute("fileid").Value)) || (seqpnt.Attribute("fileid") == null && seqpnt.Parent.Parent.Element("FileRef") != null - && fileIds.Contains(seqpnt.Parent.Parent.Element("FileRef").Attribute("uid").Value))) + && fileIds.Uids.Contains(seqpnt.Parent.Parent.Element("FileRef").Attribute("uid").Value))) .Select(seqpnt => new { LineNumberStart = int.Parse(seqpnt.Attribute("sl").Value, CultureInfo.InvariantCulture), @@ -331,7 +332,16 @@ private static CodeFile ProcessFile(IDictionary trackedMethods, } } - var codeFile = new CodeFile(filePath, coverage, lineVisitStatus, branches); + CodeFile codeFile = null; + if (!string.IsNullOrWhiteSpace(fileIds.EmbeddedSource)) + { + var additionalFileReader = new AltCoverEmbeddedFileReader(fileIds.EmbeddedSource); + codeFile = new CodeFile(filePath, coverage, lineVisitStatus, branches, additionalFileReader); + } + else + { + codeFile = new CodeFile(filePath, coverage, lineVisitStatus, branches); + } foreach (var trackedMethodCoverage in coverageByTrackedMethod) { @@ -347,7 +357,7 @@ private static CodeFile ProcessFile(IDictionary trackedMethods, } var methodsOfFile = methods - .Where(m => m.Element("FileRef") != null && fileIds.Contains(m.Element("FileRef").Attribute("uid").Value)) + .Where(m => m.Element("FileRef") != null && fileIds.Uids.Contains(m.Element("FileRef").Attribute("uid").Value)) .ToArray(); SetMethodMetrics(codeFile, methodsOfFile); @@ -448,7 +458,7 @@ private static void SetMethodMetrics(CodeFile codeFile, IEnumerable me /// The methods. /// The file ids of the class. /// The branches by line number. - private static Dictionary> GetBranches(XElement[] methods, HashSet fileIds) + private static Dictionary> GetBranches(XElement[] methods, FileElement fileIds) { var branchPoints = methods .Elements("BranchPoints") @@ -465,7 +475,7 @@ private static void SetMethodMetrics(CodeFile codeFile, IEnumerable me foreach (var branchPoint in branchPoints) { if (branchPoint.Attribute("fileid") != null - && !fileIds.Contains(branchPoint.Attribute("fileid").Value)) + && !fileIds.Uids.Contains(branchPoint.Attribute("fileid").Value)) { // If fileid is available, verify that branch belongs to same file (available since version OpenCover.4.5.3418) continue; @@ -600,5 +610,32 @@ private static string ExtractMethodName(string methodName) return (methodGroups.Length == 0) ? (decimal?)null : (decimal)Math.Truncate(1000 * (double)visitedMethods / (double)methodGroups.Length) / 10; } + + private class FileElement + { + /// + /// Initializes a new instance of the class. + /// + /// The File elements. + public FileElement(IEnumerable elements) + { + this.Uids = elements.Select(f => f.Attribute("uid").Value).ToHashSet(); + this.EmbeddedSource = elements + .Select(e => e.Attribute("altcover.embed")) + .Where(e => e != null) + .FirstOrDefault() + ?.Value; + } + + /// + /// Gets the uids. + /// + public HashSet Uids { get; } + + /// + /// Gets or sets the embedded source code. + /// + public string EmbeddedSource { get; set; } + } } } diff --git a/src/ReportGenerator.Core/Properties/AssemblyInfo.cs b/src/ReportGenerator.Core/Properties/AssemblyInfo.cs index b3ea877f..4ebb8641 100644 --- a/src/ReportGenerator.Core/Properties/AssemblyInfo.cs +++ b/src/ReportGenerator.Core/Properties/AssemblyInfo.cs @@ -1,2 +1,2 @@ [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("ReportGenerator.Core.Test, PublicKey=002400000480000094000000060200000024000052534131000400000100010001b2e0fd2c33078e5bc48ce0c850634f8a79a3e7c08bd7a53cc76c3c25eca25d2c27627b530c50827d4dcbf41f6a1081c92168062637702f099169f2aaff1152b54fdf8f6d80184fe12493a047260f9d84b957300de136bdbe90b0b3deec03ed4478e5c7ee9b3f8871b2ad8035f395ebbca57e895b05cb9ffa9c7b1fcc2709a9")] -[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=002400000480000094000000060200000024000052534131000400000100010001b2e0fd2c33078e5bc48ce0c850634f8a79a3e7c08bd7a53cc76c3c25eca25d2c27627b530c50827d4dcbf41f6a1081c92168062637702f099169f2aaff1152b54fdf8f6d80184fe12493a047260f9d84b957300de136bdbe90b0b3deec03ed4478e5c7ee9b3f8871b2ad8035f395ebbca57e895b05cb9ffa9c7b1fcc2709a9")] \ No newline at end of file +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("DynamicProxyGenAssembly2,PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] \ No newline at end of file diff --git a/src/ReportGenerator.Core/ReportGenerator.Core.csproj b/src/ReportGenerator.Core/ReportGenerator.Core.csproj index 0a32a545..c8e35d2e 100644 --- a/src/ReportGenerator.Core/ReportGenerator.Core.csproj +++ b/src/ReportGenerator.Core/ReportGenerator.Core.csproj @@ -74,13 +74,11 @@ - - - - + + + + - - all runtime; build; native; contentfiles; analyzers diff --git a/src/ReportGenerator.Core/stylecop.ruleset b/src/ReportGenerator.Core/stylecop.ruleset index 4ddff22f..343cca24 100644 --- a/src/ReportGenerator.Core/stylecop.ruleset +++ b/src/ReportGenerator.Core/stylecop.ruleset @@ -5,6 +5,7 @@ + diff --git a/src/ReportGenerator.DotnetCorePluginLoader/ReportGenerator.DotnetCorePluginLoader.csproj b/src/ReportGenerator.DotnetCorePluginLoader/ReportGenerator.DotnetCorePluginLoader.csproj index 09706ec5..14ef943f 100644 --- a/src/ReportGenerator.DotnetCorePluginLoader/ReportGenerator.DotnetCorePluginLoader.csproj +++ b/src/ReportGenerator.DotnetCorePluginLoader/ReportGenerator.DotnetCorePluginLoader.csproj @@ -1,13 +1,13 @@  - netcoreapp2.0;net5.0 + netcoreapp3.1;net5.0;net6.0 ReportGenerator.DotnetCorePluginLoader 4.8.13.0 4.8.13.0 - + diff --git a/src/ReportGenerator.DotnetGlobalTool/ReportGenerator.DotnetGlobalTool.csproj b/src/ReportGenerator.DotnetGlobalTool/ReportGenerator.DotnetGlobalTool.csproj index b7375ffd..7f13a786 100644 --- a/src/ReportGenerator.DotnetGlobalTool/ReportGenerator.DotnetGlobalTool.csproj +++ b/src/ReportGenerator.DotnetGlobalTool/ReportGenerator.DotnetGlobalTool.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.1;netcoreapp3.0;net5.0 + netcoreapp3.1;net5.0;net6.0 ProgramIcon.ico ReportGenerator Palmmedia.ReportGenerator diff --git a/src/ReportGenerator.MSBuild/ReportGenerator.MSBuild.csproj b/src/ReportGenerator.MSBuild/ReportGenerator.MSBuild.csproj index 3079cb98..aec4c5e0 100644 --- a/src/ReportGenerator.MSBuild/ReportGenerator.MSBuild.csproj +++ b/src/ReportGenerator.MSBuild/ReportGenerator.MSBuild.csproj @@ -10,7 +10,7 @@ - + diff --git a/src/ReportGenerator.sln b/src/ReportGenerator.sln index 9e3a8cf4..0d13eb28 100644 --- a/src/ReportGenerator.sln +++ b/src/ReportGenerator.sln @@ -22,6 +22,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Reports", "Reports", "{7925 Testprojects\CSharp\Reports\OpenCover.xml = Testprojects\CSharp\Reports\OpenCover.xml Testprojects\CSharp\Reports\OpenCover_altcover.xml = Testprojects\CSharp\Reports\OpenCover_altcover.xml Testprojects\CSharp\Reports\OpenCover_coverlet.xml = Testprojects\CSharp\Reports\OpenCover_coverlet.xml + Testprojects\CSharp\Reports\OpenCoverWithEmbeddedSource.xml = Testprojects\CSharp\Reports\OpenCoverWithEmbeddedSource.xml Testprojects\CSharp\Reports\OpenCoverWithTrackedMethods.xml = Testprojects\CSharp\Reports\OpenCoverWithTrackedMethods.xml Testprojects\CSharp\Reports\Partcover2.2.xml = Testprojects\CSharp\Reports\Partcover2.2.xml Testprojects\CSharp\Reports\Partcover2.3.0.35109.xml = Testprojects\CSharp\Reports\Partcover2.3.0.35109.xml diff --git a/src/Testprojects/CSharp/Project_DotNetCore/Test/Test.csproj b/src/Testprojects/CSharp/Project_DotNetCore/Test/Test.csproj index c9d0f8c1..9300c5e6 100644 --- a/src/Testprojects/CSharp/Project_DotNetCore/Test/Test.csproj +++ b/src/Testprojects/CSharp/Project_DotNetCore/Test/Test.csproj @@ -1,6 +1,6 @@ - netcoreapp2.0 + netcoreapp3.1 false diff --git a/src/Testprojects/CSharp/Project_DotNetCore/UnitTests/UnitTests.csproj b/src/Testprojects/CSharp/Project_DotNetCore/UnitTests/UnitTests.csproj index 1ebe1edc..e463314c 100644 --- a/src/Testprojects/CSharp/Project_DotNetCore/UnitTests/UnitTests.csproj +++ b/src/Testprojects/CSharp/Project_DotNetCore/UnitTests/UnitTests.csproj @@ -1,7 +1,7 @@ - netcoreapp2.0 + netcoreapp3.1 false diff --git a/src/Testprojects/CSharp/Reports/OpenCoverWithEmbeddedSource.xml b/src/Testprojects/CSharp/Reports/OpenCoverWithEmbeddedSource.xml new file mode 100644 index 00000000..a4de9bb4 --- /dev/null +++ b/src/Testprojects/CSharp/Reports/OpenCoverWithEmbeddedSource.xml @@ -0,0 +1,35 @@ + + + + + + C:\temp\CSharpGeneratedDemo.dll + 2021-10-25T17:23:59.746698Z + CSharpGeneratedDemo + + + + + + + MustacheAttribute + + + + 100663304 + System.Void MustacheAttribute::.ctor(System.String,System.String,System.String) + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Testprojects/altCover.ps1 b/src/Testprojects/altCover.ps1 index a0dd46c1..51b0b726 100644 --- a/src/Testprojects/altCover.ps1 +++ b/src/Testprojects/altCover.ps1 @@ -1,7 +1,7 @@ dotnet test /p:AltCover=true /p:AltCoverXmlReport=..\..\Reports\OpenCover_altcover.xml /p:AltCoverCobertura=..\..\Reports\Cobertura_altcover.xml /p:AltCoverAssemblyFilter=UnitTests CSharp\Project_DotNetCore\UnitTests\UnitTests.csproj $pathToReplace1 = [regex]::Escape((Get-Location).Path + "\CSharp\Project_DotNetCore\Test") -$pathToReplace2 = [regex]::Escape((Get-Location).Path + "\CSharp\Project_DotNetCore\UnitTests\bin\Debug\netcoreapp2.0\__Saved") +$pathToReplace2 = [regex]::Escape((Get-Location).Path + "\CSharp\Project_DotNetCore\UnitTests\bin\Debug\netcoreapp3.1\__Saved") $replacement = "C:\temp" (gc "CSharp\Reports\OpenCover_altcover.xml") | % { $_ -replace $pathToReplace1, $replacement } | Out-File "CSharp\Reports\OpenCover_altcover.xml" -Encoding UTF8 diff --git a/src/build.proj b/src/build.proj index 2fbea888..eeee7b76 100644 --- a/src/build.proj +++ b/src/build.proj @@ -51,15 +51,14 @@ - - - - + + + - - + + @@ -82,22 +81,19 @@ - - - + + - - - - + + @@ -105,9 +101,9 @@ - - - + + +