Skip to content

Commit 091b0a9

Browse files
committed
test_runner: add code coverage support to spec reporter
1 parent 1b87cb6 commit 091b0a9

File tree

1 file changed

+36
-0
lines changed
  • lib/internal/test_runner/reporter

1 file changed

+36
-0
lines changed

lib/internal/test_runner/reporter/spec.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@ const {
66
ArrayPrototypeShift,
77
ArrayPrototypeUnshift,
88
hardenRegExp,
9+
NumberPrototypeToFixed,
910
RegExpPrototypeSymbolSplit,
1011
SafeMap,
1112
StringPrototypeRepeat,
1213
} = primordials;
1314
const assert = require('assert');
15+
const { relative } = require('path');
1416
const Transform = require('internal/streams/transform');
1517
const { inspectWithNoCustomRetry } = require('internal/errors');
1618
const { green, blue, red, white, gray } = require('internal/util/colors');
@@ -23,12 +25,14 @@ const colors = {
2325
'test:fail': red,
2426
'test:pass': green,
2527
'test:diagnostic': blue,
28+
'test:coverage': blue,
2629
};
2730
const symbols = {
2831
'__proto__': null,
2932
'test:fail': '\u2716 ',
3033
'test:pass': '\u2714 ',
3134
'test:diagnostic': '\u2139 ',
35+
'test:coverage': '\u2139 ',
3236
'arrow:right': '\u25B6 ',
3337
};
3438
class SpecReporter extends Transform {
@@ -59,6 +63,36 @@ class SpecReporter extends Transform {
5963
), `\n${indent} `);
6064
return `\n${indent} ${message}\n`;
6165
}
66+
#reportCoverage(color, nesting, summary, symbol) {
67+
let report = `${color}${this.#indent(nesting)}${symbol}start of coverage report${white}\n`;
68+
report += `${color}${this.#indent(nesting)}${symbol}file | line % | branch % | funcs % | uncovered lines${white}\n`;
69+
70+
for (let i = 0; i < summary.files.length; ++i) {
71+
const {
72+
path,
73+
coveredLinePercent,
74+
coveredBranchPercent,
75+
coveredFunctionPercent,
76+
uncoveredLineNumbers,
77+
} = summary.files[i];
78+
const relativePath = relative(summary.workingDirectory, path);
79+
const lines = NumberPrototypeToFixed(coveredLinePercent, 2);
80+
const branches = NumberPrototypeToFixed(coveredBranchPercent, 2);
81+
const functions = NumberPrototypeToFixed(coveredFunctionPercent, 2);
82+
const uncovered = ArrayPrototypeJoin(uncoveredLineNumbers, ', ');
83+
84+
report += `${color}${this.#indent(nesting)}${symbol}${relativePath} | ${lines} | ${branches} | ${functions} | ${uncovered}\n`;
85+
}
86+
87+
const { totals } = summary;
88+
report += `${color}${this.#indent(nesting)}${symbol}all files | ` +
89+
`${NumberPrototypeToFixed(totals.coveredLinePercent, 2)} | ` +
90+
`${NumberPrototypeToFixed(totals.coveredBranchPercent, 2)} | ` +
91+
`${NumberPrototypeToFixed(totals.coveredFunctionPercent, 2)} |\n`;
92+
93+
report += `${color}${this.#indent(nesting)}${symbol}end of coverage report\n`;
94+
return report;
95+
}
6296
#handleEvent({ type, data }) {
6397
const color = colors[type] ?? white;
6498
const symbol = symbols[type] ?? ' ';
@@ -97,6 +131,8 @@ class SpecReporter extends Transform {
97131
break;
98132
case 'test:diagnostic':
99133
return `${color}${this.#indent(data.nesting)}${symbol}${data.message}${white}\n`;
134+
case 'test:coverage':
135+
return this.#reportCoverage(color, data.nesting, data.summary, symbol);
100136
}
101137
}
102138
_transform({ type, data }, encoding, callback) {

0 commit comments

Comments
 (0)