From 9facfbe8bf3a67a544fc228e4f405c2b4e72b10b Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 14 Oct 2012 11:12:54 +0100 Subject: [PATCH] Display code coverage results when solution opened. On opening a solution previous code coverage results files are located and displayed in the code coverage pad. --- .../CodeCoverage/Project/CodeCoverage.csproj | 2 + .../Project/Src/CodeCoverageService.cs | 10 +++ .../Project/Src/CodeCoverageTestRunner.cs | 2 +- .../Project/Src/OpenCoverApplication.cs | 13 +-- .../Src/ProjectCodeCoverageResultsFileName.cs | 30 +++++++ .../Src/SolutionCodeCoverageResults.cs | 48 ++++++++++ .../Test/CodeCoverage.Tests.csproj | 4 + .../SolutionCodeCoverageResultsTests.cs | 89 +++++++++++++++++++ 8 files changed, 185 insertions(+), 13 deletions(-) create mode 100644 src/AddIns/Analysis/CodeCoverage/Project/Src/ProjectCodeCoverageResultsFileName.cs create mode 100644 src/AddIns/Analysis/CodeCoverage/Project/Src/SolutionCodeCoverageResults.cs create mode 100644 src/AddIns/Analysis/CodeCoverage/Test/Coverage/SolutionCodeCoverageResultsTests.cs diff --git a/src/AddIns/Analysis/CodeCoverage/Project/CodeCoverage.csproj b/src/AddIns/Analysis/CodeCoverage/Project/CodeCoverage.csproj index a9d268549f..b3d40a4769 100644 --- a/src/AddIns/Analysis/CodeCoverage/Project/CodeCoverage.csproj +++ b/src/AddIns/Analysis/CodeCoverage/Project/CodeCoverage.csproj @@ -91,8 +91,10 @@ + + diff --git a/src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageService.cs b/src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageService.cs index 0e0a3675b0..fff4d88b91 100644 --- a/src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageService.cs +++ b/src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageService.cs @@ -5,6 +5,7 @@ using ICSharpCode.SharpDevelop.Editor; using System; using System.Collections.Generic; using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Project; namespace ICSharpCode.CodeCoverage { @@ -20,6 +21,7 @@ namespace ICSharpCode.CodeCoverage static CodeCoverageService() { WorkbenchSingleton.Workbench.ViewOpened += ViewOpened; + ProjectService.SolutionLoaded += SolutionLoaded; } /// @@ -143,5 +145,13 @@ namespace ICSharpCode.CodeCoverage return results.Count > 0; } } + + static void SolutionLoaded(object sender, SolutionEventArgs e) + { + var solutionCodeCoverageResults = new SolutionCodeCoverageResults(e.Solution); + foreach (CodeCoverageResults results in solutionCodeCoverageResults.GetCodeCoverageResultsForAllProjects()) { + ShowResults(results); + } + } } } diff --git a/src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageTestRunner.cs b/src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageTestRunner.cs index a932555057..5785ee7970 100644 --- a/src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageTestRunner.cs +++ b/src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageTestRunner.cs @@ -35,7 +35,7 @@ namespace ICSharpCode.CodeCoverage return fileSystem.FileExists(CodeCoverageResultsFileName); } - public CodeCoverageResults ReadCodeCoverageResults() + public CodeCoverageResults ReadCodeCoverageResults() { TextReader reader = fileSystem.CreateTextReader(CodeCoverageResultsFileName); return new CodeCoverageResults(reader); diff --git a/src/AddIns/Analysis/CodeCoverage/Project/Src/OpenCoverApplication.cs b/src/AddIns/Analysis/CodeCoverage/Project/Src/OpenCoverApplication.cs index 51968b6121..a80a05da32 100644 --- a/src/AddIns/Analysis/CodeCoverage/Project/Src/OpenCoverApplication.cs +++ b/src/AddIns/Analysis/CodeCoverage/Project/Src/OpenCoverApplication.cs @@ -65,18 +65,7 @@ namespace ICSharpCode.CodeCoverage } public string CodeCoverageResultsFileName { - get { return GetCodeCoverageResultsFileName(); } - } - - string GetCodeCoverageResultsFileName() - { - string outputDirectory = GetOutputDirectory(nunitConsoleApp.Project); - return Path.Combine(outputDirectory, "coverage.xml"); - } - - string GetOutputDirectory(IProject project) - { - return Path.Combine(project.Directory, "OpenCover"); + get { return new ProjectCodeCoverageResultsFileName(nunitConsoleApp.Project).FileName; } } public ProcessStartInfo GetProcessStartInfo() diff --git a/src/AddIns/Analysis/CodeCoverage/Project/Src/ProjectCodeCoverageResultsFileName.cs b/src/AddIns/Analysis/CodeCoverage/Project/Src/ProjectCodeCoverageResultsFileName.cs new file mode 100644 index 0000000000..d8352e7cdc --- /dev/null +++ b/src/AddIns/Analysis/CodeCoverage/Project/Src/ProjectCodeCoverageResultsFileName.cs @@ -0,0 +1,30 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.IO; +using ICSharpCode.SharpDevelop.Project; + +namespace ICSharpCode.CodeCoverage +{ + public class ProjectCodeCoverageResultsFileName + { + public ProjectCodeCoverageResultsFileName(IProject project) + { + FileName = GetCodeCoverageResultsFileName(project); + } + + public string FileName { get; private set; } + + string GetCodeCoverageResultsFileName(IProject project) + { + string outputDirectory = GetOutputDirectory(project); + return Path.Combine(outputDirectory, "coverage.xml"); + } + + string GetOutputDirectory(IProject project) + { + return Path.Combine(project.Directory, "OpenCover"); + } + } +} diff --git a/src/AddIns/Analysis/CodeCoverage/Project/Src/SolutionCodeCoverageResults.cs b/src/AddIns/Analysis/CodeCoverage/Project/Src/SolutionCodeCoverageResults.cs new file mode 100644 index 0000000000..885989e2d2 --- /dev/null +++ b/src/AddIns/Analysis/CodeCoverage/Project/Src/SolutionCodeCoverageResults.cs @@ -0,0 +1,48 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Collections.Generic; +using System.IO; + +using ICSharpCode.SharpDevelop.Project; + +namespace ICSharpCode.CodeCoverage +{ + public class SolutionCodeCoverageResults + { + Solution solution; + IFileSystem fileSystem; + + public SolutionCodeCoverageResults(Solution solution) + : this(solution, new FileSystem()) + { + } + + public SolutionCodeCoverageResults(Solution solution, IFileSystem fileSystem) + { + this.solution = solution; + this.fileSystem = fileSystem; + } + + public IEnumerable GetCodeCoverageResultsForAllProjects() + { + foreach (IProject project in solution.Projects) { + CodeCoverageResults results = GetCodeCoverageResultsForProject(project); + if (results != null) { + yield return results; + } + } + } + + CodeCoverageResults GetCodeCoverageResultsForProject(IProject project) + { + var fileName = new ProjectCodeCoverageResultsFileName(project); + if (fileSystem.FileExists(fileName.FileName)) { + TextReader reader = fileSystem.CreateTextReader(fileName.FileName); + return new CodeCoverageResults(reader); + } + return null; + } + } +} diff --git a/src/AddIns/Analysis/CodeCoverage/Test/CodeCoverage.Tests.csproj b/src/AddIns/Analysis/CodeCoverage/Test/CodeCoverage.Tests.csproj index ca9e20c1bc..ea869eca66 100644 --- a/src/AddIns/Analysis/CodeCoverage/Test/CodeCoverage.Tests.csproj +++ b/src/AddIns/Analysis/CodeCoverage/Test/CodeCoverage.Tests.csproj @@ -38,6 +38,9 @@ 3.0 + + ..\..\..\..\Libraries\RhinoMocks\Rhino.Mocks.dll + @@ -75,6 +78,7 @@ + diff --git a/src/AddIns/Analysis/CodeCoverage/Test/Coverage/SolutionCodeCoverageResultsTests.cs b/src/AddIns/Analysis/CodeCoverage/Test/Coverage/SolutionCodeCoverageResultsTests.cs new file mode 100644 index 0000000000..2722987586 --- /dev/null +++ b/src/AddIns/Analysis/CodeCoverage/Test/Coverage/SolutionCodeCoverageResultsTests.cs @@ -0,0 +1,89 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +using ICSharpCode.CodeCoverage.Tests.Utils; +using ICSharpCode.SharpDevelop.Project; +using NUnit.Framework; +using Rhino.Mocks; +using UnitTesting.Tests.Utils; + +namespace ICSharpCode.CodeCoverage.Tests.Coverage +{ + [TestFixture] + public class SolutionCodeCoverageResultsTests + { + SolutionCodeCoverageResults solutionCodeCoverageResults; + Solution solution; + IFileSystem fakeFileSystem; + + void CreateSolutionCodeCoverageResults() + { + solution = new Solution(new MockProjectChangeWatcher()); + fakeFileSystem = MockRepository.GenerateStub(); + solutionCodeCoverageResults = new SolutionCodeCoverageResults(solution, fakeFileSystem); + } + + IEnumerable GetCodeCoverageResultsForAllProjects() + { + return solutionCodeCoverageResults.GetCodeCoverageResultsForAllProjects(); + } + + void AddProject(string fileName) + { + var project = new MockCSharpProject(solution, Path.GetFileNameWithoutExtension(fileName)); + project.FileName = fileName; + solution.Folders.Add(project); + } + + void AddCodeCoverageFile(string fileName) + { + string coverageXml = ""; + AddCodeCoverageFile(fileName, coverageXml); + } + + void AddCodeCoverageFile(string fileName, string coverageXml) + { + var stringReader = new StringReader(coverageXml); + fakeFileSystem.Stub(fs => fs.FileExists(fileName)).Return(true); + fakeFileSystem.Stub(fs => fs.CreateTextReader(fileName)).Return(stringReader); + } + + [Test] + public void GetCodeCoverageResultsForAllProjects_NoProjects_ReturnsNoResults() + { + CreateSolutionCodeCoverageResults(); + + List results = GetCodeCoverageResultsForAllProjects().ToList(); + + Assert.AreEqual(0, results.Count); + } + + [Test] + public void GetCodeCoverageResultsForAllProjects_OneProject_ReturnsOneCodeCoverageResult() + { + CreateSolutionCodeCoverageResults(); + AddProject(@"d:\Projects\MyProject\MyProject.csproj"); + AddCodeCoverageFile(@"d:\Projects\MyProject\OpenCover\coverage.xml"); + + List results = GetCodeCoverageResultsForAllProjects().ToList(); + + Assert.AreEqual(1, results.Count); + } + + [Test] + public void GetCodeCoverageResultsForAllProjects_OneProjectInSolutionWithoutCodeCoverageResultsFile_ReturnsNoResults() + { + CreateSolutionCodeCoverageResults(); + AddProject(@"d:\Projects\MyProject\MyProject.csproj"); + + List results = GetCodeCoverageResultsForAllProjects().ToList(); + + Assert.AreEqual(0, results.Count); + } + } +}