2017-04-20 08:20:31 -05:00

118 lines
2.8 KiB
JavaScript

const chai = require("chai");
const child = require("child_process");
const fs = require("fs-extra");
const helper = require("babel-helper-fixtures");
const path = require("path");
const fixtureLoc = path.join(__dirname, "debug-fixtures");
const tmpLoc = path.join(__dirname, "tmp");
const clear = () => {
process.chdir(__dirname);
if (fs.existsSync(tmpLoc)) fs.removeSync(tmpLoc);
fs.mkdirSync(tmpLoc);
process.chdir(tmpLoc);
};
const saveInFiles = files => {
Object.keys(files).forEach(filename => {
const content = files[filename];
fs.outputFileSync(filename, content);
});
};
const assertTest = (stdout, stderr, opts) => {
stderr = stderr.trim();
if (stderr) {
throw new Error("stderr:\n" + stderr);
}
stdout = stdout.trim();
stdout = stdout.replace(/\\/g, "/");
if (opts.stdout) {
const expectStdout = opts.stdout.trim();
chai.expect(stdout).to.equal(expectStdout, "stdout didn't match");
} else {
const file = path.join(opts.testLoc, "stdout.txt");
console.log(`New test file created: ${file}`);
fs.outputFileSync(file, stdout);
}
};
const buildTest = opts => {
const binLoc = path.join(process.cwd(), "node_modules/.bin/babel");
return callback => {
clear();
saveInFiles(opts.inFiles);
let args = [binLoc];
args = args.concat(opts.args);
const spawn = child.spawn(process.execPath, args);
let stdout = "";
let stderr = "";
spawn.stdout.on("data", chunk => stdout += chunk);
spawn.stderr.on("data", chunk => stderr += chunk);
spawn.on("close", () => {
let err;
try {
assertTest(stdout, stderr, opts);
} catch (e) {
err = e;
}
callback(err);
});
};
};
describe("debug output", () => {
fs.readdirSync(fixtureLoc).forEach(testName => {
if (testName.slice(0, 1) === ".") return;
const testLoc = path.join(fixtureLoc, testName);
const opts = {
args: ["src", "--out-dir", "lib"],
testLoc: testLoc,
};
const stdoutLoc = path.join(testLoc, "stdout.txt");
if (fs.existsSync(stdoutLoc)) {
opts.stdout = helper.readFile(stdoutLoc);
}
const optionsLoc = path.join(testLoc, "options.json");
if (!fs.existsSync(optionsLoc)) {
throw new Error(
`Debug test '${testName}' is missing an options.json file`,
);
}
const inFilesFolderLoc = path.join(testLoc, "in");
opts.inFiles = {
".babelrc": helper.readFile(optionsLoc),
};
if (!fs.existsSync(inFilesFolderLoc)) {
opts.inFiles["src/in.js"] = "";
} else {
fs.readdirSync(inFilesFolderLoc).forEach(filename => {
opts.inFiles[`src/${filename}`] = helper.readFile(
path.join(inFilesFolderLoc, filename),
);
});
}
it(testName, buildTest(opts));
});
});