'use strict'
var path = require('path');
var testDir = path.join(__dirname, '..', 'node_modules', 'test262');
var whitelistFile = path.join(__dirname, 'test-262-whitelist.txt');
var shouldUpdate = process.argv.indexOf('--update-whitelist') > -1;
var esprima = require('..');
var TestStream = require('test262-stream');
var Interpreter = require('results-interpreter');
function normalizePath(str) {
return path.posix.format(path.parse(str));
}
var stream = new TestStream(testDir);
var Transform = require('stream').Transform;
var results = new Transform({
objectMode: true,
transform(test, encoding, done) {
var result = {
id: normalizePath(test.file) + '(' + test.scenario + ')',
expected: test.attrs.negative && test.attrs.negative.phase === 'early'
? 'fail' : 'pass'
};
var parse = test.attrs.flags.module ?
esprima.parseModule : esprima.parseScript;
try {
parse(test.contents);
result.actual = 'pass';
} catch (err) {
result.actual = 'fail';
}
done(null, result);
}
});
var interpreter = new Interpreter(whitelistFile, {
outputFile: shouldUpdate ? whitelistFile : null
});
console.log('Now running tests...');
if (shouldUpdate) {
console.log(
'The whitelist file will be updated according to the results of this ' +
'test run.'
);
} else {
console.log(
'Note: the whitelist file may be automatically updated by specifying ' +
'the `--update-whitelist` flag.'
);
}
stream.pipe(results)
.pipe(interpreter)
.on('error', (error) => {
console.error(error);
process.exitCode = 1;
})
.on('finish', function () {
report(this.summary);
process.exitCode = this.summary.passed ? 0 : 1;
});
function report(summary) {
var goodnews = [
summary.allowed.success.length + ' valid programs parsed without error',
summary.allowed.failure.length +
' invalid programs produced a parsing error',
summary.allowed.falsePositive.length +
' invalid programs did not produce a parsing error' +
' (and allowed by the whitelist file)',
summary.allowed.falseNegative.length +
' valid programs produced a parsing error' +
' (and allowed by the whitelist file)'
];
var badnews = [];
var badnewsDetails = [];
void [
{
tests: summary.disallowed.success,
label:
'valid programs parsed without error' +
' (in violation of the whitelist file)'
},
{
tests: summary.disallowed.failure,
label:
'invalid programs produced a parsing error' +
' (in violation of the whitelist file)'
},
{
tests: summary.disallowed.falsePositive,
label:
'invalid programs did not produce a parsing error' +
' (without a corresponding entry in the whitelist file)'
},
{
tests: summary.disallowed.falseNegative,
label:
'valid programs produced a parsing error' +
' (without a corresponding entry in the whitelist file)'
},
{
tests: summary.unrecognized,
label: 'non-existent programs specified in the whitelist file'
}
].forEach(function (entry) {
var tests = entry.tests;
var label = entry.label;
if (!tests.length) {
return;
}
var desc = tests.length + ' ' + label;
badnews.push(desc);
badnewsDetails.push(desc + ':');
badnewsDetails.push.apply(
badnewsDetails,
tests.map(function (test) {
return test.id || test;
})
);
});
console.log('Testing complete.');
console.log('Summary:');
console.log(goodnews.join('\n').replace(/^/gm, ' ✔ '));
if (!summary.passed) {
console.log('');
console.log(badnews.join('\n').replace(/^/gm, ' ✘ '));
console.log('');
console.log('Details:');
console.log(badnewsDetails.join('\n').replace(/^/gm, ' '));
}
}