48 lines
2.5 KiB
JavaScript
48 lines
2.5 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import { SimSession, CONTEXT_ID } from "./sim-session.mjs";
|
|
|
|
const calls = [];
|
|
let lastSeq = 0;
|
|
const core = {
|
|
_sim_protocol_reset() { calls.push(["reset"]); },
|
|
_sim_protocol_accept(...args) {
|
|
calls.push(["accept", ...args]);
|
|
if (args[1] !== lastSeq + 1) return -101;
|
|
lastSeq = args[1];
|
|
return 0;
|
|
},
|
|
_sim_create(...args) { calls.push(["create", ...args]); return 0; },
|
|
_sim_load_workspace(...args) { calls.push(["load", ...args]); return 0; },
|
|
_sim_step(...args) { calls.push(["step", ...args]); return 0; },
|
|
_sim_protocol_set_tick(...args) { calls.push(["set_tick", ...args]); return 0; },
|
|
_sim_destroy(...args) { calls.push(["destroy", ...args]); },
|
|
};
|
|
|
|
const session = new SimSession(core);
|
|
const base = { schema_version: 1, context_id: CONTEXT_ID, session_id: "s-1" };
|
|
let response = session.accept({ ...base, kind: "HELLO", seq: 1, payload: {} });
|
|
assert.equal(response.kind, "CAPABILITIES");
|
|
response = session.accept({ ...base, kind: "SESSION_ATTACH", seq: 2, payload: { project_id: "demo" } });
|
|
assert.equal(response.kind, "SESSION_READY");
|
|
response = session.accept({ ...base, kind: "LOAD_WORKSPACE", seq: 3, operation_id: "op-3", payload: { root_path: "/workspace" } });
|
|
assert.equal(response.payload.status, "verified");
|
|
response = session.accept({ ...base, kind: "SIM_STEP", seq: 4, operation_id: "op-4", payload: { cycles: 7 } });
|
|
assert.equal(response.simulation_tick, 7);
|
|
response = session.accept({ ...base, kind: "SNAPSHOT_REQUEST", seq: 5, payload: {} });
|
|
assert.equal(response.payload.tick, 7);
|
|
response = session.accept({ ...base, kind: "SIM_STEP", seq: 7, operation_id: "op-7", payload: { cycles: 1 } });
|
|
assert.equal(response.kind, "ERROR");
|
|
assert.equal(response.payload.code, "protocol_sequence");
|
|
response = session.accept({ ...base, kind: "CHECKPOINT", seq: 6, operation_id: "op-checkpoint", payload: {} });
|
|
assert.equal(response.kind, "CHECKPOINT_READY");
|
|
const checkpoint = response.payload.checkpoint;
|
|
response = session.accept({ ...base, kind: "SIM_STEP", seq: 7, operation_id: "op-7", payload: { cycles: 1 } });
|
|
assert.equal(response.kind, "COMMAND_RESULT");
|
|
const replayed = session.accept({ ...base, kind: "SIM_STEP", seq: 8, operation_id: "op-7", payload: { cycles: 99 } });
|
|
assert.equal(replayed.replayed, true);
|
|
assert.equal(replayed.payload.cycles, 1);
|
|
const recovered = session.restoreCheckpoint(checkpoint, null, (operation) => operation);
|
|
assert.equal(recovered.status, "recovered");
|
|
assert.equal(recovered.simulation_tick, 7);
|
|
console.log("sim_session=passed calls=" + calls.length);
|