Files
FreeCADWasmDev/tools/start-browser-business-cases.mjs
wangdequan 9a7c4f0335 Save FreeCAD Web workspace sources and user validation evidence
IFC native binding remains incomplete; preserve accurate test results.
2026-09-15 22:01:58 +08:00

35 lines
2.5 KiB
JavaScript

import assert from "node:assert/strict";
import { playwright } from "./part-primitive-business-cases.mjs";
export async function runStartBrowserCases() {
const browser = await playwright().chromium.launch({ executablePath: process.env.FREECAD_CHROME ?? "/usr/bin/google-chrome", headless: true, args: ["--no-sandbox", "--disable-dev-shm-usage"] });
try {
const page = await browser.newPage();
await page.goto(process.env.FREECAD_START_BROWSER_ORIGIN ?? "http://localhost:5180/", { waitUntil: "domcontentloaded" });
const result = await page.evaluate(async () => {
const { WebModuleRouter } = await import("/src/module-router.ts");
const { getWebModuleWorkerForCommand } = await import("/src/module-registry.generated.ts");
const router = new WebModuleRouter(), responses = [];
try {
const worker = getWebModuleWorkerForCommand("Start", "start.importSvg");
const input = content => ({ schema: "freecad-web-start/import-svg/v1", module: "Start", action: "import", path: "/tmp/browser.svg", content });
for (const content of ['<svg xmlns="http://www.w3.org/2000/svg" width="100mm" height="100mm" viewBox="0 0 100 100"><circle r="3"/></svg>', "not XML", '<svg xmlns="http://www.w3.org/2000/svg" width="100mm" height="100mm" viewBox="0 0 100 100"><rect width="5" height="3"/></svg>']) {
const payload = input(content), start = performance.now();
responses.push({ input: payload, response: await router.request("Start", "start.importSvg", payload, "StartBrowser"), seconds: (performance.now() - start) / 1000 });
}
return { worker, responses };
} finally { router.dispose(); }
});
assert.equal(result.worker, "start.worker.ts");
const [first, invalid, recovered] = result.responses.map(item => item.response);
assert.equal(first.kind, "result", JSON.stringify(first));
assert.ok(Math.abs(first.result.objects[0].length - 6 * Math.PI) < 1e-6);
assert.equal(invalid.kind, "error"); assert.equal(recovered.kind, "result", JSON.stringify(recovered));
assert.equal(recovered.result.document, first.result.document);
assert.equal(recovered.result.objectCount, first.result.objectCount + 1);
assert.ok(Math.abs(recovered.result.objects[0].length - 16) < 1e-6);
return result.responses.map(item => ({ input: item.input, actual: item.response, seconds: item.seconds,
assertions: [{ name: "browser module router uses the real SVG Worker, native geometry, correlated errors and same-document recovery", passed: true }] }));
} finally { await browser.close(); }
}