56 lines
1.6 KiB
JavaScript
56 lines
1.6 KiB
JavaScript
"use strict";
|
|
|
|
try {
|
|
const tape = require("tape-catch");
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
const util = require("util");
|
|
const evaluate = require("../src/evaluate");
|
|
|
|
const NIX_SOURCE_REPO = process.env.NIX_SOURCE_REPO;
|
|
|
|
if (NIX_SOURCE_REPO == null) {
|
|
throw new Error(`To run the upstream Nix language tests, you must specify a NIX_SOURCE_REPO environment variable, that points at the root of a local checkout of the Git repository for Nix`);
|
|
}
|
|
|
|
const testsPath = path.join(NIX_SOURCE_REPO, "tests/lang");
|
|
|
|
let tests = fs.readdirSync(testsPath)
|
|
.filter((entry) => entry.endsWith(".exp"))
|
|
.map((entry) => entry.replace(/\.exp$/, ""));
|
|
|
|
function formatResultNode(node) {
|
|
if (typeof node === "string") {
|
|
return `"${node.replace(/"/g, '\\"')}"`;
|
|
} else if (Array.isArray(node)) {
|
|
return `[ ${node.map(formatResultNode).join(" ")} ]`;
|
|
} else {
|
|
return node.toString();
|
|
}
|
|
}
|
|
|
|
for (let test of tests) {
|
|
try {
|
|
let expression = fs.readFileSync(path.join(testsPath, `${test}.nix`), "utf8");
|
|
let expectedResult = fs.readFileSync(path.join(testsPath, `${test}.exp`), "utf8").replace(/\n$/, "");
|
|
|
|
tape(`Nix upstream language tests - ${test}`, (test) => {
|
|
test.plan(1);
|
|
|
|
let result = formatResultNode(evaluate(expression).value);
|
|
|
|
test.equals(expectedResult, result);
|
|
});
|
|
} catch (error) {
|
|
// FIXME: This would currently cause ENOENTs during evaluation (eg. reading a file from Nix itself) to be ignored
|
|
if (error.code === "ENOENT") {
|
|
// skip
|
|
} else {
|
|
throw error;
|
|
}
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.error(error);
|
|
}
|