Add runFixtureTestsWithoutExactASTMatch in parser test runner (#13227)

This commit is contained in:
Huáng Jùnliàng 2021-04-29 12:42:26 -04:00 committed by GitHub
parent a2ac2f39b5
commit 0f2a1a8153
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 33 additions and 11 deletions

View File

@ -1,9 +1,13 @@
import path from "path";
import { runThrowTestsWithEstree } from "./helpers/runFixtureTests";
import { runFixtureTestsWithoutExactASTMatch } from "./helpers/runFixtureTests";
import { parse } from "../lib";
import { fileURLToPath } from "url";
runThrowTestsWithEstree(
runFixtureTestsWithoutExactASTMatch(
path.join(path.dirname(fileURLToPath(import.meta.url)), "fixtures"),
parse,
(input, options = {}) => {
options.plugins = options.plugins || [];
options.plugins.push("estree");
return parse(input, options);
},
);

View File

@ -81,15 +81,26 @@ export function runFixtureTests(fixturesPath, parseFunction) {
});
}
export function runThrowTestsWithEstree(fixturesPath, parseFunction) {
/**
* Run Fixture test without an exact AST match. If the output.json does not contain
* "errors", it asserts the actual output does not have "errors". If the output.json
* have "errors", it asserts the actual output have the same "errors".
*
* This routine is used to test parser options that have impact on the AST shape but
* does not change the syntax
* @param {*} fixturesPath The path to the fixture root
* @param {*} parseFunction The customized parseFunction, different global test options
* should be implemented here
*/
export function runFixtureTestsWithoutExactASTMatch(
fixturesPath,
parseFunction,
) {
const fixtures = getFixtures(fixturesPath);
Object.keys(fixtures).forEach(function (name) {
fixtures[name].forEach(function (testSuite) {
testSuite.tests.forEach(function (task) {
task.options.plugins = task.options.plugins || [];
task.options.plugins.push("estree");
const testFn = task.disabled ? it.skip : it;
testFn(name + "/" + testSuite.title + "/" + task.title, function () {
@ -135,7 +146,7 @@ function save(test, ast) {
generated from `getFixtures`
* @param {*} parseFunction A parser with the same interface of `@babel/parser#parse`
* @param {boolean} [compareErrorsOnly=false] Whether we should only compare the "errors"
* of generated ast against the expected AST. Used for `runThrowTestsWithEstree` where an
* of generated ast against the expected AST. Used for `runFixtureTestsWithoutExactASTMatch` where an
* ESTree AST is generated but we want to make sure `@babel/parser` still throws expected
* recoverable errors on given code locations.
* @returns {void}
@ -180,13 +191,20 @@ function runTest(test, parseFunction, compareErrorsOnly = false) {
if (ast.comments && !ast.comments.length) delete ast.comments;
if (ast.errors && !ast.errors.length) delete ast.errors;
if (!test.expect.code && !opts.throws && !process.env.CI) {
if (
!test.expect.code &&
!opts.throws &&
!process.env.CI &&
!compareErrorsOnly
) {
test.expect.loc += "on";
return save(test, ast);
}
const shouldOverWrite = process.env.OVERWRITE && !compareErrorsOnly;
if (opts.throws) {
if (process.env.OVERWRITE) {
if (shouldOverWrite) {
const fn = path.dirname(test.expect.loc) + "/options.json";
test.options = test.options || {};
delete test.options.throws;
@ -212,7 +230,7 @@ function runTest(test, parseFunction, compareErrorsOnly = false) {
const mis = misMatch(JSON.parse(test.expect.code), ast);
if (mis) {
if (process.env.OVERWRITE) {
if (shouldOverWrite) {
return save(test, ast);
}
throw new Error(mis);