Newer
Older
rpg / tools / checks / agent-invariants.mjs
/**
 * Сценарий 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;
}