Allow Distrans between completed auction bids
Verify and publish checkpoint container / container (push) Successful in 10m44s
Verify and publish checkpoint container / container (push) Successful in 10m44s
This commit is contained in:
1 parent
ab7a947833
commit
ccc4c7bb40
16 files changed
+250
-80
No files matched your search
@@ -0,0 +1,54 @@
|
||||
import assert from 'node:assert/strict';
|
||||
import test from 'node:test';
|
||||
import { handLimit, viewGame } from '../game/engine';
|
||||
import {
|
||||
actDistransPrebid, advanceDistransPrebid, createDistransPrebidFixture,
|
||||
distransPrebidClean, distransPrebidInventory, distransPrebidPlayer as player,
|
||||
distransPrebidPosition, finishDistransPrebidLot,
|
||||
} from './fixture-distrans-prebid';
|
||||
|
||||
for (const advanced of [false, true]) {
|
||||
const mode = advanced ? 'Advanced' : 'Basic';
|
||||
void test(`${mode} Distrans between ordinary bids preserves the standing purchase and resumes that lot`, () => {
|
||||
const f = createDistransPrebidFixture({ advanced });
|
||||
const bidder = f.game.auction!.active;
|
||||
let game = actDistransPrebid(f.game, bidder, { type: 'bid', amount: 1, allyPayment: 0 });
|
||||
assert.equal(game.auction!.bidder, bidder);
|
||||
assert.equal(game.auction!.bid, 1);
|
||||
const recipient = game.players.find(seat => seat.id !== f.holder && seat.id !== bidder &&
|
||||
seat.hand.length < handLimit(seat));
|
||||
assert.ok(recipient);
|
||||
const action = { ...f.action, target: recipient.id };
|
||||
const offered = viewGame(game, f.holder).distrans!;
|
||||
assert.equal(offered.blocked, null);
|
||||
assert.ok(offered.choices.find(choice => choice.recipient === recipient.id)!.cards.some(card => card.id === f.give));
|
||||
const original = structuredClone(game), index = game.auction!.index, turn = game.turn;
|
||||
const soldCard = game.auction!.cards[index].id;
|
||||
const bidderSpice = player(game, bidder).spice;
|
||||
game = actDistransPrebid(game, f.holder, action);
|
||||
assert.deepEqual(distransPrebidPosition(game), distransPrebidPosition(original));
|
||||
assert.ok(player(game, recipient.id).hand.some(card => card.id === f.give));
|
||||
assert.equal(game.discard.filter(card => card.id === f.card).length, 1);
|
||||
assert.deepEqual(distransPrebidInventory(game), f.originalInventory);
|
||||
game = advanceDistransPrebid(game, distransPrebidClean);
|
||||
assert.deepEqual(game.auction, original.auction);
|
||||
game = finishDistransPrebidLot(game, turn, index);
|
||||
assert.ok(player(game, bidder).hand.some(card => card.id === soldCard));
|
||||
assert.equal(player(game, bidder).spice, bidderSpice - 1);
|
||||
assert.deepEqual(distransPrebidInventory(game), f.originalInventory);
|
||||
});
|
||||
|
||||
void test(`${mode} a standing bidder retains its last hand slot through a Distrans attempt`, () => {
|
||||
const f = createDistransPrebidFixture({ advanced, capacity: 'recipientLastSlot' });
|
||||
const bidder = f.game.auction!.active;
|
||||
assert.equal(bidder, f.recipient);
|
||||
assert.equal(player(f.game, bidder).hand.length, handLimit(player(f.game, bidder)) - 1);
|
||||
const game = actDistransPrebid(f.game, bidder, { type: 'bid', amount: 1, allyPayment: 0 });
|
||||
const before = structuredClone(game);
|
||||
const option = viewGame(game, f.holder).distrans!.choices.find(choice => choice.recipient === bidder)!;
|
||||
assert.ok(!option.cards.some(card => card.id === f.give));
|
||||
assert.throws(() => actDistransPrebid(game, f.holder, f.action));
|
||||
assert.deepEqual(game, before);
|
||||
assert.deepEqual(distransPrebidInventory(game), f.originalInventory);
|
||||
});
|
||||
}
|
||||
Reference in new issue
Block a user