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

47 lines
4.1 KiB
JavaScript

#!/usr/bin/env node
import crypto from "node:crypto";
import fs from "node:fs";
import path from "node:path";
import { createRequire } from "node:module";
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 methods = [
"Measurement.addReference3D", "Measurement.has3DReferences", "Measurement.volume", "Measurement.clear",
"Measurement.length", "Measurement.area", "Measurement.delta", "Measurement.com", "Measurement.angle",
"Measurement.lineLineDistance", "Measurement.planePlaneDistance", "Measurement.radius",
];
globalThis.__dirname = `${build}${path.sep}`;
globalThis.require = createRequire(import.meta.url);
const loader = await import(pathToFileURL(path.join(build, "FreeCADWebMeasureKernelProbe.js")));
const kernel = await loader.default({ wasmBinary: fs.readFileSync(path.join(build, "FreeCADWebMeasureKernelProbe.wasm")) });
const dispatch = (request) => JSON.parse(String(kernel.ccall("fc_web_dispatch_json", "string", ["string"], [JSON.stringify(request)])));
const request = { cmd: "measure.measurementApi", args: { methods } };
const first = dispatch(request);
const second = dispatch(request);
const malformed = dispatch({ cmd: request.cmd, args: { methods: ["Measurement.unknown"] } });
if (first.ok !== true || first.schema !== "freecad-web-measure/measurement-api/v1" || first.module !== "Measure" || first.action !== "measurement-api" || first.resourcesReleased !== true || JSON.stringify(first.methods) !== JSON.stringify(methods)) throw new Error(`native measurement dispatch failed: ${JSON.stringify(first)}`);
if (JSON.stringify(first) !== JSON.stringify(second)) throw new Error("measurement dispatch replay changed the native result");
const values = first.values || {};
if (values["Measurement.addReference3D"] !== null || values["Measurement.has3DReferences"] !== true || values["Measurement.clear"] !== null || Math.abs(Number(values["Measurement.volume"]) - 24) > 1e-9 || values["Measurement.length"] !== 4 || values["Measurement.area"] !== 12 || values["Measurement.radius"] !== 5 || !Array.isArray(values["Measurement.delta"]) || !Array.isArray(values["Measurement.com"])) throw new Error(`measurement values failed: ${JSON.stringify(values)}`);
if (malformed.ok !== false || malformed.code !== "unsupported_method") throw new Error(`unsupported method was accepted: ${JSON.stringify(malformed)}`);
const hash = (value) => crypto.createHash("sha256").update(JSON.stringify(value)).digest("hex");
const report = {
schema: "freecad-web-p6-measure-measurement-api-dispatch/v1",
taskId: "FW-P6-FPA-Y",
result: "pass",
route: { command: "measure.measurementApi", native: "freecad-source/src/WebAssembly/FreeCADCoreProbe/MeasureKernelProbe.cpp:fc_web_dispatch_json", facade: "web/src/measure-measurement-facade.ts", worker: "web/src/measure.worker.ts" },
request,
requestSha256: hash(request),
response: first,
responseSha256: hash(first),
replay: { equal: true, responseSha256: hash(second) },
unsupportedMethod: { response: malformed, responseSha256: hash(malformed) },
semantics: { volume: values["Measurement.volume"], length: values["Measurement.length"], area: values["Measurement.area"], radius: values["Measurement.radius"], resourcesReleased: first.resourcesReleased },
boundaries: ["The native fixture executes Measure::Measurement against Part solids; method parameters remain the fixed source-backed fixture contract.", "Unsupported method names are rejected by the native dispatcher before a Worker result is returned."],
};
fs.writeFileSync(path.join(root, "docs/p6/measure-measurement-api-dispatch.json"), `${JSON.stringify(report, null, 2)}\n`);
fs.writeFileSync(path.join(root, "docs/freecad-p6-measure-measurement-api-dispatch.log"), `${JSON.stringify({ result: report.result, responseSha256: report.responseSha256, replayEqual: true, unsupportedMethod: malformed.code })}\n`);
console.log(JSON.stringify({ result: report.result, responseSha256: report.responseSha256, replayEqual: true, unsupportedMethod: malformed.code }));