import assert from "node:assert/strict";
import fs from "node:fs";
import os from "node:os";
import path from "node:path";
import { execFileSync } from "node:child_process";
import { fileURLToPath, pathToFileURL } from "node:url";
import { loadWasmProbe } from "./wasm-probe-runtime.mjs";
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
const out = fs.mkdtempSync(path.join(os.tmpdir(), "freecad-draft-business-"));
const ids = JSON.parse(process.env.FREECAD_BUSINESS_IDS ?? '["Draft:draft.formatBatch"]');
const svgIds = new Set(["business-format:Draft:import:.svg", "business-format:Draft:export:.svg"]);
const dxfId = "business-format:Draft:import:.dxf";
const started = performance.now();
const timings = { operations: [] };
let exitCode = 0;
try {
let stageStarted = performance.now();
execFileSync(path.join(root, "web/node_modules/.bin/tsc"), [
"--target", "ES2022", "--module", "ESNext", "--moduleResolution", "Bundler", "--strict", "--skipLibCheck",
"--outDir", out, path.join(root, "web/src/facade-envelope.ts"), path.join(root, "web/src/draft-python-family-facade.ts"),
], { cwd: root, stdio: "pipe" });
timings.transpileSeconds = (performance.now() - stageStarted) / 1000;
const facade = await import(pathToFileURL(path.join(out, "draft-python-family-facade.js")));
const { FacadeSerialQueue } = await import(pathToFileURL(path.join(out, "facade-envelope.js")));
stageStarted = performance.now();
const { kernel } = await loadWasmProbe(process.env.FREECAD_DRAFT_BUSINESS_BUILD ?? path.join(root, "web/public/kernel"), "FreeCADWebDraftRuntimeProbe");
timings.nativeLoadSeconds = (performance.now() - stageStarted) / 1000;
const queue = new FacadeSerialQueue(); let n = 0;
const call = async records => {
const began = performance.now();
const result = await facade.dispatchDraftFormat(queue, facade.createDraftFormatRequest(`draft-${++n}`, records), kernel);
timings.operations.push({ format: records[0].format, direction: records[0].direction, seconds: (performance.now() - began) / 1000, result: result.kind });
return result;
};
const cases = [];
for (const request of [null, undefined, {}, { requestId: 17 }]) {
const rejected = await facade.dispatchDraftFormat(queue, request, kernel);
assert.equal(rejected.kind, "error", JSON.stringify(rejected));
assert.equal(rejected.requestId, "invalid");
cases.push({ input: { malformedRequest: request ?? null }, actual: rejected,
assertions: [{ name: "malformed format envelope returns a structured error", passed: true }] });
}
const lengths = [];
for (const [documentId, width, height] of [["DraftCaseA", 5, 3], ["DraftCaseB", 8, 4]]) {
const payload = ``;
const imported = await call([{ format: "svg", direction: "import", documentId, payload }]);
assert.equal(imported.kind, "result", JSON.stringify(imported));
const first = imported.result.records[0];
assert.equal(first.documentId, documentId);
assert.equal(first.objectCount > 0, true);
assert.equal(first.objects.every(object => object.isNull === false && object.length > 0), true);
lengths.push(first.objects.reduce((sum, object) => sum + object.length, 0));
const appended = await call([{ format: "svg", direction: "import", documentId, payload }]);
assert.equal(appended.kind, "result", JSON.stringify(appended));
const second = appended.result.records[0];
assert.equal(second.documentId, documentId);
assert.equal(second.objectCount, first.objectCount);
assert.equal(second.objects.every(object => !first.objects.some(prior => prior.objectHandle === object.objectHandle)), true);
const exported = await call([{ format: "svg", direction: "export", documentId }]);
assert.equal(exported.kind, "result", JSON.stringify(exported));
assert.match(exported.result.records[0].payload, /