Run parser tests from the official TypeScript parser (#10444)

This commit is contained in:
Nicolò Ribaudo
2019-09-16 01:28:17 +02:00
parent 7195f0d8cf
commit e74efd2c0a
10 changed files with 583 additions and 5 deletions

View 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;
});

View 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

View 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;
});

View 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)

View 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;
});

View 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

View 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;