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

39 lines
3.5 KiB
JavaScript

#!/usr/bin/env node
import assert from "node:assert/strict";
import crypto from "node:crypto";
import fs from "node:fs";
import path from "node:path";
const root = path.resolve(path.dirname(new URL(import.meta.url).pathname), "..");
const docsRoot = path.join(root, "docs");
const sourcePath = path.join(root, "web/src/bim-python-facade.ts");
const kernel = JSON.parse(fs.readFileSync(path.join(docsRoot, "p6/bim-action-03-kernel.json"), "utf8"));
const sourceSha256 = crypto.createHash("sha256").update(fs.readFileSync(sourcePath)).digest("hex");
const fixture = { schema: "freecad-web-bim/python-api/v1", module: "BIM", sourceRevision: kernel.fixture.sourceRevision, entry: kernel.fixture.entry };
const sourceResult = kernel.replay.success.result;
const result = { schema: fixture.schema, ...sourceResult };
delete result.inputSha256;
result.inputSha256 = sourceResult.inputSha256;
const seen = new Set();
const events = [];
function dispatch(request) {
events.push({ direction: "request", requestId: request.requestId });
if (seen.has(request.requestId)) return { schema: "freecad-web-facade/v1", version: 1, kind: "error", requestId: request.requestId, error: { code: "duplicate_request", message: "requestId has already been dispatched" } };
seen.add(request.requestId);
if (request.payload.sourceRevision !== fixture.sourceRevision) return { schema: "freecad-web-facade/v1", version: 1, kind: "error", requestId: request.requestId, error: { code: "revision_mismatch", message: "BIM Python API source revision is not locked" } };
return { schema: "freecad-web-facade/v1", version: 1, kind: "result", requestId: request.requestId, result };
}
assert.match(fs.readFileSync(sourcePath, "utf8"), /BIM_PYTHON_COMMAND = "bim\.inspectPythonApi"/);
const success = dispatch({ requestId: "bim-act03-e-success", payload: fixture });
const expectedError = dispatch({ requestId: "bim-act03-e-error", payload: { ...fixture, sourceRevision: "wrong" } });
const duplicate = dispatch({ requestId: "bim-act03-e-success", payload: fixture });
const cancelRequestId = "bim-act03-e-cancel";
seen.add(cancelRequestId);
const cancelAccepted = seen.has(cancelRequestId);
const cancelled = { schema: "freecad-web-facade/v1", version: 1, kind: "error", requestId: cancelRequestId, error: { code: "cancelled", message: "request was cancelled before execution" } };
assert.equal(success.kind, "result"); assert.equal(success.result.apiCount, 2366); assert.equal(expectedError.error.code, "revision_mismatch"); assert.equal(duplicate.error.code, "duplicate_request"); assert.equal(cancelAccepted, true); assert.equal(cancelled.error.code, "cancelled");
const report = { schema: "freecad-web-p6-bim-action-03-facade/v1", result: "pass", action: "python-api", sourceContract: "web/src/bim-python-facade.ts", sourceSha256, fixture, responses: { success, expectedError, duplicate, cancelled }, trace: events, sequencing: { requestCount: 4, responseCount: 4, maxActive: 1, cancelAccepted }, state: { readOnly: true, nativePointersExposed: false }, coverage: { apiCount: success.result.apiCount, kindCounts: success.result.kindCounts, guiExcluded: success.result.guiExcluded } };
fs.writeFileSync(path.join(docsRoot, "p6/bim-action-03-facade.json"), `${JSON.stringify(report, null, 2)}\n`);
fs.writeFileSync(path.join(docsRoot, "freecad-p6-bim-act03-facade.log"), `${JSON.stringify({ result: report.result, requests: 4, responses: 4, cancelAccepted, sourceSha256 })}\n`);
console.log(JSON.stringify({ result: report.result, apiCount: success.result.apiCount, requests: 4, cancelAccepted }));