public int Execute( InstrumentationResult result, float threshold, bool noFail) { var hitsInfo = HitsInfo.TryReadFromDirectory(result.HitsPath); var files = result.GetSourceFiles(); var summary = SummaryFactory.CalculateFilesSummary(files, hitsInfo, threshold); var tableRows = SummaryFactory.GetSummaryGrid(files, hitsInfo, threshold); var consoleTable = new ConsoleTable { Header = CreateHeader(), Body = tableRows.Where(r => !r.Root).Select(f => CreateRow(f)).ToArray(), Footer = CreateFooter(summary) }; consoleTable.WriteTable(); return(noFail || summary.LinesCoveragePass ? 0 : 1); }
public virtual int Execute(InstrumentationResult result, IDirectoryInfo output, float threshold, bool noFail) { Directory.CreateDirectory(output.FullName); var hitsInfo = HitsInfo.TryReadFromDirectory(result.HitsPath); var fileName = Path.Combine(output.FullName, "index.html"); var sourceFiles = result.GetSourceFiles(); var totalLines = sourceFiles.Sum(sf => sf.Sequences .SelectMany(s => s.GetLines()) .Distinct() .Count() ); var totalCoveredLines = sourceFiles.Sum(sf => sf.Sequences .Where(s => hitsInfo.WasHit(s.HitId)) .SelectMany(s => s.GetLines()) .Distinct() .Count() ); var totalCoveragePercentage = (float)totalCoveredLines / totalLines; var isHigherThanThreshold = totalCoveragePercentage >= threshold; var totalThresholdClass = isHigherThanThreshold ? "green" : "red"; using (var htmlWriter = (TextWriter)File.CreateText(fileName)) { htmlWriter.WriteLine("<html>"); htmlWriter.WriteLine("<style>"); htmlWriter.WriteLine(ResourceUtils.GetContent("MiniCover.Reports.Html.Shared.css")); htmlWriter.WriteLine(ResourceUtils.GetContent("MiniCover.Reports.Html.Summary.css")); htmlWriter.WriteLine("</style>"); htmlWriter.WriteLine("<script>"); htmlWriter.WriteLine(ResourceUtils.GetContent("MiniCover.Reports.Html.Shared.js")); htmlWriter.WriteLine("</script>"); htmlWriter.WriteLine("<body>"); // Write summary htmlWriter.WriteLine("<h2>Summary</h2>"); htmlWriter.WriteLine("<table>"); htmlWriter.WriteLine($"<tr><th>Generated on</th><td>{DateTime.Now}</td></tr>"); htmlWriter.WriteLine($"<tr><th>Threshold</th><td>{threshold:P}</td></tr>"); htmlWriter.WriteLine("</table>"); // Write detailed report htmlWriter.WriteLine("<h2>Source Files</h2>"); htmlWriter.WriteLine("<table border=\"1\" cellpadding=\"5\">"); htmlWriter.WriteLine("<tr>"); htmlWriter.WriteLine("<th>File</th>"); htmlWriter.WriteLine("<th class=\"value\">Lines</th>"); htmlWriter.WriteLine("<th class=\"value\">% Lines</th>"); htmlWriter.WriteLine("<th class=\"value\">Stmts</th>"); htmlWriter.WriteLine("<th class=\"value\">% Stmts</th>"); htmlWriter.WriteLine("<th class=\"value\">Branches</th>"); htmlWriter.WriteLine("<th class=\"value\">% Branches</th>"); htmlWriter.WriteLine("</tr>"); foreach (var summaryRow in SummaryFactory.GetSummaryGrid(result.GetSourceFiles(), hitsInfo, threshold)) { var summary = summaryRow.Summary; var statementsCoverageClass = summary.StatementsCoveragePass ? "green" : "red"; var linesCoverageClass = summary.LinesCoveragePass ? "green" : "red"; var branchesCoverageClass = summary.BranchesCoveragePass ? "green" : "red"; var classes = new List <string> { }; if (summaryRow.Level == 0) { classes.Add("root"); } if (summaryRow.Folder) { classes.Add("folder"); } if (summaryRow.File) { classes.Add("file"); } var marginLeft = Math.Max(summaryRow.Level - 1, 0) * 20; htmlWriter.WriteLine($"<tr class=\"{string.Join(" ", classes)}\">"); htmlWriter.WriteLine($"<td>"); if (summaryRow.SourceFiles.Length == 1) { var indexRelativeFileName = GetIndexRelativeHtmlFileName(summaryRow.SourceFiles[0].Path); htmlWriter.WriteLine($"<a class=\"name\" href=\"{indexRelativeFileName}\" style=\"margin-left: {marginLeft}px\">{summaryRow.Name}</a>"); } else { htmlWriter.WriteLine($"<span class=\"name\" style=\"margin-left: {marginLeft}px\">{summaryRow.Name}</span"); } htmlWriter.WriteLine("</td>"); htmlWriter.WriteLine($"<td class=\"value {linesCoverageClass}\">{summary.CoveredLines} / {summary.Lines}</td>"); htmlWriter.WriteLine($"<td class=\"value {linesCoverageClass}\">{summary.LinesPercentage:P}</td>"); htmlWriter.WriteLine($"<td class=\"value {statementsCoverageClass}\">{summary.CoveredStatements} / {summary.Statements}</td>"); htmlWriter.WriteLine($"<td class=\"value {statementsCoverageClass}\">{summary.StatementsPercentage:P}</td>"); htmlWriter.WriteLine($"<td class=\"value {branchesCoverageClass}\">{summary.CoveredBranches} / {summary.Branches}</td>"); htmlWriter.WriteLine($"<td class=\"value {branchesCoverageClass}\">{summary.BranchesPercentage:P}</td>"); htmlWriter.WriteLine("</tr>"); if (summaryRow.SourceFiles.Length == 1) { var relativeFileName = GetHtmlFileName(output, summaryRow.SourceFiles[0].Path); new HtmlSourceFileReport() .Generate(result, summaryRow.SourceFiles.First(), hitsInfo, threshold, relativeFileName); } } htmlWriter.WriteLine("</table>"); htmlWriter.WriteLine("</body>"); htmlWriter.WriteLine("</html>"); } return(noFail || isHigherThanThreshold ? 0 : 1); }