Skip to content

Commit ec4a48f

Browse files
committed
code cov summary view
1 parent 5c12fed commit ec4a48f

2 files changed

Lines changed: 103 additions & 1 deletion

File tree

src/codeCoverageSummary.ts

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import { readFileSync, unlinkSync, existsSync } from "fs";
2+
import * as path from "path";
3+
import * as core from "@actions/core";
4+
5+
// interfaces for coverage data
6+
interface CoverageMetric {
7+
Executed: number;
8+
Total: number;
9+
Percentage: number;
10+
}
11+
12+
interface CoverageData {
13+
StatementCoverage: CoverageMetric;
14+
FunctionCoverage: CoverageMetric;
15+
DecisionCoverage: CoverageMetric;
16+
ConditionCoverage: CoverageMetric;
17+
MCDCCoverage: CoverageMetric;
18+
}
19+
20+
// function to write coverage summary
21+
export function writeCoverageSummary() {
22+
try {
23+
const runnerTemp = process.env.RUNNER_TEMP || "";
24+
const runId = process.env.GITHUB_RUN_ID || "";
25+
const coveragePath = path.join(runnerTemp, `matlabCoverageResults${runId}.json`);
26+
27+
if (!existsSync(coveragePath)) {
28+
console.log("No coverage data found");
29+
return;
30+
}
31+
32+
const coverageData: CoverageData[] = JSON.parse(readFileSync(coveragePath, "utf8"));
33+
34+
if (!coverageData || coverageData.length === 0) {
35+
console.log("Coverage data is empty");
36+
return;
37+
}
38+
39+
// Use the latest coverage data (last element in array)
40+
const latestCoverage = coverageData[coverageData.length - 1];
41+
42+
const coverageTable = createCoverageTable(latestCoverage);
43+
44+
core.summary
45+
.addHeading("Overall Coverage")
46+
.addRaw(coverageTable, true)
47+
.write();
48+
49+
// Clean up the file after reading
50+
try {
51+
unlinkSync(coveragePath);
52+
} catch (e) {
53+
console.error(`Error deleting coverage file ${coveragePath}:`, e);
54+
}
55+
} catch (e) {
56+
console.error("An error occurred while adding coverage results to the summary:", e);
57+
}
58+
}
59+
60+
function createCoverageTable(coverage: CoverageData): string {
61+
return `
62+
<table>
63+
<thead>
64+
<tr>
65+
<th>Coverage Type</th>
66+
<th>Percentage</th>
67+
<th>Covered/Total</th>
68+
</tr>
69+
</thead>
70+
<tbody>
71+
<tr>
72+
<td>Statement</td>
73+
<td>${coverage.StatementCoverage.Percentage.toFixed(2)}%</td>
74+
<td>${coverage.StatementCoverage.Executed}/${coverage.StatementCoverage.Total}</td>
75+
</tr>
76+
<tr>
77+
<td>Function</td>
78+
<td>${coverage.FunctionCoverage.Percentage.toFixed(2)}%</td>
79+
<td>${coverage.FunctionCoverage.Executed}/${coverage.FunctionCoverage.Total}</td>
80+
</tr>
81+
<tr>
82+
<td>Decision</td>
83+
<td>${coverage.DecisionCoverage.Percentage.toFixed(2)}%</td>
84+
<td>${coverage.DecisionCoverage.Executed}/${coverage.DecisionCoverage.Total}</td>
85+
</tr>
86+
<tr>
87+
<td>Condition</td>
88+
<td>${coverage.ConditionCoverage.Percentage.toFixed(2)}%</td>
89+
<td>${coverage.ConditionCoverage.Executed}/${coverage.ConditionCoverage.Total}</td>
90+
</tr>
91+
<tr>
92+
<td>MCDC</td>
93+
<td>${coverage.MCDCCoverage.Percentage?.toFixed(2) || '0.00'}%</td>
94+
<td>${coverage.MCDCCoverage.Executed}/${coverage.MCDCCoverage.Total}</td>
95+
</tr>
96+
</tbody>
97+
</table>
98+
`;
99+
}

src/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import * as core from "@actions/core";
44
import * as exec from "@actions/exec";
55
import * as scriptgen from "./scriptgen";
66
import { matlab, testResultsSummary } from "common-utils";
7-
7+
import {writeCoverageSummary} from "./codeCoverageSummary";
88
/**
99
* Gather action inputs and then run action
1010
*/
@@ -56,6 +56,9 @@ async function run() {
5656

5757
testResultsSummary.processAndAddTestSummary(runnerTemp, runId, actionName, workspaceDir);
5858
core.summary.write();
59+
60+
writeCoverageSummary();
61+
core.summary.write();
5962
});
6063
}
6164

0 commit comments

Comments
 (0)