/**
* Сценарий agent:invariants — мост жив, мир стабилен.
* Новая игра -> 300 фиксированных шагов -> движковые/сценические/контентные
* инварианты не содержат ошибок.
* Запуск: node tools/agent.mjs run tools/checks/agent-invariants.mjs
*/
import { startDevServer, openGame, Checks } from '../agent-lib.mjs';
export default async function ({ pretty }) {
const c = new Checks('agent-invariants');
const server = await startDevServer();
let ctx;
try {
await c.run('новая игра через мост', async () => {
ctx = await openGame({ url: server.url, newGame: true });
const s = await ctx.agent.snapshot();
c.expect(s.scene === 'location', `сцена не location`, { scene: s.scene, err: s.error });
return null;
});
await c.run('300 шагов без ошибок инвариантов', async () => {
await ctx.agent.step(300);
const inv = await ctx.agent.invariants();
const errs = inv.filter((i) => i.severity === 'error');
c.expect(errs.length === 0, 'инварианты нарушены', errs);
return null;
});
await c.run('снапшот содержит героя и флаги', async () => {
const s = await ctx.agent.snapshot();
c.expect(!!s.hero?.tile, 'нет s.hero.tile', s);
c.expect(Array.isArray(s.flags), 'нет s.flags');
return null;
});
} finally {
await ctx?.browser?.close();
server.stop();
}
return c.finish({ pretty }).ok ? 0 : 1;
}