Skip to content

Commit 0023874

Browse files
committed
move coverage reporter to common location
1 parent d5a632f commit 0023874

File tree

4 files changed

+54
-76
lines changed

4 files changed

+54
-76
lines changed

lib/internal/test_runner/reporter/spec.js

Lines changed: 3 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ const {
66
ArrayPrototypeShift,
77
ArrayPrototypeUnshift,
88
hardenRegExp,
9-
NumberPrototypeToFixed,
109
RegExpPrototypeSymbolSplit,
1110
SafeMap,
1211
StringPrototypeRepeat,
@@ -15,7 +14,7 @@ const assert = require('assert');
1514
const Transform = require('internal/streams/transform');
1615
const { inspectWithNoCustomRetry } = require('internal/errors');
1716
const { green, blue, red, white, gray } = require('internal/util/colors');
18-
const { relative } = require('path');
17+
const { getCoverageReport } = require('internal/test_runner/utils');
1918

2019

2120
const inspectOptions = { __proto__: null, colors: true, breakLength: Infinity };
@@ -63,39 +62,7 @@ class SpecReporter extends Transform {
6362
), `\n${indent} `);
6463
return `\n${indent} ${message}\n`;
6564
}
66-
#coverageThresholdColor(coverage, color = blue) {
67-
coverage = NumberPrototypeToFixed(coverage, 2);
68-
if (coverage > 90) return `${green}${coverage}${color}`;
69-
if (coverage < 50) return `${red}${coverage}${color}`;
70-
return coverage;
71-
}
72-
#reportCoverage(nesting, symbol, color, summary) {
73-
const indent = this.#indent(nesting);
74-
let report = `${color}${indent}${symbol}========= coverage report =========\n`;
75-
report += `${indent}${symbol}file | line % | branch % | funcs % | uncovered lines\n`;
76-
for (let i = 0; i < summary.files.length; ++i) {
77-
const {
78-
path,
79-
coveredLinePercent,
80-
coveredBranchPercent,
81-
coveredFunctionPercent,
82-
uncoveredLineNumbers,
83-
} = summary.files[i];
84-
const relativePath = relative(summary.workingDirectory, path);
85-
const uncovered = ArrayPrototypeJoin(uncoveredLineNumbers, ', ');
86-
report += `${indent}${symbol}${relativePath} | ${this.#coverageThresholdColor(coveredLinePercent)} | ${this.#coverageThresholdColor(coveredBranchPercent)} | ` +
87-
`${this.#coverageThresholdColor(coveredFunctionPercent)} | ${gray}${uncovered}${color}\n`;
88-
}
89-
const {
90-
coveredLinePercent,
91-
coveredBranchPercent,
92-
coveredFunctionPercent,
93-
} = summary.totals;
94-
report += `${indent}${symbol}all files | ${this.#coverageThresholdColor(coveredLinePercent)} | ${this.#coverageThresholdColor(coveredBranchPercent)} | ` +
95-
`${this.#coverageThresholdColor(coveredFunctionPercent)} |\n`;
96-
report += `${symbol}${indent}==================================== ${white}`;
97-
return report;
98-
}
65+
9966
#handleEvent({ type, data }) {
10067
let color = colors[type] ?? white;
10168
let symbol = symbols[type] ?? ' ';
@@ -140,7 +107,7 @@ class SpecReporter extends Transform {
140107
case 'test:diagnostic':
141108
return `${color}${this.#indent(data.nesting)}${symbol}${data.message}${white}\n`;
142109
case 'test:coverage':
143-
return this.#reportCoverage(data.nesting, symbols['test:coverage'], blue, data.summary);
110+
return getCoverageReport(this.#indent(data.nesting), data.summary, symbols['test:coverage'], blue);
144111
}
145112
}
146113
_transform({ type, data }, encoding, callback) {

lib/internal/test_runner/reporter/tap.js

Lines changed: 2 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ const {
33
ArrayPrototypeForEach,
44
ArrayPrototypeJoin,
55
ArrayPrototypePush,
6-
NumberPrototypeToFixed,
76
ObjectEntries,
87
RegExpPrototypeSymbolReplace,
98
SafeMap,
@@ -13,7 +12,7 @@ const {
1312
} = primordials;
1413
const { inspectWithNoCustomRetry } = require('internal/errors');
1514
const { isError, kEmptyObject } = require('internal/util');
16-
const { relative } = require('path');
15+
const { getCoverageReport } = require('internal/test_runner/utils');
1716
const kDefaultIndent = ' '; // 4 spaces
1817
const kFrameStartRegExp = /^ {4}at /;
1918
const kLineBreakRegExp = /\n|\r\n/;
@@ -49,7 +48,7 @@ async function * tapReporter(source) {
4948
yield `${indent(data.nesting)}# ${tapEscape(data.message)}\n`;
5049
break;
5150
case 'test:coverage':
52-
yield reportCoverage(data.nesting, data.summary);
51+
yield getCoverageReport(indent(data.nesting), data.summary);
5352
break;
5453
}
5554
}
@@ -73,40 +72,6 @@ function reportTest(nesting, testNumber, status, name, skip, todo) {
7372
return line;
7473
}
7574

76-
function reportCoverage(nesting, summary) {
77-
const pad = indent(nesting);
78-
let report = `${pad}# start of coverage report\n`;
79-
80-
report += `${pad}# file | line % | branch % | funcs % | uncovered lines\n`;
81-
82-
for (let i = 0; i < summary.files.length; ++i) {
83-
const {
84-
path,
85-
coveredLinePercent,
86-
coveredBranchPercent,
87-
coveredFunctionPercent,
88-
uncoveredLineNumbers,
89-
} = summary.files[i];
90-
const relativePath = relative(summary.workingDirectory, path);
91-
const lines = NumberPrototypeToFixed(coveredLinePercent, 2);
92-
const branches = NumberPrototypeToFixed(coveredBranchPercent, 2);
93-
const functions = NumberPrototypeToFixed(coveredFunctionPercent, 2);
94-
const uncovered = ArrayPrototypeJoin(uncoveredLineNumbers, ', ');
95-
96-
report += `${pad}# ${relativePath} | ${lines} | ${branches} | ` +
97-
`${functions} | ${uncovered}\n`;
98-
}
99-
100-
const { totals } = summary;
101-
report += `${pad}# all files | ` +
102-
`${NumberPrototypeToFixed(totals.coveredLinePercent, 2)} | ` +
103-
`${NumberPrototypeToFixed(totals.coveredBranchPercent, 2)} | ` +
104-
`${NumberPrototypeToFixed(totals.coveredFunctionPercent, 2)} |\n`;
105-
106-
report += `${pad}# end of coverage report\n`;
107-
return report;
108-
}
109-
11075
function reportDetails(nesting, data = kEmptyObject) {
11176
const { error, duration_ms } = data;
11277
const _indent = indent(nesting);

lib/internal/test_runner/utils.js

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
'use strict';
22
const {
3+
ArrayPrototypeJoin,
34
ArrayPrototypeMap,
45
ArrayPrototypePush,
6+
NumberPrototypeToFixed,
57
ObjectGetOwnPropertyDescriptor,
68
SafePromiseAllReturnArrayLike,
79
RegExp,
810
RegExpPrototypeExec,
911
SafeMap,
1012
} = primordials;
11-
const { basename } = require('path');
13+
const { basename, relative } = require('path');
1214
const { createWriteStream } = require('fs');
1315
const { pathToFileURL } = require('internal/url');
1416
const { createDeferredPromise } = require('internal/util');
@@ -22,6 +24,7 @@ const {
2224
kIsNodeError,
2325
} = require('internal/errors');
2426
const { compose } = require('stream');
27+
const { green, red, white } = require('internal/util/colors');
2528

2629
const kMultipleCallbackInvocations = 'multipleCallbackInvocations';
2730
const kRegExpPattern = /^\/(.*)\/([a-z]*)$/;
@@ -213,6 +216,48 @@ function parseCommandLine() {
213216
return globalTestOptions;
214217
}
215218

219+
function coverageThreshold(coverage, color = white) {
220+
coverage = NumberPrototypeToFixed(coverage, 2);
221+
if (color !== white) {
222+
if (coverage > 90) return `${green}${coverage}${color}`;
223+
if (coverage < 50) return `${red}${coverage}${color}`;
224+
}
225+
return coverage;
226+
}
227+
228+
function getCoverageReport(pad, summary, symbol = '# ', color = white) {
229+
let report = `${color}${pad}${symbol}start of coverage report\n`;
230+
231+
report += `${pad}${symbol}file | line % | branch % | funcs % | uncovered lines\n`;
232+
233+
for (let i = 0; i < summary.files.length; ++i) {
234+
const {
235+
path,
236+
coveredLinePercent,
237+
coveredBranchPercent,
238+
coveredFunctionPercent,
239+
uncoveredLineNumbers,
240+
} = summary.files[i];
241+
const relativePath = relative(summary.workingDirectory, path);
242+
const lines = coverageThreshold(coveredLinePercent, color);
243+
const branches = coverageThreshold(coveredBranchPercent, color);
244+
const functions = coverageThreshold(coveredFunctionPercent, color);
245+
const uncovered = ArrayPrototypeJoin(uncoveredLineNumbers, ', ');
246+
247+
report += `${pad}${symbol}${relativePath} | ${lines} | ${branches} | ` +
248+
`${functions} | ${uncovered}\n`;
249+
}
250+
251+
const { totals } = summary;
252+
report += `${pad}${symbol}all files | ` +
253+
`${coverageThreshold(totals.coveredLinePercent, color)} | ` +
254+
`${coverageThreshold(totals.coveredBranchPercent, color)} | ` +
255+
`${coverageThreshold(totals.coveredFunctionPercent, color)} |\n`;
256+
257+
report += `${pad}${symbol}end of coverage report${white}\n`;
258+
return report;
259+
}
260+
216261
module.exports = {
217262
convertStringToRegExp,
218263
createDeferredCallback,
@@ -221,4 +266,5 @@ module.exports = {
221266
isTestFailureError,
222267
parseCommandLine,
223268
setupTestReporters,
269+
getCoverageReport,
224270
};

test/parallel/test-runner-spec-coverage.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ function findCoverageFileForPid(pid) {
2020

2121
function getCoverageFixtureReport() {
2222
const report = [
23-
'\u2139 ========= coverage report =========',
23+
'\u2139 start of coverage report',
2424
'\u2139 file | line % | branch % | funcs % | uncovered lines',
2525
'\u2139 test/fixtures/test-runner/coverage.js | 78.65 | 38.46 | 60.00 | 12, ' +
2626
'13, 16, 17, 18, 19, 20, 21, 22, 27, 39, 43, 44, 61, 62, 66, 67, 71, 72',
2727
'\u2139 test/fixtures/test-runner/invalid-tap.js | 100.00 | 100.00 | 100.00 | ',
2828
'\u2139 test/fixtures/v8-coverage/throw.js | 71.43 | 50.00 | 100.00 | 5, 6',
2929
'\u2139 all files | 78.35 | 43.75 | 60.00 |',
30-
'\u2139 ====================================',
30+
'\u2139 end of coverage report',
3131
].join('\n');
3232

3333
if (common.isWindows) {

0 commit comments

Comments
 (0)