37 lines
1.8 KiB
JavaScript
37 lines
1.8 KiB
JavaScript
const {test} = require("node:test");
|
|
const assert = require("node:assert/strict");
|
|
const {createDeck, evaluateBestHand, compareScores, calculatePayouts} = require("../lib/poker");
|
|
const cards = text => text.split(" ").map(card => ({rank: card.slice(0, -1), suit: card.slice(-1)}));
|
|
|
|
test("deck contains 52 distinct cards", () => {
|
|
for (let i = 0; i < 20; i++) {
|
|
const deck = createDeck();
|
|
assert.equal(deck.length, 52);
|
|
assert.equal(new Set(deck.map(card => card.rank + card.suit)).size, 52);
|
|
}
|
|
});
|
|
test("evaluates wheel, royal flush, and best full house from seven cards", () => {
|
|
assert.deepEqual(evaluateBestHand(cards("AS 2H 3D 4C 5S KH QD")).score, [4, 5]);
|
|
assert.deepEqual(evaluateBestHand(cards("AS KS QS JS 10S 2H 3D")).score, [9, 14]);
|
|
assert.deepEqual(evaluateBestHand(cards("AS AH AD KS KH KD 2D")).score, [6, 14, 13]);
|
|
assert.ok(compareScores([1, 10, 14, 8, 7], [1, 10, 13, 12, 11]) > 0);
|
|
});
|
|
test("short all-in wins only main pot; remaining players contest side pot", () => {
|
|
const payouts = calculatePayouts({a: 20, b: 100, c: 100}, [
|
|
{player: "a", result: {score: [8]}},
|
|
{player: "b", result: {score: [4]}},
|
|
{player: "c", result: {score: [1]}}
|
|
], ["a", "b", "c"]);
|
|
assert.deepEqual({...payouts}, {a: 60, b: 160});
|
|
});
|
|
test("folded contributions count, ties preserve every chip, unmatched bets return", () => {
|
|
const payouts = calculatePayouts({a: 5, b: 5, folded: 5}, [
|
|
{player: "a", result: {score: [1, 14]}},
|
|
{player: "b", result: {score: [1, 14]}}
|
|
], ["b", "a"]);
|
|
assert.deepEqual({...payouts}, {b: 8, a: 7});
|
|
assert.deepEqual({...calculatePayouts({a: 20, b: 100}, [
|
|
{player: "a", result: {score: [8]}}, {player: "b", result: {score: [1]}}
|
|
], ["a", "b"])}, {a: 40, b: 80});
|
|
});
|