recast/test/syntax.ts
2024-05-31 14:34:27 +00:00

54 lines
1.7 KiB
TypeScript

import assert from "assert";
import fs from "fs";
import path from "path";
import * as types from "ast-types";
import { parse } from "../lib/parser";
const hasOwn = Object.prototype.hasOwnProperty;
// Babel 7 no longer supports Node 4 or 5.
const nodeMajorVersion = parseInt(process.versions.node, 10);
(nodeMajorVersion >= 6 ? describe : xdescribe)("Syntax", function () {
// Make sure the pretty-printer can print all node types currently provided by
// types.namedTypes.
describe("Pretty-printer switch (node.type) cases implemented", function () {
const printer = path.join(__dirname, "../lib/printer.ts");
const data = fs.readFileSync(printer, "utf-8");
const ast = parse(data, { parser: require("../parsers/typescript") });
const typeNames: { [name: string]: string } = {};
types.visit(ast, {
visitFunctionDeclaration(path) {
const decl = path.node;
if (
types.namedTypes.Identifier.check(decl.id) &&
decl.id.name === "genericPrintNoParens"
) {
this.traverse(path, {
visitSwitchCase(path) {
const test = path.node.test;
if (
test &&
test.type === "StringLiteral" &&
typeof test.value === "string"
) {
const name = test.value;
typeNames[name] = name;
}
return false;
},
});
} else {
this.traverse(path);
}
},
});
Object.keys(types.namedTypes).forEach((name) => {
it(name, () => {
assert.ok(hasOwn.call(typeNames, name), "unhandled type: " + name);
assert.strictEqual(name, typeNames[name]);
delete typeNames[name];
});
});
});
});