Skip to content

Commit

Permalink
Refactored file parsing + tests
Browse files Browse the repository at this point in the history
  • Loading branch information
csMACnz committed Dec 13, 2014
1 parent 43444a9 commit 7cd83f3
Show file tree
Hide file tree
Showing 14 changed files with 1,601 additions and 62 deletions.
301 changes: 301 additions & 0 deletions src/csmacnz.Coveralls.Tests/EmptyReport.xml

Large diffs are not rendered by default.

101 changes: 101 additions & 0 deletions src/csmacnz.Coveralls.Tests/OpenCoverParserTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
using System.IO;
using System.Reflection;
using System.Xml;
using System.Xml.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace csmacnz.Coveralls.Tests
{
[TestClass]
public class OpenCoverParserTests
{
private const string SingleFileReportSourceFilePath = @"c:\Users\Mark\Documents\Visual Studio 2013\Projects\OpenCoverTesting\OpenCoverTesting\Class1.cs";

[TestMethod]
public void EmptyReportLoadsNoSourceFiles()
{
var document = LoadDocumentFromResource("csmacnz.Coveralls.Tests.EmptyReport.xml");

var results = CreateOpenCoverParser().GenerateSourceFiles(document);

Assert.AreEqual(0, results.Count);
}

[TestMethod]
public void SingleFileReportLoadsSingleSourceFiles()
{
var document = LoadDocumentFromResource("csmacnz.Coveralls.Tests.SingleFileReport.xml");

var results = CreateOpenCoverParser().GenerateSourceFiles(document);

Assert.AreEqual(1, results.Count);
}

[TestMethod]
public void SingleFileReportWithSingleMethodLineCoveredWithoutSourceLoadsCorrectly()
{
var document = LoadDocumentFromResource("csmacnz.Coveralls.Tests.SingleFileReportOneLineCovered.xml");

var results = CreateOpenCoverParserForSingleFileReport().GenerateSourceFiles(document);

Assert.AreEqual(1, results.Count);
Assert.AreEqual(SingleFileReportSourceFilePath, results[0].Name);
Assert.AreEqual(12, results[0].Coverage.Length);
Assert.AreEqual(1, results[0].Coverage[8]);
}

[TestMethod]
public void SingleFileReportWithSingleMethodLineUncoveredWithoutSourceLoadsCorrectly()
{
var document = LoadDocumentFromResource("csmacnz.Coveralls.Tests.SingleFileReportOneLineUncovered.xml");

var results = CreateOpenCoverParserForSingleFileReport().GenerateSourceFiles(document);

Assert.AreEqual(1, results.Count);
Assert.AreEqual(SingleFileReportSourceFilePath, results[0].Name);
Assert.AreEqual(12, results[0].Coverage.Length);
Assert.AreEqual(0, results[0].Coverage[8]);
}

private OpenCoverParser CreateOpenCoverParser()
{
return new OpenCoverParser(new TestFileSystem());
}

private OpenCoverParser CreateOpenCoverParserForSingleFileReport()
{
var testFileSystem = new TestFileSystem();
var singleFileReportSourceContent = LoadContentFromResource("csmacnz.Coveralls.Tests.SingleFileReportSourceFile.txt");
testFileSystem.AddFile(SingleFileReportSourceFilePath, singleFileReportSourceContent);
return new OpenCoverParser(testFileSystem);
}

private static XDocument LoadDocumentFromResource(string embeddedResource)
{
XDocument document;
var executingAssembly = Assembly.GetExecutingAssembly();
using (var stream = executingAssembly.GetManifestResourceStream(embeddedResource))
{
using (var reader = XmlReader.Create(stream))
{
document = XDocument.Load(reader);
}
}
return document;
}

private static string LoadContentFromResource(string embeddedResource)
{
string content;
var executingAssembly = Assembly.GetExecutingAssembly();
using (var stream = executingAssembly.GetManifestResourceStream(embeddedResource))
{
using (var reader = new StreamReader(stream))
{
content = reader.ReadToEnd();
}
}
return content;
}
}
}
341 changes: 341 additions & 0 deletions src/csmacnz.Coveralls.Tests/SingleFileReport.xml

Large diffs are not rendered by default.

335 changes: 335 additions & 0 deletions src/csmacnz.Coveralls.Tests/SingleFileReportOneLineCovered.xml

Large diffs are not rendered by default.

343 changes: 343 additions & 0 deletions src/csmacnz.Coveralls.Tests/SingleFileReportOneLineUncovered.xml

Large diffs are not rendered by default.

12 changes: 12 additions & 0 deletions src/csmacnz.Coveralls.Tests/SingleFileReportSourceFile.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System;

namespace OpenCoverTesting
{
public static class Class1
{
public static void CallThis()
{
Console.WriteLine("called");
}
}
}
23 changes: 23 additions & 0 deletions src/csmacnz.Coveralls.Tests/TestFileSystem.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using System.Collections.Generic;

namespace csmacnz.Coveralls.Tests
{
public class TestFileSystem : IFileSystem
{
private readonly Dictionary<string, string> _files = new Dictionary<string, string>();

public string TryLoadFile(string fullPath)
{
if (_files.ContainsKey(fullPath))
{
return _files[fullPath];
}
return null;
}

public void AddFile(string path, string contents)
{
_files[path] = contents;
}
}
}
38 changes: 38 additions & 0 deletions src/csmacnz.Coveralls.Tests/csmacnz.Coveralls.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
<IsCodedUITest>False</IsCodedUITest>
<TestProjectType>UnitTest</TestProjectType>
<TargetFrameworkProfile />
<NuGetPackageImportStamp>891bef23</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
Expand All @@ -37,6 +38,16 @@
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Net.Http.Extensions">
<HintPath>..\packages\Microsoft.Net.Http.2.2.28\lib\net45\System.Net.Http.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http.Primitives">
<HintPath>..\packages\Microsoft.Net.Http.2.2.28\lib\net45\System.Net.Http.Primitives.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http.WebRequest" />
<Reference Include="System.XML" />
<Reference Include="System.Xml.Linq" />
</ItemGroup>
<Choose>
<When Condition="('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'">
Expand All @@ -52,14 +63,34 @@
</Choose>
<ItemGroup>
<Compile Include="CoverageFileBuilderTests.cs" />
<Compile Include="OpenCoverParserTests.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="TestFileSystem.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\csmacnz.Coveralls\csmacnz.Coveralls.csproj">
<Project>{ee91f48d-75d2-4c73-a3aa-b1ddc7ed7e13}</Project>
<Name>csmacnz.Coveralls</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="EmptyReport.xml" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="SingleFileReport.xml" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="SingleFileReportOneLineCovered.xml" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="SingleFileReportOneLineUncovered.xml" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="SingleFileReportSourceFile.txt" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<Choose>
<When Condition="'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'">
<ItemGroup>
Expand All @@ -80,6 +111,13 @@
</Choose>
<Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets'))" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
Expand Down
6 changes: 6 additions & 0 deletions src/csmacnz.Coveralls.Tests/packages.config
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.Bcl" version="1.1.9" targetFramework="net451" />
<package id="Microsoft.Bcl.Build" version="1.0.21" targetFramework="net451" />
<package id="Microsoft.Net.Http" version="2.2.28" targetFramework="net451" />
</packages>
12 changes: 12 additions & 0 deletions src/csmacnz.Coveralls/FileSystem.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System.IO;

namespace csmacnz.Coveralls
{
public class FileSystem : IFileSystem
{
public string TryLoadFile(string fullPath)
{
return File.ReadAllText(fullPath);
}
}
}
7 changes: 7 additions & 0 deletions src/csmacnz.Coveralls/IFileSystem.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace csmacnz.Coveralls
{
public interface IFileSystem
{
string TryLoadFile(string fullPath);
}
}
78 changes: 78 additions & 0 deletions src/csmacnz.Coveralls/OpenCoverParser.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
using System.Collections.Generic;
using System.Xml.Linq;

namespace csmacnz.Coveralls
{
public class OpenCoverParser
{
private readonly IFileSystem _fileSystem;

public OpenCoverParser(IFileSystem fileSystem)
{
_fileSystem = fileSystem;
}

public List<CoverageFile> GenerateSourceFiles(XDocument document)
{
var files = new List<CoverageFile>();
if (document.Root != null)
{
var xElement = document.Root.Element("Modules");
if (xElement != null)
foreach (var module in xElement.Elements("Module"))
{
var attribute = module.Attribute("skippedDueTo");
if (attribute == null || string.IsNullOrEmpty(attribute.Value))
{
var filesElement = module.Element("Files");
if (filesElement != null)
{
foreach (var file in filesElement.Elements("File"))
{
var fileid = file.Attribute("uid").Value;
var fullPath = file.Attribute("fullPath").Value;
var coverageBuilder = new CoverageFileBuilder(fullPath);

var classesElement = module.Element("Classes");
if (classesElement != null)
{
foreach (var @class in classesElement.Elements("Class"))
{
var methods = @class.Element("Methods");
if (methods != null)
foreach (var method in methods.Elements("Method"))
{
var sequencePointsElement = method.Element("SequencePoints");
if (sequencePointsElement != null)
foreach (var sequencePoint in sequencePointsElement.Elements("SequencePoint"))
{
var sequenceFileid = sequencePoint.Attribute("fileid").Value;
if (fileid == sequenceFileid)
{
var sourceLine = int.Parse(sequencePoint.Attribute("sl").Value);
var visitCount = int.Parse(sequencePoint.Attribute("vc").Value);

coverageBuilder.RecordCoverage(sourceLine, visitCount);
}

}
}
}
}

var readAllText = _fileSystem.TryLoadFile(fullPath);
if (readAllText != null)
{
coverageBuilder.AddSource(readAllText);
}
var coverageFile = coverageBuilder.CreateFile();
files.Add(coverageFile);
}
}
}
}
}
return files;
}
}
}
63 changes: 1 addition & 62 deletions src/csmacnz.Coveralls/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,71 +15,10 @@ public static void Main(string[] args)
var p = new OptionSet();
p.Parse(args);

var files = new List<CoverageFile>();
var fileName = @"opencovertests.xml";
var document = XDocument.Load(fileName);

if (document.Root != null)
{
var xElement = document.Root.Element("Modules");
if (xElement != null)
foreach(var module in xElement.Elements("Module"))
{
var attribute = module.Attribute("skippedDueTo");
if (attribute == null || string.IsNullOrEmpty(attribute.Value))
{
var filesElement = module.Element("Files");
if (filesElement != null)
{
foreach (var file in filesElement.Elements("File"))
{
var fileid = file.Attribute("uid").Value;
var fullPath = file.Attribute("fullPath").Value;
var sourcePath = fullPath;
var index = sourcePath.IndexOf(':');
if (index != -1)
{
sourcePath = sourcePath.Substring(index + 1);
}
sourcePath = sourcePath.Replace("\\", "/");
var coverageBuilder = new CoverageFileBuilder(sourcePath);

var classesElement = module.Element("Classes");
if (classesElement != null)
{
foreach(var @class in classesElement.Elements("Class"))
{
var methods = @class.Element("Methods");
if (methods != null)
foreach (var method in methods.Elements("Method"))
{
var sequencePointsElement = method.Element("SequencePoints");
if (sequencePointsElement != null)
foreach (var sequencePoint in sequencePointsElement.Elements("SequencePoint"))
{
var sequenceFileid = sequencePoint.Attribute("fileid").Value;
if (fileid == sequenceFileid)
{
var sourceLine = int.Parse(sequencePoint.Attribute("sl").Value);
var visitCount = int.Parse(sequencePoint.Attribute("vc").Value);

coverageBuilder.RecordCoverage(sourceLine,visitCount);
}

}
}
}
}

coverageBuilder.AddSource(File.ReadAllText(fullPath));

var coverageFile = coverageBuilder.CreateFile();
files.Add(coverageFile);
}
}
}
}
}
List<CoverageFile> files = new OpenCoverParser(new FileSystem()).GenerateSourceFiles(document);

GitData gitData = null;
var commitId = Environment.GetEnvironmentVariable("APPVEYOR_REPO_COMMIT");
Expand Down
Loading

0 comments on commit 7cd83f3

Please sign in to comment.