-
Notifications
You must be signed in to change notification settings - Fork 31
/
Copy pathparseResults.js
executable file
·103 lines (90 loc) · 3.3 KB
/
parseResults.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#!/usr/bin/env node
const { stdin, stdout, exit, env } = process;
import fs from 'fs';
const isProduction = env.NODE_ENV === 'production';
const isTranspiledBuild = !!env.TRANSPILE;
const PREFIXES = [
['FAIL', 'PASS'],
['EXPECTED FAIL', 'UNEXPECTED PASS']
];
let testOutput = '';
const now = Date.now();
const expectedFailures = new Set();
function includeExpectedFailures(file) {
const lines = fs.readFileSync(file, { encoding: 'utf-8' });
for (let line of lines.split('\n')) {
line = line.trim();
if (!line) continue;
if (line.startsWith('#')) continue;
expectedFailures.add(line);
}
}
includeExpectedFailures('../../test/expected-failures.txt');
if (isProduction) {
includeExpectedFailures(
isTranspiledBuild ? '../../test/expected-failures-es5.txt' : '../../test/expected-failures-opt.txt'
);
}
stdin.setEncoding('utf8');
stdout.write('Starting Test262 tests.\n');
let testCount = 0;
let nextReportCount = 100;
function reportStatus(length = testCount) {
const secs = (Date.now() - now) / 1000;
stdout.write(`${length} tests completed in ${secs.toFixed(1)} seconds. (${Math.round(length / secs)} tests/sec)\n`);
}
stdin.on('data', function (chunk) {
testOutput += chunk;
const matches = testOutput.split('"file":').length - 1;
// We skipped execution of non-strict tests via a preprocessor, but the test
// is treated as passed and shows up here, so we'll divide total by 2.
testCount = Math.trunc(matches / 2);
if (testCount >= nextReportCount || testOutput.endsWith(']\n')) {
reportStatus();
nextReportCount += 100;
}
});
stdin.on('end', function () {
stdout.write('\n');
// filter out the non-strict tests because they were skipped via a preprocessor
const tests = JSON.parse(testOutput).filter((test) => test.scenario.includes('strict'));
const failedTests = [];
const unexpectedPasses = [];
for (const test of tests) {
const { result, scenario, file } = test;
if (result.message === 'Debugger attached.\nWaiting for the debugger to disconnect...\n') {
// work around https://github.com/nodejs/node/issues/34799 when running tests in the debugger
result.message = '';
result.pass = true;
}
const expectedFailure = expectedFailures.has(file);
const message = `${PREFIXES[+expectedFailure][+result.pass]} ${file} (${scenario})\n`;
stdout.write(message);
if (result.pass === expectedFailure) {
(result.pass ? unexpectedPasses : failedTests).push({ ...test, message });
}
}
if (failedTests.length || unexpectedPasses.length) {
if (failedTests.length) {
stdout.write(`\n${failedTests.length} tests failed:\n`);
for (const test of failedTests) {
const { message, rawResult } = test;
stdout.write(`\n${message}\n`);
stdout.write(`${rawResult.stderr}\n`);
stdout.write(`${rawResult.stdout}\n`);
stdout.write(rawResult.message ? rawResult.message + '\n' : '');
}
}
if (unexpectedPasses.length) {
stdout.write(`\n${unexpectedPasses.length} tests passed unexpectedly:\n`);
for (const { message } of unexpectedPasses) {
stdout.write(`${message}\n`);
}
}
} else {
stdout.write('All results as expected.\n');
}
reportStatus(tests.length);
stdout.write('\n\n');
exit(failedTests.length || unexpectedPasses.length ? 1 : 0);
});