Files
linuxcncWebWASM/web/worker/test_wasm_session.mjs

47 lines
3.7 KiB
JavaScript

import assert from "node:assert/strict";
import { readFile } from "node:fs/promises";
import createModule from "../../build-wasm/linuxcnc-sim-core.js";
import { SimSession, CONTEXT_ID } from "./sim-session.mjs";
const wasmBinary = await readFile(new URL("../../build-wasm/linuxcnc-sim-core.wasm", import.meta.url));
const core = await createModule({ wasmBinary });
const session = new SimSession(core, { sessionId: "s-real" });
const base = { schema_version: 1, context_id: CONTEXT_ID, session_id: "s-real" };
assert.equal(session.accept({ ...base, kind: "HELLO", seq: 1, payload: {} }).kind, "CAPABILITIES");
assert.equal(session.accept({ ...base, kind: "SESSION_ATTACH", seq: 2, operation_id: "op-2", payload: {} }).kind, "SESSION_READY");
assert.equal(session.accept({ ...base, kind: "LOAD_WORKSPACE", seq: 3, operation_id: "op-3", payload: { root_path: "/workspace" } }).payload.status, "verified");
const stepped = session.accept({ ...base, kind: "SIM_STEP", seq: 4, operation_id: "op-4", payload: { cycles: 11 } });
assert.equal(stepped.simulation_tick, 11);
assert.equal(core._sim_protocol_last_seq(), 4);
assert.equal(core._sim_protocol_tick(), 11);
assert.equal(core._sim_event_count(), 4);
assert.equal(session.accept({ ...base, kind: "SNAPSHOT_REQUEST", seq: 6, payload: {} }).payload.code, "protocol_sequence");
console.log("wasm_session=passed tick=" + stepped.simulation_tick);
const programSession = new SimSession(core, { sessionId: "s-program" });
const programBase = { schema_version: 1, context_id: CONTEXT_ID, session_id: "s-program" };
programSession.accept({ ...programBase, kind: "HELLO", seq: 1, payload: {} });
programSession.accept({ ...programBase, kind: "SESSION_ATTACH", seq: 2, operation_id: "program-attach", payload: {} });
programSession.accept({ ...programBase, kind: "LOAD_WORKSPACE", seq: 3, operation_id: "program-workspace", payload: { root_path: "/workspace" } });
const loaded = programSession.accept({ ...programBase, kind: "PROGRAM_LOAD", seq: 4, operation_id: "program-load", payload: { path: "demo.ngc", source: "G21 G90\nG1 X10 Y2 F120\nM2\n" } });
assert.equal(loaded.payload.line_count, 3);
assert.equal(programSession.accept({ ...programBase, kind: "PROGRAM_RUN", seq: 5, operation_id: "program-run", payload: {} }).payload.program_status, "running");
const firstLine = programSession.accept({ ...programBase, kind: "SIM_STEP", seq: 6, operation_id: "program-tick-1", payload: { cycles: 1 } });
assert.equal(firstLine.payload.program.state.x, 0);
const secondLine = programSession.accept({ ...programBase, kind: "SIM_STEP", seq: 7, operation_id: "program-tick-2", payload: { cycles: 1 } });
assert.equal(secondLine.payload.program.state.x, 10);
const finalLine = programSession.accept({ ...programBase, kind: "SIM_STEP", seq: 8, operation_id: "program-tick-3", payload: { cycles: 1 } });
assert.equal(finalLine.payload.program.program_status, "completed");
console.log("wasm_program=passed x=" + finalLine.payload.program.state.x + " status=" + finalLine.payload.program.program_status);
const mdiSession = new SimSession(core, { sessionId: "s-mdi" });
const mdiBase = { schema_version: 1, context_id: CONTEXT_ID, session_id: "s-mdi" };
mdiSession.accept({ ...mdiBase, kind: "HELLO", seq: 1, payload: {} });
mdiSession.accept({ ...mdiBase, kind: "SESSION_ATTACH", seq: 2, operation_id: "mdi-attach", payload: {} });
mdiSession.accept({ ...mdiBase, kind: "LOAD_WORKSPACE", seq: 3, operation_id: "mdi-workspace", payload: { root_path: "/workspace" } });
const mdi = mdiSession.accept({ ...mdiBase, kind: "MDI_EXECUTE", seq: 4, operation_id: "mdi-command", payload: { block: "G21 G90 G1 X3 Y4 F60" } });
assert.equal(mdi.payload.state.x, 3);
assert.equal(mdi.payload.state.y, 4);
console.log("wasm_mdi=passed x=" + mdi.payload.state.x + " y=" + mdi.payload.state.y);