// Recompute every vector file of ops-conformance under this engine's WebAssembly, and // require each to equal the committed file byte for byte. // // node verify.mjs import { readFileSync, readdirSync } from 'node:fs'; import { join } from 'node:path'; const [wasmPath, root] = process.argv.slice(2); if (!wasmPath || !root) { console.error('usage: node verify.mjs '); process.exit(2); } const { instance } = await WebAssembly.instantiate(readFileSync(wasmPath), {}); const x = instance.exports; function recompute(kind, bytes) { const p = x.wai_ops_alloc(bytes.length); new Uint8Array(x.memory.buffer, p, bytes.length).set(bytes); const status = x.wai_ops_recompute(kind, p, bytes.length); x.wai_ops_free(p, bytes.length); const out = new Uint8Array(x.memory.buffer, x.wai_ops_out_ptr(), x.wai_ops_out_len()).slice(); return { status, out }; } let files = 0, vectors = 0, bad = 0; for (const [dir, kind] of [['vectors', 0], ['stage', 1], ['graphs', 0]]) { for (const f of readdirSync(join(root, dir)).filter((n) => n.endsWith('.jsonl')).sort()) { const bytes = readFileSync(join(root, dir, f)); files += 1; vectors += bytes.reduce((n, b) => n + (b === 10 ? 1 : 0), 0); const { status, out } = recompute(kind, bytes); if (status !== 0) { bad += 1; console.error(`FAIL ${dir}/${f}: ${new TextDecoder().decode(out)}`); } else if (Buffer.compare(Buffer.from(out), bytes) !== 0) { bad += 1; console.error(`DIFF ${dir}/${f}: the recomputed file differs`); } } } console.log(`recomputed ${files} vector files, ${vectors} vectors, under ${process.version}`); if (bad > 0) { console.error(`${bad} files failed`); process.exit(1); } console.log('ops-conformance: every vector file verifies');