49 lines
2.9 KiB
TypeScript
49 lines
2.9 KiB
TypeScript
import assert from 'node:assert/strict';
|
||
import test from 'node:test';
|
||
import { DUKE_VIDAL_ID, dukeController } from '../game/duke-vidal';
|
||
import { createMoritaniDukeCaptureFixture, revealMoritaniTerrorVictim } from './fixture-moritani-duke-capture';
|
||
import { advanceNexusDuke, nexusDukeClean, nexusDukePlayer } from './fixture-nexus-duke-capture';
|
||
|
||
void test('the actual native Terror lottery kills the entrant’s captured Duke once and resumes its paid shipment', () => {
|
||
const f = createMoritaniDukeCaptureFixture({ terror: true });
|
||
assert.equal(f.game.pendingTerrorEntry!.entrant, f.captor);
|
||
assert.equal(f.game.dukeVidal!.leader.capturedBy, f.captor);
|
||
const revealed = revealMoritaniTerrorVictim(f, DUKE_VIDAL_ID);
|
||
assert.equal(revealed.after.dukeVidal!.leader.dead, true);
|
||
assert.equal(revealed.after.dukeVidal!.leader.deaths, revealed.before.dukeVidal!.leader.deaths + 1);
|
||
assert.equal(dukeController(revealed.after.dukeVidal!), null);
|
||
assert.equal(revealed.after.dukeVidal!.leader.capturedBy, undefined);
|
||
assert.equal(revealed.after.dukeVidal!.leader.concealed, undefined);
|
||
assert.equal(revealed.after.dukeVidal!.captureVisibility, undefined);
|
||
assert.equal(nexusDukePlayer(revealed.after, f.owner).spice,
|
||
nexusDukePlayer(revealed.before, f.owner).spice + 6);
|
||
assert.ok(nexusDukePlayer(revealed.after, f.captor).leaders.every(l => !l.dead));
|
||
assert.equal(nexusDukePlayer(revealed.after, f.captor).forces['tueks_sietch:5'], 1);
|
||
assert.equal(revealed.after.moritaniTerror!.tokens.find(t => t.id === f.terrorToken)!.status, 'removed');
|
||
assert.ok(!revealed.after.pendingTerrorEntry);
|
||
const settled = advanceNexusDuke(revealed.after,
|
||
g => g.phase === 6 && nexusDukeClean(g), f.plan, f.actions);
|
||
assert.equal(settled.dukeVidal!.leader.dead, true);
|
||
assert.equal(dukeController(settled.dukeVidal!), null);
|
||
});
|
||
|
||
void test('an explicit empty-pool checkpoint spends the original revealed token with no death or bounty', () => {
|
||
const f = createMoritaniDukeCaptureFixture({ terror: true, terrorEntrant: 'guild' });
|
||
assert.equal(f.game.pendingTerrorEntry!.entrant, f.guild);
|
||
// Controlled boundary: the original arrival/token are genuine; only the
|
||
// entrant's preceding native-death history is staged for this empty edge.
|
||
for (const leader of nexusDukePlayer(f.game, f.guild).leaders) {
|
||
leader.dead = true;
|
||
leader.deaths = 1;
|
||
}
|
||
const before = structuredClone(nexusDukePlayer(f.game, f.guild).leaders);
|
||
const revealed = revealMoritaniTerrorVictim(f);
|
||
assert.deepEqual(nexusDukePlayer(revealed.after, f.guild).leaders, before);
|
||
assert.equal(nexusDukePlayer(revealed.after, f.owner).spice,
|
||
nexusDukePlayer(revealed.before, f.owner).spice);
|
||
assert.equal(revealed.after.moritaniTerror!.tokens.find(t => t.id === f.terrorToken)!.status, 'removed');
|
||
assert.equal(nexusDukePlayer(revealed.after, f.guild).forces['arrakeen:10'], 1);
|
||
assert.ok(!revealed.after.pendingTerrorEntry);
|
||
assert.equal(revealed.after.active, f.guild);
|
||
});
|