41 lines
2.4 KiB
JavaScript
41 lines
2.4 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import { readFile } from "node:fs/promises";
|
|
import createModule from "../../build-wasm/linuxcnc-sim-core.js";
|
|
import { SimScheduler, SCHEDULER_PHASES } from "./sim-scheduler.mjs";
|
|
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 fast = new SimScheduler(core, { budget: 100 });
|
|
const stepped = new SimScheduler(core, { budget: 100 });
|
|
const seen = [];
|
|
fast.step(10, { reconcile: () => seen.push("reconcile"), task: () => seen.push("task"), tp: () => seen.push("tp"), kinematics: () => seen.push("kinematics"), motion: () => seen.push("motion"), hal_io: () => seen.push("hal_io"), callbacks: () => seen.push("callbacks"), publish: () => seen.push("publish") });
|
|
for (let index = 0; index < 10; index += 1) stepped.step(1);
|
|
assert.equal(fast.tick, 10);
|
|
assert.equal(fast.hash(), stepped.hash());
|
|
assert.deepEqual(seen.slice(0, 8), SCHEDULER_PHASES);
|
|
assert.throws(() => fast.step(101), /scheduler_budget_exceeded/);
|
|
assert.equal(fast.tick, 10);
|
|
const restored = new SimScheduler(core, { budget: 100 });
|
|
assert.equal(restored.restore(fast.export()).state_hash, fast.hash());
|
|
|
|
let lastSeq = 0;
|
|
const session = new SimSession({
|
|
_sim_protocol_reset() {},
|
|
_sim_protocol_accept(...args) { if (args[1] !== lastSeq + 1) return -101; lastSeq = args[1]; return 0; },
|
|
_sim_create() { return 0; },
|
|
_sim_load_workspace() { return 0; },
|
|
_sim_step() { return 0; },
|
|
_sim_protocol_set_tick() { return 0; },
|
|
}, { sessionId: "scheduler-session" });
|
|
const base = { schema_version: 1, context_id: CONTEXT_ID, session_id: "scheduler-session" };
|
|
session.accept({ ...base, kind: "HELLO", seq: 1, payload: {} });
|
|
session.accept({ ...base, kind: "SESSION_ATTACH", seq: 2, operation_id: "attach", payload: {} });
|
|
session.accept({ ...base, kind: "LOAD_WORKSPACE", seq: 3, operation_id: "load", payload: { root_path: "/workspace" } });
|
|
const steppedResponse = session.accept({ ...base, kind: "SIM_STEP", seq: 4, operation_id: "step", payload: { cycles: 4 } });
|
|
assert.equal(steppedResponse.payload.scheduler.tick, 4);
|
|
assert.deepEqual(steppedResponse.payload.scheduler.phase_trace, [...SCHEDULER_PHASES]);
|
|
assert.equal(steppedResponse.payload.task.simulation_tick, 4);
|
|
console.log(`sim_scheduler=passed tick=${fast.tick} state_hash=${fast.hash()} worker_hash=${steppedResponse.payload.scheduler.state_hash}`);
|