85 lines
4.6 KiB
TypeScript
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));
|
|
});
|