Files
cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/tests/node/verify_five_axis_session.mjs
2026-07-09 18:12:01 -04:00

78 lines
3.6 KiB
JavaScript

import assert from "node:assert/strict";
import { createFiveAxisSessionPayload, createMemorySessionStorage } from "../../app/src/runtime/five-axis-session.js";
import { createLinuxCncInterpreterRuntime } from "../../app/src/runtime/linuxcnc-interpreter-runtime.js";
import { createSimulationStore } from "../../app/src/state/store.js";
async function waitForInterpreterExecution(store) {
for (let attempt = 0; attempt < 20; attempt += 1) {
const state = store.getState();
if (!state.interpreterExecutionPending && state.programExecutionSourceMode === "linuxcnc-interpreter-wasm") {
return state;
}
await new Promise((resolve) => setTimeout(resolve, 0));
}
return store.getState();
}
const store = createSimulationStore();
const interpreterRuntime = await createLinuxCncInterpreterRuntime();
store.dispatch({ type: "ATTACH_INTERPRETER_RUNTIME", runtime: interpreterRuntime });
store.dispatch({ type: "TOGGLE_POWER" });
store.dispatch({ type: "HOME" });
store.dispatch({ type: "SET_MODE", mode: "auto" });
store.dispatch({ type: "SET_RTCP", enabled: true });
store.dispatch({
type: "LOAD_PROGRAM",
filename: "session-demo.ngc",
content: [
"G90 G17",
"G0 X0 Y0 Z0",
"G1 X4 Y5 B6 C7 F100",
"M2",
].join("\n"),
});
await waitForInterpreterExecution(store);
store.dispatch({ type: "STEP" });
const beforeSave = store.getState();
const payload = createFiveAxisSessionPayload(beforeSave);
assert.equal(payload.apiName, "web-rtcp-5axis-session-payload");
assert.equal(payload.machineProfile, "xyzbc-trt");
assert.equal(payload.programExecution.sourceMode, "linuxcnc-interpreter-wasm");
assert.equal(payload.rtcpState, "on");
assert.equal(payload.programRuntimeFeedback.sourceMode, "linuxcnc-tp-runtime-sample");
assert.equal(payload.programRuntimeFeedback.semanticBoundary, "linuxcnc_tp_run_cycle_feedback_without_hardware");
const storage = createMemorySessionStorage();
const saved = await store.saveSession({ storage });
assert.equal(saved.snapshot.format, "web-rtcp-5axis-session-snapshot");
assert.equal(saved.path, "web-rtcp-5axis-xyzbc-trt-sim-plan/sessions/xyzbc-trt-web-session/web-rtcp-5axis-session.json");
assert.equal(saved.storageMode, "memory");
assert.equal(store.getState().sessionPersistence.storageMode, "memory");
store.dispatch({ type: "SET_RTCP", enabled: false });
store.dispatch({ type: "STOP" });
store.dispatch({ type: "SET_MODE", mode: "manual" });
store.dispatch({ type: "JOG", axis: "x", direction: 1, increment: 25 });
assert.notEqual(store.getState().rtcpState, beforeSave.rtcpState);
assert.notEqual(store.getState().axisPose.x, beforeSave.axisPose.x);
const restored = await store.restoreSession({ storage });
const afterRestore = store.getState();
assert.equal(restored.path, saved.path);
assert.equal(restored.storageMode, "memory");
assert.equal(afterRestore.sessionPersistence.status, "restored");
assert.equal(afterRestore.sessionPersistence.storageMode, "memory");
assert.equal(afterRestore.rtcpState, beforeSave.rtcpState);
assert.equal(afterRestore.kinsType, beforeSave.kinsType);
assert.equal(afterRestore.axisPose.x, beforeSave.axisPose.x);
assert.equal(afterRestore.activeProgram, "session-demo.ngc");
assert.equal(afterRestore.programExecution.sourceMode, "linuxcnc-interpreter-wasm");
assert.equal(afterRestore.programExecution.summary.motionEventCount, beforeSave.programExecution.summary.motionEventCount);
assert.equal(afterRestore.programRuntimeFeedback.semanticBoundary, beforeSave.programRuntimeFeedback.semanticBoundary);
assert.equal(afterRestore.programRuntimeFeedback.axisPose.x, beforeSave.programRuntimeFeedback.axisPose.x);
console.log("five_axis_session_smoke=ok");