Run parser tests from the official TypeScript parser (#10444)
This commit is contained in:
132
scripts/parser-tests/flow/index.js
Normal file
132
scripts/parser-tests/flow/index.js
Normal file
@@ -0,0 +1,132 @@
|
||||
const fs = require("fs").promises;
|
||||
const path = require("path");
|
||||
const merge = require("mergeiterator");
|
||||
const TestRunner = require("../utils/parser-test-runner");
|
||||
|
||||
const flowOptionsMapping = {
|
||||
esproposal_class_instance_fields: "classProperties",
|
||||
esproposal_class_static_fields: "classProperties",
|
||||
esproposal_export_star_as: "exportNamespaceFrom",
|
||||
esproposal_decorators: "decorators-legacy",
|
||||
esproposal_nullish_coalescing: "nullishCoalescingOperator",
|
||||
esproposal_optional_chaining: "optionalChaining",
|
||||
types: "flowComments",
|
||||
intern_comments: false,
|
||||
};
|
||||
|
||||
function getPlugins(test) {
|
||||
const plugins = [
|
||||
"dynamicImport",
|
||||
["flow", { all: true }],
|
||||
"flowComments",
|
||||
"jsx",
|
||||
"classProperties",
|
||||
"classPrivateProperties",
|
||||
"classPrivateMethods",
|
||||
"bigInt",
|
||||
"numericSeparator",
|
||||
];
|
||||
|
||||
if (!test.options) return plugins;
|
||||
|
||||
for (const [option, enabled] of Object.entries(test.options)) {
|
||||
if (!enabled) {
|
||||
const idx = plugins.indexOf(flowOptionsMapping[option]);
|
||||
if (idx !== -1) plugins.splice(idx, 1);
|
||||
} else if (!(option in flowOptionsMapping)) {
|
||||
throw new Error("Parser options not mapped " + option);
|
||||
} else if (flowOptionsMapping[option]) {
|
||||
plugins.push(flowOptionsMapping[option]);
|
||||
}
|
||||
}
|
||||
|
||||
return plugins;
|
||||
}
|
||||
|
||||
async function* readdirRecursive(root, dir = ".") {
|
||||
const names = await fs.readdir(path.join(root, dir));
|
||||
|
||||
const dirs = [];
|
||||
|
||||
for (const name of names) {
|
||||
const file = path.join(dir, name);
|
||||
const stats = await fs.stat(path.join(root, file));
|
||||
if (!stats.isDirectory()) {
|
||||
if (!file) continue;
|
||||
yield file;
|
||||
} else {
|
||||
dirs.push(readdirRecursive(root, file));
|
||||
}
|
||||
}
|
||||
|
||||
yield* merge(dirs);
|
||||
}
|
||||
|
||||
async function* loadTests(root) {
|
||||
for await (const file of readdirRecursive(root)) {
|
||||
if (file.slice(-3) === ".js") {
|
||||
const noExt = path.join(root, file).slice(0, -3);
|
||||
|
||||
const [contents, tree, options] = await Promise.all([
|
||||
fs.readFile(noExt + ".js", "utf8"),
|
||||
fs.readFile(noExt + ".tree.json", "utf8").catch(() => null),
|
||||
fs.readFile(noExt + ".options.json", "utf8").catch(() => null),
|
||||
]);
|
||||
|
||||
yield {
|
||||
file,
|
||||
contents,
|
||||
tree: JSON.parse(tree),
|
||||
options: JSON.parse(options),
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const runner = new TestRunner({
|
||||
testDir: path.join(__dirname, "../../../build/flow/src/parser/test/flow"),
|
||||
whitelist: path.join(__dirname, "whitelist.txt"),
|
||||
shouldUpdate: process.argv.includes("--update-whitelist"),
|
||||
|
||||
async *getTests() {
|
||||
for await (const test of loadTests(this.testDir)) {
|
||||
const shouldSuccess =
|
||||
test.tree && (!test.tree.errors || !test.tree.errors.length);
|
||||
|
||||
yield {
|
||||
contents: test.contents,
|
||||
fileName: test.file,
|
||||
id: test.file,
|
||||
expectedError: !shouldSuccess,
|
||||
plugins: getPlugins(test),
|
||||
};
|
||||
}
|
||||
},
|
||||
|
||||
parse(test, parser) {
|
||||
try {
|
||||
parser(test.contents, {
|
||||
sourceType: "module",
|
||||
plugins: test.plugins,
|
||||
});
|
||||
} catch (e) {
|
||||
// lets retry in script mode
|
||||
if (!test.expectedError) {
|
||||
try {
|
||||
parser(test.contents, {
|
||||
sourceType: "script",
|
||||
plugins: test.plugins,
|
||||
});
|
||||
return;
|
||||
} catch {}
|
||||
}
|
||||
|
||||
throw e;
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
runner.run().catch(err => {
|
||||
console.error(err);
|
||||
process.exitCode = 1;
|
||||
});
|
||||
23
scripts/parser-tests/flow/whitelist.txt
Normal file
23
scripts/parser-tests/flow/whitelist.txt
Normal file
@@ -0,0 +1,23 @@
|
||||
ES6/modules/migrated_0020.js
|
||||
JSX_invalid/migrated_0000.js
|
||||
arrow_function_invalid/migrated_0002.js
|
||||
async_await/migrated_0007.js
|
||||
async_await/migrated_0020.js
|
||||
async_await/migrated_0024.js
|
||||
async_await/migrated_0027.js
|
||||
async_generators/migrated_0007.js
|
||||
class_method_kinds/polymorphic_getter.js
|
||||
class_properties/migrated_0021.js
|
||||
class_properties/migrated_0026.js
|
||||
decorators/migrated_0003.js
|
||||
export_import_reserved_words/migrated_0003.js
|
||||
export_statements/export_trailing_comma.js
|
||||
nullish_coalescing/precedence_and.js
|
||||
nullish_coalescing/precedence_or.js
|
||||
private_class_properties/getter_and_field.js
|
||||
private_class_properties/getter_duplicate.js
|
||||
private_class_properties/multiple.js
|
||||
private_class_properties/multiple.js
|
||||
private_class_properties/setter_and_field.js
|
||||
private_class_properties/setter_duplicate.js
|
||||
types/member/reserved_words.js
|
||||
193
scripts/parser-tests/test262/index.js
Normal file
193
scripts/parser-tests/test262/index.js
Normal file
@@ -0,0 +1,193 @@
|
||||
const path = require("path");
|
||||
const TestStream = require("test262-stream");
|
||||
const TestRunner = require("../utils/parser-test-runner");
|
||||
|
||||
const ignoredFeatures = [
|
||||
"Array.prototype.flat",
|
||||
"Array.prototype.flatMap",
|
||||
"Array.prototype.values",
|
||||
"ArrayBuffer",
|
||||
"async-functions",
|
||||
"async-iteration",
|
||||
"arrow-function",
|
||||
"Atomics",
|
||||
"caller",
|
||||
"class",
|
||||
"computed-property-names",
|
||||
"const",
|
||||
"cross-realm",
|
||||
"DataView",
|
||||
"DataView.prototype.getFloat32",
|
||||
"DataView.prototype.getFloat64",
|
||||
"DataView.prototype.getInt8",
|
||||
"DataView.prototype.getInt16",
|
||||
"DataView.prototype.getInt32",
|
||||
"DataView.prototype.getUint16",
|
||||
"DataView.prototype.getUint32",
|
||||
"DataView.prototype.setUint8",
|
||||
"default-parameters",
|
||||
"destructuring-assignment",
|
||||
"destructuring-binding",
|
||||
"FinalizationGroup",
|
||||
"Float32Array",
|
||||
"Float64Array",
|
||||
"for-of",
|
||||
"generators",
|
||||
"globalThis",
|
||||
"hashbang",
|
||||
"host-gc-required",
|
||||
"Int8Array",
|
||||
"Int32Array",
|
||||
"Intl.DateTimeFormat-datetimestyle",
|
||||
"Intl.DateTimeFormat-dayPeriod",
|
||||
"Intl.DateTimeFormat-fractionalSecondDigits",
|
||||
"Intl.DateTimeFormat-formatRange",
|
||||
"Intl.ListFormat",
|
||||
"Intl.Locale",
|
||||
"Intl.NumberFormat-unified",
|
||||
"Intl.RelativeTimeFormat",
|
||||
"Intl.Segmenter",
|
||||
"IsHTMLDDA",
|
||||
"json-superset",
|
||||
"let",
|
||||
"Map",
|
||||
"new.target",
|
||||
"Object.fromEntries",
|
||||
"Object.is",
|
||||
"object-rest",
|
||||
"object-spread",
|
||||
"optional-catch-binding",
|
||||
"Promise.allSettled",
|
||||
"Promise.prototype.finally",
|
||||
"Proxy",
|
||||
"proxy-missing-checks",
|
||||
"Reflect",
|
||||
"Reflect.construct",
|
||||
"Reflect.set",
|
||||
"Reflect.setPrototypeOf",
|
||||
"regexp-dotall",
|
||||
"regexp-lookbehind",
|
||||
"regexp-named-groups",
|
||||
"regexp-unicode-property-escapes",
|
||||
"rest-parameters",
|
||||
"SharedArrayBuffer",
|
||||
"Set",
|
||||
"String.fromCodePoint",
|
||||
"String.prototype.endsWith",
|
||||
"String.prototype.includes",
|
||||
"String.prototype.matchAll",
|
||||
"String.prototype.trimEnd",
|
||||
"String.prototype.trimStart",
|
||||
"string-trimming",
|
||||
"super",
|
||||
"Symbol",
|
||||
"Symbol.asyncIterator",
|
||||
"Symbol.hasInstance",
|
||||
"Symbol.isConcatSpreadable",
|
||||
"Symbol.iterator",
|
||||
"Symbol.match",
|
||||
"Symbol.matchAll",
|
||||
"Symbol.prototype.description",
|
||||
"Symbol.replace",
|
||||
"Symbol.search",
|
||||
"Symbol.split",
|
||||
"Symbol.species",
|
||||
"Symbol.toPrimitive",
|
||||
"Symbol.toStringTag",
|
||||
"Symbol.unscopables",
|
||||
"tail-call-optimization",
|
||||
"template",
|
||||
"TypedArray",
|
||||
"u180e",
|
||||
"Uint8Array",
|
||||
"Uint8ClampedArray",
|
||||
"Uint16Array",
|
||||
"WeakMap",
|
||||
"WeakSet",
|
||||
"WeakRef",
|
||||
"well-formed-json-stringify",
|
||||
];
|
||||
|
||||
const ignoredTests = ["built-ins/RegExp/", "language/literals/regexp/"];
|
||||
|
||||
const featuresToPlugins = {
|
||||
BigInt: "bigInt",
|
||||
"class-fields-private": "classPrivateProperties",
|
||||
"class-fields-public": "classProperties",
|
||||
"class-methods-private": "classPrivateMethods",
|
||||
"class-static-fields-public": "classProperties",
|
||||
"class-static-fields-private": "classPrivateProperties",
|
||||
"class-static-methods-private": "classPrivateMethods",
|
||||
"dynamic-import": "dynamicImport",
|
||||
"export-star-as-namespace-from-module": "exportNamespaceFrom",
|
||||
"import.meta": "importMeta",
|
||||
"numeric-separator-literal": "numericSeparator",
|
||||
"optional-chaining": "optionalChaining",
|
||||
"top-level-await": "topLevelAwait",
|
||||
};
|
||||
|
||||
const unmappedFeatures = new Set();
|
||||
|
||||
function* getPlugins(features) {
|
||||
if (!features) return;
|
||||
|
||||
for (const f of features) {
|
||||
if (featuresToPlugins[f]) {
|
||||
yield featuresToPlugins[f];
|
||||
} else if (!ignoredFeatures.includes(f)) {
|
||||
unmappedFeatures.add(f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const runner = new TestRunner({
|
||||
testDir: path.join(__dirname, "../../../build/test262"),
|
||||
whitelist: path.join(__dirname, "whitelist.txt"),
|
||||
logInterval: 500,
|
||||
shouldUpdate: process.argv.includes("--update-whitelist"),
|
||||
|
||||
async *getTests() {
|
||||
const stream = new TestStream(this.testDir, {
|
||||
omitRuntime: true,
|
||||
});
|
||||
|
||||
for await (const test of stream) {
|
||||
// strip test/
|
||||
const fileName = test.file.substr(5);
|
||||
|
||||
if (ignoredTests.some(start => fileName.startsWith(start))) continue;
|
||||
|
||||
yield {
|
||||
contents: test.contents,
|
||||
fileName,
|
||||
id: `${fileName}(${test.scenario})`,
|
||||
sourceType: test.attrs.flags.module ? "module" : "script",
|
||||
plugins: Array.from(getPlugins(test.attrs.features)),
|
||||
expectedError:
|
||||
!!test.attrs.negative &&
|
||||
(test.attrs.negative.phase === "parse" ||
|
||||
test.attrs.negative.phase === "early"),
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
runner
|
||||
.run()
|
||||
.then(() => {
|
||||
if (unmappedFeatures.size) {
|
||||
console.log("");
|
||||
console.log(
|
||||
"The following Features are not currently mapped or ignored:"
|
||||
);
|
||||
console.log(
|
||||
Array.from(unmappedFeatures)
|
||||
.join("\n")
|
||||
.replace(/^/gm, " ")
|
||||
);
|
||||
}
|
||||
})
|
||||
.catch(err => {
|
||||
console.error(err);
|
||||
process.exitCode = 1;
|
||||
});
|
||||
194
scripts/parser-tests/test262/whitelist.txt
Normal file
194
scripts/parser-tests/test262/whitelist.txt
Normal file
@@ -0,0 +1,194 @@
|
||||
language/expressions/class/elements/fields-duplicate-privatenames.js(default)
|
||||
language/expressions/class/elements/fields-duplicate-privatenames.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-chained-usage.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-chained-usage.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-recursive.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-recursive.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-private-field-on-object-destructuring.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-private-field-on-object-destructuring.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-async-gen.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-async-gen.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-async.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-async.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-gen.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-gen.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-get-field.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-get-field.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-get-get.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-get-get.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-field.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-field.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-get.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-get.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-meth.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-meth.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-set.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-set.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-staticfield.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-staticfield.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-staticmeth.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-staticmeth.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-set-field.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-set-field.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-set-set.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-set-set.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatename-in-computed-property-missing.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/grammar-privatename-in-computed-property-missing.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-call-expression-bad-reference.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-call-expression-bad-reference.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-call-expression-this.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-call-expression-this.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-fn-call-expression-bad-reference.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-fn-call-expression-bad-reference.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-fn-call-expression-this.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-fn-call-expression-this.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-fn-member-expression-bad-reference.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-fn-member-expression-bad-reference.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-fn-member-expression-this.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-fn-member-expression-this.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-member-expression-bad-reference.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-member-expression-bad-reference.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-member-expression-this.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-member-expression-this.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-call-expression-bad-reference.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-call-expression-bad-reference.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-call-expression-this.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-call-expression-this.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-fn-call-expression-bad-reference.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-fn-call-expression-bad-reference.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-fn-call-expression-this.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-fn-call-expression-this.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-fn-member-expression-bad-reference.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-fn-member-expression-bad-reference.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-fn-member-expression-this.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-fn-member-expression-this.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-heritage-call-expression-bad-reference.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-heritage-call-expression-bad-reference.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-heritage-call-expression-this.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-heritage-call-expression-this.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-heritage-member-expression-bad-reference.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-heritage-member-expression-bad-reference.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-heritage-member-expression-this.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-heritage-member-expression-this.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-member-expression-bad-reference.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-member-expression-bad-reference.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-member-expression-this.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-member-expression-this.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-outter-call-expression-bad-reference.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-outter-call-expression-bad-reference.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-outter-call-expression-this.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-outter-call-expression-this.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-outter-member-expression-bad-reference.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-outter-member-expression-bad-reference.js(strict mode)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-outter-member-expression-this.js(default)
|
||||
language/expressions/class/elements/syntax/early-errors/invalid-names/method-outter-member-expression-this.js(strict mode)
|
||||
language/expressions/object/method-definition/private-name-early-error-async-gen-inside-class.js(default)
|
||||
language/expressions/object/method-definition/private-name-early-error-async-gen-inside-class.js(strict mode)
|
||||
language/expressions/object/method-definition/private-name-early-error-gen-inside-class.js(default)
|
||||
language/expressions/object/method-definition/private-name-early-error-gen-inside-class.js(strict mode)
|
||||
language/expressions/object/method-definition/private-name-early-error-method-inside-class.js(default)
|
||||
language/expressions/object/method-definition/private-name-early-error-method-inside-class.js(strict mode)
|
||||
language/module-code/privatename-not-valid-earlyerr-module-1.js(default)
|
||||
language/module-code/privatename-not-valid-earlyerr-module-1.js(strict mode)
|
||||
language/module-code/privatename-not-valid-earlyerr-module-2.js(default)
|
||||
language/module-code/privatename-not-valid-earlyerr-module-2.js(strict mode)
|
||||
language/module-code/privatename-not-valid-earlyerr-module-3.js(default)
|
||||
language/module-code/privatename-not-valid-earlyerr-module-3.js(strict mode)
|
||||
language/module-code/privatename-not-valid-earlyerr-module-4.js(default)
|
||||
language/module-code/privatename-not-valid-earlyerr-module-4.js(strict mode)
|
||||
language/statements/class/elements/fields-duplicate-privatenames.js(default)
|
||||
language/statements/class/elements/fields-duplicate-privatenames.js(strict mode)
|
||||
language/statements/class/elements/privatename-not-valid-earlyerr-script-1.js(default)
|
||||
language/statements/class/elements/privatename-not-valid-earlyerr-script-1.js(strict mode)
|
||||
language/statements/class/elements/privatename-not-valid-earlyerr-script-2.js(default)
|
||||
language/statements/class/elements/privatename-not-valid-earlyerr-script-2.js(strict mode)
|
||||
language/statements/class/elements/privatename-not-valid-earlyerr-script-3.js(default)
|
||||
language/statements/class/elements/privatename-not-valid-earlyerr-script-3.js(strict mode)
|
||||
language/statements/class/elements/privatename-not-valid-earlyerr-script-4.js(default)
|
||||
language/statements/class/elements/privatename-not-valid-earlyerr-script-4.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-chained-usage.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-chained-usage.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-recursive.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-recursive.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-private-field-on-object-destructuring.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-private-field-on-object-destructuring.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-async-gen.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-async-gen.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-async.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-async.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-gen.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-gen.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-get-field.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-get-field.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-get-get.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-get-get.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-field.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-field.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-get.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-get.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-meth.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-meth.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-set.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-set.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-staticfield.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-staticfield.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-staticmeth.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-staticmeth.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-set-field.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-set-field.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-set-set.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-set-set.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatename-in-computed-property-missing.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/grammar-privatename-in-computed-property-missing.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-call-expression-bad-reference.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-call-expression-bad-reference.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-call-expression-this.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-call-expression-this.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-fn-call-expression-bad-reference.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-fn-call-expression-bad-reference.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-fn-call-expression-this.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-fn-call-expression-this.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-fn-member-expression-bad-reference.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-fn-member-expression-bad-reference.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-fn-member-expression-this.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-fn-member-expression-this.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-member-expression-bad-reference.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-member-expression-bad-reference.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-member-expression-this.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-member-expression-this.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-call-expression-bad-reference.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-call-expression-bad-reference.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-call-expression-this.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-call-expression-this.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-fn-call-expression-bad-reference.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-fn-call-expression-bad-reference.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-fn-call-expression-this.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-fn-call-expression-this.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-fn-member-expression-bad-reference.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-fn-member-expression-bad-reference.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-fn-member-expression-this.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-fn-member-expression-this.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-heritage-call-expression-bad-reference.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-heritage-call-expression-bad-reference.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-heritage-call-expression-this.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-heritage-call-expression-this.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-heritage-member-expression-bad-reference.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-heritage-member-expression-bad-reference.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-heritage-member-expression-this.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-heritage-member-expression-this.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-member-expression-bad-reference.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-member-expression-bad-reference.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-member-expression-this.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-member-expression-this.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-outter-call-expression-bad-reference.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-outter-call-expression-bad-reference.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-outter-call-expression-this.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-outter-call-expression-this.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-outter-member-expression-bad-reference.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-outter-member-expression-bad-reference.js(strict mode)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-outter-member-expression-this.js(default)
|
||||
language/statements/class/elements/syntax/early-errors/invalid-names/method-outter-member-expression-this.js(strict mode)
|
||||
58
scripts/parser-tests/typescript/index.js
Normal file
58
scripts/parser-tests/typescript/index.js
Normal file
@@ -0,0 +1,58 @@
|
||||
const path = require("path");
|
||||
const fs = require("fs").promises;
|
||||
const ts = require("typescript");
|
||||
const TestRunner = require("../utils/parser-test-runner");
|
||||
|
||||
async function* loadTests(dir) {
|
||||
const names = await fs.readdir(dir);
|
||||
|
||||
for (const name of names) {
|
||||
const contents = await fs.readFile(path.join(dir, name), "utf8");
|
||||
yield { name, contents };
|
||||
}
|
||||
}
|
||||
|
||||
const plugins = [
|
||||
"typescript",
|
||||
"classProperties",
|
||||
"decorators-legacy",
|
||||
"bigInt",
|
||||
"dynamicImport",
|
||||
];
|
||||
|
||||
const runner = new TestRunner({
|
||||
testDir: path.join(
|
||||
__dirname,
|
||||
"../../../build/typescript/tests/cases/compiler"
|
||||
),
|
||||
whitelist: path.join(__dirname, "whitelist.txt"),
|
||||
logInterval: 50,
|
||||
shouldUpdate: process.argv.includes("--update-whitelist"),
|
||||
|
||||
async *getTests() {
|
||||
for await (const test of loadTests(this.testDir)) {
|
||||
const isTSX = test.name.slice(-4) === ".tsx";
|
||||
const ast = ts.createSourceFile(
|
||||
test.name,
|
||||
test.contents,
|
||||
ts.ScriptTarget.Latest,
|
||||
false,
|
||||
isTSX ? ts.ScriptKind.TSX : ts.ScriptKind.TS
|
||||
);
|
||||
|
||||
yield {
|
||||
contents: test.contents,
|
||||
fileName: test.name,
|
||||
id: test.name,
|
||||
expectedError: ast.parseDiagnostics.length > 0,
|
||||
sourceType: "module",
|
||||
plugins: isTSX ? plugins.concat("jsx") : plugins,
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
runner.run().catch(err => {
|
||||
console.error(err);
|
||||
process.exitCode = 1;
|
||||
});
|
||||
501
scripts/parser-tests/typescript/whitelist.txt
Normal file
501
scripts/parser-tests/typescript/whitelist.txt
Normal file
@@ -0,0 +1,501 @@
|
||||
ArrowFunctionExpression1.ts
|
||||
ClassDeclarationWithInvalidConstOnPropertyDeclaration.ts
|
||||
MemberAccessorDeclaration15.ts
|
||||
ParameterList13.ts
|
||||
ParameterList4.ts
|
||||
ParameterList5.ts
|
||||
ParameterList6.ts
|
||||
accessorParameterAccessibilityModifier.ts
|
||||
accessorWithRestParam.ts
|
||||
accessorWithoutBody1.ts
|
||||
accessorWithoutBody2.ts
|
||||
aliasUsageInAccessorsOfClass.ts
|
||||
aliasUsageInArray.ts
|
||||
aliasUsageInFunctionExpression.ts
|
||||
aliasUsageInGenericFunction.ts
|
||||
aliasUsageInIndexerOfClass.ts
|
||||
aliasUsageInObjectLiteral.ts
|
||||
aliasUsageInOrExpression.ts
|
||||
aliasUsageInTypeArgumentOfExtendsClause.ts
|
||||
aliasUsageInVarAssignment.ts
|
||||
aliasUsedAsNameValue.ts
|
||||
allowImportClausesToMergeWithTypes.ts
|
||||
allowJscheckJsTypeParameterNoCrash.ts
|
||||
alwaysStrict.ts
|
||||
alwaysStrictES6.ts
|
||||
alwaysStrictModule.ts
|
||||
alwaysStrictModule2.ts
|
||||
alwaysStrictNoImplicitUseStrict.ts
|
||||
ambientWithStatements.ts
|
||||
amdDeclarationEmitNoExtraDeclare.ts
|
||||
amdModuleConstEnumUsage.ts
|
||||
amdModuleName2.ts
|
||||
anyDeclare.ts
|
||||
argumentsBindsToFunctionScopeArgumentList.ts
|
||||
arrayOfExportedClass.ts
|
||||
arrowFunctionErrorSpan.ts
|
||||
asiReturn.ts
|
||||
assignToInvalidLHS.ts
|
||||
assignmentToParenthesizedExpression1.ts
|
||||
asyncFunctionsAcrossFiles.ts
|
||||
augmentExportEquals1.ts
|
||||
augmentExportEquals1_1.ts
|
||||
augmentExportEquals2.ts
|
||||
augmentExportEquals2_1.ts
|
||||
augmentExportEquals3.ts
|
||||
augmentExportEquals3_1.ts
|
||||
augmentExportEquals4.ts
|
||||
augmentExportEquals4_1.ts
|
||||
augmentExportEquals6.ts
|
||||
augmentExportEquals6_1.ts
|
||||
augmentExportEquals7.ts
|
||||
augmentedTypesClass.ts
|
||||
augmentedTypesClass2.ts
|
||||
augmentedTypesClass2a.ts
|
||||
augmentedTypesClass4.ts
|
||||
augmentedTypesEnum.ts
|
||||
augmentedTypesEnum2.ts
|
||||
augmentedTypesFunction.ts
|
||||
augmentedTypesInterface.ts
|
||||
augmentedTypesVar.ts
|
||||
awaitInNonAsyncFunction.ts
|
||||
awaitLiteralValues.ts
|
||||
bigIntWithTargetES3.ts
|
||||
bigintWithLib.ts
|
||||
breakNotInIterationOrSwitchStatement1.ts
|
||||
breakNotInIterationOrSwitchStatement2.ts
|
||||
breakTarget5.ts
|
||||
breakTarget6.ts
|
||||
cacheResolutions.ts
|
||||
cachedModuleResolution1.ts
|
||||
cachedModuleResolution2.ts
|
||||
cachedModuleResolution3.ts
|
||||
cachedModuleResolution4.ts
|
||||
cachedModuleResolution5.ts
|
||||
cachedModuleResolution6.ts
|
||||
cachedModuleResolution7.ts
|
||||
cachedModuleResolution8.ts
|
||||
cachedModuleResolution9.ts
|
||||
callOverloads2.ts
|
||||
catchClauseWithInitializer1.ts
|
||||
catchClauseWithTypeAnnotation.ts
|
||||
checkSuperCallBeforeThisAccessing9.ts
|
||||
classCannotExtendVar.ts
|
||||
classExpressionPropertyModifiers.ts
|
||||
classExpressionWithDecorator1.ts
|
||||
classExtendsAcrossFiles.ts
|
||||
classExtendsMultipleBaseClasses.ts
|
||||
classHeritageWithTrailingSeparator.ts
|
||||
classOverloadForFunction.ts
|
||||
collisionArgumentsArrowFunctions.ts
|
||||
collisionArgumentsClassConstructor.ts
|
||||
collisionArgumentsClassMethod.ts
|
||||
collisionArgumentsFunction.ts
|
||||
collisionArgumentsFunctionExpressions.ts
|
||||
collisionExportsRequireAndClass.ts
|
||||
commonSourceDir5.ts
|
||||
commonSourceDir6.ts
|
||||
commonjsSafeImport.ts
|
||||
complicatedPrivacy.ts
|
||||
conflictingTypeAnnotatedVar.ts
|
||||
constDeclarationShadowedByVarDeclaration.ts
|
||||
constDeclarations-invalidContexts.ts
|
||||
constDeclarations-scopes.ts
|
||||
constDeclarations-validContexts.ts
|
||||
constEnumNoPreserveDeclarationReexport.ts
|
||||
constEnumPreserveEmitReexport.ts
|
||||
constInClassExpression.ts
|
||||
constructorArgsErrors1.ts
|
||||
constructorArgsErrors2.ts
|
||||
constructorArgsErrors3.ts
|
||||
constructorArgsErrors4.ts
|
||||
constructorArgsErrors5.ts
|
||||
continueNotInIterationStatement1.ts
|
||||
continueNotInIterationStatement2.ts
|
||||
continueNotInIterationStatement3.ts
|
||||
continueNotInIterationStatement4.ts
|
||||
continueTarget1.ts
|
||||
continueTarget5.ts
|
||||
continueTarget6.ts
|
||||
convertKeywordsYes.ts
|
||||
declarationEmitAmdModuleNameDirective.ts
|
||||
declarationEmitComputedNameCausesImportToBePainted.ts
|
||||
declarationEmitComputedNameConstEnumAlias.ts
|
||||
declarationEmitCrossFileImportTypeOfAmbientModule.ts
|
||||
declarationEmitDefaultExportWithStaticAssignment.ts
|
||||
declarationEmitDestructuring2.ts
|
||||
declarationEmitDestructuringOptionalBindingParametersInOverloads.ts
|
||||
declarationEmitDestructuringParameterProperties.ts
|
||||
declarationEmitDestructuringWithOptionalBindingParameters.ts
|
||||
declarationEmitExpandoPropertyPrivateName.ts
|
||||
declarationEmitExportAssignment.ts
|
||||
declarationEmitExportDeclaration.ts
|
||||
declarationEmitForTypesWhichNeedImportTypes.ts
|
||||
declarationEmitInterfaceWithNonEntityNameExpressionHeritage.ts
|
||||
declarationEmitPrefersPathKindBasedOnBundling.ts
|
||||
declarationEmitPrefersPathKindBasedOnBundling2.ts
|
||||
declarationEmitPrivateSymbolCausesVarDeclarationEmit2.ts
|
||||
declarationMapsMultifile.ts
|
||||
declarationMapsOutFile.ts
|
||||
declarationsForInferredTypeFromOtherFile.ts
|
||||
declareAlreadySeen.ts
|
||||
declareModifierOnImport1.ts
|
||||
decoratorMetadataRestParameterWithImportedType.ts
|
||||
decoratorMetadataWithImportDeclarationNameCollision.ts
|
||||
decoratorMetadataWithImportDeclarationNameCollision3.ts
|
||||
decoratorMetadataWithImportDeclarationNameCollision4.ts
|
||||
decoratorMetadataWithImportDeclarationNameCollision5.ts
|
||||
decoratorMetadataWithImportDeclarationNameCollision7.ts
|
||||
decoratorReferenceOnOtherProperty.ts
|
||||
decoratorsOnComputedProperties.ts
|
||||
decrementAndIncrementOperators.ts
|
||||
defaultArgsInOverloads.ts
|
||||
defaultDeclarationEmitDefaultImport.ts
|
||||
defaultIsNotVisibleInLocalScope.ts
|
||||
defaultPropsEmptyCurlyBecomesAnyForJs.ts
|
||||
defaultValueInFunctionTypes.ts
|
||||
deleteOperator1.ts
|
||||
deleteOperatorInStrictMode.ts
|
||||
dependencyViaImportAlias.ts
|
||||
destructureOptionalParameter.ts
|
||||
destructuredDeclarationEmit.ts
|
||||
doubleUnderscoreExportStarConflict.ts
|
||||
downlevelLetConst1.ts
|
||||
duplicateIdentifierBindingElementInParameterDeclaration1.ts
|
||||
duplicateIdentifierBindingElementInParameterDeclaration2.ts
|
||||
duplicateIdentifierEnum.ts
|
||||
duplicateIdentifierInCatchBlock.ts
|
||||
duplicateIdentifierRelatedSpans1.ts
|
||||
duplicateIdentifierRelatedSpans2.ts
|
||||
duplicateIdentifiersAcrossFileBoundaries.ts
|
||||
duplicateLabel1.ts
|
||||
duplicateLabel2.ts
|
||||
duplicateVarAndImport.ts
|
||||
duplicateVarAndImport2.ts
|
||||
duplicateVarsAcrossFileBoundaries.ts
|
||||
dynamicImportTrailingComma.ts
|
||||
dynamicNames.ts
|
||||
elidedEmbeddedStatementsReplacedWithSemicolon.ts
|
||||
emitClassMergedWithConstNamespaceNotElided.ts
|
||||
emitSuperCallBeforeEmitParameterPropertyDeclaration1.ts
|
||||
emitSuperCallBeforeEmitParameterPropertyDeclaration1ES6.ts
|
||||
emitSuperCallBeforeEmitPropertyDeclarationAndParameterPropertyDeclaration1.ts
|
||||
emitSuperCallBeforeEmitPropertyDeclarationAndParameterPropertyDeclaration1ES6.ts
|
||||
emitThisInSuperMethodCall.ts
|
||||
enumGenericTypeClash.ts
|
||||
enumIdentifierLiterals.ts
|
||||
errorOnInitializerInInterfaceProperty.ts
|
||||
errorOnInitializerInObjectTypeLiteralProperty.ts
|
||||
es3-oldStyleOctalLiteralInEnums.ts
|
||||
es3-oldStyleOctalLiteralTypes.ts
|
||||
es3defaultAliasIsQuoted.ts
|
||||
es5-asyncFunctionWithStatements.ts
|
||||
es5-importHelpersAsyncFunctions.ts
|
||||
es5-oldStyleOctalLiteralInEnums.ts
|
||||
es5ModuleInternalNamedImports.ts
|
||||
es6ExportAssignment2.ts
|
||||
es6ExportAssignment3.ts
|
||||
es6ImportDefaultBindingFollowedWithNamedImport.ts
|
||||
es6ImportDefaultBindingFollowedWithNamedImport1.ts
|
||||
es6ImportDefaultBindingFollowedWithNamedImport1InEs5.ts
|
||||
es6ImportDefaultBindingFollowedWithNamedImport1WithExport.ts
|
||||
es6ImportDefaultBindingFollowedWithNamedImportDts.ts
|
||||
es6ImportDefaultBindingFollowedWithNamedImportDts1.ts
|
||||
es6ImportDefaultBindingFollowedWithNamedImportInEs5.ts
|
||||
es6ImportDefaultBindingFollowedWithNamedImportWithExport.ts
|
||||
es6ImportDefaultBindingFollowedWithNamespaceBinding1WithExport.ts
|
||||
es6ImportDefaultBindingFollowedWithNamespaceBindingWithExport.ts
|
||||
es6ImportDefaultBindingMergeErrors.ts
|
||||
es6ImportDefaultBindingWithExport.ts
|
||||
es6ImportEqualsDeclaration.ts
|
||||
es6ImportEqualsExportModuleCommonJsError.ts
|
||||
es6ImportEqualsExportModuleEs2015Error.ts
|
||||
es6ImportNameSpaceImportMergeErrors.ts
|
||||
es6ImportNameSpaceImportWithExport.ts
|
||||
es6ImportNamedImport.ts
|
||||
es6ImportNamedImportAmd.ts
|
||||
es6ImportNamedImportDts.ts
|
||||
es6ImportNamedImportInEs5.ts
|
||||
es6ImportNamedImportInExportAssignment.ts
|
||||
es6ImportNamedImportMergeErrors.ts
|
||||
es6ImportNamedImportNoExportMember.ts
|
||||
es6ImportNamedImportNoNamedExports.ts
|
||||
es6ImportNamedImportWithExport.ts
|
||||
es6ImportNamedImportWithTypesAndValues.ts
|
||||
es6ImportWithoutFromClauseWithExport.ts
|
||||
es6ModuleInternalNamedImports.ts
|
||||
es6ModuleInternalNamedImports2.ts
|
||||
es6UseOfTopLevelRequire.ts
|
||||
esModuleInterop.ts
|
||||
esModuleInteropImportTSLibHasImport.ts
|
||||
esModuleInteropNamedDefaultImports.ts
|
||||
esModuleInteropTslibHelpers.ts
|
||||
exportAlreadySeen.ts
|
||||
exportAssignClassAndModule.ts
|
||||
exportAssignmentImportMergeNoCrash.ts
|
||||
exportAssignmentMembersVisibleInAugmentation.ts
|
||||
exportAssignmentWithDeclareAndExportModifiers.ts
|
||||
exportAssignmentWithDeclareModifier.ts
|
||||
exportAssignmentWithExportModifier.ts
|
||||
exportAssignmentWithoutAllowSyntheticDefaultImportsError.ts
|
||||
exportClassExtendingIntersection.ts
|
||||
exportClassWithoutName.ts
|
||||
exportDeclarationInInternalModule.ts
|
||||
exportDeclarationsInAmbientNamespaces.ts
|
||||
exportDefaultAbstractClass.ts
|
||||
exportDefaultAsyncFunction2.ts
|
||||
exportDefaultMarksIdentifierAsUsed.ts
|
||||
exportDefaultStripsFreshness.ts
|
||||
exportEqualsOfModule.ts
|
||||
exportImport.ts
|
||||
exportImportNonInstantiatedModule2.ts
|
||||
exportSameNameFuncVar.ts
|
||||
exportSpecifierAndExportedMemberDeclaration.ts
|
||||
exportSpecifierAndLocalMemberDeclaration.ts
|
||||
exportStarFromEmptyModule.ts
|
||||
expressionsForbiddenInParameterInitializers.ts
|
||||
extendingClassFromAliasAndUsageInIndexer.ts
|
||||
extendsClauseAlreadySeen.ts
|
||||
extendsClauseAlreadySeen2.ts
|
||||
externalModuleAssignToVar.ts
|
||||
fatarrowfunctionsOptionalArgsErrors1.ts
|
||||
fileWithNextLine2.ts
|
||||
fileWithNextLine3.ts
|
||||
funClodule.ts
|
||||
functionAndImportNameConflict.ts
|
||||
functionCall15.ts
|
||||
functionDeclarationWithResolutionOfTypeNamedArguments01.ts
|
||||
functionExpressionInWithBlock.ts
|
||||
functionExpressionWithResolutionOfTypeNamedArguments01.ts
|
||||
functionsWithModifiersInBlocks1.ts
|
||||
gettersAndSettersErrors.ts
|
||||
giant.ts
|
||||
illegalModifiersOnClassElements.ts
|
||||
illegalSuperCallsInConstructor.ts
|
||||
implementClausePrecedingExtends.ts
|
||||
implementsClauseAlreadySeen.ts
|
||||
importAndVariableDeclarationConflict1.ts
|
||||
importAndVariableDeclarationConflict3.ts
|
||||
importAndVariableDeclarationConflict4.ts
|
||||
importAsBaseClass.ts
|
||||
importDecl.ts
|
||||
importDeclWithClassModifiers.ts
|
||||
importDeclWithDeclareModifier.ts
|
||||
importDeclWithDeclareModifierInAmbientContext.ts
|
||||
importHelpers.ts
|
||||
importHelpersAmd.ts
|
||||
importHelpersInAmbientContext.ts
|
||||
importHelpersInIsolatedModules.ts
|
||||
importHelpersInTsx.tsx
|
||||
importHelpersNoHelpers.ts
|
||||
importHelpersNoModule.ts
|
||||
importHelpersOutFile.ts
|
||||
importHelpersSystem.ts
|
||||
importWithTrailingSlash.ts
|
||||
importedModuleClassNameClash.ts
|
||||
indexSignatureTypeCheck.ts
|
||||
indexSignatureTypeCheck2.ts
|
||||
indexSignatureWithAccessibilityModifier.ts
|
||||
indexSignatureWithInitializer1.ts
|
||||
indexTypeCheck.ts
|
||||
indexWithoutParamType.ts
|
||||
indexerAsOptional.ts
|
||||
indexerSignatureWithRestParam.ts
|
||||
initializedParameterBeforeNonoptionalNotOptional.ts
|
||||
interfaceMayNotBeExtendedWitACall.ts
|
||||
interfaceWithImplements1.ts
|
||||
invalidContinueInDownlevelAsync.ts
|
||||
invalidReferenceSyntax1.ts
|
||||
isLiteral1.ts
|
||||
isLiteral2.ts
|
||||
isolatedModulesReExportType.ts
|
||||
jsEnumTagOnObjectFrozen.ts
|
||||
jsFileCompilationBindDuplicateIdentifier.ts
|
||||
jsFileCompilationBindErrors.ts
|
||||
jsFileCompilationDuplicateFunctionImplementation.ts
|
||||
jsFileCompilationDuplicateFunctionImplementationFileOrderReversed.ts
|
||||
jsFileCompilationExternalPackageError.ts
|
||||
jsNoImplicitAnyNoCascadingReferenceErrors.ts
|
||||
jsdocAccessEnumType.ts
|
||||
jsxAttributeWithoutExpressionReact.tsx
|
||||
letAndVarRedeclaration.ts
|
||||
letAsIdentifier.ts
|
||||
letAsIdentifierInStrictMode.ts
|
||||
letDeclarations-invalidContexts.ts
|
||||
letDeclarations-scopes-duplicates.ts
|
||||
letDeclarations-scopes-duplicates2.ts
|
||||
letDeclarations-scopes-duplicates3.ts
|
||||
letDeclarations-scopes-duplicates4.ts
|
||||
letDeclarations-scopes-duplicates5.ts
|
||||
letDeclarations-scopes-duplicates6.ts
|
||||
letDeclarations-scopes-duplicates7.ts
|
||||
letDeclarations-scopes.ts
|
||||
letDeclarations-validContexts.ts
|
||||
literalsInComputedProperties1.ts
|
||||
mergeWithImportedType.ts
|
||||
mergedDeclarations6.ts
|
||||
metadataOfClassFromAlias.ts
|
||||
metadataOfClassFromAlias2.ts
|
||||
metadataReferencedWithinFilteredUnion.ts
|
||||
mismatchedClassConstructorVariable.ts
|
||||
missingSemicolonInModuleSpecifier.ts
|
||||
misspelledNewMetaProperty.ts
|
||||
modifierOnParameter1.ts
|
||||
modifiersInObjectLiterals.ts
|
||||
modifiersOnInterfaceIndexSignature1.ts
|
||||
moduleAugmentationCollidingNamesInAugmentation1.ts
|
||||
moduleAugmentationDeclarationEmit1.ts
|
||||
moduleAugmentationDeclarationEmit2.ts
|
||||
moduleAugmentationDisallowedExtensions.ts
|
||||
moduleAugmentationDuringSyntheticDefaultCheck.ts
|
||||
moduleAugmentationExtendAmbientModule1.ts
|
||||
moduleAugmentationExtendAmbientModule2.ts
|
||||
moduleAugmentationExtendFileModule1.ts
|
||||
moduleAugmentationExtendFileModule2.ts
|
||||
moduleAugmentationGlobal1.ts
|
||||
moduleAugmentationGlobal2.ts
|
||||
moduleAugmentationGlobal3.ts
|
||||
moduleAugmentationImportsAndExports1.ts
|
||||
moduleAugmentationImportsAndExports2.ts
|
||||
moduleAugmentationImportsAndExports3.ts
|
||||
moduleAugmentationImportsAndExports4.ts
|
||||
moduleAugmentationImportsAndExports5.ts
|
||||
moduleAugmentationImportsAndExports6.ts
|
||||
moduleAugmentationNoNewNames.ts
|
||||
moduleAugmentationsBundledOutput1.ts
|
||||
moduleAugmentationsImports1.ts
|
||||
moduleAugmentationsImports2.ts
|
||||
moduleAugmentationsImports3.ts
|
||||
moduleAugmentationsImports4.ts
|
||||
moduleDuplicateIdentifiers.ts
|
||||
moduleElementsInWrongContext.ts
|
||||
moduleElementsInWrongContext2.ts
|
||||
moduleElementsInWrongContext3.ts
|
||||
moduleResolutionNoTs.ts
|
||||
moduleResolutionWithSymlinks.ts
|
||||
moduleResolutionWithSymlinks_withOutDir.ts
|
||||
moduleResolution_automaticTypeDirectiveNames.ts
|
||||
moduleSharesNameWithImportDeclarationInsideIt3.ts
|
||||
moduleSharesNameWithImportDeclarationInsideIt5.ts
|
||||
module_augmentUninstantiatedModule2.ts
|
||||
multiImportExport.ts
|
||||
multiLinePropertyAccessAndArrowFunctionIndent1.ts
|
||||
multipleClassPropertyModifiers.ts
|
||||
multipleClassPropertyModifiersErrors.ts
|
||||
multipleInheritance.ts
|
||||
nameCollisions.ts
|
||||
narrowedImports.ts
|
||||
newNamesInGlobalAugmentations1.ts
|
||||
noBundledEmitFromNodeModules.ts
|
||||
noCrashOnImportShadowing.ts
|
||||
noImplicitAnyDestructuringVarDeclaration.ts
|
||||
noSymbolForMergeCrash.ts
|
||||
nodeResolution4.ts
|
||||
nodeResolution6.ts
|
||||
nodeResolution8.ts
|
||||
nonMergedOverloads.ts
|
||||
numberVsBigIntOperations.ts
|
||||
objectBindingPattern_restElementWithPropertyName.ts
|
||||
objectLiteralMemberWithModifiers1.ts
|
||||
objectLiteralMemberWithModifiers2.ts
|
||||
objectLiteralMemberWithQuestionMark1.ts
|
||||
objectLiteralMemberWithoutBlock1.ts
|
||||
objectTypeWithOptionalProperty1.ts
|
||||
outModuleConcatAmd.ts
|
||||
outModuleConcatCommonjs.ts
|
||||
outModuleConcatCommonjsDeclarationOnly.ts
|
||||
outModuleConcatES6.ts
|
||||
outModuleConcatSystem.ts
|
||||
outModuleConcatUmd.ts
|
||||
outModuleTripleSlashRefs.ts
|
||||
parameterInitializerBeforeDestructuringEmit.ts
|
||||
parameterPropertyOutsideConstructor.ts
|
||||
parseGenericArrowRatherThanLeftShift.ts
|
||||
pathMappingBasedModuleResolution3_classic.ts
|
||||
pathMappingBasedModuleResolution3_node.ts
|
||||
privacyCheckExternalModuleExportAssignmentOfGenericClass.ts
|
||||
privacyImportParseErrors.ts
|
||||
privacyTopLevelAmbientExternalModuleImportWithExport.ts
|
||||
privacyTopLevelAmbientExternalModuleImportWithoutExport.ts
|
||||
reExportGlobalDeclaration1.ts
|
||||
reExportUndefined1.ts
|
||||
reExportUndefined2.ts
|
||||
readonlyInNonPropertyParameters.ts
|
||||
recursiveExportAssignmentAndFindAliasedType1.ts
|
||||
recursiveExportAssignmentAndFindAliasedType2.ts
|
||||
recursiveExportAssignmentAndFindAliasedType3.ts
|
||||
recursiveExportAssignmentAndFindAliasedType4.ts
|
||||
recursiveExportAssignmentAndFindAliasedType5.ts
|
||||
recursiveExportAssignmentAndFindAliasedType6.ts
|
||||
recursiveExportAssignmentAndFindAliasedType7.ts
|
||||
redeclareParameterInCatchBlock.ts
|
||||
reexportedMissingAlias.ts
|
||||
relativeNamesInClassicResolution.ts
|
||||
requireAsFunctionInExternalModule.ts
|
||||
restParamAsOptional.ts
|
||||
restParamModifier2.ts
|
||||
restParameterNotLast.ts
|
||||
restParameterWithBindingPattern3.ts
|
||||
shadowedReservedCompilerDeclarationsWithNoEmit.ts
|
||||
shadowingViaLocalValue.ts
|
||||
shadowingViaLocalValueOrBindingElement.ts
|
||||
shorthandPropertyAssignmentInES6Module.ts
|
||||
shorthandPropertyAssignmentsInDestructuring.ts
|
||||
shorthandPropertyAssignmentsInDestructuring_ES6.ts
|
||||
sourceMap-LineBreaks.ts
|
||||
sourceMapValidationDecorators.ts
|
||||
sourceMapValidationStatements.ts
|
||||
spaceBeforeQuestionMarkInPropertyAssignment.ts
|
||||
standaloneBreak.ts
|
||||
staticIndexer.ts
|
||||
staticModifierAlreadySeen.ts
|
||||
staticMustPrecedePublic.ts
|
||||
staticPrototypeProperty.ts
|
||||
strictModeReservedWord.ts
|
||||
strictModeReservedWordInClassDeclaration.ts
|
||||
superCallFromClassThatHasNoBaseType1.ts
|
||||
superCallFromFunction1.ts
|
||||
superCallOutsideConstructor.ts
|
||||
superCallsInConstructor.ts
|
||||
superInObjectLiterals_ES5.ts
|
||||
superInObjectLiterals_ES6.ts
|
||||
super_inside-object-literal-getters-and-setters.ts
|
||||
switchStatementsWithMultipleDefaults1.ts
|
||||
symbolLinkDeclarationEmitModuleNames.ts
|
||||
symbolMergeValueAndImportedType.ts
|
||||
systemExportAssignment.ts
|
||||
systemExportAssignment2.ts
|
||||
systemModule11.ts
|
||||
systemModule15.ts
|
||||
systemModule17.ts
|
||||
systemModuleWithSuperClass.ts
|
||||
systemObjectShorthandRename.ts
|
||||
targetEs6DecoratorMetadataImportNotElided.ts
|
||||
targetTypeCastTest.ts
|
||||
throwWithoutNewLine2.ts
|
||||
tsxDeepAttributeAssignabilityError.tsx
|
||||
typeReferenceDirectives10.ts
|
||||
typeReferenceDirectives11.ts
|
||||
typeReferenceDirectives12.ts
|
||||
typeReferenceDirectives13.ts
|
||||
typeReferenceDirectives5.ts
|
||||
typeReferenceDirectives7.ts
|
||||
typeReferenceDirectives8.ts
|
||||
typeReferenceDirectives9.ts
|
||||
unaryOperatorsInStrictMode.ts
|
||||
unusedImports1.ts
|
||||
unusedImports11.ts
|
||||
unusedImports12.ts
|
||||
unusedImports2.ts
|
||||
unusedImports3.ts
|
||||
unusedImports4.ts
|
||||
unusedImports5.ts
|
||||
unusedInvalidTypeArguments.ts
|
||||
varAndFunctionShareName.ts
|
||||
varArgConstructorMemberParameter.ts
|
||||
variableDeclarationInStrictMode1.ts
|
||||
withStatement.ts
|
||||
withStatementErrors.ts
|
||||
withStatementInternalComments.ts
|
||||
withStatementNestedScope.ts
|
||||
yieldStringLiteral.ts
|
||||
237
scripts/parser-tests/utils/parser-test-runner.js
Normal file
237
scripts/parser-tests/utils/parser-test-runner.js
Normal file
@@ -0,0 +1,237 @@
|
||||
"use strict";
|
||||
|
||||
const fs = require("fs").promises;
|
||||
const chalk = require("chalk");
|
||||
const { parse: parser } = require("../../../packages/babel-parser");
|
||||
|
||||
const dot = chalk.gray(".");
|
||||
|
||||
class TestRunner {
|
||||
constructor({
|
||||
testDir,
|
||||
whitelist,
|
||||
logInterval = 1,
|
||||
shouldUpdate,
|
||||
getTests,
|
||||
parse = this.parse,
|
||||
}) {
|
||||
this.testDir = testDir;
|
||||
this.whitelist = whitelist;
|
||||
this.logInterval = logInterval;
|
||||
this.shouldUpdate = shouldUpdate;
|
||||
this.getTests = getTests;
|
||||
this.parse = parse;
|
||||
}
|
||||
|
||||
async run() {
|
||||
const whitelistP = this.getWhitelist();
|
||||
|
||||
console.log(`Now running tests...`);
|
||||
|
||||
const results = [];
|
||||
for await (const result of this.runTests()) {
|
||||
results.push(result);
|
||||
if (results.length % this.logInterval === 0) process.stdout.write(dot);
|
||||
}
|
||||
process.stdout.write("\n");
|
||||
|
||||
const summary = this.interpret(results, await whitelistP);
|
||||
|
||||
await this.output(summary);
|
||||
}
|
||||
|
||||
async *runTests() {
|
||||
for await (const test of this.getTests()) {
|
||||
yield this.runTest(test);
|
||||
}
|
||||
}
|
||||
|
||||
runTest(test) {
|
||||
try {
|
||||
this.parse(test, parser);
|
||||
test.actualError = false;
|
||||
} catch (err) {
|
||||
test.actualError = true;
|
||||
}
|
||||
|
||||
test.result = test.expectedError !== test.actualError ? "fail" : "pass";
|
||||
|
||||
return test;
|
||||
}
|
||||
|
||||
parse(test, parser) {
|
||||
parser(test.contents, {
|
||||
sourceType: test.sourceType,
|
||||
plugins: test.plugins,
|
||||
});
|
||||
}
|
||||
|
||||
async getWhitelist() {
|
||||
const contents = await fs.readFile(this.whitelist, "utf-8");
|
||||
const table = new Set();
|
||||
|
||||
for (const line of contents.split("\n")) {
|
||||
const filename = line.replace(/#.*$/, "").trim();
|
||||
if (filename) table.add(filename);
|
||||
}
|
||||
|
||||
return table;
|
||||
}
|
||||
|
||||
async updateWhitelist(summary) {
|
||||
const contents = await fs.readFile(this.whitelist, "utf-8");
|
||||
|
||||
const toRemove = summary.disallowed.success
|
||||
.concat(summary.disallowed.failure)
|
||||
.map(test => test.id)
|
||||
.concat(summary.unrecognized);
|
||||
|
||||
const updated = summary.disallowed.falsePositive
|
||||
.concat(summary.disallowed.falseNegative)
|
||||
.map(test => test.id);
|
||||
|
||||
for (const line of contents.split("\n")) {
|
||||
const testId = line.replace(/#.*$/, "").trim();
|
||||
if (!toRemove.includes(testId) && line) {
|
||||
updated.push(line);
|
||||
}
|
||||
}
|
||||
|
||||
updated.sort();
|
||||
|
||||
await fs.writeFile(this.whitelist, updated.join("\n") + "\n", "utf8");
|
||||
}
|
||||
|
||||
interpret(results, whitelist) {
|
||||
const summary = {
|
||||
passed: true,
|
||||
allowed: {
|
||||
success: [],
|
||||
failure: [],
|
||||
falsePositive: [],
|
||||
falseNegative: [],
|
||||
},
|
||||
disallowed: {
|
||||
success: [],
|
||||
failure: [],
|
||||
falsePositive: [],
|
||||
falseNegative: [],
|
||||
},
|
||||
unrecognized: null,
|
||||
count: results.length,
|
||||
};
|
||||
|
||||
results.forEach(function(result) {
|
||||
let classification, isAllowed;
|
||||
const inWhitelist = whitelist.has(result.id);
|
||||
whitelist.delete(result.id);
|
||||
|
||||
if (!result.expectedError) {
|
||||
if (!result.actualError) {
|
||||
classification = "success";
|
||||
isAllowed = !inWhitelist;
|
||||
} else {
|
||||
classification = "falseNegative";
|
||||
isAllowed = inWhitelist;
|
||||
}
|
||||
} else {
|
||||
if (!result.actualError) {
|
||||
classification = "falsePositive";
|
||||
isAllowed = inWhitelist;
|
||||
} else {
|
||||
classification = "failure";
|
||||
isAllowed = !inWhitelist;
|
||||
}
|
||||
}
|
||||
|
||||
summary.passed &= isAllowed;
|
||||
summary[isAllowed ? "allowed" : "disallowed"][classification].push(
|
||||
result
|
||||
);
|
||||
});
|
||||
|
||||
summary.unrecognized = Array.from(whitelist);
|
||||
summary.passed = !!summary.passed && summary.unrecognized.length === 0;
|
||||
|
||||
return summary;
|
||||
}
|
||||
|
||||
async output(summary) {
|
||||
const 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)",
|
||||
];
|
||||
const badnews = [];
|
||||
const 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({ tests, label }) {
|
||||
if (!tests.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
const desc = tests.length + " " + label;
|
||||
|
||||
badnews.push(desc);
|
||||
badnewsDetails.push(desc + ":");
|
||||
badnewsDetails.push(...tests.map(test => ` ${test.id || test}`));
|
||||
});
|
||||
|
||||
console.log(`Testing complete (${summary.count} tests).`);
|
||||
console.log("Summary:");
|
||||
console.log(chalk.green(goodnews.join("\n").replace(/^/gm, " ✔ ")));
|
||||
|
||||
if (!summary.passed) {
|
||||
console.log("");
|
||||
console.log(chalk.red(badnews.join("\n").replace(/^/gm, " ✘ ")));
|
||||
console.log("");
|
||||
console.log("Details:");
|
||||
console.log(badnewsDetails.join("\n").replace(/^/gm, " "));
|
||||
}
|
||||
|
||||
if (this.shouldUpdate) {
|
||||
await this.updateWhitelist(summary);
|
||||
console.log("");
|
||||
console.log("Whitelist file updated.");
|
||||
} else {
|
||||
process.exitCode = summary.passed ? 0 : 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = exports = TestRunner;
|
||||
Reference in New Issue
Block a user