mirror of
https://github.com/RTimothyEdwards/magic.git
synced 2026-08-29 01:24:51 +02:00
The example/suite runners discarded e.stack via console.error(e.message ?? e), hiding the wasm-function offsets that emsymbolizer needs to map an abort back to C source. A failing test only printed a terse message like "memory access out of bounds" with no trace. - Add reportError() to helpers.js/helpers-tcl.js; print the full stack (falling back to the message). - Wrap command execution in runScript() to name the command that aborted before the error propagates. - Use reportError() in all standalone runners and in all.js/all-tcl.js (full stack to stderr, one-line PASS/FAIL summary kept; tests still run independently). - build.sh: run the --test step in a subshell so its cd does not leak into the --pack step.
55 lines
1.6 KiB
JavaScript
55 lines
1.6 KiB
JavaScript
// all.js — Run all Magic WASM example tests and print a summary.
|
|
//
|
|
// Usage: node examples/all.js
|
|
import { run as runExtract } from './extract.js';
|
|
import { run as runGds } from './gds.js';
|
|
import { run as runDrc } from './drc.js';
|
|
import { run as runCif } from './cif.js';
|
|
import { reportError } from './helpers.js';
|
|
|
|
const PAD = 9;
|
|
|
|
async function test(name, fn) {
|
|
process.stdout.write(` ${name.padEnd(PAD)} `);
|
|
try {
|
|
const result = await fn();
|
|
console.log(`PASS ${formatResult(name, result)}`);
|
|
return true;
|
|
} catch (e) {
|
|
console.log(`FAIL ${e.message ?? e}`);
|
|
// Full stack to stderr so CI shows the wasm-function offsets, while the
|
|
// one-line summary above stays readable. Other tests still run.
|
|
reportError(e);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function formatResult(name, r) {
|
|
if (!r) return '';
|
|
switch (name) {
|
|
case 'extract': return [r.ext, r.spice].filter(Boolean).map(p => p.split(/[\\/]/).pop()).join(', ');
|
|
case 'gds': return `${r.outPath.split(/[\\/]/).pop()} (${r.bytes} B)`;
|
|
case 'cif': return `${r.outPath.split(/[\\/]/).pop()} (${r.bytes} B)`;
|
|
case 'drc': return r.violations != null ? `${r.violations} violation${r.violations !== 1 ? 's' : ''}` : '';
|
|
default: return '';
|
|
}
|
|
}
|
|
|
|
console.log('\nMagic WASM — test suite\n');
|
|
|
|
const suite = [
|
|
['extract', runExtract],
|
|
['gds', runGds],
|
|
['drc', runDrc],
|
|
['cif', runCif],
|
|
];
|
|
|
|
const passed = [];
|
|
for (const [name, fn] of suite) {
|
|
passed.push(await test(name, fn));
|
|
}
|
|
|
|
const ok = passed.filter(Boolean).length;
|
|
console.log(`\n${ok}/${suite.length} passed`);
|
|
process.exit(ok === suite.length ? 0 : 1);
|