28 lines
1.8 KiB
TypeScript
28 lines
1.8 KiB
TypeScript
import assert from 'node:assert/strict';
|
|
import test from 'node:test';
|
|
import { applyAction, viewGame } from '../game/engine';
|
|
import { createHomeworldEcazDukeFixture, actHomeworldEcazDuke, homeworldEcazDukePhysical } from './fixture-homeworld-ecaz-duke';
|
|
|
|
for (const legacy of [false, true]) void test(
|
|
`public occupied Ecaz grant clears ${legacy ? 'legacy' : 'uncertain'} Duke capture history`, () => {
|
|
// The original occupation, alliance and choice are earned; only the
|
|
// previous public uncertainty receipt is staged for this continuation.
|
|
const fixture = createHomeworldEcazDukeFixture({ advanced: true, allied: true });
|
|
const source = structuredClone(fixture.game), beforePhysical = structuredClone(homeworldEcazDukePhysical(source));
|
|
if (legacy) delete source.dukeCaptureUncertain;
|
|
else source.dukeCaptureUncertain = true;
|
|
const offer = viewGame(source, fixture.occupier).homeworldEcazDuke;
|
|
assert.ok(offer); assert.equal(offer.blocked, null); assert.ok(fixture.ally);
|
|
const action = { type: 'homeworldDuke', event: offer.event, recipient: fixture.ally };
|
|
const before = structuredClone(source);
|
|
assert.throws(() => applyAction(source, fixture.occupier, { ...action, event: `${offer.event}:stale` }));
|
|
assert.deepEqual(source, before, 'A rejected grant must not clear uncertainty');
|
|
const done = actHomeworldEcazDuke(source, fixture.occupier, action);
|
|
assert.equal(done.dukeCaptureUncertain, false);
|
|
assert.equal(done.dukeVidal?.controller, fixture.ally);
|
|
assert.equal(done.dukeVidal?.source, 'homeworldEcaz');
|
|
assert.equal(done.dukeVidal?.leader.id, fixture.dukeId);
|
|
assert.ok(done.log.some(entry => entry.text.includes('granted the living Duke Vidal')));
|
|
assert.deepEqual(homeworldEcazDukePhysical(done), beforePhysical);
|
|
});
|