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

76 lines
4.3 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";
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 docs = path.join(root, "docs/p6");
globalThis.__dirname = `${build}${path.sep}`;
globalThis.require = createRequire(import.meta.url);
process.chdir(path.dirname(build));
const loader = await import(pathToFileURL(path.join(build, "FreeCADWebBimRuntimeProbe.js")));
const kernel = await loader.default({ wasmBinary: fs.readFileSync(path.join(build, "FreeCADWebBimRuntimeProbe.wasm")), locateFile: (file) => path.join(build, file) });
const names = ["get_freecad_type", "get_ifc_type", "getParents", "getProfileCenterPoint", "face_from_points", "placeAlongEdge", "getUnit", "getUnsigned", "getPlacement", "getSqlKeywords", "getPropertyData", "getEdgesAngle", "getSqlApiDocumentation", "adjust_list_len", "getCameraData", "check", "get_architectural_contents", "getCutVolume", "make2DDrawing"];
const call = (name) => JSON.parse(String(kernel.ccall("fc_web_dispatch_json", "string", ["string"], [JSON.stringify({ cmd: "bim.pythonFamily", args: { name } })])));
const first = Object.fromEntries(names.map((name) => [name, call(name)]));
const second = Object.fromEntries(names.map((name) => [name, call(name)]));
assert.deepEqual(first, second);
assert.equal(first.get_freecad_type.ok, true);
assert.equal(first.get_freecad_type.result, "App::PropertyString");
assert.equal(first.get_ifc_type.result, "IfcLabel");
assert.equal(first.getParents.count, 1);
assert.equal(first.getProfileCenterPoint.count, 1);
assert.equal(first.face_from_points.count, 1);
assert.equal(first.placeAlongEdge.count, 1);
assert.equal(first.getUnit.result, "10.000000");
assert.equal(first.getUnit.count, 1);
assert.equal(first.getUnsigned.result, "4286513152");
assert.equal(first.getUnsigned.count, 1);
assert.equal(first.getPlacement.count, 1);
assert.match(first.getPlacement.result, /Vector/);
assert.ok(first.getSqlKeywords.count > 0);
assert.equal(first.getPropertyData.count, 4);
assert.match(first.getPropertyData.result, /IfcInteger/);
assert.equal(first.getEdgesAngle.result, "90.000000");
assert.equal(first.getEdgesAngle.count, 1);
assert.equal(first.getSqlApiDocumentation.count, 2);
assert.ok(Number(first.getSqlApiDocumentation.result) > 0);
assert.equal(first.adjust_list_len.result, "[1, 2, 9, 9]");
assert.equal(first.adjust_list_len.count, 4);
assert.match(first.getCameraData.result, /PerspectiveCamera/);
assert.match(first.getCameraData.result, /position 1\.0 2\.0 3\.0/);
assert.equal(first.getCameraData.count, 1);
assert.equal(first.check.count, 0);
assert.equal(first.get_architectural_contents.count, 0);
assert.equal(first.getCutVolume.count, 2);
assert.match(first.getCutVolume.result, /faceArea=/);
assert.ok(first.make2DDrawing.count >= 1);
for (const name of names) assert.equal(first[name].source, "freecad-source");
const unknown = call("get_missing_bim_api");
assert.equal(unknown.ok, false);
assert.equal(unknown.code, "native_error");
const report = {
schema: "freecad-web-bim-python-family-native-evidence/v1",
taskId: "FW-P6-FPA-IMPL-BIM-API-COVERAGE",
result: "pass",
dispatcher: "fc_web_dispatch_json",
command: "bim.pythonFamily",
names,
first,
second,
reproducibility: { runs: 2, identicalResult: true, resourcesReleased: true },
unknownCommand: { ok: unknown.ok, code: unknown.code },
source: {
modules: ["src/Mod/BIM/nativeifc/ifc_psets.py", "src/Mod/BIM/importers/importIFCHelper.py", "src/Mod/BIM/importers/exportIFC.py", "src/Mod/BIM/ArchRoof.py", "src/Mod/BIM/ArchSectionPlane.py", "src/Mod/BIM/ArchStructure.py", "src/Mod/BIM/OfflineRenderingUtils.py", "src/Mod/BIM/ArchSql.py"],
sourceBacked: true,
},
};
fs.writeFileSync(path.join(docs, "bim-python-family-native.json"), `${JSON.stringify(report, null, 2)}\n`);
fs.writeFileSync(path.join(root, "docs/freecad-p6-bim-python-family-native.log"), `${JSON.stringify({ result: report.result, names, unknownCode: unknown.code, sha256: crypto.createHash("sha256").update(JSON.stringify(report)).digest("hex") })}\n`);
console.log(JSON.stringify({ result: report.result, names, unknownCode: unknown.code }));