Skip to content

Commit ee6a76f

Browse files
committed
test_runner: address review feedback on statement coverage
- lazy-load acorn and acorn-walk behind ??= guard - fix 100% statement coverage for unparseable files - sort coverage ranges by startOffset for early loop exit - regenerate snapshot files from native linux build - update hardcoded report strings in coverage tests
1 parent 5d3754e commit ee6a76f

File tree

4 files changed

+23
-12
lines changed

4 files changed

+23
-12
lines changed

lib/internal/test_runner/coverage.js

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const {
33
ArrayFrom,
44
ArrayPrototypeMap,
55
ArrayPrototypePush,
6+
ArrayPrototypeSort,
67
JSONParse,
78
MathFloor,
89
MathMax,
@@ -30,10 +31,8 @@ const { tmpdir } = require('os');
3031
const { join, resolve, relative } = require('path');
3132
const { fileURLToPath, URL } = require('internal/url');
3233
const { kMappings, SourceMap } = require('internal/source_map/source_map');
33-
const { Parser: AcornParser } =
34-
require('internal/deps/acorn/acorn/dist/acorn');
35-
const { simple: acornWalkSimple } =
36-
require('internal/deps/acorn/acorn-walk/dist/walk');
34+
let AcornParser; // Lazy loaded -- only needed when statement coverage is enabled.
35+
let acornWalkSimple;
3736
const {
3837
codes: {
3938
ERR_SOURCE_MAP_CORRUPT,
@@ -94,6 +93,11 @@ class TestCoverage {
9493
return null;
9594
}
9695

96+
AcornParser ??=
97+
require('internal/deps/acorn/acorn/dist/acorn').Parser;
98+
acornWalkSimple ??=
99+
require('internal/deps/acorn/acorn-walk/dist/walk').simple;
100+
97101
const statements = [];
98102

99103
// Parse as script with permissive flags -- script mode is non-strict,
@@ -333,8 +337,6 @@ class TestCoverage {
333337
const statementReports = [];
334338

335339
if (statements) {
336-
// Flatten all V8 coverage ranges into a single array so
337-
// the statement loop only needs two levels of iteration.
338340
const allRanges = [];
339341
for (let fi = 0; fi < functions.length; ++fi) {
340342
const { ranges } = functions[fi];
@@ -343,13 +345,17 @@ class TestCoverage {
343345
}
344346
}
345347

348+
// Sort by startOffset so the inner loop can break early.
349+
ArrayPrototypeSort(allRanges, (a, b) => a.startOffset - b.startOffset);
350+
346351
for (let j = 0; j < statements.length; ++j) {
347352
const stmt = statements[j];
348353
let bestCount = 0;
349354
let bestSize = Infinity;
350355

351356
for (let ri = 0; ri < allRanges.length; ++ri) {
352357
const range = allRanges[ri];
358+
if (range.startOffset > stmt.startOffset) break;
353359
if (doesRangeContainOtherRange(range, stmt)) {
354360
const size = range.endOffset - range.startOffset;
355361
if (size < bestSize) {
@@ -378,6 +384,11 @@ class TestCoverage {
378384
}
379385
}
380386

387+
// When the file could not be parsed (statements === null),
388+
// report 0% rather than the misleading 100% from toPercentage(0, 0).
389+
const coveredStmtPercent = statements != null ?
390+
toPercentage(statementsCovered, totalStatements) : 0;
391+
381392
ArrayPrototypePush(coverageSummary.files, {
382393
__proto__: null,
383394
path: fileURLToPath(url),
@@ -392,7 +403,7 @@ class TestCoverage {
392403
coveredLinePercent: toPercentage(coveredCnt, lines.length),
393404
coveredBranchPercent: toPercentage(branchesCovered, totalBranches),
394405
coveredFunctionPercent: toPercentage(functionsCovered, totalFunctions),
395-
coveredStatementPercent: toPercentage(statementsCovered, totalStatements),
406+
coveredStatementPercent: coveredStmtPercent,
396407
functions: functionReports,
397408
branches: branchReports,
398409
lines: lineReports,

test/parallel/test-runner-coverage-default-exclusion.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ describe('test runner coverage default exclusion', skipIfNoInspector, () => {
3434
'# test | | | | | ',
3535
'# not-matching-test-name.js | 100.00 | 100.00 | 100.00 | 100.00 | ',
3636
'# -------------------------------------------------------------------------------------',
37-
'# all files | 90.91 | 91.89 | 100.00 | 83.33 | ',
37+
'# all files | 92.00 | 91.89 | 100.00 | 83.33 | ',
3838
'# -------------------------------------------------------------------------------------',
3939
'# end of coverage report',
4040
].join('\n');

test/parallel/test-runner-coverage-source-map.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,9 @@ describe('Coverage with source maps', async () => {
8383
'# test-runner | | | | | ',
8484
'# source-maps | | | | | ',
8585
'# line-lengths | | | | | ',
86-
'# index.ts | 100.00 | 100.00 | 100.00 | 100.00 | ',
86+
'# index.ts | 98.67 | 100.00 | 100.00 | 100.00 | ',
8787
'# ----------------------------------------------------------------------------',
88-
'# all files | 100.00 | 100.00 | 100.00 | 100.00 | ',
88+
'# all files | 98.67 | 100.00 | 100.00 | 100.00 | ',
8989
'# ----------------------------------------------------------------------------',
9090
]);
9191

test/parallel/test-runner-coverage.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,12 +198,12 @@ test('coverage is combined for multiple processes', skipIfNoInspector, () => {
198198
'# -----------------------------------------------------------------------------',
199199
'# file | stmts % | line % | branch % | funcs % | uncovered lines',
200200
'# -----------------------------------------------------------------------------',
201-
'# common.js | 86.84 | 89.86 | 62.50 | 100.00 | 8 13-14 18 34-35 53',
201+
'# common.js | 89.47 | 89.86 | 62.50 | 100.00 | 8 13-14 18 34-35 53',
202202
'# first.test.js | 87.50 | 83.33 | 100.00 | 50.00 | 5-6',
203203
'# second.test.js | 100.00 | 100.00 | 100.00 | 100.00 | ',
204204
'# third.test.js | 100.00 | 100.00 | 100.00 | 100.00 | ',
205205
'# -----------------------------------------------------------------------------',
206-
'# all files | 91.04 | 92.11 | 72.73 | 88.89 | ',
206+
'# all files | 92.54 | 92.11 | 72.73 | 88.89 | ',
207207
'# -----------------------------------------------------------------------------',
208208
'# end of coverage report',
209209
].join('\n');

0 commit comments

Comments
 (0)