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

7 lines
3.9 KiB
JavaScript

import assert from "node:assert/strict"; import crypto from "node:crypto"; import fs from "node:fs"; import path from "node:path"; import { Worker } from "node:worker_threads"; import { pathToFileURL } from "node:url";
const root = path.resolve(path.dirname(new URL(import.meta.url).pathname), ".."); const facadePath = path.resolve(process.argv[2]); const buildDirectory = path.resolve(process.argv[3] ?? path.join(root, "freecad-source/build-web/configure/bin")); const facade = await import(pathToFileURL(facadePath)); const envelopePath = path.join(path.dirname(facadePath), "facade-envelope.js"); const envelope = await import(pathToFileURL(envelopePath)); const worker = new Worker(new URL("./spreadsheet-inspect-facade-smoke-worker.mjs", import.meta.url), { workerData: { facadePath, envelopePath, buildDirectory } }); const events = []; const pending = new Map(); worker.on("message", (message) => { events.push(message.kind === "ready" ? "ready" : `${message.kind}:${message.requestId}`); if (message.requestId && pending.has(message.requestId)) { pending.get(message.requestId)(message); pending.delete(message.requestId); } }); const waitFor = (id) => new Promise((resolve) => pending.set(id, resolve)); const ready = await new Promise((resolve) => worker.once("message", resolve)); assert.equal(ready.kind, "ready"); const send = (request) => { const response = waitFor(request.requestId); worker.postMessage(request); return response; };
const success = await send(facade.createSpreadsheetInspectRequest("spr-act02-e-success")); const expectedError = await send(facade.createSpreadsheetInspectRequest("spr-act02-e-error", { ...facade.SPREADSHEET_INSPECT_FIXTURE, sourceEntry: "src/Mod/Spreadsheet/App/Missing.cpp" })); const duplicate = await send(facade.createSpreadsheetInspectRequest("spr-act02-e-success")); const cancelRequest = facade.createSpreadsheetInspectRequest("spr-act02-e-cancel"); const cancelledPromise = send(cancelRequest); worker.postMessage(envelope.createCancel("spr-act02-e-cancel-message", cancelRequest.requestId, "spreadsheet-source-inventory")); const cancelled = await cancelledPromise; const after = await send(facade.createSpreadsheetInspectRequest("spr-act02-e-after")); await worker.terminate();
assert.equal(success.kind, "result"); assert.equal(success.result.sourceEntry, facade.SPREADSHEET_SOURCE_ENTRY); assert.equal(success.result.registeredTypeCount, 1); assert.equal(expectedError.kind, "error"); assert.equal(expectedError.error.code, "revision_mismatch"); assert.equal(duplicate.kind, "error"); assert.equal(duplicate.error.code, "duplicate_request"); assert.equal(cancelled.kind, "error"); assert.equal(cancelled.error.code, "cancelled"); assert.equal(after.kind, "result"); assert.deepEqual(after.result, success.result);
const responses = { success, expectedError, duplicate, cancelled, after }; const report = { schema: "freecad-web-p6-spreadsheet-action-02-facade/v1", taskId: "FW-P6-SPR-ACT-02-E", module: "Spreadsheet", action: "inspect/source-inventory", result: "pass", responses, sequencing: { requestCount: 5, responseCount: 5, events }, schemaChecks: { responses: Object.values(responses).every((response) => envelope.isFacadeResponse(response)), noNativePointers: !JSON.stringify(responses).match(/pointer|native|handle/i) }, fixture: { ...facade.SPREADSHEET_INSPECT_FIXTURE, inputSha256: crypto.createHash("sha256").update(JSON.stringify(facade.SPREADSHEET_INSPECT_FIXTURE)).digest("hex") }, boundaries: ["Success inventory fields are read from the native Spreadsheet WASM ABI and returned as typed values.", "Cancellation precedes the delayed kernel source and the following replay succeeds."] };
fs.writeFileSync(path.join(root, "docs/p6/spreadsheet-action-02-facade.json"), `${JSON.stringify(report, null, 2)}\n`); fs.writeFileSync(path.join(root, "docs/freecad-p6-spreadsheet-action-02-e-facade.log"), `${JSON.stringify({ result: report.result, requests: 5, events })}\n`); console.log(JSON.stringify({ result: report.result, requests: 5, events }));