Files
FreeCADWasmDev/web/tools/test-points-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

49 lines
2.7 KiB
JavaScript

import assert from "node:assert/strict";
import fs from "node:fs";
import vm from "node:vm";
import test from "node:test";
import ts from "typescript";
const modules = new Map();
function load(name) {
if (modules.has(name)) return modules.get(name);
const source = fs.readFileSync(new URL(`../src/${name.replace(/^\.\//, "").replace(/\.js$/, ".ts")}`, import.meta.url), "utf8");
const compiled = ts.transpileModule(source, { compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2022 } }).outputText;
const module = { exports: {} };
vm.runInNewContext("(function(exports,require,module){" + compiled + "})", { AbortController })(module.exports, load, module);
modules.set(name, module.exports);
return module.exports;
}
const points = load("./points-facade.js");
const payload = { ...points.POINTS_FIXTURE, document: "CloudA", object: "Current", points: [[-2, 1, 3], [4, 6, -1]] };
const result = { ok: true, schema: points.POINTS_SCHEMA, module: "Points", action: "create/recompute", document: "CloudA", objectName: "Current",
pointCount: 2, objectCount: 1, min: [-2, 1, -1], max: [4, 6, 3], resourcesReleased: true };
test("variable point counts and named document parameters reach the native dispatcher", async () => {
let received;
const kernel = { ccall(_name, _type, _types, args) { received = JSON.parse(args[0]); return JSON.stringify(result); } };
const actual = await points.handlePoints(payload, new AbortController().signal, kernel);
assert.deepEqual(received.args, payload);
assert.equal(actual.pointCount, 2);
assert.equal(actual.document, "CloudA");
});
test("invalid coordinates or names never call native code", async () => {
const kernel = { ccall() { assert.fail("invalid payload reached native code"); } };
for (const invalid of [{ points: [] }, { points: [[1, 2]] }, { points: [[1, Infinity, 3]] }, { points: [[1, "2", 3]] }, { document: "bad/name" }, { object: "" }]) {
await assert.rejects(points.handlePoints({ ...payload, ...invalid }, new AbortController().signal, kernel), /nonempty finite point set/);
}
});
test("native ownership, count and invalid bounds cannot be reported as success", async () => {
for (const changed of [{ document: "Other" }, { objectName: "Other" }, { pointCount: 3 }, { min: [7, 8, 9] }, { objectCount: 0 }]) {
await assert.rejects(points.handlePoints(payload, new AbortController().signal, { ccall: () => JSON.stringify({ ...result, ...changed }) }), /do not match/);
}
});
test("cancellation remains distinct from a native protocol error", async () => {
const controller = new AbortController();
controller.abort();
await assert.rejects(points.handlePoints(payload, controller.signal, { ccall() { assert.fail("cancelled request ran"); } }), /cancelled/);
});