import { describe, expect, it } from "vitest"; import type { Card, HandRank } from "@/lib/minigames/poker"; import { handRankTier, ROYAL_RANK_TIER } from "@/lib/minigames/poker/handRankStyle"; import { describeHandStrength } from "@/lib/minigames/poker/handHint"; function rank(category: number, tiebreakers: readonly number[]): HandRank { return { category, tiebreakers }; } describe("handRankTier", () => { it("maps every category to its own tier", () => { expect(handRankTier(rank(0, [14]))).toBe(0); expect(handRankTier(rank(1, [9]))).toBe(1); expect(handRankTier(rank(2, [11, 4]))).toBe(2); expect(handRankTier(rank(3, [7]))).toBe(3); expect(handRankTier(rank(4, [9]))).toBe(4); expect(handRankTier(rank(5, [14]))).toBe(5); expect(handRankTier(rank(6, [13, 8]))).toBe(6); expect(handRankTier(rank(7, [3]))).toBe(7); expect(handRankTier(rank(8, [9]))).toBe(8); }); it("promotes only the ace-high straight flush to the royal tier", () => { expect(handRankTier(rank(8, [14]))).toBe(ROYAL_RANK_TIER); expect(handRankTier(rank(8, [13]))).toBe(8); expect(handRankTier(rank(4, [14]))).not.toBe(ROYAL_RANK_TIER); }); }); describe("describeHandStrength tiers", () => { it("keeps high card at tier zero and a pocket pair at tier one", () => { const high = describeHandStrength( [ { rank: 14, suit: "s" }, { rank: 13, suit: "h" }, ], [], ); const pair = describeHandStrength( [ { rank: 9, suit: "s" }, { rank: 9, suit: "h" }, ], [], ); expect(high?.tier).toBe(0); expect(pair?.tier).toBe(1); }); it("grades a royal flush at the top tier with the royal label", () => { const hole: Card[] = [ { rank: 10, suit: "h" }, { rank: 11, suit: "h" }, ]; const board: Card[] = [ { rank: 12, suit: "h" }, { rank: 13, suit: "h" }, { rank: 14, suit: "h" }, { rank: 2, suit: "s" }, { rank: 3, suit: "d" }, ]; const hint = describeHandStrength(hole, board); expect(hint?.tier).toBe(ROYAL_RANK_TIER); expect(hint?.label).toBe("Royal flush"); }); });