1+ import pytest
2+
3+ from src .poker .card import Face , Suit , Hand , Card , parse_cards , identify_hand , get_similar_cards
4+
5+
6+ def test_parse_cards ():
7+ input_line = "Kc 9s Ks Kd 9d 3c 6d"
8+ expected = [
9+ Card (face = Face .KING , suit = Suit .CLUBS ),
10+ Card (face = Face .NINE , suit = Suit .SPADES ),
11+ Card (face = Face .KING , suit = Suit .SPADES ),
12+ Card (face = Face .KING , suit = Suit .DIAMONDS ),
13+ Card (face = Face .NINE , suit = Suit .DIAMONDS ),
14+ Card (face = Face .THREE , suit = Suit .CLUBS ),
15+ Card (face = Face .SIX , suit = Suit .DIAMONDS )
16+ ]
17+ assert parse_cards (input_line ) == expected
18+
19+
20+
21+
22+
23+ test_data = [
24+ ("test_full_house" , [
25+ Card (face = Face .KING , suit = Suit .CLUBS ),
26+ Card (face = Face .NINE , suit = Suit .SPADES ),
27+ Card (face = Face .KING , suit = Suit .SPADES ),
28+ Card (face = Face .KING , suit = Suit .DIAMONDS ),
29+ Card (face = Face .NINE , suit = Suit .DIAMONDS ),
30+ Card (face = Face .THREE , suit = Suit .CLUBS ),
31+ Card (face = Face .SIX , suit = Suit .DIAMONDS )
32+ ], {
33+ 'combinations' : [(3 , 'K' ), (2 , '9' )],
34+ 'kickers' : ['6' , '3' ]
35+ }),
36+
37+ ("test_two_pair" , [
38+ Card (face = Face .KING , suit = Suit .CLUBS ),
39+ Card (face = Face .NINE , suit = Suit .SPADES ),
40+ Card (face = Face .KING , suit = Suit .SPADES ),
41+ Card (face = Face .NINE , suit = Suit .DIAMONDS ),
42+ Card (face = Face .THREE , suit = Suit .CLUBS ),
43+ Card (face = Face .SIX , suit = Suit .DIAMONDS )
44+ ], {
45+ 'combinations' : [(2 , 'K' ), (2 , '9' )],
46+ 'kickers' : ['6' , '3' ]
47+ }),
48+
49+ ("test_three_of_a_kind" , [
50+ Card (face = Face .KING , suit = Suit .CLUBS ),
51+ Card (face = Face .NINE , suit = Suit .SPADES ),
52+ Card (face = Face .KING , suit = Suit .SPADES ),
53+ Card (face = Face .KING , suit = Suit .DIAMONDS ),
54+ Card (face = Face .THREE , suit = Suit .CLUBS ),
55+ Card (face = Face .SIX , suit = Suit .DIAMONDS )
56+ ], {
57+ 'combinations' : [(3 , 'K' )],
58+ 'kickers' : ['9' , '6' , '3' ]
59+ }),
60+
61+ ("test_pair" , [
62+ Card (face = Face .KING , suit = Suit .CLUBS ),
63+ Card (face = Face .NINE , suit = Suit .SPADES ),
64+ Card (face = Face .KING , suit = Suit .SPADES ),
65+ Card (face = Face .THREE , suit = Suit .CLUBS ),
66+ Card (face = Face .SIX , suit = Suit .DIAMONDS )
67+ ], {
68+ 'combinations' : [(2 , 'K' )],
69+ 'kickers' : ['9' , '6' , '3' ]
70+ }),
71+
72+ ("test_high_card" , [
73+ Card (face = Face .KING , suit = Suit .CLUBS ),
74+ Card (face = Face .NINE , suit = Suit .SPADES ),
75+ Card (face = Face .THREE , suit = Suit .CLUBS ),
76+ Card (face = Face .SIX , suit = Suit .DIAMONDS )
77+ ], {
78+ 'combinations' : [],
79+ 'kickers' : ['K' , '9' , '6' , '3' ]
80+ }),
81+ ]
82+
83+ @pytest .mark .parametrize ("name, hand, expected" , test_data )
84+ def test_get_hand_ranks (name , hand , expected ):
85+ assert get_similar_cards (hand ) == expected
86+
87+
88+
89+ def test_identify_hand ():
90+ hand = [
91+ Card (face = Face .KING , suit = Suit .CLUBS ),
92+ Card (face = Face .NINE , suit = Suit .SPADES ),
93+ Card (face = Face .KING , suit = Suit .SPADES ),
94+ Card (face = Face .KING , suit = Suit .DIAMONDS ),
95+ Card (face = Face .NINE , suit = Suit .DIAMONDS ),
96+ Card (face = Face .THREE , suit = Suit .CLUBS ),
97+ Card (face = Face .SIX , suit = Suit .DIAMONDS )
98+ ]
99+ assert identify_hand (hand ) == "Full House"
100+
101+
102+ test_data_identify_hand = [
103+ ("test_full_house" , [
104+ Card (face = Face .KING , suit = Suit .CLUBS ),
105+ Card (face = Face .NINE , suit = Suit .SPADES ),
106+ Card (face = Face .KING , suit = Suit .SPADES ),
107+ Card (face = Face .KING , suit = Suit .DIAMONDS ),
108+ Card (face = Face .NINE , suit = Suit .DIAMONDS ),
109+ Card (face = Face .THREE , suit = Suit .CLUBS ),
110+ Card (face = Face .SIX , suit = Suit .DIAMONDS )
111+ ], "Full House" ),
112+
113+ ("test_two_pair" , [
114+ Card (face = Face .KING , suit = Suit .CLUBS ),
115+ Card (face = Face .NINE , suit = Suit .SPADES ),
116+ Card (face = Face .KING , suit = Suit .SPADES ),
117+ Card (face = Face .NINE , suit = Suit .DIAMONDS ),
118+ Card (face = Face .THREE , suit = Suit .CLUBS ),
119+ Card (face = Face .SIX , suit = Suit .DIAMONDS )
120+ ], "Two Pair" ),
121+
122+ ("test_three_of_a_kind" , [
123+ Card (face = Face .KING , suit = Suit .CLUBS ),
124+ Card (face = Face .NINE , suit = Suit .SPADES ),
125+ Card (face = Face .KING , suit = Suit .SPADES ),
126+ Card (face = Face .KING , suit = Suit .DIAMONDS ),
127+ Card (face = Face .THREE , suit = Suit .CLUBS ),
128+ Card (face = Face .SIX , suit = Suit .DIAMONDS )
129+ ], "Three of a Kind" ),
130+
131+ ("test_pair" , [
132+ Card (face = Face .KING , suit = Suit .CLUBS ),
133+ Card (face = Face .NINE , suit = Suit .SPADES ),
134+ Card (face = Face .KING , suit = Suit .SPADES ),
135+ Card (face = Face .THREE , suit = Suit .CLUBS ),
136+ Card (face = Face .SIX , suit = Suit .DIAMONDS )
137+ ], "Pair" ),
138+
139+ ("test_high_card" , [
140+ Card (face = Face .KING , suit = Suit .CLUBS ),
141+ Card (face = Face .NINE , suit = Suit .SPADES ),
142+ Card (face = Face .THREE , suit = Suit .CLUBS ),
143+ Card (face = Face .SIX , suit = Suit .DIAMONDS )
144+ ], "High Card" ),
145+ ("test_straight" , [
146+ Card (face = Face .FIVE , suit = Suit .CLUBS ),
147+ Card (face = Face .NINE , suit = Suit .SPADES ),
148+ Card (face = Face .SIX , suit = Suit .SPADES ),
149+ Card (face = Face .SEVEN , suit = Suit .DIAMONDS ),
150+ Card (face = Face .EIGHT , suit = Suit .CLUBS ),
151+ Card (face = Face .TEN , suit = Suit .DIAMONDS )
152+ ], "Straight" ),
153+ ("test_flush" , [
154+ Card (face = Face .FOUR , suit = Suit .CLUBS ),
155+ Card (face = Face .NINE , suit = Suit .CLUBS ),
156+ Card (face = Face .THREE , suit = Suit .CLUBS ),
157+ Card (face = Face .SEVEN , suit = Suit .CLUBS ),
158+ Card (face = Face .EIGHT , suit = Suit .CLUBS ),
159+ Card (face = Face .TEN , suit = Suit .CLUBS )
160+ ], "Flush" ),
161+ ("test_straight_flush" , [
162+ Card (face = Face .FOUR , suit = Suit .CLUBS ),
163+ Card (face = Face .NINE , suit = Suit .CLUBS ),
164+ Card (face = Face .SIX , suit = Suit .CLUBS ),
165+ Card (face = Face .SEVEN , suit = Suit .CLUBS ),
166+ Card (face = Face .EIGHT , suit = Suit .CLUBS ),
167+ Card (face = Face .TEN , suit = Suit .CLUBS )
168+ ], "Straight Flush" ),
169+ ("test_royal_flush" , [
170+ Card (face = Face .ACE , suit = Suit .CLUBS ),
171+ Card (face = Face .JACK , suit = Suit .CLUBS ),
172+ Card (face = Face .KING , suit = Suit .CLUBS ),
173+ Card (face = Face .QUEEN , suit = Suit .CLUBS ),
174+ Card (face = Face .TEN , suit = Suit .CLUBS )
175+ ], "Royal Flush" ),
176+ ("test_four_of_a_kind" , [
177+ Card (face = Face .ACE , suit = Suit .CLUBS ),
178+ Card (face = Face .ACE , suit = Suit .SPADES ),
179+ Card (face = Face .ACE , suit = Suit .DIAMONDS ),
180+ Card (face = Face .ACE , suit = Suit .HEARTS ),
181+ Card (face = Face .TEN , suit = Suit .CLUBS )
182+ ], "Four of a Kind" ),
183+ ]
184+ @pytest .mark .parametrize ("name, hand, expected" , test_data_identify_hand )
185+ def test_identify_hand (name , hand , expected ):
186+ assert identify_hand (hand ) == expected
0 commit comments