< Summary

Information
Class: DirectSight.CodeAnalysis.RiskHotspotsAnalyzer
Assembly DirectSight
File(s): /home/runner/work/DirectSight/DirectSight/DirectSight/CodeAnalysis/RiskHotspotsAnalyzer.cs
Line coverage
89%
Covered lines: 35
Uncovered lines: 4
Coverable lines: 39
Total lines: 74
Line coverage: 89.7%
Branch coverage
90%
Covered branches: 9
Total branches: 10
Branch coverage: 90%
Method coverage

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor()100%11100%
PerformRiskHotspotAnalysis(...)90%101087.5%

File(s)

/home/runner/work/DirectSight/DirectSight/DirectSight/CodeAnalysis/RiskHotspotsAnalyzer.cs

#LineLine coverage
 1using System.Collections.Generic;
 2using System.Linq;
 3using DirectSight.Parser.Analysis;
 4
 5namespace DirectSight.CodeAnalysis;
 6
 7/// <summary>
 8/// Analyses the method metrics for risk hotspots based on exceeded thresholds.
 9/// </summary>
 10internal class RiskHotspotsAnalyzer
 11{
 12    /// <summary>
 13    /// The thresholds of the various metrics.
 14    /// </summary>
 215    private readonly Dictionary<string, decimal> thresholdsByMetricName = new()
 216    {
 217        ["Cyclomatic complexity"] = 15,
 218        ["NPath complexity"] = 200,
 219        ["Crap Score"] = 30
 220    };
 21
 22    /// <summary>
 23    /// Initializes a new instance of the <see cref="RiskHotspotsAnalyzer"/> class.
 24    /// </summary>
 625    public RiskHotspotsAnalyzer() {}
 26
 27    /// <summary>
 28    /// Performs a risk hotspot analysis on the given assemblies.
 29    /// </summary>
 30    /// <param name="assemblies">The assemlies to analyze.</param>
 31    /// <returns>The risk hotspot analysis result.</returns>
 32    public RiskHotspotAnalysisResult PerformRiskHotspotAnalysis(IEnumerable<Assembly> assemblies)
 233    {
 234        var riskHotspots = new List<RiskHotspot>();
 35
 236        bool codeCodeQualityMetricsAvailable = false;
 37
 1038        foreach (var assembly in assemblies)
 239        {
 7840            foreach (var clazz in assembly.Classes)
 3641            {
 3642                int fileIndex = 0;
 43
 18044                foreach (var file in clazz.Files)
 3645                {
 25246                    foreach (var methodMetric in file.MethodMetrics)
 7247                    {
 7248                        var codeCodeQualityMetrics = methodMetric.Metrics
 50449                            .Where(m => m.MetricType == MetricType.CodeQuality);
 50
 7251                        codeCodeQualityMetricsAvailable |= codeCodeQualityMetrics.Any();
 52
 7253                        var statusMetrics = codeCodeQualityMetrics
 21654                            .Select(m => new MetricStatus(m, this.thresholdsByMetricName.TryGetValue(m.Name, out var thr
 7255                            .ToArray();
 56
 28857                        if (statusMetrics.Any(m => m.Exceeded))
 058                        {
 059                            riskHotspots.Add(new RiskHotspot(assembly, clazz, methodMetric, statusMetrics, fileIndex));
 060                        }
 7261                    }
 62
 3663                    fileIndex++;
 3664                }
 3665            }
 266        }
 67
 268        var result = new RiskHotspotAnalysisResult(
 069            [.. riskHotspots.OrderByDescending(r => r.StatusMetrics.Where(m => m.Exceeded).Max(m => m.Metric.Value))],
 270            codeCodeQualityMetricsAvailable);
 71
 272        return result;
 273    }
 74}