137 lines
5.8 KiB
Python
137 lines
5.8 KiB
Python
"""
|
|
Tests for HandRanking and HandType classes
|
|
"""
|
|
|
|
import pytest
|
|
from poker.hand_ranking import HandRanking, HandType
|
|
from poker.card import Card, Rank, Suit
|
|
|
|
|
|
class TestHandType:
|
|
"""Test cases for HandType enum"""
|
|
|
|
def test_hand_type_values(self):
|
|
"""Test hand type strength values"""
|
|
assert HandType.HIGH_CARD.strength == 1
|
|
assert HandType.ONE_PAIR.strength == 2
|
|
assert HandType.ROYAL_FLUSH.strength == 10
|
|
|
|
def test_hand_type_names(self):
|
|
"""Test hand type names"""
|
|
assert HandType.HIGH_CARD.type_name == "High Card"
|
|
assert HandType.FOUR_OF_A_KIND.type_name == "Four of a Kind"
|
|
assert str(HandType.ROYAL_FLUSH) == "Royal Flush"
|
|
|
|
def test_hand_type_comparison(self):
|
|
"""Test hand type comparison"""
|
|
assert HandType.HIGH_CARD < HandType.ONE_PAIR
|
|
assert HandType.FULL_HOUSE > HandType.FLUSH
|
|
assert HandType.ROYAL_FLUSH >= HandType.STRAIGHT_FLUSH
|
|
assert HandType.TWO_PAIR <= HandType.THREE_OF_A_KIND
|
|
|
|
|
|
class TestHandRanking:
|
|
"""Test cases for HandRanking class"""
|
|
|
|
def test_hand_ranking_creation(self):
|
|
"""Test hand ranking creation"""
|
|
cards = [
|
|
Card(Rank.ACE, Suit.SPADES),
|
|
Card(Rank.ACE, Suit.HEARTS),
|
|
Card(Rank.ACE, Suit.DIAMONDS),
|
|
Card(Rank.ACE, Suit.CLUBS),
|
|
Card(Rank.KING, Suit.SPADES)
|
|
]
|
|
ranking = HandRanking(HandType.FOUR_OF_A_KIND, [Rank.ACE, Rank.KING], cards)
|
|
|
|
assert ranking.hand_type == HandType.FOUR_OF_A_KIND
|
|
assert ranking.key_ranks == [Rank.ACE, Rank.KING]
|
|
assert ranking.cards == cards
|
|
|
|
def test_quad_string_representation(self):
|
|
"""Test string representation for four of a kind"""
|
|
cards = [Card(Rank.ACE, Suit.SPADES)] * 5 # Dummy cards
|
|
ranking = HandRanking(HandType.FOUR_OF_A_KIND, [Rank.ACE, Rank.KING], cards)
|
|
assert str(ranking) == "Quad(A)"
|
|
|
|
def test_full_house_string_representation(self):
|
|
"""Test string representation for full house"""
|
|
cards = [Card(Rank.ACE, Suit.SPADES)] * 5 # Dummy cards
|
|
ranking = HandRanking(HandType.FULL_HOUSE, [Rank.ACE, Rank.KING], cards)
|
|
assert str(ranking) == "Full House(A over K)"
|
|
|
|
def test_flush_string_representation(self):
|
|
"""Test string representation for flush"""
|
|
cards = [Card(Rank.ACE, Suit.SPADES)] * 5 # Dummy cards
|
|
ranking = HandRanking(HandType.FLUSH, [Rank.ACE], cards)
|
|
assert str(ranking) == "Flush(A high)"
|
|
|
|
def test_straight_string_representation(self):
|
|
"""Test string representation for straight"""
|
|
cards = [Card(Rank.ACE, Suit.SPADES)] * 5 # Dummy cards
|
|
ranking = HandRanking(HandType.STRAIGHT, [Rank.ACE], cards)
|
|
assert str(ranking) == "Straight(A high)"
|
|
|
|
def test_straight_flush_string_representation(self):
|
|
"""Test string representation for straight flush"""
|
|
cards = [Card(Rank.KING, Suit.SPADES)] * 5 # Dummy cards
|
|
ranking = HandRanking(HandType.STRAIGHT_FLUSH, [Rank.KING], cards)
|
|
assert str(ranking) == "Straight Flush(K high)"
|
|
|
|
def test_royal_flush_string_representation(self):
|
|
"""Test string representation for royal flush"""
|
|
cards = [Card(Rank.ACE, Suit.SPADES)] * 5 # Dummy cards
|
|
ranking1 = HandRanking(HandType.ROYAL_FLUSH, [Rank.ACE], cards)
|
|
assert str(ranking1) == "Royal Flush"
|
|
|
|
# Also test straight flush with Ace high
|
|
ranking2 = HandRanking(HandType.STRAIGHT_FLUSH, [Rank.ACE], cards)
|
|
assert str(ranking2) == "Royal Flush"
|
|
|
|
def test_three_of_a_kind_string_representation(self):
|
|
"""Test string representation for three of a kind"""
|
|
cards = [Card(Rank.ACE, Suit.SPADES)] * 5 # Dummy cards
|
|
ranking = HandRanking(HandType.THREE_OF_A_KIND, [Rank.ACE], cards)
|
|
assert str(ranking) == "Three of a Kind(A)"
|
|
|
|
def test_two_pair_string_representation(self):
|
|
"""Test string representation for two pair"""
|
|
cards = [Card(Rank.ACE, Suit.SPADES)] * 5 # Dummy cards
|
|
ranking = HandRanking(HandType.TWO_PAIR, [Rank.ACE, Rank.KING], cards)
|
|
assert str(ranking) == "Two Pair(A and K)"
|
|
|
|
def test_one_pair_string_representation(self):
|
|
"""Test string representation for one pair"""
|
|
cards = [Card(Rank.ACE, Suit.SPADES)] * 5 # Dummy cards
|
|
ranking = HandRanking(HandType.ONE_PAIR, [Rank.ACE], cards)
|
|
assert str(ranking) == "Pair(A)"
|
|
|
|
def test_high_card_string_representation(self):
|
|
"""Test string representation for high card"""
|
|
cards = [Card(Rank.ACE, Suit.SPADES)] * 5 # Dummy cards
|
|
ranking = HandRanking(HandType.HIGH_CARD, [Rank.ACE], cards)
|
|
assert str(ranking) == "High Card(A)"
|
|
|
|
def test_hand_ranking_equality(self):
|
|
"""Test hand ranking equality"""
|
|
cards = [Card(Rank.ACE, Suit.SPADES)] * 5 # Dummy cards
|
|
ranking1 = HandRanking(HandType.FOUR_OF_A_KIND, [Rank.ACE, Rank.KING], cards)
|
|
ranking2 = HandRanking(HandType.FOUR_OF_A_KIND, [Rank.ACE, Rank.KING], cards)
|
|
ranking3 = HandRanking(HandType.FOUR_OF_A_KIND, [Rank.KING, Rank.ACE], cards)
|
|
|
|
assert ranking1 == ranking2
|
|
assert ranking1 != ranking3
|
|
|
|
def test_hand_ranking_comparison(self):
|
|
"""Test hand ranking comparison"""
|
|
cards = [Card(Rank.ACE, Suit.SPADES)] * 5 # Dummy cards
|
|
|
|
# Different hand types
|
|
quad_aces = HandRanking(HandType.FOUR_OF_A_KIND, [Rank.ACE], cards)
|
|
full_house = HandRanking(HandType.FULL_HOUSE, [Rank.ACE], cards)
|
|
assert full_house < quad_aces
|
|
|
|
# Same hand type, different ranks
|
|
quad_aces = HandRanking(HandType.FOUR_OF_A_KIND, [Rank.ACE], cards)
|
|
quad_kings = HandRanking(HandType.FOUR_OF_A_KIND, [Rank.KING], cards)
|
|
assert quad_kings < quad_aces |