Implement AXIS parity UI and execution baseline
This commit is contained in:
40
web/worker/test_python_callbacks_s3.mjs
Normal file
40
web/worker/test_python_callbacks_s3.mjs
Normal file
@@ -0,0 +1,40 @@
|
||||
import assert from "node:assert/strict";
|
||||
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", modalgroup: 6 }, ({ phase }) => phase).status, "verified");
|
||||
assert.equal(callbacks.invoke("remap", "M6", "prolog", [1]).value, "prolog");
|
||||
assert.equal(callbacks.invoke("remap", "M6", "epilog", []).value, "epilog");
|
||||
assert.equal(callbacks.invoke("remap", "M6", "body", []).code, "remap_phase_invalid");
|
||||
assert.equal(callbacks.registerRemap("M6", { prolog: "other" }).code, "remap_duplicate");
|
||||
assert.equal(callbacks.registerRemap("bad", { prolog: "bad" }, () => { throw new Error("boom"); }).status, "verified");
|
||||
assert.equal(callbacks.invoke("remap", "bad", "prolog").code, "callback_exception");
|
||||
assert.equal(callbacks.registerFilter("pure", ({ args }) => args[0]).status, "verified");
|
||||
assert.equal(callbacks.filter("pure", "G1 X1", ["ok"]).value, "G1 X1");
|
||||
assert.equal(callbacks.filter("pure", "import subprocess").code, "real_hardware_excluded");
|
||||
assert.equal(callbacks.filter("pure", "G1 X1", [Number.NaN]).code, "filter_arguments_invalid");
|
||||
assert.equal(callbacks.registerVcp("panel", [{ name: "enabled", type: "bit" }, { name: "count", type: "s32" }], () => { throw new Error("vcp-fail"); }).status, "verified");
|
||||
assert.equal(callbacks.updateVcp("panel", "enabled", 1).code, "callback_exception");
|
||||
assert.equal(callbacks.state.vcp.panel.pins[0].value, 0);
|
||||
assert.equal(callbacks.updateVcp("panel", "enabled", 2).code, "vcp_value_invalid");
|
||||
assert.equal(callbacks.updateVcp("panel", "missing", 1).code, "vcp_pin_missing");
|
||||
const saved = callbacks.export();
|
||||
const restored = new PythonCallbacks();
|
||||
assert.deepEqual(restored.restore(saved), saved);
|
||||
|
||||
let sequence = 0;
|
||||
const core = { _sim_protocol_reset() {}, _sim_protocol_accept() { return 0; }, _sim_create() { return 0; }, _sim_load_workspace() { return 0; } };
|
||||
const session = new SimSession(core, { sessionId: "callbacks-s3" });
|
||||
const base = { schema_version: 1, context_id: CONTEXT_ID, session_id: "callbacks-s3" };
|
||||
const send = (kind, operation_id, payload = {}) => { sequence += 1; return session.accept({ ...base, kind, seq: sequence, operation_id, payload }); };
|
||||
send("HELLO"); send("SESSION_ATTACH", "attach");
|
||||
assert.equal(send("REMAP_REGISTER", "remap", { name: "M6", prolog: "m6_prolog", epilog: "m6_epilog" }).payload.callbacks.remaps.M6.prolog, "m6_prolog");
|
||||
assert.equal(send("REMAP_CALL", "prolog", { name: "M6", phase: "prolog", args: [] }).payload.status, "verified");
|
||||
assert.equal(send("VCP_REGISTER", "vcp", { name: "panel", pins: [{ name: "enabled", type: "bit" }] }).payload.status, "verified");
|
||||
assert.equal(send("VCP_UPDATE", "vcp-update", { name: "panel", pin: "enabled", value: 1 }).payload.status, "verified");
|
||||
const blocked = send("FILTER_EXEC", "filter", { name: "missing", source: "os.system('x')" });
|
||||
assert.equal(blocked.kind, "ERROR");
|
||||
const checkpoint = send("CHECKPOINT", "checkpoint").payload.checkpoint;
|
||||
assert.equal(checkpoint.state.callbacks.schema, "python-callbacks.v1");
|
||||
console.log(JSON.stringify({ schema: "python-callbacks-s3-sample.v1", status: "verified", calls: callbacks.state.calls.length, errors: callbacks.state.errors.length, callback_hash: callbacks.hash(), worker_hash: session.callbacks.hash(), checkpoint_hash: checkpoint.checkpoint_hash }));
|
||||
Reference in New Issue
Block a user