meld-spec
Version:
Specification for the Meld scripting language
174 lines (173 loc) • 7.22 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.specTests = void 0;
exports.runSpecTests = runSpecTests;
exports.runDirectiveTests = runDirectiveTests;
const compare_1 = require("../utils/compare");
const embed_test_1 = require("./tests/directives/embed/embed.test");
const embed_invalid_test_1 = require("./tests/directives/embed/embed-invalid.test");
const run_test_1 = require("./tests/directives/run/run.test");
const run_invalid_test_1 = require("./tests/directives/run/run-invalid.test");
const import_test_1 = require("./tests/directives/import/import.test");
const import_invalid_test_1 = require("./tests/directives/import/import-invalid.test");
const define_test_1 = require("./tests/directives/define/define.test");
const define_invalid_test_1 = require("./tests/directives/define/define-invalid.test");
const text_test_1 = require("./tests/directives/text/text.test");
const text_invalid_test_1 = require("./tests/directives/text/text-invalid.test");
const data_test_1 = require("./tests/directives/data/data.test");
const data_invalid_test_1 = require("./tests/directives/data/data-invalid.test");
const path_test_1 = require("./tests/directives/path/path.test");
const path_invalid_test_1 = require("./tests/directives/path/path-invalid.test");
const api_test_1 = require("./tests/directives/api/api.test");
const api_invalid_test_1 = require("./tests/directives/api/api-invalid.test");
const call_test_1 = require("./tests/directives/call/call.test");
const call_invalid_test_1 = require("./tests/directives/call/call-invalid.test");
/**
* Collection of all specification test cases
*/
exports.specTests = {
'embed/valid': embed_test_1.embedTests,
'embed/invalid': embed_invalid_test_1.embedInvalidTests,
'run/valid': run_test_1.runTests,
'run/invalid': run_invalid_test_1.runInvalidTests,
'import/valid': import_test_1.importTests,
'import/invalid': import_invalid_test_1.importInvalidTests,
'define/valid': define_test_1.defineTests,
'define/invalid': define_invalid_test_1.defineInvalidTests,
'text/valid': text_test_1.textTests,
'text/invalid': text_invalid_test_1.textInvalidTests,
'data/valid': data_test_1.dataTests,
'data/invalid': data_invalid_test_1.dataInvalidTests,
'path/valid': path_test_1.pathTests,
'path/invalid': path_invalid_test_1.pathInvalidTests,
'api/valid': api_test_1.apiTests,
'api/invalid': api_invalid_test_1.apiInvalidTests,
'call/valid': call_test_1.callTests,
'call/invalid': call_invalid_test_1.callInvalidTests
};
/**
* Run all specification tests against a parser implementation
*/
function runSpecTests(parser) {
const errors = [];
// Run all test cases
Object.entries(exports.specTests).forEach(([category, tests]) => {
tests.forEach(test => {
try {
const nodes = parser.parse(test.input);
// We expect exactly one node for these test cases
if (!nodes || nodes.length !== 1) {
errors.push({
testName: `${category}/${test.name}`,
input: test.input,
expected: test.expected,
error: `Expected 1 node, got ${nodes?.length ?? 0}`
});
return;
}
const actual = nodes[0];
if (!(0, compare_1.compareNodes)(actual, test.expected)) {
errors.push({
testName: `${category}/${test.name}`,
input: test.input,
expected: test.expected,
received: actual
});
}
}
catch (error) {
// For invalid test cases, catching an error is expected
if (category.includes('/invalid')) {
const errorNode = {
type: 'Error',
error: error instanceof Error ? error.message : String(error)
};
if (!(0, compare_1.compareNodes)(errorNode, test.expected)) {
errors.push({
testName: `${category}/${test.name}`,
input: test.input,
expected: test.expected,
received: errorNode
});
}
}
else {
errors.push({
testName: `${category}/${test.name}`,
input: test.input,
expected: test.expected,
error: error instanceof Error ? error.message : String(error)
});
}
}
});
});
return {
valid: errors.length === 0,
errors
};
}
/**
* Run specification tests for a specific directive
*/
function runDirectiveTests(parser, directive) {
const validTests = exports.specTests[`${directive}/valid`];
const invalidTests = exports.specTests[`${directive}/invalid`];
if (!validTests && !invalidTests) {
throw new Error(`No tests found for directive: ${directive}`);
}
const errors = [];
const allTests = [...(validTests || []), ...(invalidTests || [])];
allTests.forEach(test => {
try {
const nodes = parser.parse(test.input);
if (!nodes || nodes.length !== 1) {
errors.push({
testName: test.name,
input: test.input,
expected: test.expected,
error: `Expected 1 node, got ${nodes?.length ?? 0}`
});
return;
}
const actual = nodes[0];
if (!(0, compare_1.compareNodes)(actual, test.expected)) {
errors.push({
testName: test.name,
input: test.input,
expected: test.expected,
received: actual
});
}
}
catch (error) {
// For invalid test cases, catching an error is expected
if (test.expected.type === 'Error') {
const errorNode = {
type: 'Error',
error: error instanceof Error ? error.message : String(error)
};
if (!(0, compare_1.compareNodes)(errorNode, test.expected)) {
errors.push({
testName: test.name,
input: test.input,
expected: test.expected,
received: errorNode
});
}
}
else {
errors.push({
testName: test.name,
input: test.input,
expected: test.expected,
error: error instanceof Error ? error.message : String(error)
});
}
}
});
return {
valid: errors.length === 0,
errors
};
}