37 lines
4.1 KiB
JavaScript
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 }));
|