Files
Dune/tests/basic-native-leaderless-occupy.test.ts
T
Quintine f73a6e0a9c
Verify and publish checkpoint container / container (push) Successful in 10m14s
Announce leaderless native Basic battles before plans
2026-10-29 20:33:33 +11:00

85 lines
4.6 KiB
TypeScript

import assert from 'node:assert/strict';
import test from 'node:test';
import { viewGame } from '../game/engine';
import { basicNativeLeaderlessOccupy, basicOccupyNoRicheseLeaderless, finishOccupyLeaderlessPreparation } from './fixture-basic-native-leaderless-occupy';
for (const lead of ['ecaz', 'ally'] as const) for (const dead of ['selected', 'opponent'] as const)
void test(`Basic Ecaz Occupy ${lead} lead opens public dead-leader preparation for ${dead} after lead settles`, () => {
const f = basicNativeLeaderlessOccupy({ lead, dead });
const b = f.game.battle!;
assert.equal(b.ecazOccupy?.lead, f.selected);
assert.ok([b.attacker, b.defender].includes(f.selected));
assert.ok(![b.attacker, b.defender].includes(f.unselected));
assert.equal(b.basicEarlyLeaderlessVersion, 1);
assert.equal(b.basicDeadLeaderPreparation, true);
assert.ok(b.preLeader && !b.preLeader.closed);
assert.ok(!b.preLeader.ready.includes(f.dead!));
assert.ok(b.preLeader.ready.every(id => [b.attacker, b.defender].includes(id)));
assert.deepEqual(b.plans, {});
const game = finishOccupyLeaderlessPreparation(f.game);
assert.ok(game.battle);
assert.deepEqual(game.battle.plans, {});
assert.ok(game.battle.basicEarlyLeaderless?.includes(f.dead!));
for (const viewer of game.players)
assert.ok(viewGame(game, viewer.id).battle!.earlyLeaderless?.includes(f.dead!));
});
for (const lead of ['ecaz', 'ally'] as const)
void test(`Basic Ecaz Occupy ${lead} lead does not open dead-leader preparation for a nonleading ally`, () => {
const f = basicNativeLeaderlessOccupy({ lead, dead: 'unselected' });
assert.ok(f.game.battle);
assert.equal(f.game.battle.basicDeadLeaderPreparation, undefined);
assert.ok(f.game.battle.preLeader && !f.game.battle.preLeader.closed,
'The original Richese shared preparation is retained');
const game = finishOccupyLeaderlessPreparation(f.game);
assert.ok(game.battle?.basicEarlyLeaderless?.includes(f.selected));
assert.ok(!game.battle?.basicEarlyLeaderless?.includes(f.unselected));
});
void test('An available shared Duke prevents the Ecaz lead from announcing no leader', () => {
const f = basicNativeLeaderlessOccupy({ lead: 'ecaz', dead: 'none', duke: true });
const game = finishOccupyLeaderlessPreparation(f.game);
assert.equal(game.dukeVidal?.controller, f.fixture.ecaz);
assert.ok(!game.battle?.basicEarlyLeaderless?.includes(f.fixture.ecaz));
assert.ok(game.battle?.basicEarlyLeaderless?.includes(f.fixture.opponent));
});
void test('An available Duke still prevents a notice when every Ecaz native leader is dead', () => {
const f = basicNativeLeaderlessOccupy({ lead: 'ecaz', dead: 'selected', duke: true });
assert.ok(f.game.battle?.preLeader && !f.game.battle.preLeader.closed,
'The original Richese shared preparation remains available');
const game = finishOccupyLeaderlessPreparation(f.game);
assert.ok(!game.battle?.basicEarlyLeaderless?.includes(f.fixture.ecaz));
assert.ok(game.battle?.basicEarlyLeaderless?.includes(f.fixture.opponent));
});
void test('Canceled Ecaz Occupy retains the selected lead and its pre-leader opportunity', () => {
const f = basicNativeLeaderlessOccupy({ lead: 'ally', dead: 'selected', cancel: true });
assert.equal(f.game.battle?.ecazOccupy?.canceled, true);
assert.equal(f.game.battle?.ecazOccupy?.lead, f.selected);
assert.equal(f.game.battle?.basicDeadLeaderPreparation, true);
const game = finishOccupyLeaderlessPreparation(f.game);
assert.ok(game.battle?.basicEarlyLeaderless?.includes(f.selected));
});
void test('Audit-entry Basic Occupy without Richese creates neutral preparation for the final dead-leader combatant', () => {
const f = basicOccupyNoRicheseLeaderless();
const b = f.game.battle!;
assert.equal(b.saphoTimingVersion, undefined);
assert.equal(b.ecazOccupy?.lead, f.fixture.ecaz);
assert.equal(b.basicDeadLeaderPreparation, true);
assert.ok(b.preLeader && !b.preLeader.closed);
assert.ok(!b.preLeader.ready.includes(f.fixture.ecaz));
assert.ok(b.preLeader.ready.includes(f.fixture.opponent));
const game = finishOccupyLeaderlessPreparation(f.game);
assert.ok(game.battle?.basicEarlyLeaderless?.includes(f.fixture.ecaz));
});
void test('Audit-entry Occupy with an available Duke does not add an unnecessary dead-leader preparation', () => {
const f = basicOccupyNoRicheseLeaderless(true);
assert.equal(f.game.battle?.ecazOccupy?.lead, f.fixture.ecaz);
assert.equal(f.game.battle?.basicDeadLeaderPreparation, undefined);
assert.equal(f.game.battle?.preLeader, undefined);
assert.ok(!f.game.battle?.basicEarlyLeaderless?.includes(f.fixture.ecaz));
});