Files
Dune/tests/fixture-truth-charity-commitment.ts

46 lines
2.4 KiB
TypeScript

import assert from 'node:assert/strict';
import { charityQuote } from '../game/charity';
import { type Action, type Game, viewGame } from '../game/engine';
import { type TruthQuestion } from '../game/truthtrance';
import {
actTruthCharityPayments as act,
createTruthCharityPaymentsFixture,
declareTruthCharityPayments,
truthCharityPaymentsInventory as inventory,
truthCharityPaymentsPlayer as player,
} from './fixture-truth-charity-payments';
export { act, inventory, player };
/** Original Basic classic factions with the selected Ix deck and original
* Truth cards, genuine Amal and Charity chronology. The only additional
* preparation is a real four-spice bribe, leaving the target at one spice;
* no wallet, cards, phase or readiness are installed by the fixture. */
export function createTruthCharityCommitmentFixture() {
const base = createTruthCharityPaymentsFixture({ source: 'phase2', advanced: false });
assert.equal(base.game.phase, 2);
assert.equal(player(base.game, base.target).spice, 5);
const game = act(base.game, base.target, { type: 'bribe', target: base.asker, amount: 4 });
assert.equal(player(game, base.target).spice, 1);
assert.equal(charityQuote(game, player(game, base.target)).total, 1);
assert.deepEqual(inventory(game), base.originalCards);
return { ...base, game, unprepared: structuredClone(base.game), source: structuredClone(game),
charityQuestion: { kind: 'charity', target: base.target, turn: game.turn } satisfies TruthQuestion };
}
export type TruthCharityCommitmentFixture = ReturnType<typeof createTruthCharityCommitmentFixture>;
export function askTruthCharityCommitment(f: TruthCharityCommitmentFixture, source = f.game, copy: 0 | 1 = 0) {
const declared = declareTruthCharityPayments(f, source, copy).game;
return act(declared, f.asker, { type: 'truthAsk', question: f.charityQuestion });
}
export function bindTruthCharityCommitment(f: TruthCharityCommitmentFixture, answer: 'yes' | 'no', source = f.game, copy: 0 | 1 = 0) {
const asked = askTruthCharityCommitment(f, source, copy);
assert.ok(viewGame(asked, f.target).truthCharityAnswers?.includes(answer));
return { asked, game: act(asked, f.target, { type: 'truthAnswer', answer }) };
}
export function rejectTruthCharityCommitment(game: Game, actor: string, action: Action) {
const before = structuredClone(game);
assert.throws(() => act(game, actor, action));
assert.deepEqual(game, before, 'Rejected actions preserve the input');
}