import assert from "node:assert/strict"; import { readFile } from "node:fs/promises"; import createModule from "../../build-wasm/linuxcnc-sim-core.js"; import { PythonCallbacks } from "./python-callbacks.mjs"; import { SimSession, CONTEXT_ID } from "./sim-session.mjs"; const callbacks = new PythonCallbacks(); assert.equal(callbacks.registerRemap("M6", { prolog: "m6_prolog", epilog: "m6_epilog" }, ({ phase }) => phase).status, "verified"); assert.equal(callbacks.invoke("remap", "M6", "prolog", [1]).value, "prolog"); assert.equal(callbacks.registerFilter("pure", () => "G1 X1").status, "verified"); assert.equal(callbacks.filter("pure", "G1 X1").status, "verified"); assert.equal(callbacks.filter("pure", "import subprocess").code, "real_hardware_excluded"); assert.equal(callbacks.registerVcp("panel", [{ name: "enabled", type: "bit" }], ({ args }) => args[1]).status, "verified"); assert.equal(callbacks.updateVcp("panel", "enabled", 1).status, "verified"); const saved = callbacks.export(); const restored = new PythonCallbacks(); assert.deepEqual(restored.restore(saved), saved); const core = await createModule({ wasmBinary: await readFile(new URL("../../build-wasm/linuxcnc-sim-core.wasm", import.meta.url)) }); const session = new SimSession(core, { sessionId: "callbacks" }); const base = { schema_version: 1, context_id: CONTEXT_ID, session_id: "callbacks" }; const send = (kind, seq, operation_id, payload = {}) => session.accept({ ...base, kind, seq, operation_id, payload }); send("HELLO", 1); send("SESSION_ATTACH", 2, "attach"); assert.equal(send("REMAP_REGISTER", 3, "remap", { name: "M6", prolog: "m6_prolog" }).payload.callbacks.remaps.M6.name, "M6"); assert.equal(send("REMAP_CALL", 4, "call", { name: "M6", phase: "prolog" }).payload.status, "verified"); const blocked = send("FILTER_EXEC", 5, "filter", { name: "M6", source: "os.system('x')" }); assert.equal(blocked.kind, "ERROR"); assert.equal(blocked.payload.code, "real_hardware_excluded"); console.log(`python_callbacks=passed remap=${callbacks.state.calls.length} errors=${callbacks.state.errors.length} worker=${blocked.payload.code}`);