Announce leaderless native Basic battles before plans
Verify and publish checkpoint container / container (push) Successful in 10m14s

This commit is contained in:
Quintine committed 2026-10-29 20:33:33 +11:00
1 parent 00e01a7cd2
commit f73a6e0a9c
9 files changed
+481 -21

No files matched your search

@@ -0,0 +1,84 @@
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));
});