prettier/tests_config/run_spec.js

93 lines
2.3 KiB
JavaScript

"use strict";
const fs = require('fs');
const prettier = require("../");
const types = require("ast-types");
const parser = require('../src/parser');
const RUN_AST_TESTS = process.env["AST_COMPARE"];
// Ignoring empty statements that are added into the output removes a
// lot of noise from test failures and let's us focus on the real
// failures when comparing asts
function removeEmptyStatements(ast) {
return types.visit(ast, {
visitEmptyStatement: function(path) {
path.prune();
return false;
}
});
}
function run_spec(dirname, options) {
fs.readdirSync(dirname).forEach(filename => {
if (filename.endsWith('.js') && filename !== 'jsfmt.spec.js') {
const path = dirname + '/' + filename;
if (!RUN_AST_TESTS) {
const source = read(path).replace(/\r\n/g, '\n');
const output = prettyprint(source, path, options || {});
test(filename, () => {
expect(source + '~'.repeat(80) + '\n' + output).toMatchSnapshot();
});
}
if (RUN_AST_TESTS) {
const source = read(dirname + '/' + filename);
const ast = removeEmptyStatements(parse(source));
let prettyprinted = false;
let ppast;
let pperr = null;
try {
ppast = removeEmptyStatements(parse(prettyprint(source, path)));
}
catch(e) {
pperr = e.stack;
}
test(path + ' parse', () => {
expect(pperr).toBe(null);
expect(ppast).toBeDefined();
if(ast.errors.length === 0) {
expect(ast).toEqual(ppast);
}
});
}
}
});
}
global.run_spec = run_spec;
function stripLocation(ast) {
if (Array.isArray(ast)) {
return ast.map(e => stripLocation(e));
}
if (typeof ast === 'object') {
const newObj = {};
for (var key in ast) {
if (key === 'loc' || key === 'range' || key === 'raw' || key === 'comments') {
continue;
}
newObj[key] = stripLocation(ast[key]);
}
return newObj;
}
return ast;
}
function parse(string) {
return stripLocation(parser.parseWithFlow(string));
}
function prettyprint(src, filename, options) {
return prettier.format(src, Object.assign({
filename,
parser: 'flow',
printWidth: 80,
}, options));
}
function read(filename) {
return fs.readFileSync(filename, 'utf8');
}