Exercise Nexus games across two to six seats

This commit is contained in:
Quintine committed 2026-09-27 21:12:30 +10:00
1 parent 8045c9e3eb
commit 628c536218
3 files changed
+77 -25

No files matched your search

+40 -4
View File
@@ -180,15 +180,17 @@ void test('Homeworld and Nexus sample snapshots resume only their matching modul
['nexus', 39, 'nexusCards', 'homeworlds'],
] as const) {
const out = join(area, profile);
assert.equal(run(out, '--profile', profile, '--rules', 'advanced', '--seed', '1000', '--max-actions', '1').status, 1);
assertFailedEvidence(out, `${profile}-advanced`, 1000 + ordinal, false);
const snapshot = join(out, `failed-${profile}-advanced.json`);
const name = profile === 'nexus' ? 'nexus-6-advanced' : 'homeworld-advanced';
const playerFilter = profile === 'nexus' ? ['--players', '6'] : [];
assert.equal(run(out, '--profile', profile, '--rules', 'advanced', ...playerFilter, '--seed', '1000', '--max-actions', '1').status, 1);
assertFailedEvidence(out, name, 1000 + ordinal, false);
const snapshot = join(out, `failed-${name}.json`);
const game = json<Record<string, unknown>>(snapshot);
assert.ok(game[module], `${profile} module remains in the snapshot`);
assert.equal(Boolean(game[other]), false);
const resumed = join(area, `${profile}-resumed`);
assert.equal(run(resumed, '--resume', snapshot, '--seed', '1000', '--max-actions', '1').status, 1);
assertFailedEvidence(resumed, `${profile}-advanced`, 1000 + ordinal, true);
assertFailedEvidence(resumed, name, 1000 + ordinal, true);
const unsupported = join(area, `${profile}-combined.json`);
writeFileSync(unsupported, JSON.stringify({ ...game, [other]: game[module] }), { mode: 0o600 });
const refused = join(area, `${profile}-refused`);
@@ -198,6 +200,40 @@ void test('Homeworld and Nexus sample snapshots resume only their matching modul
}
});
void test('three-seat Nexus samples preserve their module and roster across saved continuation', (t) => {
const area = temporary(t);
for (const [rules, ordinal] of [['basic', 42], ['advanced', 43]] as const) {
const out = join(area, rules);
const initial = run(out, '--profile', 'nexus', '--players', '3', '--rules', rules, '--seed', '1000', '--max-actions', '1');
assert.equal(initial.status, 1);
assertFailedEvidence(out, `nexus-3-${rules}`, 1000 + ordinal, false);
const snapshot = join(out, `failed-nexus-3-${rules}.json`);
const game = json<{ players: unknown[]; nexusCards: unknown }>(snapshot);
assert.equal(game.players.length, 3);
assert.ok(game.nexusCards);
const resumed = join(area, `${rules}-resumed`);
assert.equal(run(resumed, '--resume', snapshot, '--seed', '1000', '--max-actions', '1').status, 1);
assertFailedEvidence(resumed, `nexus-3-${rules}`, 1000 + ordinal, true);
}
});
void test('a genuine three-seat Advanced Nexus game reaches unallied card choice and completes without illegal bot actions', (t) => {
const out = join(temporary(t), 'card-draw');
const result = run(out, '--profile', 'nexus', '--players', '3', '--rules', 'advanced', '--seed', '20260927');
assert.equal(result.status, 0, result.stderr);
const report = json<CliReport>(join(out, 'report.json'));
const evidence = json<{ results: (CliResult & {
used: Record<string, number>;
rejected: Record<string, number>;
restores: number;
})[] }>(join(out, 'results.json')).results[0];
assert.equal(report.status, 'passed');
assert.equal(evidence.outcome, 'complete');
assert.ok(evidence.used.nexusCardChoice > 0);
assert.deepEqual(evidence.rejected, {});
assert.ok(evidence.restores > 0);
});
void test('selected genuine three-player Advanced base sample fails honestly, resumes its fixed snapshot and keeps source-bound private evidence', (t) => {
const area = temporary(t);
const first = join(area, 'first');