< Summary

Information
Class: DirectSight.Parser.Preprocessing.OpenCoverReportPreprocessor
Assembly DirectSight
File(s): /home/runner/work/DirectSight/DirectSight/DirectSight/Parser/Preprocessing/OpenCoverReportPreprocessor.cs
Line coverage
23%
Covered lines: 20
Uncovered lines: 64
Coverable lines: 84
Total lines: 129
Line coverage: 23.8%
Branch coverage
16%
Covered branches: 4
Total branches: 24
Branch coverage: 16.6%
Method coverage

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
Execute(...)100%22100%
ApplyClassNameToStartupCodeElements(...)9.09%222217.94%

File(s)

/home/runner/work/DirectSight/DirectSight/DirectSight/Parser/Preprocessing/OpenCoverReportPreprocessor.cs

#LineLine coverage
 1using System;
 2using System.Linq;
 3using System.Xml.Linq;
 4
 5namespace DirectSight.Parser.Preprocessing;
 6
 7/// <summary>
 8/// Preprocessor for OpenCover reports.
 9/// </summary>
 10internal class OpenCoverReportPreprocessor
 11{
 12    /// <summary>
 13    /// Executes the preprocessing of the report.
 14    /// </summary>
 15    /// <param name="report">The report.</param>
 16    internal void Execute(XContainer report)
 5617    {
 192418        foreach (var module in report.Descendants("Module").ToArray())
 87819        {
 87820            ApplyClassNameToStartupCodeElements(module);
 87821        }
 5622    }
 23
 24    /// <summary>
 25    /// Applies the class name of the parent class to startup code elements.
 26    /// </summary>
 27    /// <param name="module">The module.</param>
 28    private static void ApplyClassNameToStartupCodeElements(XElement module)
 87829    {
 87830        var startupCodeClasses = module
 87831            .Elements("Classes")
 87832            .Elements("Class")
 139033            .Where(c => c.Element("FullName").Value.StartsWith("<StartupCode$", StringComparison.OrdinalIgnoreCase)
 139034                && c.Element("FullName").Value.Contains("/"))
 87835            .ToArray();
 36
 87837        var classesInModule = module
 87838            .Elements("Classes")
 87839            .Elements("Class")
 139040            .Where(c => !c.Element("FullName").Value.StartsWith("<StartupCode$", StringComparison.OrdinalIgnoreCase))
 87841            .ToArray();
 42
 263443        foreach (var startupCodeClass in startupCodeClasses)
 044        {
 045            var methods = startupCodeClass
 046                .Elements("Methods")
 047                .Elements("Method")
 048                .Where(c => c.Element("FileRef") != null)
 049                .ToArray();
 50
 051            var fileIds = methods.Elements("FileRef")
 052                .Select(e => e.Attribute("uid").Value)
 053                .Distinct()
 054                .ToArray();
 55
 056            if (fileIds.Length != 1)
 057            {
 058                continue;
 59            }
 60
 061            var lineNumbers = methods
 062                .Elements("SequencePoints")
 063                .Elements("SequencePoint")
 064                .Where(s => s.Attribute("sl") != null)
 065                .Select(s => int.Parse(s.Attribute("sl").Value))
 066                .OrderBy(v => v)
 067                .Take(1)
 068                .ToArray();
 69
 070            if (lineNumbers.Length != 1)
 071            {
 072                continue;
 73            }
 74
 075            XElement closestClass = null;
 076            int closestLineNumber = 0;
 77
 078            foreach (var @class in classesInModule)
 079            {
 080                var methodsOfClass = @class
 081                    .Elements("Methods")
 082                    .Elements("Method")
 083                    .Where(c => c.Element("FileRef") != null)
 084                    .ToArray();
 85
 086                var fileIdsOfClass = methodsOfClass
 087                    .Elements("FileRef")
 088                    .Select(e => e.Attribute("uid").Value)
 089                    .Distinct()
 090                    .ToArray();
 91
 092                if (fileIdsOfClass.Length != 1 || fileIdsOfClass[0] != fileIds[0])
 093                {
 094                    continue;
 95                }
 96
 097                var lineNumbersOfClass = methodsOfClass
 098                    .Elements("SequencePoints")
 099                    .Elements("SequencePoint")
 0100                    .Where(s => s.Attribute("sl") != null)
 0101                    .Select(s => int.Parse(s.Attribute("sl").Value))
 0102                    .OrderBy(v => v)
 0103                    .Take(1)
 0104                    .ToArray();
 105
 106                /* Conditions:
 107                    * 1) No line numbers available
 108                    * 2) Class comes after current class
 109                    * 3) Closer class has already been found */
 0110                if (lineNumbersOfClass.Length != 1
 0111                    || lineNumbersOfClass[0] > lineNumbers[0]
 0112                    || closestLineNumber > lineNumbersOfClass[0])
 0113                {
 0114                    continue;
 115                }
 116                else
 0117                {
 0118                    closestClass = @class;
 0119                    closestLineNumber = lineNumbersOfClass[0];
 0120                }
 0121            }
 122
 0123            if (closestClass != null)
 0124            {
 0125                startupCodeClass.Element("FullName").Value = closestClass.Element("FullName").Value + "/" + startupCodeC
 0126            }
 0127        }
 878128    }
 129}