From e2dafe2eb82d7dede92f2ad1a15e3e7edacede21 Mon Sep 17 00:00:00 2001 From: Oluwatoni Solarin-Sodara Date: Sun, 18 Mar 2018 13:55:12 +0100 Subject: [PATCH] add preliminary support for opencover output format --- .../Reporters/OpenCoverReporter.cs | 113 ++++++++++++++++++ .../CoverageResultTask.cs | 16 ++- src/coverlet.msbuild/coverlet.props | 3 +- 3 files changed, 127 insertions(+), 5 deletions(-) create mode 100644 src/coverlet.core/Reporters/OpenCoverReporter.cs diff --git a/src/coverlet.core/Reporters/OpenCoverReporter.cs b/src/coverlet.core/Reporters/OpenCoverReporter.cs new file mode 100644 index 0000000..f15a1a0 --- /dev/null +++ b/src/coverlet.core/Reporters/OpenCoverReporter.cs @@ -0,0 +1,113 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Xml; + +namespace Coverlet.Core.Reporters +{ + public class OpenCoverReporter : IReporter + { + public string Format(CoverageResult result) + { + XmlDocument xml = new XmlDocument(); + XmlElement coverage = xml.CreateElement("CoverageSession"); + coverage.AppendChild(xml.CreateElement("Summary")); + + XmlElement modules = xml.CreateElement("Modules"); + + foreach (var mod in result.Modules) + { + XmlElement module = xml.CreateElement("Module"); + module.SetAttribute("hash", Guid.NewGuid().ToString().ToUpper()); + + XmlElement path = xml.CreateElement("ModulePath"); + path.AppendChild(xml.CreateTextNode(mod.Key)); + + XmlElement time = xml.CreateElement("ModuleTime"); + time.AppendChild(xml.CreateTextNode(DateTime.UtcNow.ToString("yyyy-MM-ddThh:mm:ss"))); + + XmlElement name = xml.CreateElement("ModuleName"); + name.AppendChild(xml.CreateTextNode(Path.GetFileNameWithoutExtension(mod.Key))); + + module.AppendChild(path); + module.AppendChild(time); + module.AppendChild(name); + + XmlElement files = xml.CreateElement("Files"); + XmlElement classes = xml.CreateElement("Classes"); + int i = 1; + + foreach (var doc in mod.Value) + { + XmlElement file = xml.CreateElement("File"); + file.SetAttribute("uid", i.ToString()); + file.SetAttribute("fullPath", doc.Key); + files.AppendChild(file); + + foreach (var cls in doc.Value) + { + XmlElement @class = xml.CreateElement("Class"); + + XmlElement className = xml.CreateElement("FullName"); + className.AppendChild(xml.CreateTextNode(cls.Key)); + + @class.AppendChild(xml.CreateElement("Summary")); + @class.AppendChild(className); + + XmlElement methods = xml.CreateElement("Methods"); + int j = 0; + foreach (var meth in cls.Value) + { + XmlElement method = xml.CreateElement("Method"); + + XmlElement methodName = xml.CreateElement("Name"); + methodName.AppendChild(xml.CreateTextNode(meth.Key)); + + XmlElement fileRef = xml.CreateElement("FileRef"); + fileRef.SetAttribute("uid", i.ToString()); + + method.AppendChild(xml.CreateElement("Summary")); + method.AppendChild(xml.CreateElement("MetadataToken")); + method.AppendChild(methodName); + method.AppendChild(fileRef); + + XmlElement methodPoint = xml.CreateElement("MethodPoint"); + methodPoint.SetAttribute("type", "xsi", "SequencePoint"); + methodPoint.SetAttribute("ordinal", j.ToString()); + methodPoint.SetAttribute("sc", "0"); + methodPoint.SetAttribute("sl", meth.Value.First().Key.ToString()); + methodPoint.SetAttribute("ec", "1"); + methodPoint.SetAttribute("el", meth.Value.Last().Key.ToString()); + methodPoint.SetAttribute("bec", "0"); + methodPoint.SetAttribute("bev", "0"); + methodPoint.SetAttribute("fileid", i.ToString()); + + method.AppendChild(xml.CreateElement("SequencePoints")); + method.AppendChild(xml.CreateElement("BranchPoints")); + method.AppendChild(methodPoint); + methods.AppendChild(method); + j++; + } + + @class.AppendChild(methods); + classes.AppendChild(@class); + } + i++; + } + + module.AppendChild(files); + module.AppendChild(classes); + modules.AppendChild(module); + } + + coverage.AppendChild(modules); + xml.AppendChild(coverage); + + StringWriter writer = new StringWriter(); + xml.Save(writer); + + return writer.ToString(); + } + } +} \ No newline at end of file diff --git a/src/coverlet.msbuild.tasks/CoverageResultTask.cs b/src/coverlet.msbuild.tasks/CoverageResultTask.cs index aedb43b..b39fd39 100644 --- a/src/coverlet.msbuild.tasks/CoverageResultTask.cs +++ b/src/coverlet.msbuild.tasks/CoverageResultTask.cs @@ -44,10 +44,18 @@ namespace Coverlet.MSbuild.Tasks Console.WriteLine($" Generating report '{_filename}'"); IReporter reporter = default(IReporter); - if (_format == "lcov") - reporter = new LcovReporter(); - else - reporter = new JsonReporter(); + switch (_format) + { + case "lcov": + reporter = new LcovReporter(); + break; + case "opencover": + reporter = new OpenCoverReporter(); + break; + default: + reporter = new JsonReporter(); + break; + } File.WriteAllText(_filename, result.Format(reporter)); diff --git a/src/coverlet.msbuild/coverlet.props b/src/coverlet.msbuild/coverlet.props index 95cc172..94f5e16 100644 --- a/src/coverlet.msbuild/coverlet.props +++ b/src/coverlet.msbuild/coverlet.props @@ -5,7 +5,8 @@ $(MSBuildProjectDirectory) .info - .json + .xml + .json $(CoverletOutputDirectory)\coverage$(CoverletOutputExtension) false