public void Hotspot_Metrics()
        {
            // arrage
            var assembly = new Assembly("assembly");
            var @class   = new Class("class", assembly);

            assembly.AddClass(@class);
            var method = new MethodMetric("method");

            method.AddMetric(new Metric(ReportResources.CyclomaticComplexity, null, 1));
            method.AddMetric(new Metric(ReportResources.SequenceCoverage, null, 2));
            method.AddMetric(new Metric(ReportResources.BranchCoverage, null, 3));
            method.AddMetric(new Metric(ReportResources.CrapScore, null, 4));
            @class.AddMethodMetric(method);
            var assemblies = new List <Assembly> {
                assembly
            };

            // act
            var hotspots = RiskHotspotsAnalysis.DetectHotspots(assemblies);

            // assert
            var hotspot = hotspots.First();

            Assert.AreEqual(1, hotspot.Complexity);
            Assert.AreEqual(2, hotspot.Coverage);
            Assert.AreEqual(3, hotspot.BranchCoverage);
            Assert.AreEqual(4, hotspot.CrapScore);
        }
        public void Hotspots_Count_Limited_ToTopThree()
        {
            // arrage
            var assembly = new Assembly("assembly");
            var class1   = new Class("class1", assembly);
            var class2   = new Class("class2", assembly);
            var class3   = new Class("class3", assembly);
            var class4   = new Class("class4", assembly);
            var class5   = new Class("class5", assembly);

            assembly.AddClass(class1);
            assembly.AddClass(class2);
            assembly.AddClass(class3);
            assembly.AddClass(class4);
            assembly.AddClass(class5);
            var method1 = new MethodMetric("method1", new List <Metric> {
                new Metric(ReportResources.CrapScore, null, 40)
            });
            var method2 = new MethodMetric("method2", new List <Metric> {
                new Metric(ReportResources.CrapScore, null, 30)
            });
            var method3 = new MethodMetric("method3", new List <Metric> {
                new Metric(ReportResources.CrapScore, null, 20)
            });
            var method4 = new MethodMetric("method4", new List <Metric> {
                new Metric(ReportResources.CrapScore, null, 10)
            });
            var method5 = new MethodMetric("method5", new List <Metric> {
                new Metric(ReportResources.CrapScore, null, 50)
            });

            class1.AddMethodMetric(method1);
            class2.AddMethodMetric(method2);
            class3.AddMethodMetric(method3);
            class4.AddMethodMetric(method4);
            class5.AddMethodMetric(method5);
            var assemblies = new List <Assembly> {
                assembly
            };

            // act
            const int maxHotspots = 3;
            var       hotspots    = RiskHotspotsAnalysis.DetectHotspots(assemblies, maxHotspots);

            // assert
            var hotspotsList = hotspots.ToList();

            Assert.AreEqual(maxHotspots, hotspotsList.Count);
            Assert.AreEqual("method5", hotspotsList[0].MethodNameShort);
            Assert.AreEqual("method1", hotspotsList[1].MethodNameShort);
            Assert.AreEqual("method2", hotspotsList[2].MethodNameShort);
            Assert.AreEqual(50, hotspotsList[0].CrapScore);
            Assert.AreEqual(40, hotspotsList[1].CrapScore);
            Assert.AreEqual(30, hotspotsList[2].CrapScore);
        }
        public void NoHotspots_WhenNoAssemblies()
        {
            // arrage
            var assemblies = new List <Assembly>();

            // act
            var hotspots = RiskHotspotsAnalysis.DetectHotspots(assemblies);

            // assert
            Assert.AreEqual(0, hotspots.Count());
        }
        public void OneHotspot_ForEveryClass()
        {
            // arrage
            var assembly1 = new Assembly("assembly1");
            var assembly2 = new Assembly("assembly2");
            var @class1A  = new Class("class1A", assembly1);
            var @class1B  = new Class("class1B", assembly1);
            var @class2A  = new Class("class2A", assembly2);
            var @class2B  = new Class("class2B", assembly1);

            assembly1.AddClass(@class1A);
            assembly1.AddClass(@class1B);
            assembly2.AddClass(@class2A);
            assembly2.AddClass(@class2B);
            var method1A1 = new MethodMetric("method1A1", new List <Metric> {
                new Metric("dummyMetric", null, 1)
            });
            var method1A2 = new MethodMetric("method1A2", new List <Metric> {
                new Metric("dummyMetric", null, 1)
            });

            @class1A.AddMethodMetric(method1A1);
            @class1A.AddMethodMetric(method1A2);
            var method1B1 = new MethodMetric("method1B1", new List <Metric> {
                new Metric("dummyMetric", null, 1)
            });
            var method1B2 = new MethodMetric("method1B2", new List <Metric> {
                new Metric("dummyMetric", null, 1)
            });

            @class1B.AddMethodMetric(method1B1);
            @class1B.AddMethodMetric(method1B2);
            var method2A1 = new MethodMetric("method2A1", new List <Metric> {
                new Metric("dummyMetric", null, 1)
            });

            @class2A.AddMethodMetric(method2A1);
            var method2B1 = new MethodMetric("method2B1", new List <Metric> {
                new Metric("dummyMetric", null, 1)
            });

            @class2B.AddMethodMetric(method2B1);

            var assemblies = new List <Assembly> {
                assembly1, assembly2
            };

            // act
            var hotspots = RiskHotspotsAnalysis.DetectHotspots(assemblies);

            // assert
            Assert.AreEqual(4, hotspots.Count());
        }
        public void OnlyWorstHotspot_Taken_FromEveryClass()
        {
            // arrage
            var assembly = new Assembly("assembly");
            var classA   = new Class("classA", assembly);

            assembly.AddClass(classA);
            var methodA1 = new MethodMetric("methodA1", new List <Metric> {
                new Metric(ReportResources.CrapScore, null, 2)
            });
            var methodA2 = new MethodMetric("methodA2", new List <Metric> {
                new Metric(ReportResources.CrapScore, null, 22)
            });

            classA.AddMethodMetric(methodA1);
            classA.AddMethodMetric(methodA2);
            var classB = new Class("classB", assembly);

            assembly.AddClass(classB);
            var methodB1 = new MethodMetric("methodB1", new List <Metric> {
                new Metric(ReportResources.CrapScore, null, 11)
            });
            var methodB2 = new MethodMetric("methodB2", new List <Metric> {
                new Metric(ReportResources.CrapScore, null, 1)
            });

            classB.AddMethodMetric(methodB1);
            classB.AddMethodMetric(methodB2);
            var assemblies = new List <Assembly> {
                assembly
            };

            // act
            var hotspots = RiskHotspotsAnalysis.DetectHotspots(assemblies);

            // assert
            var hotspotsList = hotspots.ToList();

            Assert.AreEqual("assembly", hotspotsList[0].AssemblyShortName);
            Assert.AreEqual("assembly", hotspotsList[1].AssemblyShortName);
            Assert.AreEqual("classA", hotspotsList[0].ClassNameShort);
            Assert.AreEqual("classB", hotspotsList[1].ClassNameShort);
            Assert.AreEqual("methodA2", hotspotsList[0].MethodNameShort);
            Assert.AreEqual("methodB1", hotspotsList[1].MethodNameShort);
            Assert.AreEqual(22, hotspotsList[0].CrapScore);
            Assert.AreEqual(11, hotspotsList[1].CrapScore);
        }
        public void Hotspots_SortedBy_CrapScore()
        {
            // arrage
            var assembly = new Assembly("assembly");
            var class1   = new Class("class1", assembly);
            var class2   = new Class("class2", assembly);
            var class3   = new Class("class3", assembly);

            assembly.AddClass(class1);
            assembly.AddClass(class2);
            assembly.AddClass(class3);
            var method1 = new MethodMetric("method1", new List <Metric> {
                new Metric(ReportResources.CrapScore, null, 10)
            });
            var method2 = new MethodMetric("method2", new List <Metric> {
                new Metric(ReportResources.CrapScore, null, 30)
            });
            var method3 = new MethodMetric("method3", new List <Metric> {
                new Metric(ReportResources.CrapScore, null, 20)
            });

            class1.AddMethodMetric(method1);
            class2.AddMethodMetric(method2);
            class3.AddMethodMetric(method3);
            var assemblies = new List <Assembly> {
                assembly
            };

            // act
            var hotspots = RiskHotspotsAnalysis.DetectHotspots(assemblies);

            // assert
            var hotspotsList = hotspots.ToList();

            Assert.AreEqual("method2", hotspotsList[0].MethodNameShort);
            Assert.AreEqual("method3", hotspotsList[1].MethodNameShort);
            Assert.AreEqual("method1", hotspotsList[2].MethodNameShort);
            Assert.AreEqual(30, hotspotsList[0].CrapScore);
            Assert.AreEqual(20, hotspotsList[1].CrapScore);
            Assert.AreEqual(10, hotspotsList[2].CrapScore);
        }
        /// <summary>
        /// Creates the summary report.
        /// </summary>
        /// <param name="reportRenderer">The report renderer.</param>
        /// <param name="summaryResult">The summary result.</param>
        public virtual void CreateSummaryReport(IReportRenderer reportRenderer, SummaryResult summaryResult)
        {
            if (reportRenderer == null)
            {
                throw new ArgumentNullException(nameof(reportRenderer));
            }

            if (summaryResult == null)
            {
                throw new ArgumentNullException(nameof(summaryResult));
            }

            reportRenderer.BeginSummaryReport(this.ReportConfiguration.TargetDirectory, null, ReportResources.Summary);
            reportRenderer.Header(ReportResources.Summary);

            reportRenderer.BeginKeyValueTable();
            reportRenderer.KeyValueRow(ReportResources.GeneratedOn, DateTime.Now.ToShortDateString() + " - " + DateTime.Now.ToLongTimeString());
            reportRenderer.KeyValueRow(ReportResources.Parser, summaryResult.UsedParser);
            reportRenderer.KeyValueRow(ReportResources.Assemblies2, summaryResult.Assemblies.Count().ToString(CultureInfo.InvariantCulture));
            reportRenderer.KeyValueRow(ReportResources.Classes, summaryResult.Assemblies.SelectMany(a => a.Classes).Count().ToString(CultureInfo.InvariantCulture));
            reportRenderer.KeyValueRow(ReportResources.Files2, summaryResult.Assemblies.SelectMany(a => a.Classes).SelectMany(a => a.Files).Distinct().Count().ToString(CultureInfo.InvariantCulture));
            reportRenderer.KeyValueRow(ReportResources.CoveredLines, summaryResult.CoveredLines.ToString(CultureInfo.InvariantCulture));
            reportRenderer.KeyValueRow(ReportResources.UncoveredLines, (summaryResult.CoverableLines - summaryResult.CoveredLines).ToString(CultureInfo.InvariantCulture));
            reportRenderer.KeyValueRow(ReportResources.CoverableLines, summaryResult.CoverableLines.ToString(CultureInfo.InvariantCulture));
            reportRenderer.KeyValueRow(ReportResources.TotalLines, summaryResult.TotalLines.GetValueOrDefault().ToString(CultureInfo.InvariantCulture));
            reportRenderer.KeyValueRow(ReportResources.Coverage2, summaryResult.CoverageQuota.HasValue ? summaryResult.CoverageQuota.Value.ToString(CultureInfo.InvariantCulture) + "%" : string.Empty);

            decimal?branchCoverage = summaryResult.BranchCoverageQuota;

            if (branchCoverage.HasValue)
            {
                reportRenderer.KeyValueRow(ReportResources.BranchCoverage2, branchCoverage.Value.ToString(CultureInfo.InvariantCulture) + "%");
            }

            if (this.ReportConfiguration.Tag != null)
            {
                reportRenderer.KeyValueRow(ReportResources.Tag, this.ReportConfiguration.Tag);
            }

            reportRenderer.FinishTable();

            var historicCoverages = this.GetOverallHistoricCoverages(this.ReportConfiguration.OverallHistoricCoverages);

            if (historicCoverages.Any(h => h.CoverageQuota.HasValue || h.BranchCoverageQuota.HasValue))
            {
                reportRenderer.Header(ReportResources.History);
                reportRenderer.Chart(historicCoverages);
            }

            var summableMetrics = summaryResult.Assemblies
                                  .SelectMany(a => a.Classes)
                                  .SelectMany(c => c.MethodMetrics)
                                  .SelectMany(m => m.Metrics)
                                  .Where(m => m.MetricType == MetricType.CoverageAbsolute)
                                  .GroupBy(m => m.Name)
                                  .Select(g => new Metric(g.Key, g.First().ExplanationUrl, MetricType.CoverageAbsolute, g.Sum(m => m.Value)))
                                  .ToArray();

            if (summableMetrics.Length > 0)
            {
                reportRenderer.Header(ReportResources.Metrics);

                var methodMetric = new MethodMetric(ReportResources.Total, summableMetrics);
                reportRenderer.BeginMetricsTable(methodMetric);
                reportRenderer.MetricsRow(methodMetric);

                reportRenderer.FinishTable();
            }

            var hotspots = RiskHotspotsAnalysis.DetectHotspotsByMetricName(summaryResult.Assemblies);

            if (hotspots.Any())
            {
                reportRenderer.Header(ReportResources.RiskHotspots);
                reportRenderer.RiskHotspots(hotspots);
            }

            reportRenderer.Header(ReportResources.Coverage3);

            if (summaryResult.Assemblies.Any())
            {
                reportRenderer.BeginSummaryTable(summaryResult.SupportsBranchCoverage);

                foreach (var assembly in summaryResult.Assemblies)
                {
                    reportRenderer.SummaryAssembly(assembly, summaryResult.SupportsBranchCoverage);

                    foreach (var @class in assembly.Classes)
                    {
                        reportRenderer.SummaryClass(@class, summaryResult.SupportsBranchCoverage);
                    }
                }

                reportRenderer.FinishTable();
            }
            else
            {
                reportRenderer.Paragraph(ReportResources.NoCoveredAssemblies);
            }

            reportRenderer.CustomSummary(summaryResult.Assemblies, hotspots, summaryResult.SupportsBranchCoverage);

            reportRenderer.AddFooter();
            reportRenderer.SaveSummaryReport(this.ReportConfiguration.TargetDirectory);
        }