from telltale.game.cards import Card, Deck from telltale.game.holdem import HandState, PlayerState, Street def cards(*values: str) -> list[Card]: parsed: list[Card] = [] for value in values: parsed.append(Card.parse(value)) return parsed def showdown_hand(players: list[PlayerState], board: list[Card], contributions: dict[str, int]) -> HandState: return HandState( hand_id="pot-test", deck=Deck(), players=players, dealer_button_index=0, small_blind_index=1, big_blind_index=2 if len(players) > 2 else 1, current_actor_index=None, street=Street.RIVER, board_cards=board, pot_contributions=contributions, minimum_raise_amount=10, ) def player(player_id: str, seat: int, hole_cards: list[Card], folded: bool = False) -> PlayerState: return PlayerState( player_id=player_id, name=player_id, seat_index=seat, stack=0, hole_cards=hole_cards, has_folded=folded, ) def test_single_winner_receives_full_pot(): players = [ player("p0", 0, cards("Ah", "Ad")), player("p1", 1, cards("Kh", "Kd")), ] hand = showdown_hand(players, cards("2c", "3d", "4h", "9s", "Td"), {"p0": 50, "p1": 50}) hand._showdown() assert players[0].stack == 100 assert players[1].stack == 0 def test_tie_splits_pot(): players = [ player("p0", 0, cards("2c", "7d")), player("p1", 1, cards("3c", "8d")), ] hand = showdown_hand(players, cards("Ah", "Kh", "Qh", "Jh", "Th"), {"p0": 40, "p1": 40}) hand._showdown() assert players[0].stack == 40 assert players[1].stack == 40 def test_odd_chip_remainder_is_deterministic_clockwise_from_dealer(): players = [ player("p0", 0, cards("Jc", "7d")), player("p1", 1, cards("Jd", "8d")), player("p2", 2, cards("Tc", "9d")), ] hand = showdown_hand(players, cards("Ah", "Ad", "Kc", "Qs", "2h"), {"p0": 1, "p1": 1, "p2": 1}) hand._showdown() assert players[0].stack == 1 assert players[1].stack == 2 assert players[2].stack == 0 def test_three_player_all_in_side_pot_distributes_correctly(): players = [ player("p0", 0, cards("Ah", "Ad")), player("p1", 1, cards("Kh", "Kd")), player("p2", 2, cards("Qh", "Qd")), ] hand = showdown_hand( players, cards("2c", "3d", "4h", "9s", "Td"), {"p0": 50, "p1": 100, "p2": 200}, ) hand._showdown() assert players[0].stack == 150 assert players[1].stack == 100 assert players[2].stack == 100 def test_folded_player_cannot_win_even_if_cards_are_best(): players = [ player("p0", 0, cards("Ah", "Ad"), folded=True), player("p1", 1, cards("Kh", "Kd")), ] hand = showdown_hand(players, cards("2c", "3d", "4h", "9s", "Td"), {"p0": 50, "p1": 50}) hand._showdown() assert players[0].stack == 0 assert players[1].stack == 100