55 lines
2.8 KiB
TypeScript
55 lines
2.8 KiB
TypeScript
import assert from 'node:assert/strict';
|
|
import test from 'node:test';
|
|
import { applyAction, type Game } from '../game/engine';
|
|
import { DUKE_VIDAL_ID, dukeController } from '../game/duke-vidal';
|
|
import { createNexusDukeDeathFixture } from './fixture-nexus-duke-capture';
|
|
import { cancelMoritaniDukeReclaim, createMoritaniDukeCaptureFixture,
|
|
reclaimMoritaniDuke } from './fixture-moritani-duke-capture';
|
|
|
|
/** Both marker states occur after a publicly possible Duke capture: true on
|
|
* fresh games, absent on older saves whose complete history is unavailable. */
|
|
function marker(game: Game, value: 'uncertain' | 'legacy') {
|
|
if (value === 'uncertain') game.dukeCaptureUncertain = true;
|
|
else delete game.dukeCaptureUncertain;
|
|
}
|
|
|
|
for (const state of ['uncertain', 'legacy'] as const) {
|
|
void test(`public Ecaz Cunning resolves ${state} Duke uncertainty`, () => {
|
|
// Native setup, an actual battle death, and the original Nexus draw.
|
|
const fixture = createNexusDukeDeathFixture(), game = fixture.window;
|
|
marker(game, state);
|
|
const done = applyAction(game, fixture.owner, fixture.action);
|
|
assert.equal(done.dukeCaptureUncertain, false);
|
|
assert.equal(done.dukeVidal?.leader.id, DUKE_VIDAL_ID);
|
|
assert.equal(dukeController(done.dukeVidal!), fixture.owner);
|
|
assert.equal(done.dukeVidal?.source, 'ecazNexus');
|
|
assert.ok(done.log.some(entry => entry.text.includes('spent Ecaz Nexus Cunning to take Duke')));
|
|
});
|
|
|
|
for (const execute of [false, true]) {
|
|
void test(`public Moritani ${execute ? 'Tanks outcome' : 'acquisition'} resolves ${state} Duke uncertainty`, () => {
|
|
// Native setup, actual capture and actual Moritani response. The
|
|
// original physical lottery entropy is controlled by the shared fixture.
|
|
const f = createMoritaniDukeCaptureFixture({ execute });
|
|
marker(f.game, state);
|
|
const { after } = reclaimMoritaniDuke(f);
|
|
assert.equal(after.dukeCaptureUncertain, false);
|
|
assert.equal(after.dukeVidal?.leader.id, DUKE_VIDAL_ID);
|
|
assert.equal(after.dukeVidal?.leader.dead, execute);
|
|
assert.equal(dukeController(after.dukeVidal!), execute ? null : f.owner);
|
|
assert.ok(after.log.some(entry => execute
|
|
? entry.text.includes('Duke acquisition resolved with the shared disc in the Tanks')
|
|
: entry.text.includes('acquired Duke Vidal for one battle')));
|
|
});
|
|
}
|
|
|
|
void test(`canceled Moritani acquisition preserves ${state} Duke uncertainty`, () => {
|
|
const f = createMoritaniDukeCaptureFixture({ karama: true });
|
|
marker(f.game, state);
|
|
const { after } = cancelMoritaniDukeReclaim(f);
|
|
assert.equal(after.dukeCaptureUncertain, state === 'uncertain' ? true : undefined);
|
|
assert.equal(dukeController(after.dukeVidal!), f.captor);
|
|
assert.ok(after.log.some(entry => entry.text.includes('Karama prevented Moritani from acquiring Duke')));
|
|
});
|
|
}
|