Files
FreeCADWasmDev/tools/run_p6_partdesign_geometry_family_facade.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

37 lines
4.1 KiB
JavaScript

#!/usr/bin/env node
import assert from "node:assert/strict";
import crypto from "node:crypto";
import fs from "node:fs";
import os from "node:os";
import path from "node:path";
import { createRequire } from "node:module";
import { execFileSync } from "node:child_process";
import { pathToFileURL } from "node:url";
const root = path.resolve(path.dirname(new URL(import.meta.url).pathname), "..");
const build = path.resolve(process.argv[2] || path.join(root, "freecad-source/build-web/configure/bin"));
const out = fs.mkdtempSync(path.join(os.tmpdir(), "freecad-partdesign-geometry-family-facade-"));
execFileSync(path.join(root, "web/node_modules/.bin/tsc"), ["--target", "ES2022", "--module", "ESNext", "--moduleResolution", "Bundler", "--strict", "--skipLibCheck", "--outDir", out, "--declaration", "false", "--noEmit", "false", "web/src/facade-envelope.ts", "web/src/partdesign-geometry-family-facade.ts"], { cwd: root, stdio: "inherit" });
const facade = await import(pathToFileURL(path.join(out, "partdesign-geometry-family-facade.js")));
globalThis.__dirname = `${build}${path.sep}`;
globalThis.require = createRequire(import.meta.url);
const loader = await import(pathToFileURL(path.join(build, "FreeCADWebPartDesignRuntimeProbe.js")));
const kernel = await loader.default({ wasmBinary: fs.readFileSync(path.join(build, "FreeCADWebPartDesignRuntimeProbe.wasm")) });
const inventory = JSON.parse(fs.readFileSync(path.join(root, "docs/p6/partdesign-geometry-family-kernel.json"), "utf8"));
const payload = { schema: facade.PARTDESIGN_GEOMETRY_FAMILY_SCHEMA, module: "PartDesign", records: inventory.records.map((record) => ({ name: record.name })) };
const success = await facade.handlePartDesignGeometryFamily(payload, new AbortController().signal, kernel);
assert.equal(success.count, payload.records.length);
assert.equal(success.records.length, payload.records.length);
assert.equal(success.resourcesReleased, true);
assert.equal(success.records.filter((record) => record.status === "passed").length, payload.records.length);
assert.equal(success.records.filter((record) => record.status === "blocked").length, 0);
await assert.rejects(() => facade.handlePartDesignGeometryFamily({ ...payload, records: [] }, new AbortController().signal, kernel), (error) => error.code === "invalid_fixture");
const cancelled = new AbortController();
cancelled.abort();
await assert.rejects(() => facade.handlePartDesignGeometryFamily(payload, cancelled.signal, kernel), (error) => error.code === "cancelled");
const trace = { success: { count: success.count, passed: success.records.filter((record) => record.status === "passed").length, blocked: success.records.filter((record) => record.status === "blocked").length, resourcesReleased: success.resourcesReleased }, invalidFixture: "invalid_fixture", cancelled: "cancelled" };
const report = { schema: "freecad-web-p6-partdesign-geometry-family-facade/v1", taskId: "FW-P6-FPA-Y", result: "pass", route: { command: facade.PARTDESIGN_GEOMETRY_FAMILY_COMMAND, facade: "web/src/partdesign-geometry-family-facade.ts", worker: "web/src/partdesign.worker.ts", native: "freecad-source/src/WebAssembly/FreeCADCoreProbe/PartDesignRuntimeProbe.cpp:fc_web_dispatch_json" }, trace, traceSha256: crypto.createHash("sha256").update(JSON.stringify(trace)).digest("hex"), boundaries: ["Facade validates envelopes and cancellation, then forwards all object creation/recompute to FreeCADWebPartDesignRuntimeProbe.", "All 25 PartDesign geometry-family records now have native create/recompute evidence; no blocked records are promoted."] };
fs.writeFileSync(path.join(root, "docs/p6/partdesign-geometry-family-facade.json"), `${JSON.stringify(report, null, 2)}\n`);
fs.writeFileSync(path.join(root, "docs/freecad-p6-partdesign-geometry-family-facade.log"), `${JSON.stringify({ result: report.result, count: success.count, passed: trace.success.passed, blocked: trace.success.blocked, invalidFixture: trace.invalidFixture, cancelled: trace.cancelled })}\n`);
console.log(JSON.stringify({ result: report.result, count: success.count, passed: trace.success.passed, blocked: trace.success.blocked, invalidFixture: trace.invalidFixture, cancelled: trace.cancelled }));