""" 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