Files
FreeCADWasmDev/freecad-source/src/WebAssembly/FreeCADCoreProbe/openscad-kernel-smoke.js
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

89 lines
4.7 KiB
JavaScript

// SPDX-License-Identifier: LGPL-2.1-or-later
const crypto = require("crypto");
const fs = require("fs");
const path = require("path");
const { pathToFileURL } = require("url");
const buildDirectory = path.resolve(process.argv[2] || "build-web/configure/bin");
const sourceRevision = "837f44197c879e41198b7e3bed55c897a9920520";
async function main()
{
globalThis.__dirname = `${buildDirectory}${path.sep}`;
globalThis.require = require;
const moduleUrl = pathToFileURL(path.join(buildDirectory, "FreeCADWebOpenSCADRuntimeProbe.js")).href;
const module = await import(moduleUrl);
const probe = await module.default({
wasmBinary: fs.readFileSync(path.join(buildDirectory, "FreeCADWebOpenSCADRuntimeProbe.wasm")),
});
const call = (name, returnType = "number", argTypes = [], args = []) => probe.ccall(name, returnType, argTypes, args);
const error = () => ({
code: call("fc_web_openscad_inspect_error_code", "string"),
field: call("fc_web_openscad_inspect_error_field", "string"),
message: call("fc_web_openscad_inspect_error_message", "string"),
});
const run = () => {
const details = {
run: call("fc_web_openscad_inspect_source_inventory", "number", ["string"], [sourceRevision]),
error: error(),
sourceRevision: call("fc_web_openscad_inspect_source_revision", "string"),
summary: call("fc_web_openscad_inspect_summary", "string"),
sourceEntry: call("fc_web_openscad_inspect_source_entry", "string"),
registrationEntry: call("fc_web_openscad_inspect_registration_entry", "string"),
targets: call("fc_web_openscad_inspect_targets_json", "string"),
registeredTypes: call("fc_web_openscad_inspect_registered_types_json", "string"),
registeredFormats: call("fc_web_openscad_inspect_registered_formats_json", "string"),
dependencies: call("fc_web_openscad_inspect_dependencies_json", "string"),
guiExcluded: call("fc_web_openscad_inspect_gui_excluded_json", "string"),
readOnly: call("fc_web_openscad_inspect_read_only"),
objectTypeCount: call("fc_web_openscad_inspect_object_type_count"),
formatExtensionCount: call("fc_web_openscad_inspect_format_extension_count"),
formatEvidenceCount: call("fc_web_openscad_inspect_format_evidence_count"),
pythonApiCount: call("fc_web_openscad_inspect_python_api_count"),
guiPythonApiCount: call("fc_web_openscad_inspect_gui_python_api_count"),
moduleHandleBeforeRelease: call("fc_web_openscad_inspect_module_handle_before_release"),
moduleHandleAfterRelease: call("fc_web_openscad_inspect_module_handle_after_release"),
documentCountBefore: call("fc_web_openscad_inspect_document_count_before"),
documentCountAfter: call("fc_web_openscad_inspect_document_count_after"),
persistenceApplicable: call("fc_web_openscad_inspect_persistence_applicable"),
persistenceReason: call("fc_web_openscad_inspect_persistence_reason", "string"),
};
details.resultSha256 = crypto.createHash("sha256").update(details.summary).digest("hex");
return details;
};
const first = run();
const second = run();
const invalidRevision = call("fc_web_openscad_inspect_source_inventory", "number", ["string"], ["wrong-revision"]);
const invalidError = error();
const valid = (details) => details.run === 1
&& details.error.code === ""
&& details.sourceRevision === sourceRevision
&& details.sourceEntry === "src/Mod/OpenSCAD/Init.py"
&& details.registrationEntry === "src/Mod/OpenSCAD/Init.py:31-43"
&& details.targets === "[\"OpenSCAD\"]"
&& details.registeredTypes === "[]"
&& details.registeredFormats === "[\"csg\",\"CSG\",\"scad\"]"
&& details.readOnly === 1
&& details.objectTypeCount === 0
&& details.formatExtensionCount === 4
&& details.formatEvidenceCount === 1
&& details.pythonApiCount === 2
&& details.guiPythonApiCount === 0
&& details.moduleHandleBeforeRelease === 1
&& details.moduleHandleAfterRelease === 0
&& details.documentCountBefore === details.documentCountAfter
&& details.persistenceApplicable === 0;
if (!valid(first) || !valid(second) || JSON.stringify(first) !== JSON.stringify(second)
|| invalidRevision !== 0 || invalidError.code !== "revision_mismatch") {
throw new Error(JSON.stringify({first, second, invalidRevision, invalidError}));
}
console.log(JSON.stringify({result: "pass", action: "inspect/source-inventory", runs: 2, details: first}));
}
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});