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

3 lines
4.2 KiB
JavaScript

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 { execFileSync } from "node:child_process"; import { fileURLToPath, pathToFileURL } from "node:url"; import { Worker } from "node:worker_threads";
const root=path.resolve(path.dirname(fileURLToPath(import.meta.url)),".."),build=path.resolve(process.argv[2]??path.join(root,"freecad-source/build-web/configure/bin")),out=fs.mkdtempSync(path.join(os.tmpdir(),"freecad-p6-points-save-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/points-persistence-facade.ts"],{cwd:root,stdio:"inherit"});const f=await import(pathToFileURL(path.join(out,"points-persistence-facade.js"))),e=await import(pathToFileURL(path.join(out,"facade-envelope.js"))),w=new Worker(path.join(root,"tools/points-persistence-facade-smoke-worker.mjs"),{workerData:{buildDirectory:build,facadePath:pathToFileURL(path.join(out,"points-persistence-facade.js")).href,envelopePath:pathToFileURL(path.join(out,"facade-envelope.js")).href}}),recv=()=>new Promise((r,j)=>{const m=x=>{w.off("error",j);r(x)};w.once("message",m);w.once("error",j)}),ready=await recv(),ok=f.createPointsPersistenceRequest("pts-save-success-1");w.postMessage(ok);const success=await recv();w.postMessage(f.createPointsPersistenceRequest("pts-save-error-1",{...f.POINTS_PERSISTENCE_FIXTURE,path:"/tmp/Missing.Points.FCStd"}));const expectedError=await recv();w.postMessage(ok);const duplicate=await recv();const cancel=f.createPointsPersistenceRequest("pts-save-cancel-1"),cp=new Promise((r,j)=>{const m=x=>{if(x.requestId===cancel.requestId){w.off("error",j);r(x)}};w.on("message",m);w.once("error",j)});w.postMessage(cancel);w.postMessage(e.createCancel("pts-save-cancel-control",cancel.requestId));const cancelled=await cp;w.postMessage(f.createPointsPersistenceRequest("pts-save-after-cancel-1"));const afterCancel=await recv();await w.terminate();assert.equal(success.kind,"result");assert.equal(success.result.objectType,"Points::Feature");assert.equal(success.result.pointCount,3);assert.equal(expectedError.error.code,"invalid_fixture");assert.equal(duplicate.error.code,"duplicate_request");assert.equal(cancelled.error.code,"cancelled");assert.equal(afterCancel.kind,"result");assert.deepEqual(afterCancel.result,success.result);const trace={ready,success,expectedError,duplicate,cancelled,afterCancel},traceSha256=crypto.createHash("sha256").update(JSON.stringify(trace)).digest("hex"),report={schema:"freecad-web-points-action-04-facade/v1",task_id:"FW-P6-PTS-ACT-04-E",module:"Points",action:f.POINTS_PERSISTENCE_COMMAND,result:"pass",envelopeSchema:e.FACADE_SCHEMA,typedSchema:f.POINTS_PERSISTENCE_SCHEMA,fixture:{...f.POINTS_PERSISTENCE_FIXTURE,inputSha256:crypto.createHash("sha256").update(JSON.stringify(f.POINTS_PERSISTENCE_FIXTURE)).digest("hex")},trace,traceSha256,sequencing:{requestCount:6,responseCount:6,maxActive:1,cancelAccepted:true},schemaChecks:{success:success.kind==="result",expectedError:expectedError.error?.code==="invalid_fixture",duplicate:duplicate.error?.code==="duplicate_request",cancel:cancelled.error?.code==="cancelled",afterCancel:afterCancel.kind==="result",noNativePointers:!JSON.stringify(trace).match(/pointer|native/i)},artifacts:{kernel:"docs/p6/points-action-04-kernel.json",recovery:"docs/p6/points-action-04-recovery.json",worker:"web/src/points-persistence.worker.ts"},commands:["node tools/run_p6_points_action04_facade.mjs freecad-source/build-web/configure/bin"],boundaries:["Typed facade transports native Points persistence only; no native pointers are exposed."]};fs.writeFileSync(path.join(root,"docs/p6/points-action-04-facade.json"),`${JSON.stringify(report,null,2)}\n`);fs.writeFileSync(path.join(root,"docs/freecad-p6-points-action-04-e-facade.log"),`${JSON.stringify({result:report.result,requests:6,maxActive:1,cancel:cancelled.error.code,traceSha256})}\n`);console.log(JSON.stringify({result:report.result,requests:6,maxActive:1,cancel:cancelled.error.code,traceSha256}));