118 lines
2.8 KiB
JavaScript
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));
|
|
});
|
|
});
|