Skip to content

Commit be37af7

Browse files
committed
merge conflicts
2 parents 61803c6 + 6bb398e commit be37af7

6 files changed

Lines changed: 600 additions & 19 deletions

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "common-utils",
33
"author": "The MathWorks, Inc.",
4-
"version": "2.0.1",
4+
"version": "2.1.0",
55
"description": "",
66
"type": "module",
77
"main": "lib/index.js",

src/codeCoverageSummary.ts

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
// Copyright 2026 The MathWorks, Inc.
2+
3+
import { readFileSync, unlinkSync, existsSync } from "fs";
4+
import * as path from "path";
5+
6+
interface CoverageMetric {
7+
Executed: number;
8+
Total: number;
9+
Percentage: number;
10+
}
11+
12+
export interface CoverageData {
13+
MetricLevel?: string;
14+
FunctionCoverage?: CoverageMetric;
15+
StatementCoverage?: CoverageMetric;
16+
DecisionCoverage?: CoverageMetric;
17+
ConditionCoverage?: CoverageMetric;
18+
MCDCCoverage?: CoverageMetric;
19+
}
20+
21+
export function getCoverageResults(runnerTemp: string, runId: string): CoverageData | null {
22+
let coverageData = null;
23+
const coveragePath = path.join(runnerTemp, `matlabCoverageResults${runId}.json`);
24+
25+
if (existsSync(coveragePath)) {
26+
try {
27+
const coverageArray: CoverageData[] = JSON.parse(readFileSync(coveragePath, "utf8"));
28+
if (coverageArray.length !== 0) {
29+
coverageData = coverageArray[coverageArray.length - 1];
30+
}
31+
} catch (e) {
32+
console.error(
33+
`An error occurred while reading the code coverage summary file ${coveragePath}:`,
34+
e,
35+
);
36+
} finally {
37+
try {
38+
unlinkSync(coveragePath);
39+
} catch (e) {
40+
console.error(
41+
`An error occurred while trying to delete the code coverage summary file ${coveragePath}:`,
42+
e,
43+
);
44+
}
45+
}
46+
}
47+
return coverageData;
48+
}
49+
50+
function formatPercentage(percentage: number): string {
51+
if (percentage === null || percentage === undefined || isNaN(percentage)) {
52+
return "0.00%";
53+
}
54+
return percentage.toFixed(2) + "%";
55+
}
56+
57+
export function getCoverageTable(coverage: CoverageData): string {
58+
// Define all possible columns
59+
const allColumns = [
60+
{ name: "Function", data: coverage.FunctionCoverage },
61+
{ name: "Statement", data: coverage.StatementCoverage },
62+
{ name: "Decision", data: coverage.DecisionCoverage },
63+
{ name: "Condition", data: coverage.ConditionCoverage },
64+
{ name: "MC/DC", data: coverage.MCDCCoverage },
65+
];
66+
67+
// Filter to only include columns where data actually exists
68+
const visibleColumns = allColumns.filter((col) => col.data !== undefined && col.data !== null);
69+
70+
// Build header row
71+
const headers = visibleColumns.map((col) => `<th>${col.name}</th>`).join("");
72+
const headerRow = `<tr align="center"><th>Metric</th>${headers}</tr>`;
73+
74+
// Build percentage row
75+
const percentages = visibleColumns
76+
.map((col) => `<td>${formatPercentage(col.data!.Percentage)}</td>`)
77+
.join("");
78+
const percentageRow = `<tr align="center"><td><b>Percentage</b></td>${percentages}</tr>`;
79+
80+
// Build covered/total row
81+
const coveredTotals = visibleColumns
82+
.map((col) => `<td>${col.data!.Executed}/${col.data!.Total}</td>`)
83+
.join("");
84+
const coveredTotalRow = `<tr align="center"><td><b>Covered/Total</b></td>${coveredTotals}</tr>`;
85+
86+
const tableHTML = `<table>${headerRow}${percentageRow}${coveredTotalRow}</table>`;
87+
88+
return tableHTML;
89+
}

0 commit comments

Comments
 (0)