import fs from "node:fs"; import path from "node:path"; import { expect, test } from "@playwright/test"; const root = path.resolve(import.meta.dirname, "../../.."); const fixtureRoot = path.join(root, "tests/files/web/m12_ply_negative_v1"); const cases = [ { id: "big-endian", file: "big-endian.ply", expected: "PLY_FORMAT_UNSUPPORTED", format: "binary_little_endian" }, { id: "malformed-list", file: "malformed-list-ascii.ply", expected: "PLY_DATA_TRUNCATED", format: "ascii" }, { id: "oversized-count", file: "oversized-count-ascii.ply", expected: "PLY_IMPORT_BUDGET_EXCEEDED: vertex", format: "ascii" }, ]; test("M12-07I production Worker blocks PLY negative cases deterministically", async ({ page }) => { await page.goto("/"); const result = await page.evaluate(async (input) => Promise.all(input.map((candidate) => new Promise((resolve, reject) => { const worker = new Worker("/src/workers/ply-roundtrip-test.worker.ts", { type: "module" }); worker.onmessage = (event: MessageEvent) => { worker.terminate(); resolve({ id: candidate.id, ...event.data }); }; worker.onerror = (event) => { worker.terminate(); reject(new Error(event.message)); }; const bytes = Uint8Array.from(candidate.bytes).buffer; worker.postMessage({ bytes, format: candidate.format }, [bytes]); }))), cases.map((candidate) => ({ id: candidate.id, format: candidate.format, bytes: Array.from(fs.readFileSync(path.join(fixtureRoot, candidate.file))) }))); expect(result.map((item) => ({ id: item.id, ok: item.ok, error: item.error }))).toEqual(cases.map((candidate) => ({ id: candidate.id, ok: false, error: candidate.expected }))); });