/// <summary> /// Creates a class report. /// </summary> /// <param name="reportRenderer">The report renderer.</param> /// <param name="class">The class.</param> /// <param name="fileAnalyses">The file analyses that correspond to the class.</param> public virtual void CreateClassReport(IReportRenderer reportRenderer, Class @class, IEnumerable <FileAnalysis> fileAnalyses) { if (reportRenderer == null) { throw new ArgumentNullException(nameof(reportRenderer)); } if (@class == null) { throw new ArgumentNullException(nameof(@class)); } if (fileAnalyses == null) { throw new ArgumentNullException(nameof(fileAnalyses)); } reportRenderer.BeginClassReport(this.ReportContext.ReportConfiguration.TargetDirectory, @class.Assembly.ShortName, @class.Name); reportRenderer.HeaderWithBackLink(ReportResources.Summary); reportRenderer.BeginKeyValueTable(); reportRenderer.KeyValueRow(ReportResources.Class, @class.Name); reportRenderer.KeyValueRow(ReportResources.Assembly, @class.Assembly.ShortName); reportRenderer.KeyValueRow(ReportResources.Files3, @class.Files.Select(f => f.Path)); reportRenderer.KeyValueRow(ReportResources.CoveredLines, @class.CoveredLines.ToString(CultureInfo.InvariantCulture)); reportRenderer.KeyValueRow(ReportResources.UncoveredLines, (@class.CoverableLines - @class.CoveredLines).ToString(CultureInfo.InvariantCulture)); reportRenderer.KeyValueRow(ReportResources.CoverableLines, @class.CoverableLines.ToString(CultureInfo.InvariantCulture)); reportRenderer.KeyValueRow(ReportResources.TotalLines, @class.TotalLines.GetValueOrDefault().ToString(CultureInfo.InvariantCulture)); reportRenderer.KeyValueRow(ReportResources.Coverage2, @class.CoverageQuota.HasValue ? $"{@class.CoverageQuota.Value.ToString(CultureInfo.InvariantCulture)}% ({@class.CoveredLines.ToString(CultureInfo.InvariantCulture)} {ReportResources.Of} {@class.CoverableLines.ToString(CultureInfo.InvariantCulture)})" : string.Empty); if (@class.CoveredBranches.HasValue && @class.TotalBranches.HasValue) { reportRenderer.KeyValueRow(ReportResources.CoveredBranches2, @class.CoveredBranches.GetValueOrDefault().ToString(CultureInfo.InvariantCulture)); reportRenderer.KeyValueRow(ReportResources.TotalBranches, @class.TotalBranches.GetValueOrDefault().ToString(CultureInfo.InvariantCulture)); decimal?branchCoverage = @class.BranchCoverageQuota; if (branchCoverage.HasValue) { reportRenderer.KeyValueRow(ReportResources.BranchCoverage2, $"{branchCoverage.Value.ToString(CultureInfo.InvariantCulture)}% ({@class.CoveredBranches.GetValueOrDefault().ToString(CultureInfo.InvariantCulture)} {ReportResources.Of} {@class.TotalBranches.GetValueOrDefault().ToString(CultureInfo.InvariantCulture)})"); } } if (this.ReportContext.ReportConfiguration.Tag != null) { reportRenderer.KeyValueRow(ReportResources.Tag, this.ReportContext.ReportConfiguration.Tag); } reportRenderer.FinishTable(); if (reportRenderer.SupportsCharts) { if (@class.HistoricCoverages.Any(h => h.CoverageQuota.HasValue || h.BranchCoverageQuota.HasValue)) { reportRenderer.Header(ReportResources.History); reportRenderer.Chart(@class.HistoricCoverages, this.ReportContext.Settings.RenderPngFallBackImagesForHistoryCharts); } } if (@class.Files.Any(f => f.MethodMetrics.Any())) { reportRenderer.Header(ReportResources.Metrics); reportRenderer.MetricsTable(@class); } reportRenderer.Header(ReportResources.Files); if (fileAnalyses.Any()) { int fileIndex = 0; foreach (var fileAnalysis in fileAnalyses) { reportRenderer.File(fileAnalysis.Path); if (!string.IsNullOrEmpty(fileAnalysis.Error)) { reportRenderer.Paragraph(fileAnalysis.Error); } else { reportRenderer.BeginLineAnalysisTable(new[] { string.Empty, "#", ReportResources.Line, string.Empty, ReportResources.Coverage }); foreach (var line in fileAnalysis.Lines) { reportRenderer.LineAnalysis(fileIndex, line); } reportRenderer.FinishTable(); } fileIndex++; } } else { reportRenderer.Paragraph(ReportResources.NoFilesFound); } reportRenderer.AddFooter(); if (fileAnalyses.Any()) { var testMethods = @class.Files .SelectMany(f => f.TestMethods) .Distinct() .OrderBy(l => l.ShortName); var codeElementsByFileIndex = new Dictionary <int, IEnumerable <CodeElement> >(); int fileIndex = 0; foreach (var file in @class.Files) { codeElementsByFileIndex.Add(fileIndex++, file.CodeElements.OrderBy(c => c.FirstLine)); } reportRenderer.TestMethods(testMethods, fileAnalyses, codeElementsByFileIndex); } reportRenderer.SaveClassReport(this.ReportContext.ReportConfiguration.TargetDirectory, @class.Assembly.ShortName, @class.Name); }
/// <summary> /// Creates a class report. /// </summary> /// <param name="reportRenderer">The report renderer.</param> /// <param name="class">The class.</param> /// <param name="fileAnalyses">The file analyses that correspond to the class.</param> public virtual void CreateClassReport(IReportRenderer reportRenderer, Class @class, IEnumerable <FileAnalysis> fileAnalyses) { if (reportRenderer == null) { throw new ArgumentNullException("reportRenderer"); } if (@class == null) { throw new ArgumentNullException("@class"); } if (fileAnalyses == null) { throw new ArgumentNullException("fileAnalyses"); } reportRenderer.BeginClassReport(this.TargetDirectory, @class.Assembly.ShortName, @class.Name); reportRenderer.Header(ReportResources.Summary); reportRenderer.BeginKeyValueTable(); reportRenderer.KeyValueRow(ReportResources.Class, @class.Name); reportRenderer.KeyValueRow(ReportResources.Assembly, @class.Assembly.ShortName); reportRenderer.KeyValueRow(ReportResources.Files3, @class.Files.Select(f => f.Path)); reportRenderer.KeyValueRow(ReportResources.CoveredLines, @class.CoveredLines.ToString(CultureInfo.InvariantCulture)); reportRenderer.KeyValueRow(ReportResources.UncoveredLines, (@class.CoverableLines - @class.CoveredLines).ToString(CultureInfo.InvariantCulture)); reportRenderer.KeyValueRow(ReportResources.CoverableLines, @class.CoverableLines.ToString(CultureInfo.InvariantCulture)); reportRenderer.KeyValueRow(ReportResources.TotalLines, @class.TotalLines.GetValueOrDefault().ToString(CultureInfo.InvariantCulture)); reportRenderer.KeyValueRow(ReportResources.Coverage2, @class.CoverageQuota.HasValue ? @class.CoverageQuota.Value.ToString(CultureInfo.InvariantCulture) + "%" : string.Empty); decimal?branchCoverage = @class.BranchCoverageQuota; if (branchCoverage.HasValue) { reportRenderer.KeyValueRow(ReportResources.BranchCoverage2, branchCoverage.Value.ToString(CultureInfo.InvariantCulture) + "%"); } reportRenderer.FinishTable(); if (@class.HistoricCoverages.Any(h => h.CoverageQuota.HasValue || h.BranchCoverageQuota.HasValue)) { reportRenderer.Header(ReportResources.History); reportRenderer.Chart(@class.HistoricCoverages); } var metrics = @class.MethodMetrics; if (metrics.Any()) { reportRenderer.Header(ReportResources.Metrics); reportRenderer.BeginMetricsTable(Enumerable.Repeat(ReportResources.Method, 1).Union(metrics.First().Metrics.Select(m => m.Name))); foreach (var metric in metrics) { reportRenderer.MetricsRow(metric); } reportRenderer.FinishTable(); } reportRenderer.Header(ReportResources.Files); if (fileAnalyses.Any()) { var testMethods = @class.Files .SelectMany(f => f.TestMethods) .Distinct() .OrderBy(l => l.ShortName); reportRenderer.TestMethods(testMethods); foreach (var fileAnalysis in fileAnalyses) { reportRenderer.File(fileAnalysis.Path); if (!string.IsNullOrEmpty(fileAnalysis.Error)) { reportRenderer.Paragraph(fileAnalysis.Error); } else { reportRenderer.BeginLineAnalysisTable(new[] { string.Empty, "#", ReportResources.Line, string.Empty, ReportResources.Coverage }); foreach (var line in fileAnalysis.Lines) { reportRenderer.LineAnalysis(line); } reportRenderer.FinishTable(); } } } else { reportRenderer.Paragraph(ReportResources.NoFilesFound); } reportRenderer.SaveClassReport(this.TargetDirectory, @class.Assembly.ShortName, @class.Name); }
/// <summary> /// Creates a class report. /// </summary> /// <param name="reportRenderer">The report renderer.</param> /// <param name="class">The class.</param> /// <param name="fileAnalyses">The file analyses that correspond to the class.</param> public virtual void CreateClassReport(IReportRenderer reportRenderer, Class @class, IEnumerable<FileAnalysis> fileAnalyses) { if (reportRenderer == null) { throw new ArgumentNullException(nameof(reportRenderer)); } if (@class == null) { throw new ArgumentNullException(nameof(@class)); } if (fileAnalyses == null) { throw new ArgumentNullException(nameof(fileAnalyses)); } reportRenderer.BeginClassReport(this.TargetDirectory, @class.Assembly.ShortName, @class.Name); reportRenderer.Header(ReportResources.Summary); reportRenderer.BeginKeyValueTable(); reportRenderer.KeyValueRow(ReportResources.Class, @class.Name); reportRenderer.KeyValueRow(ReportResources.Assembly, @class.Assembly.ShortName); reportRenderer.KeyValueRow(ReportResources.Files3, @class.Files.Select(f => f.Path)); reportRenderer.KeyValueRow(ReportResources.CoveredLines, @class.CoveredLines.ToString(CultureInfo.InvariantCulture)); reportRenderer.KeyValueRow(ReportResources.UncoveredLines, (@class.CoverableLines - @class.CoveredLines).ToString(CultureInfo.InvariantCulture)); reportRenderer.KeyValueRow(ReportResources.CoverableLines, @class.CoverableLines.ToString(CultureInfo.InvariantCulture)); reportRenderer.KeyValueRow(ReportResources.TotalLines, @class.TotalLines.GetValueOrDefault().ToString(CultureInfo.InvariantCulture)); reportRenderer.KeyValueRow(ReportResources.Coverage2, @class.CoverageQuota.HasValue ? @class.CoverageQuota.Value.ToString(CultureInfo.InvariantCulture) + "%" : string.Empty); decimal? branchCoverage = @class.BranchCoverageQuota; if (branchCoverage.HasValue) { reportRenderer.KeyValueRow(ReportResources.BranchCoverage2, branchCoverage.Value.ToString(CultureInfo.InvariantCulture) + "%"); } reportRenderer.FinishTable(); if (@class.HistoricCoverages.Any(h => h.CoverageQuota.HasValue || h.BranchCoverageQuota.HasValue)) { reportRenderer.Header(ReportResources.History); reportRenderer.Chart(@class.HistoricCoverages); } var metrics = @class.MethodMetrics; if (metrics.Any()) { reportRenderer.Header(ReportResources.Metrics); reportRenderer.BeginMetricsTable(Enumerable.Repeat(ReportResources.Method, 1).Union(metrics.First().Metrics.Select(m => m.Name))); foreach (var metric in metrics) { reportRenderer.MetricsRow(metric); } reportRenderer.FinishTable(); } reportRenderer.Header(ReportResources.Files); if (fileAnalyses.Any()) { var testMethods = @class.Files .SelectMany(f => f.TestMethods) .Distinct() .OrderBy(l => l.ShortName); reportRenderer.TestMethods(testMethods); foreach (var fileAnalysis in fileAnalyses) { reportRenderer.File(fileAnalysis.Path); if (!string.IsNullOrEmpty(fileAnalysis.Error)) { reportRenderer.Paragraph(fileAnalysis.Error); } else { reportRenderer.BeginLineAnalysisTable(new[] { string.Empty, "#", ReportResources.Line, string.Empty, ReportResources.Coverage }); foreach (var line in fileAnalysis.Lines) { reportRenderer.LineAnalysis(line); } reportRenderer.FinishTable(); } } } else { reportRenderer.Paragraph(ReportResources.NoFilesFound); } reportRenderer.SaveClassReport(this.TargetDirectory, @class.Assembly.ShortName, @class.Name); }
/// <summary> /// Creates a class report. /// </summary> /// <param name="reportRenderer">The report renderer.</param> /// <param name="class">The class.</param> /// <param name="fileAnalyses">The file analyses that correspond to the class.</param> public virtual void CreateClassReport(IReportRenderer reportRenderer, Class @class, IEnumerable <FileAnalysis> fileAnalyses) { if (reportRenderer == null) { throw new ArgumentNullException(nameof(reportRenderer)); } if (@class == null) { throw new ArgumentNullException(nameof(@class)); } if (fileAnalyses == null) { throw new ArgumentNullException(nameof(fileAnalyses)); } reportRenderer.BeginClassReport(this.TargetDirectory, @class.Assembly.ShortName, @class.Name); reportRenderer.Header(ReportResources.Summary); //int val; //if (@class.TestedNewLines != 0 && @class.NewLines != 0 && @class.CoverableLines!=0) //{ // val = (int)((@class.CoverableLines == 0) ? (decimal?)null : (decimal)Math.Truncate(100 * ((double)@class.TestedNewLines / (double)@class.NewLines))); //} //else // val = 0; reportRenderer.BeginKeyValueTable(); reportRenderer.KeyValueRow(ReportResources.Class, @class.Name); reportRenderer.KeyValueRow(ReportResources.Assembly, @class.Assembly.ShortName); reportRenderer.KeyValueRow(ReportResources.Files3, @class.Files.Select(f => f.Path)); reportRenderer.KeyValueRow(ReportResources.CoveredLines, @class.CoveredLines.ToString(CultureInfo.InvariantCulture)); reportRenderer.KeyValueRow(ReportResources.UncoveredLines, (@class.CoverableLines - @class.CoveredLines).ToString(CultureInfo.InvariantCulture)); reportRenderer.KeyValueRow(ReportResources.CoverableLines, @class.CoverableLines.ToString(CultureInfo.InvariantCulture)); reportRenderer.KeyValueRow(ReportResources.NewLines, @class.NewLines.ToString(CultureInfo.InvariantCulture)); reportRenderer.KeyValueRow(ReportResources.TestedNewLines, @class.TestedNewLines.ToString(CultureInfo.InvariantCulture)); reportRenderer.KeyValueRow(ReportResources.TotalLines, @class.TotalLines.GetValueOrDefault().ToString(CultureInfo.InvariantCulture)); reportRenderer.KeyValueRow(ReportResources.Coverage2, @class.CoverageQuota.HasValue ? @class.CoverageQuota.Value.ToString(CultureInfo.InvariantCulture) + "%" : string.Empty); reportRenderer.KeyValueRow(ReportResources.NewCoverage, @class.NewCoverage != 0 ? @class.NewCoverage.ToString(CultureInfo.InvariantCulture) + "%" : "0%"); decimal?branchCoverage = @class.BranchCoverageQuota; if (branchCoverage.HasValue) { reportRenderer.KeyValueRow(ReportResources.BranchCoverage2, branchCoverage.Value.ToString(CultureInfo.InvariantCulture) + "%"); } reportRenderer.FinishTable(); if (@class.HistoricCoverages.Any(h => h.CoverageQuota.HasValue || h.BranchCoverageQuota.HasValue)) { reportRenderer.Header(ReportResources.History); reportRenderer.Chart(@class.HistoricCoverages); } var metrics = @class.MethodMetrics; if (metrics.Any()) { reportRenderer.Header(ReportResources.Metrics); reportRenderer.BeginMetricsTable(metrics.First()); foreach (var metric in metrics) { reportRenderer.MetricsRow(metric); } reportRenderer.FinishTable(); } reportRenderer.Header(ReportResources.Files); if (fileAnalyses.Any()) { int fileIndex = 0; foreach (var fileAnalysis in fileAnalyses) { reportRenderer.File(fileAnalysis.Path); if (!string.IsNullOrEmpty(fileAnalysis.Error)) { reportRenderer.Paragraph(fileAnalysis.Error); } else { reportRenderer.BeginLineAnalysisTable(new[] { string.Empty, "#", ReportResources.Line, string.Empty, ReportResources.Coverage }); foreach (var line in fileAnalysis.Lines) { //if (line.LineVisitStatus == LineVisitStatus.newline || line.LineVisitStatus == LineVisitStatus.TestNotCovered) reportRenderer.LineAnalysis(fileIndex, line); } reportRenderer.FinishTable(); } fileIndex++; } } else { reportRenderer.Paragraph(ReportResources.NoFilesFound); } reportRenderer.AddFooter(); if (fileAnalyses.Any()) { var testMethods = @class.Files .SelectMany(f => f.TestMethods) .Distinct() .OrderBy(l => l.ShortName); var codeElementsByFileIndex = new Dictionary <int, IEnumerable <CodeElement> >(); int fileIndex = 0; List <int> val = new List <int>(); List <int> val1 = new List <int>(); List <int> less = new List <int>(); foreach (var file in @class.Files) { fileIndex++; val = new List <int>(); val = file.CodeElements.OrderBy(c => c.Line).Select(x => x.Line).ToList(); if (@class.ChangesCount.Count > 0) { for (int j = 0; j < @class.ChangesCount.Count; j++) { for (int i = 0; i < val.Count; i++) { string[] stringSeparators = new string[] { "[stop]" }; int value = Convert.ToInt32(@class.ChangesCount[j].Split(new[] { "###" }, StringSplitOptions.None) != null ? @class.ChangesCount[j].Split(new[] { "###" }, StringSplitOptions.None)[0] : ""); if (val[i] == value) { val1.Add(val[i]); } if (val[i] < value) { less.Add(val[i]); } } if (less.Count > 0) { val1.Add(less.Max()); } less = new List <int>(); } val1 = val1.Distinct().ToList(); val1.Sort(); } if (val1.Count > 0) { codeElementsByFileIndex.Add(fileIndex, file.CodeElements.OrderBy(c => c.Line).Where(x => val1.Contains(x.Line))); } else { codeElementsByFileIndex.Add(fileIndex, file.CodeElements.OrderBy(c => c.Line)); } } reportRenderer.TestMethods(testMethods, codeElementsByFileIndex); } reportRenderer.SaveClassReport(this.TargetDirectory, @class.Assembly.ShortName, @class.Name); }