forked from sashin/sashinexists
run npm install to generate a package lock
This commit is contained in:
80
node_modules/@weborigami/language/test/generator/generateTests.js
generated
vendored
Normal file
80
node_modules/@weborigami/language/test/generator/generateTests.js
generated
vendored
Normal file
@@ -0,0 +1,80 @@
|
||||
// Validate that the tests produce the expected results in JavaScript itself.
|
||||
|
||||
import { promises as fs } from "node:fs";
|
||||
import path from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
import * as YAMLModule from "yaml";
|
||||
|
||||
// The "yaml" package doesn't seem to provide a default export that the browser can
|
||||
// recognize, so we have to handle two ways to accommodate Node and the browser.
|
||||
// @ts-ignore
|
||||
const YAML = YAMLModule.default ?? YAMLModule.YAML;
|
||||
|
||||
export default async function generateTests(inputDirectory, outputDirectory) {
|
||||
const filenames = await fs.readdir(inputDirectory);
|
||||
const yamlFilenames = filenames.filter((filename) =>
|
||||
filename.endsWith(".yaml")
|
||||
);
|
||||
for (const yamlFilename of yamlFilenames) {
|
||||
const basename = path.basename(yamlFilename, ".yaml");
|
||||
|
||||
const casesPath = path.join(inputDirectory, yamlFilename);
|
||||
const text = String(await fs.readFile(casesPath));
|
||||
const cases = YAML.parse(text);
|
||||
const transformed = cases.map(transformCase);
|
||||
const result = tests(basename, transformed);
|
||||
|
||||
const outputName = basename + ".test.js";
|
||||
const outputPath = path.join(outputDirectory, outputName);
|
||||
await fs.writeFile(outputPath, result);
|
||||
}
|
||||
}
|
||||
|
||||
function javaScriptTest({ assertType, source, expectedJs, description }) {
|
||||
return ` assert.${assertType}(${source}, ${expectedJs}, "${description}");`;
|
||||
}
|
||||
|
||||
function origamiTest({ assertType, source, expectedJs, description }) {
|
||||
return ` assert.${assertType}(await oriEval("${source}"), ${expectedJs}, "${description}");`;
|
||||
}
|
||||
|
||||
function tests(suiteName, cases) {
|
||||
return `// Generated tests -- do not edit directly
|
||||
// @ts-nocheck
|
||||
|
||||
import assert from "node:assert";
|
||||
import { describe } from "node:test";
|
||||
import oriEval from "../generator/oriEval.js";
|
||||
|
||||
describe("${suiteName} - JavaScript", () => {
|
||||
${cases.map(javaScriptTest).join("\n")}
|
||||
});
|
||||
|
||||
describe("${suiteName} - Origami", async() => {
|
||||
${cases.map(origamiTest).join("\n")}
|
||||
});`;
|
||||
}
|
||||
// Transform parsed YAML values into values suitable for testing
|
||||
function transformCase({ description, expected, source }) {
|
||||
const markers = {
|
||||
__null__: null,
|
||||
__undefined__: undefined,
|
||||
__NaN__: NaN,
|
||||
};
|
||||
if (expected in markers) {
|
||||
expected = markers[expected];
|
||||
}
|
||||
const assertType = typeof expected === "object" ? "deepEqual" : "strictEqual";
|
||||
const expectedJs =
|
||||
typeof expected === "string"
|
||||
? `"${expected}"`
|
||||
: typeof expected === "object" && expected !== null
|
||||
? JSON.stringify(expected)
|
||||
: expected;
|
||||
return { assertType, description, expected, expectedJs, source };
|
||||
}
|
||||
|
||||
const dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||
const casesDirectory = path.join(dirname, "../cases");
|
||||
const generatedDirectory = path.join(dirname, "../generated");
|
||||
await generateTests(casesDirectory, generatedDirectory);
|
||||
15
node_modules/@weborigami/language/test/generator/oriEval.js
generated
vendored
Normal file
15
node_modules/@weborigami/language/test/generator/oriEval.js
generated
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
import { ObjectTree } from "@weborigami/async-tree";
|
||||
import * as compile from "../../src/compiler/compile.js";
|
||||
|
||||
export default async function oriEval(source) {
|
||||
const builtins = new ObjectTree({
|
||||
false: false,
|
||||
NaN: NaN,
|
||||
null: null,
|
||||
true: true,
|
||||
undefined: undefined,
|
||||
});
|
||||
const compiled = compile.program(source);
|
||||
const result = await compiled.call(builtins);
|
||||
return result;
|
||||
}
|
||||
Reference in New Issue
Block a user