UNPKG

meld-spec

Version:

Specification for the Meld scripting language

174 lines (173 loc) 7.22 kB
"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 }; }