import test from "node:test"; import assert from "node:assert/strict"; import { createAgentState, advanceAgent, replayAgent, describeAgent, eligibleAgentVisibility, } from "../src/scripts/agent-state.mjs"; test("agent progresses through grouped fields and stops at review", () => { const queued = createAgentState(""); assert.equal(describeAgent(queued).phase, "queued"); const assigned = advanceAgent(queued, 800, true); assert.equal(describeAgent(assigned).phase, "assigned"); const filling = advanceAgent(assigned, 900, true); assert.equal(describeAgent(filling).phase, "filling"); assert.equal(describeAgent(filling).groups, 1); assert.equal(describeAgent(advanceAgent(filling, 1100, true)).groups, 2); assert.equal(describeAgent(advanceAgent(filling, 2100, true)).groups, 3); const done = advanceAgent(filling, 9999, true); assert.deepEqual(describeAgent(done), { phase: "review", groups: 3 }); assert.equal(done.elapsed, 5000); assert.deepEqual(advanceAgent(done, 500, true), done); assert.equal(queued.elapsed, 0); }); test("offscreen and hidden states do not consume elapsed time; replay resets", () => { const running = advanceAgent(createAgentState(""), 1700, true); assert.deepEqual(advanceAgent(running, 3000, false), running); assert.deepEqual(advanceAgent(running, -1, true), running); assert.deepEqual(advanceAgent(running, NaN, true), running); assert.deepEqual(advanceAgent(running, Infinity, true), running); assert.equal(replayAgent(running).elapsed, 0); }); test("capture accepts deterministic phases, ignores invalid phases and cannot replay", () => { for (const phase of ["queued", "assigned", "filling", "review"]) { const state = createAgentState("?capture=1&phase=" + phase); assert.equal(describeAgent(state).phase, phase); assert.deepEqual(advanceAgent(state, 9000, true), state); assert.deepEqual(replayAgent(state), state); } assert.equal( describeAgent(createAgentState("?capture=1&phase=bad")).phase, "review", ); assert.equal(describeAgent(createAgentState("?capture=1")).phase, "review"); assert.equal( describeAgent(createAgentState("?phase=review")).phase, "queued", ); }); test("reduced motion is a settled review even when capture phase is specified", () => { const state = createAgentState("?capture=1&phase=queued", true); assert.equal(describeAgent(state).phase, "review"); assert.deepEqual(replayAgent(state), state); }); test("visibility threshold is half the stage or viewport for tall mobile layouts", () => { assert.equal(eligibleAgentVisibility(600, 299, 900), false); assert.equal(eligibleAgentVisibility(600, 300, 900), true); assert.equal(eligibleAgentVisibility(1100, 400, 800), true); assert.equal(eligibleAgentVisibility(1100, 399, 800), false); assert.equal(eligibleAgentVisibility(0, 0, 800), false); });