Files
FreeCADWasmDev/tools/run_p6_robot_runtime.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
2.8 KiB
JavaScript

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 docs = path.join(root, "docs/p6"); const build = path.resolve(process.argv[2] ?? path.join(root, "freecad-source/build-web/configure/bin")); globalThis.__dirname = `${build}${path.sep}`; globalThis.require = createRequire(import.meta.url); const loader = await import(pathToFileURL(path.join(build, "FreeCADWebRobotRuntimeProbe.js"))); const p = await loader.default({ wasmBinary: fs.readFileSync(path.join(build, "FreeCADWebRobotRuntimeProbe.wasm")), print: () => {}, printErr: () => {} }); const c = (n,t="number",a=[],v=[]) => p.ccall(n,t,a,v); const first={initialize:c("fc_web_robot_initialize"),calls:c("fc_web_robot_initialization_calls"),runs:c("fc_web_robot_initialization_runs"),moduleAvailable:c("fc_web_robot_module_available"),typeCount:c("fc_web_robot_type_count"),typeNames:c("fc_web_robot_type_names","string"),error:c("fc_web_robot_error","string")}; const api=c("fc_web_robot_python_api"); const invalid=c("fc_web_robot_type_probe","number",["string"],["Robot::MissingType"]); const second={initialize:c("fc_web_robot_initialize"),calls:c("fc_web_robot_initialization_calls"),runs:c("fc_web_robot_initialization_runs"),api,invalid,error:c("fc_web_robot_error","string")}; const result={first,second,deterministic:first.runs===1&&second.runs===1&&first.typeNames===second.typeNames,pass:first.initialize===1&&first.typeCount===5&&api===1&&invalid===0&&second.runs===1}; const fixture={module:"Robot",sourceEntry:"src/Mod/Robot/App/AppRobot.cpp",representativeTypes:5,pythonApi:["Robot6Axis","Waypoint","Trajectory"]}; const hash=v=>crypto.createHash("sha256").update(JSON.stringify(v)).digest("hex"); const report={schema:"freecad-web-p6-robot-runtime/v1",taskId:"FW-P6-ROB-B-R1",module:"Robot",result:result.pass&&result.deterministic?"pass":"fail",fixture:{...fixture,inputSha256:hash(fixture)},result,resultSha256:hash(result),artifacts:{wasm:{path:"freecad-source/build-web/configure/bin/FreeCADWebRobotRuntimeProbe.wasm",sha256:crypto.createHash("sha256").update(fs.readFileSync(path.join(build,"FreeCADWebRobotRuntimeProbe.wasm"))).digest("hex")}},boundaries:["Robot App uses bundled KDL and does not require PySide or GUI; RobotGui remains excluded."]}; fs.writeFileSync(path.join(docs,"robot-runtime.json"),`${JSON.stringify(report,null,2)}\n`); fs.writeFileSync(path.join(root,"docs/freecad-p6-robot-b-runtime.log"),`${JSON.stringify({result:report.result,initializationRuns:second.runs,typeCount:first.typeCount,api,invalid})}\n`); console.log(JSON.stringify({result:report.result,initializationRuns:second.runs,typeCount:first.typeCount,api,invalid})); if(report.result!=="pass")process.exitCode=1;