/** * Proof of format: parse a real TP5 export, rebuild it from the parsed model, * and require the result to be byte-identical. */ import { readFileSync } from 'node:fs'; import { parseTd5, buildTd5, frameToPixels, pixelsToFrame } from '../src/codec/td5.mjs'; const path = process.argv[2] ?? new URL('../samples/EXPRESS 1.td5', import.meta.url); const original = new Uint8Array(readFileSync(path)); const doc = parseTd5(original); console.log(`company : ${doc.company}`); console.log(`version : ${doc.version} exported ${doc.timestamp}`); console.log(`screen : ${doc.screen.width}x${doc.screen.height}`); console.log(`dests : ${doc.destinations.length}`); const multi = doc.destinations.filter((d) => d.frames.length > 1); console.log(`multiframe: ${multi.map((d) => `${d.name}(${d.frames.length})`).join(', ') || 'none'}`); const badCrc = doc.destinations.filter((d) => !d.crcOk); console.log(`crc check : ${doc.destinations.length - badCrc.length}/${doc.destinations.length} verify` + (badCrc.length ? ` — FAILED: ${badCrc.map((d) => d.name).join(', ')}` : '')); const rebuilt = buildTd5(doc, { timestamp: doc.timestamp }); let ok = rebuilt.length === original.length; const diffs = []; if (!ok) { console.log(`\nSIZE MISMATCH: original ${original.length}, rebuilt ${rebuilt.length}`); } else { for (let i = 0; i < original.length; i++) { if (original[i] !== rebuilt[i]) { diffs.push(i); if (diffs.length > 40) break; } } ok = diffs.length === 0; } if (ok) { console.log('\n✅ BYTE-IDENTICAL round-trip over all ' + original.length + ' bytes'); } else { console.log(`\n❌ ${diffs.length}${diffs.length > 40 ? '+' : ''} differing bytes`); for (const off of diffs.slice(0, 24)) { console.log(` 0x${off.toString(16).padStart(5, '0')}: orig ${hx(original[off])} != ${hx(rebuilt[off])}`); } } // pixel round-trip let pxOk = true; for (const d of doc.destinations) { for (const f of d.frames) { const re = pixelsToFrame(frameToPixels(f), f.width, f.height); if (Buffer.compare(Buffer.from(re.data), Buffer.from(f.data)) !== 0) { pxOk = false; console.log(` pixel round-trip failed: ${d.name}`); } } } console.log(pxOk ? '✅ pixel pack/unpack round-trips for every frame' : '❌ pixel round-trip failed'); function hx(b) { return '0x' + b.toString(16).padStart(2, '0'); } process.exit(ok && pxOk ? 0 : 1);