ckc_rs/
hand_rank.rs

1use core::cmp::Ordering;
2use core::fmt;
3use serde::{Deserialize, Serialize};
4use strum::EnumIter;
5
6/// `HandRank` represents the value of a specific 5 card hand of poker. The lower the
7/// `HandRankValue` the better the hand. When a `HandRank` is instantiated it can only
8/// have a specific matching `HandRankName` and `HandRankValue`.
9#[derive(Serialize, Deserialize, Clone, Copy, Debug, Eq, Hash, PartialEq)]
10pub struct HandRank {
11    pub value: HandRankValue,
12    pub name: HandRankName,
13    pub class: HandRankClass,
14}
15
16impl HandRank {
17    /// Takes in a calculated `HandRankValue` and returns the `HandRank`.
18    ///
19    /// 7462 possible combination of hands:
20    ///
21    ///   10 straight-flushes
22    ///  156 four of a kinds
23    ///  156 full houses
24    /// 1277 flushes
25    ///   10 straights
26    ///  858 three of a kinds
27    ///  858 two pairs
28    /// 2860 pairs
29    /// 1277 high cards
30    #[must_use]
31    pub fn determine_name(hrv: &HandRankValue) -> HandRankName {
32        match *hrv {
33            1..=10 => HandRankName::StraightFlush,
34            11..=166 => HandRankName::FourOfAKind,
35            167..=322 => HandRankName::FullHouse,
36            323..=1599 => HandRankName::Flush,
37            1600..=1609 => HandRankName::Straight,
38            1610..=2467 => HandRankName::ThreeOfAKind,
39            2468..=3325 => HandRankName::TwoPair,
40            3326..=6185 => HandRankName::Pair,
41            6186..=7462 => HandRankName::HighCard,
42            _ => HandRankName::Invalid,
43        }
44    }
45
46    #[must_use]
47    #[allow(clippy::too_many_lines)]
48    pub fn determine_class(hrv: &HandRankValue) -> HandRankClass {
49        match *hrv {
50            1 => HandRankClass::RoyalFlush,
51            2 => HandRankClass::KingHighStraightFlush,
52            3 => HandRankClass::QueenHighStraightFlush,
53            4 => HandRankClass::JackHighStraightFlush,
54            5 => HandRankClass::TenHighStraightFlush,
55            6 => HandRankClass::NineHighStraightFlush,
56            7 => HandRankClass::EightHighStraightFlush,
57            8 => HandRankClass::SevenHighStraightFlush,
58            9 => HandRankClass::SixHighStraightFlush,
59            10 => HandRankClass::FiveHighStraightFlush,
60            11..=22 => HandRankClass::FourAces,
61            23..=34 => HandRankClass::FourKings,
62            35..=46 => HandRankClass::FourQueens,
63            47..=58 => HandRankClass::FourJacks,
64            59..=70 => HandRankClass::FourTens,
65            71..=82 => HandRankClass::FourNines,
66            83..=94 => HandRankClass::FourEights,
67            95..=106 => HandRankClass::FourSevens,
68            107..=118 => HandRankClass::FourSixes,
69            119..=130 => HandRankClass::FourFives,
70            131..=142 => HandRankClass::FourFours,
71            143..=154 => HandRankClass::FourTreys,
72            155..=166 => HandRankClass::FourDeuces,
73            167 => HandRankClass::AcesOverKings,
74            168 => HandRankClass::AcesOverQueens,
75            169 => HandRankClass::AcesOverJacks,
76            170 => HandRankClass::AcesOverTens,
77            171 => HandRankClass::AcesOverNines,
78            172 => HandRankClass::AcesOverEights,
79            173 => HandRankClass::AcesOverSevens,
80            174 => HandRankClass::AcesOverSixes,
81            175 => HandRankClass::AcesOverFives,
82            176 => HandRankClass::AcesOverFours,
83            177 => HandRankClass::AcesOverTreys,
84            178 => HandRankClass::AcesOverDeuces,
85            179 => HandRankClass::KingsOverAces,
86            180 => HandRankClass::KingsOverQueens,
87            181 => HandRankClass::KingsOverJacks,
88            182 => HandRankClass::KingsOverTens,
89            183 => HandRankClass::KingsOverNines,
90            184 => HandRankClass::KingsOverEights,
91            185 => HandRankClass::KingsOverSevens,
92            186 => HandRankClass::KingsOverSixes,
93            187 => HandRankClass::KingsOverFives,
94            188 => HandRankClass::KingsOverFours,
95            189 => HandRankClass::KingsOverTreys,
96            190 => HandRankClass::KingsOverDeuces,
97            191 => HandRankClass::QueensOverAces,
98            192 => HandRankClass::QueensOverKings,
99            193 => HandRankClass::QueensOverJacks,
100            194 => HandRankClass::QueensOverTens,
101            195 => HandRankClass::QueensOverNines,
102            196 => HandRankClass::QueensOverEights,
103            197 => HandRankClass::QueensOverSevens,
104            198 => HandRankClass::QueensOverSixes,
105            199 => HandRankClass::QueensOverFives,
106            200 => HandRankClass::QueensOverFours,
107            201 => HandRankClass::QueensOverTreys,
108            202 => HandRankClass::QueensOverDeuces,
109            203 => HandRankClass::JacksOverAces,
110            204 => HandRankClass::JacksOverKings,
111            205 => HandRankClass::JacksOverQueens,
112            206 => HandRankClass::JacksOverTens,
113            207 => HandRankClass::JacksOverNines,
114            208 => HandRankClass::JacksOverEights,
115            209 => HandRankClass::JacksOverSevens,
116            210 => HandRankClass::JacksOverSixes,
117            211 => HandRankClass::JacksOverFives,
118            212 => HandRankClass::JacksOverFours,
119            213 => HandRankClass::JacksOverTreys,
120            214 => HandRankClass::JacksOverDeuces,
121            215 => HandRankClass::TensOverAces,
122            216 => HandRankClass::TensOverKings,
123            217 => HandRankClass::TensOverQueens,
124            218 => HandRankClass::TensOverJacks,
125            219 => HandRankClass::TensOverNines,
126            220 => HandRankClass::TensOverEights,
127            221 => HandRankClass::TensOverSevens,
128            222 => HandRankClass::TensOverSixes,
129            223 => HandRankClass::TensOverFives,
130            224 => HandRankClass::TensOverFours,
131            225 => HandRankClass::TensOverTreys,
132            226 => HandRankClass::TensOverDeuces,
133            227 => HandRankClass::NinesOverAces,
134            228 => HandRankClass::NinesOverKings,
135            229 => HandRankClass::NinesOverQueens,
136            230 => HandRankClass::NinesOverJacks,
137            231 => HandRankClass::NinesOverTens,
138            232 => HandRankClass::NinesOverEights,
139            233 => HandRankClass::NinesOverSevens,
140            234 => HandRankClass::NinesOverSixes,
141            235 => HandRankClass::NinesOverFives,
142            236 => HandRankClass::NinesOverFours,
143            237 => HandRankClass::NinesOverTreys,
144            238 => HandRankClass::NinesOverDeuces,
145            239 => HandRankClass::EightsOverAces,
146            240 => HandRankClass::EightsOverKings,
147            241 => HandRankClass::EightsOverQueens,
148            242 => HandRankClass::EightsOverJacks,
149            243 => HandRankClass::EightsOverTens,
150            244 => HandRankClass::EightsOverNines,
151            245 => HandRankClass::EightsOverSevens,
152            246 => HandRankClass::EightsOverSixes,
153            247 => HandRankClass::EightsOverFives,
154            248 => HandRankClass::EightsOverFours,
155            249 => HandRankClass::EightsOverTreys,
156            250 => HandRankClass::EightsOverDeuces,
157            251 => HandRankClass::SevensOverAces,
158            252 => HandRankClass::SevensOverKings,
159            253 => HandRankClass::SevensOverQueens,
160            254 => HandRankClass::SevensOverJacks,
161            255 => HandRankClass::SevensOverTens,
162            256 => HandRankClass::SevensOverNines,
163            257 => HandRankClass::SevensOverEights,
164            258 => HandRankClass::SevensOverSixes,
165            259 => HandRankClass::SevensOverFives,
166            260 => HandRankClass::SevensOverFours,
167            261 => HandRankClass::SevensOverTreys,
168            262 => HandRankClass::SevensOverDeuces,
169            263 => HandRankClass::SixesOverAces,
170            264 => HandRankClass::SixesOverKings,
171            265 => HandRankClass::SixesOverQueens,
172            266 => HandRankClass::SixesOverJacks,
173            267 => HandRankClass::SixesOverTens,
174            268 => HandRankClass::SixesOverNines,
175            269 => HandRankClass::SixesOverEights,
176            270 => HandRankClass::SixesOverSevens,
177            271 => HandRankClass::SixesOverFives,
178            272 => HandRankClass::SixesOverFours,
179            273 => HandRankClass::SixesOverTreys,
180            274 => HandRankClass::SixesOverDeuces,
181            275 => HandRankClass::FivesOverAces,
182            276 => HandRankClass::FivesOverKings,
183            277 => HandRankClass::FivesOverQueens,
184            278 => HandRankClass::FivesOverJacks,
185            279 => HandRankClass::FivesOverTens,
186            280 => HandRankClass::FivesOverNines,
187            281 => HandRankClass::FivesOverEights,
188            282 => HandRankClass::FivesOverSevens,
189            283 => HandRankClass::FivesOverSixes,
190            284 => HandRankClass::FivesOverFours,
191            285 => HandRankClass::FivesOverTreys,
192            286 => HandRankClass::FivesOverDeuces,
193            287 => HandRankClass::FoursOverAces,
194            288 => HandRankClass::FoursOverKings,
195            289 => HandRankClass::FoursOverQueens,
196            290 => HandRankClass::FoursOverJacks,
197            291 => HandRankClass::FoursOverTens,
198            292 => HandRankClass::FoursOverNines,
199            293 => HandRankClass::FoursOverEights,
200            294 => HandRankClass::FoursOverSevens,
201            295 => HandRankClass::FoursOverSixes,
202            296 => HandRankClass::FoursOverFives,
203            297 => HandRankClass::FoursOverTreys,
204            298 => HandRankClass::FoursOverDeuces,
205            299 => HandRankClass::TreysOverAces,
206            300 => HandRankClass::TreysOverKings,
207            301 => HandRankClass::TreysOverQueens,
208            302 => HandRankClass::TreysOverJacks,
209            303 => HandRankClass::TreysOverTens,
210            304 => HandRankClass::TreysOverNines,
211            305 => HandRankClass::TreysOverEights,
212            306 => HandRankClass::TreysOverSevens,
213            307 => HandRankClass::TreysOverSixes,
214            308 => HandRankClass::TreysOverFives,
215            309 => HandRankClass::TreysOverFours,
216            310 => HandRankClass::TreysOverDeuces,
217            311 => HandRankClass::DeucesOverAces,
218            312 => HandRankClass::DeucesOverKings,
219            313 => HandRankClass::DeucesOverQueens,
220            314 => HandRankClass::DeucesOverJacks,
221            315 => HandRankClass::DeucesOverTens,
222            316 => HandRankClass::DeucesOverNines,
223            317 => HandRankClass::DeucesOverEights,
224            318 => HandRankClass::DeucesOverSevens,
225            319 => HandRankClass::DeucesOverSixes,
226            320 => HandRankClass::DeucesOverFives,
227            321 => HandRankClass::DeucesOverFours,
228            322 => HandRankClass::DeucesOverTreys,
229            323..=815 => HandRankClass::AceHighFlush,
230            816..=1144 => HandRankClass::KingHighFlush,
231            1145..=1353 => HandRankClass::QueenHighFlush,
232            1354..=1478 => HandRankClass::JackHighFlush,
233            1479..=1547 => HandRankClass::TenHighFlush,
234            1548..=1581 => HandRankClass::NineHighFlush,
235            1582..=1595 => HandRankClass::EightHighFlush,
236            1596..=1599 => HandRankClass::SevenHighFlush,
237            1600 => HandRankClass::AceHighStraight,
238            1601 => HandRankClass::KingHighStraight,
239            1602 => HandRankClass::QueenHighStraight,
240            1603 => HandRankClass::JackHighStraight,
241            1604 => HandRankClass::TenHighStraight,
242            1605 => HandRankClass::NineHighStraight,
243            1606 => HandRankClass::EightHighStraight,
244            1607 => HandRankClass::SevenHighStraight,
245            1608 => HandRankClass::SixHighStraight,
246            1609 => HandRankClass::FiveHighStraight,
247            1610..=1675 => HandRankClass::ThreeAces,
248            1676..=1741 => HandRankClass::ThreeKings,
249            1742..=1807 => HandRankClass::ThreeQueens,
250            1808..=1873 => HandRankClass::ThreeJacks,
251            1874..=1939 => HandRankClass::ThreeTens,
252            1940..=2005 => HandRankClass::ThreeNines,
253            2006..=2071 => HandRankClass::ThreeEights,
254            2072..=2137 => HandRankClass::ThreeSevens,
255            2138..=2203 => HandRankClass::ThreeSixes,
256            2204..=2269 => HandRankClass::ThreeFives,
257            2270..=2335 => HandRankClass::ThreeFours,
258            2336..=2401 => HandRankClass::ThreeTreys,
259            2402..=2467 => HandRankClass::ThreeDeuces,
260            2468..=2478 => HandRankClass::AcesAndKings,
261            2479..=2489 => HandRankClass::AcesAndQueens,
262            2490..=2500 => HandRankClass::AcesAndJacks,
263            2501..=2511 => HandRankClass::AcesAndTens,
264            2512..=2522 => HandRankClass::AcesAndNines,
265            2523..=2533 => HandRankClass::AcesAndEights,
266            2534..=2544 => HandRankClass::AcesAndSevens,
267            2545..=2555 => HandRankClass::AcesAndSixes,
268            2556..=2566 => HandRankClass::AcesAndFives,
269            2567..=2577 => HandRankClass::AcesAndFours,
270            2578..=2588 => HandRankClass::AcesAndTreys,
271            2589..=2599 => HandRankClass::AcesAndDeuces,
272            2600..=2610 => HandRankClass::KingsAndQueens,
273            2611..=2621 => HandRankClass::KingsAndJacks,
274            2622..=2632 => HandRankClass::KingsAndTens,
275            2633..=2643 => HandRankClass::KingsAndNines,
276            2644..=2654 => HandRankClass::KingsAndEights,
277            2655..=2665 => HandRankClass::KingsAndSevens,
278            2666..=2676 => HandRankClass::KingsAndSixes,
279            2677..=2687 => HandRankClass::KingsAndFives,
280            2688..=2698 => HandRankClass::KingsAndFours,
281            2699..=2709 => HandRankClass::KingsAndTreys,
282            2710..=2720 => HandRankClass::KingsAndDeuces,
283            2721..=2731 => HandRankClass::QueensAndJacks,
284            2732..=2742 => HandRankClass::QueensAndTens,
285            2743..=2753 => HandRankClass::QueensAndNines,
286            2754..=2764 => HandRankClass::QueensAndEights,
287            2765..=2775 => HandRankClass::QueensAndSevens,
288            2776..=2786 => HandRankClass::QueensAndSixes,
289            2787..=2797 => HandRankClass::QueensAndFives,
290            2798..=2808 => HandRankClass::QueensAndFours,
291            2809..=2819 => HandRankClass::QueensAndTreys,
292            2820..=2830 => HandRankClass::QueensAndDeuces,
293            2831..=2841 => HandRankClass::JacksAndTens,
294            2842..=2852 => HandRankClass::JacksAndNines,
295            2853..=2863 => HandRankClass::JacksAndEights,
296            2864..=2874 => HandRankClass::JacksAndSevens,
297            2875..=2885 => HandRankClass::JacksAndSixes,
298            2886..=2896 => HandRankClass::JacksAndFives,
299            2897..=2907 => HandRankClass::JacksAndFours,
300            2908..=2918 => HandRankClass::JacksAndTreys,
301            2919..=2929 => HandRankClass::JacksAndDeuces,
302            2930..=2940 => HandRankClass::TensAndNines,
303            2941..=2951 => HandRankClass::TensAndEights,
304            2952..=2962 => HandRankClass::TensAndSevens,
305            2963..=2973 => HandRankClass::TensAndSixes,
306            2974..=2984 => HandRankClass::TensAndFives,
307            2985..=2995 => HandRankClass::TensAndFours,
308            2996..=3006 => HandRankClass::TensAndTreys,
309            3007..=3017 => HandRankClass::TensAndDeuces,
310            3018..=3028 => HandRankClass::NinesAndEights,
311            3029..=3039 => HandRankClass::NinesAndSevens,
312            3040..=3050 => HandRankClass::NinesAndSixes,
313            3051..=3061 => HandRankClass::NinesAndFives,
314            3062..=3072 => HandRankClass::NinesAndFours,
315            3073..=3083 => HandRankClass::NinesAndTreys,
316            3084..=3094 => HandRankClass::NinesAndDeuces,
317            3095..=3105 => HandRankClass::EightsAndSevens,
318            3106..=3116 => HandRankClass::EightsAndSixes,
319            3117..=3127 => HandRankClass::EightsAndFives,
320            3128..=3138 => HandRankClass::EightsAndFours,
321            3139..=3149 => HandRankClass::EightsAndTreys,
322            3150..=3160 => HandRankClass::EightsAndDeuces,
323            3161..=3171 => HandRankClass::SevensAndSixes,
324            3172..=3182 => HandRankClass::SevensAndFives,
325            3183..=3193 => HandRankClass::SevensAndFours,
326            3194..=3204 => HandRankClass::SevensAndTreys,
327            3205..=3215 => HandRankClass::SevensAndDeuces,
328            3216..=3226 => HandRankClass::SixesAndFives,
329            3227..=3237 => HandRankClass::SixesAndFours,
330            3238..=3248 => HandRankClass::SixesAndTreys,
331            3249..=3259 => HandRankClass::SixesAndDeuces,
332            3260..=3270 => HandRankClass::FivesAndFours,
333            3271..=3281 => HandRankClass::FivesAndTreys,
334            3282..=3292 => HandRankClass::FivesAndDeuces,
335            3293..=3303 => HandRankClass::FoursAndTreys,
336            3304..=3314 => HandRankClass::FoursAndDeuces,
337            3315..=3325 => HandRankClass::TreysAndDeuces,
338            3326..=3545 => HandRankClass::PairOfAces,
339            3546..=3765 => HandRankClass::PairOfKings,
340            3766..=3985 => HandRankClass::PairOfQueens,
341            3986..=4205 => HandRankClass::PairOfJacks,
342            4206..=4425 => HandRankClass::PairOfTens,
343            4426..=4645 => HandRankClass::PairOfNines,
344            4646..=4865 => HandRankClass::PairOfEights,
345            4866..=5085 => HandRankClass::PairOfSevens,
346            5086..=5305 => HandRankClass::PairOfSixes,
347            5306..=5525 => HandRankClass::PairOfFives,
348            5526..=5745 => HandRankClass::PairOfFours,
349            5746..=5965 => HandRankClass::PairOfTreys,
350            5966..=6185 => HandRankClass::PairOfDeuces,
351            6186..=6678 => HandRankClass::AceHigh,
352            6679..=7007 => HandRankClass::KingHigh,
353            7008..=7216 => HandRankClass::QueenHigh,
354            7217..=7341 => HandRankClass::JackHigh,
355            7342..=7410 => HandRankClass::TenHigh,
356            7411..=7444 => HandRankClass::NineHigh,
357            7445..=7458 => HandRankClass::EightHigh,
358            7459..=7462 => HandRankClass::SevenHigh,
359            _ => HandRankClass::Invalid,
360        }
361    }
362
363    #[must_use]
364    pub fn is_a_valid_hand_rank(&self) -> bool {
365        self == &HandRank::from(self.value)
366    }
367
368    #[must_use]
369    pub fn is_invalid(&self) -> bool {
370        self.name == HandRankName::Invalid
371    }
372}
373
374impl Default for HandRank {
375    fn default() -> HandRank {
376        HandRank::from(0)
377    }
378}
379
380impl fmt::Display for HandRank {
381    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
382        write!(f, "{self:?}")
383    }
384}
385
386impl From<HandRankValue> for HandRank {
387    fn from(value: HandRankValue) -> Self {
388        HandRank {
389            value,
390            name: HandRank::determine_name(&value),
391            class: HandRank::determine_class(&value),
392        }
393    }
394}
395
396impl PartialOrd<Self> for HandRank {
397    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
398        Some(self.cmp(other))
399    }
400}
401
402/// The lower the `HandRankValue` the higher the value of the `HandRank`, unless it's invalid.
403#[allow(clippy::if_same_then_else)]
404impl Ord for HandRank {
405    fn cmp(&self, other: &HandRank) -> Ordering {
406        if self.is_invalid() && other.is_invalid() {
407            Ordering::Equal
408        } else if self.is_invalid() {
409            Ordering::Less
410        } else if other.is_invalid() {
411            Ordering::Greater
412        } else if self.value < other.value {
413            Ordering::Greater
414        } else if self.value > other.value {
415            Ordering::Less
416        } else {
417            Ordering::Equal
418        }
419    }
420}
421
422/// `HandRankValue` is the integer representing the `HandRank` for a particular five card
423/// `PokerHand`. This value is used to compare one hand against the other, the lower the value,
424/// the stronger the hand in a traditional, highest to lowest, ranking. A `HandRankValue` can have
425/// only one `HandRankName` and `HandRankClass`.
426#[allow(clippy::module_name_repetitions)]
427pub type HandRankValue = u16;
428
429pub const NO_HAND_RANK_VALUE: HandRankValue = 0;
430
431/// `HandRankName` represents the
432/// [traditional name](https://en.wikipedia.org/wiki/List_of_poker_hands) of a five card
433/// `PokerHand`.
434#[allow(clippy::module_name_repetitions)]
435#[derive(Serialize, Deserialize, Clone, Copy, Debug, EnumIter, Eq, Hash, Ord, PartialEq, PartialOrd)]
436pub enum HandRankName {
437    StraightFlush,
438    FourOfAKind,
439    FullHouse,
440    Flush,
441    Straight,
442    ThreeOfAKind,
443    TwoPair,
444    Pair,
445    HighCard,
446    Invalid,
447}
448
449/// `HandRankClass` represents the more specific type of the five card `PokerHand`.
450#[allow(clippy::module_name_repetitions)]
451#[derive(Serialize, Deserialize, Clone, Copy, Debug, EnumIter, Eq, Hash, Ord, PartialEq, PartialOrd)]
452pub enum HandRankClass {
453    RoyalFlush,
454    KingHighStraightFlush,
455    QueenHighStraightFlush,
456    JackHighStraightFlush,
457    TenHighStraightFlush,
458    NineHighStraightFlush,
459    EightHighStraightFlush,
460    SevenHighStraightFlush,
461    SixHighStraightFlush,
462    FiveHighStraightFlush,
463    FourAces,
464    FourKings,
465    FourQueens,
466    FourJacks,
467    FourTens,
468    FourNines,
469    FourEights,
470    FourSevens,
471    FourSixes,
472    FourFives,
473    FourFours,
474    FourTreys,
475    FourDeuces,
476    AcesOverKings,
477    AcesOverQueens,
478    AcesOverJacks,
479    AcesOverTens,
480    AcesOverNines,
481    AcesOverEights,
482    AcesOverSevens,
483    AcesOverSixes,
484    AcesOverFives,
485    AcesOverFours,
486    AcesOverTreys,
487    AcesOverDeuces,
488    KingsOverAces,
489    KingsOverQueens,
490    KingsOverJacks,
491    KingsOverTens,
492    KingsOverNines,
493    KingsOverEights,
494    KingsOverSevens,
495    KingsOverSixes,
496    KingsOverFives,
497    KingsOverFours,
498    KingsOverTreys,
499    KingsOverDeuces,
500    QueensOverAces,
501    QueensOverKings,
502    QueensOverJacks,
503    QueensOverTens,
504    QueensOverNines,
505    QueensOverEights,
506    QueensOverSevens,
507    QueensOverSixes,
508    QueensOverFives,
509    QueensOverFours,
510    QueensOverTreys,
511    QueensOverDeuces,
512    JacksOverAces,
513    JacksOverKings,
514    JacksOverQueens,
515    JacksOverTens,
516    JacksOverNines,
517    JacksOverEights,
518    JacksOverSevens,
519    JacksOverSixes,
520    JacksOverFives,
521    JacksOverFours,
522    JacksOverTreys,
523    JacksOverDeuces,
524    TensOverAces,
525    TensOverKings,
526    TensOverQueens,
527    TensOverJacks,
528    TensOverNines,
529    TensOverEights,
530    TensOverSevens,
531    TensOverSixes,
532    TensOverFives,
533    TensOverFours,
534    TensOverTreys,
535    TensOverDeuces,
536    NinesOverAces,
537    NinesOverKings,
538    NinesOverQueens,
539    NinesOverJacks,
540    NinesOverTens,
541    NinesOverEights,
542    NinesOverSevens,
543    NinesOverSixes,
544    NinesOverFives,
545    NinesOverFours,
546    NinesOverTreys,
547    NinesOverDeuces,
548    EightsOverAces,
549    EightsOverKings,
550    EightsOverQueens,
551    EightsOverJacks,
552    EightsOverTens,
553    EightsOverNines,
554    EightsOverSevens,
555    EightsOverSixes,
556    EightsOverFives,
557    EightsOverFours,
558    EightsOverTreys,
559    EightsOverDeuces,
560    SevensOverAces,
561    SevensOverKings,
562    SevensOverQueens,
563    SevensOverJacks,
564    SevensOverTens,
565    SevensOverNines,
566    SevensOverEights,
567    SevensOverSixes,
568    SevensOverFives,
569    SevensOverFours,
570    SevensOverTreys,
571    SevensOverDeuces,
572    SixesOverAces,
573    SixesOverKings,
574    SixesOverQueens,
575    SixesOverJacks,
576    SixesOverTens,
577    SixesOverNines,
578    SixesOverEights,
579    SixesOverSevens,
580    SixesOverFives,
581    SixesOverFours,
582    SixesOverTreys,
583    SixesOverDeuces,
584    FivesOverAces,
585    FivesOverKings,
586    FivesOverQueens,
587    FivesOverJacks,
588    FivesOverTens,
589    FivesOverNines,
590    FivesOverEights,
591    FivesOverSevens,
592    FivesOverSixes,
593    FivesOverFours,
594    FivesOverTreys,
595    FivesOverDeuces,
596    FoursOverAces,
597    FoursOverKings,
598    FoursOverQueens,
599    FoursOverJacks,
600    FoursOverTens,
601    FoursOverNines,
602    FoursOverEights,
603    FoursOverSevens,
604    FoursOverSixes,
605    FoursOverFives,
606    FoursOverTreys,
607    FoursOverDeuces,
608    TreysOverAces,
609    TreysOverKings,
610    TreysOverQueens,
611    TreysOverJacks,
612    TreysOverTens,
613    TreysOverNines,
614    TreysOverEights,
615    TreysOverSevens,
616    TreysOverSixes,
617    TreysOverFives,
618    TreysOverFours,
619    TreysOverDeuces,
620    DeucesOverAces,
621    DeucesOverKings,
622    DeucesOverQueens,
623    DeucesOverJacks,
624    DeucesOverTens,
625    DeucesOverNines,
626    DeucesOverEights,
627    DeucesOverSevens,
628    DeucesOverSixes,
629    DeucesOverFives,
630    DeucesOverFours,
631    DeucesOverTreys,
632    AceHighFlush,
633    KingHighFlush,
634    QueenHighFlush,
635    JackHighFlush,
636    TenHighFlush,
637    NineHighFlush,
638    EightHighFlush,
639    SevenHighFlush,
640    AceHighStraight,
641    KingHighStraight,
642    QueenHighStraight,
643    JackHighStraight,
644    TenHighStraight,
645    NineHighStraight,
646    EightHighStraight,
647    SevenHighStraight,
648    SixHighStraight,
649    FiveHighStraight,
650    ThreeAces,
651    ThreeKings,
652    ThreeQueens,
653    ThreeJacks,
654    ThreeTens,
655    ThreeNines,
656    ThreeEights,
657    ThreeSevens,
658    ThreeSixes,
659    ThreeFives,
660    ThreeFours,
661    ThreeTreys,
662    ThreeDeuces,
663    AcesAndKings,
664    AcesAndQueens,
665    AcesAndJacks,
666    AcesAndTens,
667    AcesAndNines,
668    AcesAndEights,
669    AcesAndSevens,
670    AcesAndSixes,
671    AcesAndFives,
672    AcesAndFours,
673    AcesAndTreys,
674    AcesAndDeuces,
675    KingsAndQueens,
676    KingsAndJacks,
677    KingsAndTens,
678    KingsAndNines,
679    KingsAndEights,
680    KingsAndSevens,
681    KingsAndSixes,
682    KingsAndFives,
683    KingsAndFours,
684    KingsAndTreys,
685    KingsAndDeuces,
686    QueensAndJacks,
687    QueensAndTens,
688    QueensAndNines,
689    QueensAndEights,
690    QueensAndSevens,
691    QueensAndSixes,
692    QueensAndFives,
693    QueensAndFours,
694    QueensAndTreys,
695    QueensAndDeuces,
696    JacksAndTens,
697    JacksAndNines,
698    JacksAndEights,
699    JacksAndSevens,
700    JacksAndSixes,
701    JacksAndFives,
702    JacksAndFours,
703    JacksAndTreys,
704    JacksAndDeuces,
705    TensAndNines,
706    TensAndEights,
707    TensAndSevens,
708    TensAndSixes,
709    TensAndFives,
710    TensAndFours,
711    TensAndTreys,
712    TensAndDeuces,
713    NinesAndEights,
714    NinesAndSevens,
715    NinesAndSixes,
716    NinesAndFives,
717    NinesAndFours,
718    NinesAndTreys,
719    NinesAndDeuces,
720    EightsAndSevens,
721    EightsAndSixes,
722    EightsAndFives,
723    EightsAndFours,
724    EightsAndTreys,
725    EightsAndDeuces,
726    SevensAndSixes,
727    SevensAndFives,
728    SevensAndFours,
729    SevensAndTreys,
730    SevensAndDeuces,
731    SixesAndFives,
732    SixesAndFours,
733    SixesAndTreys,
734    SixesAndDeuces,
735    FivesAndFours,
736    FivesAndTreys,
737    FivesAndDeuces,
738    FoursAndTreys,
739    FoursAndDeuces,
740    TreysAndDeuces,
741    PairOfAces,
742    PairOfKings,
743    PairOfQueens,
744    PairOfJacks,
745    PairOfTens,
746    PairOfNines,
747    PairOfEights,
748    PairOfSevens,
749    PairOfSixes,
750    PairOfFives,
751    PairOfFours,
752    PairOfTreys,
753    PairOfDeuces,
754    AceHigh,
755    KingHigh,
756    QueenHigh,
757    JackHigh,
758    TenHigh,
759    NineHigh,
760    EightHigh,
761    SevenHigh,
762    Invalid,
763}
764
765#[cfg(test)]
766#[allow(non_snake_case)]
767mod hand_rank_tests {
768    use super::*;
769    use crate::cards::five::Five;
770    use crate::cards::HandRanker;
771    use crate::parse::five_from_index;
772    use alloc::format;
773    use rstest::rstest;
774
775    #[test]
776    fn is_aligned() {
777        assert!(HandRank::from(0).is_a_valid_hand_rank());
778        assert!(HandRank::from(1).is_a_valid_hand_rank());
779    }
780
781    #[test]
782    fn is_aligned__false() {
783        let mut hr = HandRank::from(1);
784        hr.name = HandRankName::Flush;
785
786        assert!(!hr.is_a_valid_hand_rank());
787    }
788
789    #[test]
790    fn is_invalid() {
791        assert!(HandRank::from(0).is_invalid());
792        assert!(HandRank::from(7463).is_invalid());
793        assert!(HandRank::default().is_invalid());
794        assert!(!HandRank::from(6186).is_invalid());
795    }
796
797    #[test]
798    fn display() {
799        assert_eq!(
800            "HandRank { value: 1, name: StraightFlush, class: RoyalFlush }",
801            format!("{}", HandRank::from(1))
802        );
803    }
804
805    #[test]
806    fn ord() {
807        assert!(HandRank::from(1) > HandRank::from(2));
808        assert!(HandRank::from(2000) < HandRank::from(2));
809        assert!(HandRank::from(0) < HandRank::from(2));
810        assert_eq!(HandRank::from(2), HandRank::from(2));
811    }
812
813    #[rustfmt::skip]
814    #[rstest]
815    #[case("A♠ K♠ Q♠ J♠ T♠", 1, HandRankName::StraightFlush, HandRankClass::RoyalFlush)]
816    #[case("K♥ Q♥ J♥ T♥ 9♥", 2, HandRankName::StraightFlush, HandRankClass::KingHighStraightFlush)]
817    #[case("Q♦ J♦ T♦ 9♦ 8♦", 3, HandRankName::StraightFlush, HandRankClass::QueenHighStraightFlush)]
818    #[case("J♣ T♣ 9♣ 8♣ 7♣", 4, HandRankName::StraightFlush, HandRankClass::JackHighStraightFlush)]
819    #[case("T♤ 9♤ 8♤ 7♤ 6♤", 5, HandRankName::StraightFlush, HandRankClass::TenHighStraightFlush)]
820    #[case("9♡ 8♡ 7♡ 6♡ 5♡", 6, HandRankName::StraightFlush, HandRankClass::NineHighStraightFlush)]
821    #[case("8♧ 7♧ 6♧ 5♧ 4♧", 7, HandRankName::StraightFlush, HandRankClass::EightHighStraightFlush)]
822    #[case("7S 6S  5S 4S 3S", 8, HandRankName::StraightFlush, HandRankClass::SevenHighStraightFlush)]
823    #[case("6H 5H 4H 3H 2H", 9, HandRankName::StraightFlush, HandRankClass::SixHighStraightFlush)]
824    #[case("5D 4D 3D 2D AD", 10, HandRankName::StraightFlush, HandRankClass::FiveHighStraightFlush)]
825    #[case("AS AH AD AC KS", 11, HandRankName::FourOfAKind, HandRankClass::FourAces)]
826    #[case("AS AH AD AC 2S", 22, HandRankName::FourOfAKind, HandRankClass::FourAces)]
827    #[case("KS KH KD KC AS", 23, HandRankName::FourOfAKind, HandRankClass::FourKings)]
828    #[case("KS KH KD KC 2S", 34, HandRankName::FourOfAKind, HandRankClass::FourKings)]
829    #[case("QS QH QD QC AS", 35, HandRankName::FourOfAKind, HandRankClass::FourQueens)]
830    #[case("QS QH QD QC 2C", 46, HandRankName::FourOfAKind, HandRankClass::FourQueens)]
831    #[case("JS JH JD JC AC", 47, HandRankName::FourOfAKind, HandRankClass::FourJacks)]
832    #[case("JS JH JD JC 2C", 58, HandRankName::FourOfAKind, HandRankClass::FourJacks)]
833    #[case("TS TH TD TC AS", 59, HandRankName::FourOfAKind, HandRankClass::FourTens)]
834    #[case("TS TH TD TC 2C", 70, HandRankName::FourOfAKind, HandRankClass::FourTens)]
835    #[case("9S 9H 9D 9C AH", 71, HandRankName::FourOfAKind, HandRankClass::FourNines)]
836    #[case("9S 9H 9D 9C 2D", 82, HandRankName::FourOfAKind, HandRankClass::FourNines)]
837    #[case("8S 8H 8D 8C AD", 83, HandRankName::FourOfAKind, HandRankClass::FourEights)]
838    #[case("8S 8H 8D 8C 2D", 94, HandRankName::FourOfAKind, HandRankClass::FourEights)]
839    #[case("7S 7H 7D 7C AD", 95, HandRankName::FourOfAKind, HandRankClass::FourSevens)]
840    #[case("7S 7H 7D 7C 2D", 106, HandRankName::FourOfAKind, HandRankClass::FourSevens)]
841    #[case("6S 6H 6D 6C AD", 107, HandRankName::FourOfAKind, HandRankClass::FourSixes)]
842    #[case("6S 6H 6D 6C 2D", 118, HandRankName::FourOfAKind, HandRankClass::FourSixes)]
843    #[case("5S 5H 5D 5C AD", 119, HandRankName::FourOfAKind, HandRankClass::FourFives)]
844    #[case("5S 5H 5D 5C 2D", 130, HandRankName::FourOfAKind, HandRankClass::FourFives)]
845    #[case("4S 4H 4D 4C AD", 131, HandRankName::FourOfAKind, HandRankClass::FourFours)]
846    #[case("4S 4H 4D 4C 2D", 142, HandRankName::FourOfAKind, HandRankClass::FourFours)]
847    #[case("3S 3H 3D 3C AD", 143, HandRankName::FourOfAKind, HandRankClass::FourTreys)]
848    #[case("3S 3H 3D 3C 2D", 154, HandRankName::FourOfAKind, HandRankClass::FourTreys)]
849    #[case("2S 2H 2D 2C AC", 155, HandRankName::FourOfAKind, HandRankClass::FourDeuces)]
850    #[case("2S 2H 2D 2C 3D", 166, HandRankName::FourOfAKind, HandRankClass::FourDeuces)]
851    #[case("AS AH AD KC KD", 167, HandRankName::FullHouse, HandRankClass::AcesOverKings)]
852    #[case("AS AH AD QC QD", 168, HandRankName::FullHouse, HandRankClass::AcesOverQueens)]
853    #[case("AS AH AD JD JC", 169, HandRankName::FullHouse, HandRankClass::AcesOverJacks)]
854    #[case("AS AH AD TD TC", 170, HandRankName::FullHouse, HandRankClass::AcesOverTens)]
855    #[case("AS AH AD 9S 9D", 171, HandRankName::FullHouse, HandRankClass::AcesOverNines)]
856    #[case("AS AH AD 8S 8D", 172, HandRankName::FullHouse, HandRankClass::AcesOverEights)]
857    #[case("AS AH AD 7S 7D", 173, HandRankName::FullHouse, HandRankClass::AcesOverSevens)]
858    #[case("AS AH AD 6S 6D", 174, HandRankName::FullHouse, HandRankClass::AcesOverSixes)]
859    #[case("AS AH AD 5S 5D", 175, HandRankName::FullHouse, HandRankClass::AcesOverFives)]
860    #[case("AS AH AD 4S 4D", 176, HandRankName::FullHouse, HandRankClass::AcesOverFours)]
861    #[case("AS AH AD 3D 3c", 177, HandRankName::FullHouse, HandRankClass::AcesOverTreys)]
862    #[case("AS AH AD 2H 2D", 178, HandRankName::FullHouse, HandRankClass::AcesOverDeuces)]
863    #[case("AS AH KD KH KC", 179, HandRankName::FullHouse, HandRankClass::KingsOverAces)]
864    #[case("QS KH QD KC KD", 180, HandRankName::FullHouse, HandRankClass::KingsOverQueens)]
865    #[case("KS KH KD JH JD", 181, HandRankName::FullHouse, HandRankClass::KingsOverJacks)]
866    #[case("KS KH KD TH TD", 182, HandRankName::FullHouse, HandRankClass::KingsOverTens)]
867    #[case("KS KH KD 9H 9D", 183, HandRankName::FullHouse, HandRankClass::KingsOverNines)]
868    #[case("KS KH 8D 8H KD", 184, HandRankName::FullHouse, HandRankClass::KingsOverEights)]
869    #[case("KS KH KD 7H 7D", 185, HandRankName::FullHouse, HandRankClass::KingsOverSevens)]
870    #[case("KS KH KD 6H 6D", 186, HandRankName::FullHouse, HandRankClass::KingsOverSixes)]
871    #[case("KS KH KD 5H 5D", 187, HandRankName::FullHouse, HandRankClass::KingsOverFives)]
872    #[case("4S 4H KD KH KC", 188, HandRankName::FullHouse, HandRankClass::KingsOverFours)]
873    #[case("3S KH KD 3H KC", 189, HandRankName::FullHouse, HandRankClass::KingsOverTreys)]
874    #[case("KS KH KD 2H 2D", 190, HandRankName::FullHouse, HandRankClass::KingsOverDeuces)]
875    #[case("QS QH QD AH AD", 191, HandRankName::FullHouse, HandRankClass::QueensOverAces)]
876    #[case("QS QH QD KH KD", 192, HandRankName::FullHouse, HandRankClass::QueensOverKings)]
877    #[case("QS QH QD JH JD", 193, HandRankName::FullHouse, HandRankClass::QueensOverJacks)]
878    #[case("QS QH QD TH TD", 194, HandRankName::FullHouse, HandRankClass::QueensOverTens)]
879    #[case("QS QH QD 9H 9D", 195, HandRankName::FullHouse, HandRankClass::QueensOverNines)]
880    #[case("QS QH QD 8H 8D", 196, HandRankName::FullHouse, HandRankClass::QueensOverEights)]
881    #[case("QS QH QD 7H 7D", 197, HandRankName::FullHouse, HandRankClass::QueensOverSevens)]
882    #[case("QS QH QD 6H 6D", 198, HandRankName::FullHouse, HandRankClass::QueensOverSixes)]
883    #[case("QS QH QD 5H 5D", 199, HandRankName::FullHouse, HandRankClass::QueensOverFives)]
884    #[case("QS QH QD 4S 4D", 200, HandRankName::FullHouse, HandRankClass::QueensOverFours)]
885    #[case("QS QH QD 3H 3D", 201, HandRankName::FullHouse, HandRankClass::QueensOverTreys)]
886    #[case("QS QH QD 2H 2D", 202, HandRankName::FullHouse, HandRankClass::QueensOverDeuces)]
887    #[case("JS JH JD AH AD", 203, HandRankName::FullHouse, HandRankClass::JacksOverAces)]
888    #[case("JS JH JD KH KD", 204, HandRankName::FullHouse, HandRankClass::JacksOverKings)]
889    #[case("JS JH JD QH QD", 205, HandRankName::FullHouse, HandRankClass::JacksOverQueens)]
890    #[case("JS JH JD TH TD", 206, HandRankName::FullHouse, HandRankClass::JacksOverTens)]
891    #[case("JS JH JD 9H 9D", 207, HandRankName::FullHouse, HandRankClass::JacksOverNines)]
892    #[case("JS JH JD 8H 8D", 208, HandRankName::FullHouse, HandRankClass::JacksOverEights)]
893    #[case("JS JH JD 7H 7D", 209, HandRankName::FullHouse, HandRankClass::JacksOverSevens)]
894    #[case("JS JH JD 6H 6D", 210, HandRankName::FullHouse, HandRankClass::JacksOverSixes)]
895    #[case("JS JH JD 5H 5D", 211, HandRankName::FullHouse, HandRankClass::JacksOverFives)]
896    #[case("JS JH JD 4H 4D", 212, HandRankName::FullHouse, HandRankClass::JacksOverFours)]
897    #[case("JS JH JD 3H 3D", 213, HandRankName::FullHouse, HandRankClass::JacksOverTreys)]
898    #[case("JS JH JD 2H 2D", 214, HandRankName::FullHouse, HandRankClass::JacksOverDeuces)]
899    #[case("TS TH TD AH AD", 215, HandRankName::FullHouse, HandRankClass::TensOverAces)]
900    #[case("TS TH TD KH KD", 216, HandRankName::FullHouse, HandRankClass::TensOverKings)]
901    #[case("TS TH TD QH QD", 217, HandRankName::FullHouse, HandRankClass::TensOverQueens)]
902    #[case("TS TH TD JH JD", 218, HandRankName::FullHouse, HandRankClass::TensOverJacks)]
903    #[case("TS TH TD 9H 9D", 219, HandRankName::FullHouse, HandRankClass::TensOverNines)]
904    #[case("TS TH TD 8H 8D", 220, HandRankName::FullHouse, HandRankClass::TensOverEights)]
905    #[case("TS TH TD 7H 7D", 221, HandRankName::FullHouse, HandRankClass::TensOverSevens)]
906    #[case("TS TH TD 6S 6D", 222, HandRankName::FullHouse, HandRankClass::TensOverSixes)]
907    #[case("TS TH TD 5H 5D", 223, HandRankName::FullHouse, HandRankClass::TensOverFives)]
908    #[case("TS TH TD 4H 4D", 224, HandRankName::FullHouse, HandRankClass::TensOverFours)]
909    #[case("TS TH TD 3H 3D", 225, HandRankName::FullHouse, HandRankClass::TensOverTreys)]
910    #[case("TS TH TD 2H 2D", 226, HandRankName::FullHouse, HandRankClass::TensOverDeuces)]
911    #[case("9S 9H 9D AH AD", 227, HandRankName::FullHouse, HandRankClass::NinesOverAces)]
912    #[case("9S 9H 9D KH KD", 228, HandRankName::FullHouse, HandRankClass::NinesOverKings)]
913    #[case("9S 9H 9D QH QD", 229, HandRankName::FullHouse, HandRankClass::NinesOverQueens)]
914    #[case("9S 9H 9D JH JD", 230, HandRankName::FullHouse, HandRankClass::NinesOverJacks)]
915    #[case("9S 9H 9D TH TD", 231, HandRankName::FullHouse, HandRankClass::NinesOverTens)]
916    #[case("9S 9H 9D 8H 8D", 232, HandRankName::FullHouse, HandRankClass::NinesOverEights)]
917    #[case("9S 9H 9D 7H 7D", 233, HandRankName::FullHouse, HandRankClass::NinesOverSevens)]
918    #[case("9S 9H 9D 6S 6D", 234, HandRankName::FullHouse, HandRankClass::NinesOverSixes)]
919    #[case("9S 9H 9D 5H 5D", 235, HandRankName::FullHouse, HandRankClass::NinesOverFives)]
920    #[case("9S 9H 9D 4H 4D", 236, HandRankName::FullHouse, HandRankClass::NinesOverFours)]
921    #[case("9S 9H 9D 3H 3D", 237, HandRankName::FullHouse, HandRankClass::NinesOverTreys)]
922    #[case("9S 9H 9D 2H 2D", 238, HandRankName::FullHouse, HandRankClass::NinesOverDeuces)]
923    #[case("8S 8H 8D AH AD", 239, HandRankName::FullHouse, HandRankClass::EightsOverAces)]
924    #[case("8S 8H 8D KH KD", 240, HandRankName::FullHouse, HandRankClass::EightsOverKings)]
925    #[case("8S 8H 8D QH QD", 241, HandRankName::FullHouse, HandRankClass::EightsOverQueens)]
926    #[case("8S 8H 8D JH JD", 242, HandRankName::FullHouse, HandRankClass::EightsOverJacks)]
927    #[case("8S 8H 8D TH TD", 243, HandRankName::FullHouse, HandRankClass::EightsOverTens)]
928    #[case("8S 8H 8D 9H 9D", 244, HandRankName::FullHouse, HandRankClass::EightsOverNines)]
929    #[case("8S 8H 8D 7H 7D", 245, HandRankName::FullHouse, HandRankClass::EightsOverSevens)]
930    #[case("8S 8H 8D 6S 6D", 246, HandRankName::FullHouse, HandRankClass::EightsOverSixes)]
931    #[case("8S 8H 8D 5H 5D", 247, HandRankName::FullHouse, HandRankClass::EightsOverFives)]
932    #[case("8S 8H 8D 4H 4D", 248, HandRankName::FullHouse, HandRankClass::EightsOverFours)]
933    #[case("8S 8H 8D 3H 3D", 249, HandRankName::FullHouse, HandRankClass::EightsOverTreys)]
934    #[case("8S 8H 8D 2H 2D", 250, HandRankName::FullHouse, HandRankClass::EightsOverDeuces)]
935    #[case("7S 7H 7D AH AD", 251, HandRankName::FullHouse, HandRankClass::SevensOverAces)]
936    #[case("7S 7H 7D KH KD", 252, HandRankName::FullHouse, HandRankClass::SevensOverKings)]
937    #[case("7S 7H 7D QH QD", 253, HandRankName::FullHouse, HandRankClass::SevensOverQueens)]
938    #[case("7S 7H 7D JH JD", 254, HandRankName::FullHouse, HandRankClass::SevensOverJacks)]
939    #[case("7S 7H 7D TH TD", 255, HandRankName::FullHouse, HandRankClass::SevensOverTens)]
940    #[case("7S 7H 7D 9H 9D", 256, HandRankName::FullHouse, HandRankClass::SevensOverNines)]
941    #[case("7S 7H 7D 8H 8D", 257, HandRankName::FullHouse, HandRankClass::SevensOverEights)]
942    #[case("7S 7H 7D 6S 6D", 258, HandRankName::FullHouse, HandRankClass::SevensOverSixes)]
943    #[case("7S 7H 7D 5H 5D", 259, HandRankName::FullHouse, HandRankClass::SevensOverFives)]
944    #[case("7S 7H 7D 4H 4D", 260, HandRankName::FullHouse, HandRankClass::SevensOverFours)]
945    #[case("7S 7H 7D 3H 3D", 261, HandRankName::FullHouse, HandRankClass::SevensOverTreys)]
946    #[case("7S 7H 7D 2H 2D", 262, HandRankName::FullHouse, HandRankClass::SevensOverDeuces)]
947    #[case("6S 6H 6D AH AD", 263, HandRankName::FullHouse, HandRankClass::SixesOverAces)]
948    #[case("6S 6H 6D KH KD", 264, HandRankName::FullHouse, HandRankClass::SixesOverKings)]
949    #[case("6S 6H 6D QH QD", 265, HandRankName::FullHouse, HandRankClass::SixesOverQueens)]
950    #[case("6S 6H 6D JH JD", 266, HandRankName::FullHouse, HandRankClass::SixesOverJacks)]
951    #[case("6S 6H 6D TH TD", 267, HandRankName::FullHouse, HandRankClass::SixesOverTens)]
952    #[case("6S 6H 6D 9H 9D", 268, HandRankName::FullHouse, HandRankClass::SixesOverNines)]
953    #[case("6S 6H 6D 8H 8D", 269, HandRankName::FullHouse, HandRankClass::SixesOverEights)]
954    #[case("6S 6H 6D 7S 7D", 270, HandRankName::FullHouse, HandRankClass::SixesOverSevens)]
955    #[case("6S 6H 6D 5H 5D", 271, HandRankName::FullHouse, HandRankClass::SixesOverFives)]
956    #[case("6S 6H 6D 4H 4D", 272, HandRankName::FullHouse, HandRankClass::SixesOverFours)]
957    #[case("6S 6H 6D 3H 3D", 273, HandRankName::FullHouse, HandRankClass::SixesOverTreys)]
958    #[case("6S 6H 6D 2H 2D", 274, HandRankName::FullHouse, HandRankClass::SixesOverDeuces)]
959    #[case("5S 5H 5D AH AD", 275, HandRankName::FullHouse, HandRankClass::FivesOverAces)]
960    #[case("5S 5H 5D KH KD", 276, HandRankName::FullHouse, HandRankClass::FivesOverKings)]
961    #[case("5S 5H 5D QH QD", 277, HandRankName::FullHouse, HandRankClass::FivesOverQueens)]
962    #[case("5S 5H 5D JH JD", 278, HandRankName::FullHouse, HandRankClass::FivesOverJacks)]
963    #[case("5S 5H 5D TH TD", 279, HandRankName::FullHouse, HandRankClass::FivesOverTens)]
964    #[case("5S 5H 5D 9H 9D", 280, HandRankName::FullHouse, HandRankClass::FivesOverNines)]
965    #[case("5S 5H 5D 8H 8D", 281, HandRankName::FullHouse, HandRankClass::FivesOverEights)]
966    #[case("5S 5H 5D 7S 7D", 282, HandRankName::FullHouse, HandRankClass::FivesOverSevens)]
967    #[case("5S 5H 5D 6H 6D", 283, HandRankName::FullHouse, HandRankClass::FivesOverSixes)]
968    #[case("5S 5H 5D 4H 4D", 284, HandRankName::FullHouse, HandRankClass::FivesOverFours)]
969    #[case("5S 5H 5D 3H 3D", 285, HandRankName::FullHouse, HandRankClass::FivesOverTreys)]
970    #[case("5S 5H 5D 2H 2D", 286, HandRankName::FullHouse, HandRankClass::FivesOverDeuces)]
971    #[case("4S 4H 4D AH AD", 287, HandRankName::FullHouse, HandRankClass::FoursOverAces)]
972    #[case("4S 4H 4D KH KD", 288, HandRankName::FullHouse, HandRankClass::FoursOverKings)]
973    #[case("4S 4H 4D QH QD", 289, HandRankName::FullHouse, HandRankClass::FoursOverQueens)]
974    #[case("4S 4H 4D JH JD", 290, HandRankName::FullHouse, HandRankClass::FoursOverJacks)]
975    #[case("4S 4H 4D TH TD", 291, HandRankName::FullHouse, HandRankClass::FoursOverTens)]
976    #[case("4S 4H 4D 9H 9D", 292, HandRankName::FullHouse, HandRankClass::FoursOverNines)]
977    #[case("4S 4H 4D 8H 8D", 293, HandRankName::FullHouse, HandRankClass::FoursOverEights)]
978    #[case("4S 4H 4D 7S 7D", 294, HandRankName::FullHouse, HandRankClass::FoursOverSevens)]
979    #[case("4S 4H 4D 6H 6D", 295, HandRankName::FullHouse, HandRankClass::FoursOverSixes)]
980    #[case("4S 4H 4D 5H 5D", 296, HandRankName::FullHouse, HandRankClass::FoursOverFives)]
981    #[case("4S 4H 4D 3H 3D", 297, HandRankName::FullHouse, HandRankClass::FoursOverTreys)]
982    #[case("4S 4H 4D 2H 2D", 298, HandRankName::FullHouse, HandRankClass::FoursOverDeuces)]
983    #[case("3S 3H 3D AH AD", 299, HandRankName::FullHouse, HandRankClass::TreysOverAces)]
984    #[case("3S 3H 3D KH KD", 300, HandRankName::FullHouse, HandRankClass::TreysOverKings)]
985    #[case("3S 3H 3D QH QD", 301, HandRankName::FullHouse, HandRankClass::TreysOverQueens)]
986    #[case("3S 3H 3D JH JD", 302, HandRankName::FullHouse, HandRankClass::TreysOverJacks)]
987    #[case("3S 3H 3D TH TD", 303, HandRankName::FullHouse, HandRankClass::TreysOverTens)]
988    #[case("3S 3H 3D 9H 9D", 304, HandRankName::FullHouse, HandRankClass::TreysOverNines)]
989    #[case("3S 3H 3D 8H 8D", 305, HandRankName::FullHouse, HandRankClass::TreysOverEights)]
990    #[case("3S 3H 3D 7S 7D", 306, HandRankName::FullHouse, HandRankClass::TreysOverSevens)]
991    #[case("3S 3H 3D 6H 6D", 307, HandRankName::FullHouse, HandRankClass::TreysOverSixes)]
992    #[case("3S 3H 3D 5H 5D", 308, HandRankName::FullHouse, HandRankClass::TreysOverFives)]
993    #[case("3S 3H 3D 4H 4D", 309, HandRankName::FullHouse, HandRankClass::TreysOverFours)]
994    #[case("3S 3H 3D 2H 2D", 310, HandRankName::FullHouse, HandRankClass::TreysOverDeuces)]
995    #[case("2S 2H 2D AH AD", 311, HandRankName::FullHouse, HandRankClass::DeucesOverAces)]
996    #[case("2S 2H 2D KH KD", 312, HandRankName::FullHouse, HandRankClass::DeucesOverKings)]
997    #[case("2S 2H 2D QH QD", 313, HandRankName::FullHouse, HandRankClass::DeucesOverQueens)]
998    #[case("2S 2H 2D JH JD", 314, HandRankName::FullHouse, HandRankClass::DeucesOverJacks)]
999    #[case("2S 2H 2D TH TD", 315, HandRankName::FullHouse, HandRankClass::DeucesOverTens)]
1000    #[case("2S 2H 2D 9H 9D", 316, HandRankName::FullHouse, HandRankClass::DeucesOverNines)]
1001    #[case("2S 2H 2D 8H 8D", 317, HandRankName::FullHouse, HandRankClass::DeucesOverEights)]
1002    #[case("2S 2H 2D 7S 7D", 318, HandRankName::FullHouse, HandRankClass::DeucesOverSevens)]
1003    #[case("2S 2H 2D 6H 6D", 319, HandRankName::FullHouse, HandRankClass::DeucesOverSixes)]
1004    #[case("2S 2H 2D 5H 5D", 320, HandRankName::FullHouse, HandRankClass::DeucesOverFives)]
1005    #[case("2S 2H 2D 4H 4D", 321, HandRankName::FullHouse, HandRankClass::DeucesOverFours)]
1006    #[case("2S 2H 2D 3H 3D", 322, HandRankName::FullHouse, HandRankClass::DeucesOverTreys)]
1007    #[case("AS KS QS JS 9S", 323, HandRankName::Flush, HandRankClass::AceHighFlush)]
1008    #[case("AS 6S 4S 3S 2S", 815, HandRankName::Flush, HandRankClass::AceHighFlush)]
1009    #[case("KH QH JH TH 8H", 816, HandRankName::Flush, HandRankClass::KingHighFlush)]
1010    #[case("KC 5C 4C 3C 2C", 1144, HandRankName::Flush, HandRankClass::KingHighFlush)]
1011    #[case("QH JH TH 9H 7H", 1145, HandRankName::Flush, HandRankClass::QueenHighFlush)]
1012    #[case("QC 5C 4C 3C 2C", 1353, HandRankName::Flush, HandRankClass::QueenHighFlush)]
1013    #[case("JH TH 9H 8H 6H", 1354, HandRankName::Flush, HandRankClass::JackHighFlush)]
1014    #[case("JC 5C 4C 3C 2C", 1478, HandRankName::Flush, HandRankClass::JackHighFlush)]
1015    #[case("TH 9H 8H 7H 5H", 1479, HandRankName::Flush, HandRankClass::TenHighFlush)]
1016    #[case("TC 5C 4C 3C 2C", 1547, HandRankName::Flush, HandRankClass::TenHighFlush)]
1017    #[case("9H 8H 7H 6H 4H", 1548, HandRankName::Flush, HandRankClass::NineHighFlush)]
1018    #[case("9C 5C 4C 3C 2C", 1581, HandRankName::Flush, HandRankClass::NineHighFlush)]
1019    #[case("8H 7H 6H 5H 3H", 1582, HandRankName::Flush, HandRankClass::EightHighFlush)]
1020    #[case("8C 5C 4C 3C 2C", 1595, HandRankName::Flush, HandRankClass::EightHighFlush)]
1021    #[case("7H 6H 5H 4H 2H", 1596, HandRankName::Flush, HandRankClass::SevenHighFlush)]
1022    #[case("7C 5C 4C 3C 2C", 1599, HandRankName::Flush, HandRankClass::SevenHighFlush)]
1023    #[case("A♠ K♠ Q♥ J♠ T♠", 1600, HandRankName::Straight, HandRankClass::AceHighStraight)]
1024    #[case("K♥ Q♥ J♠ T♥ 9♥", 1601, HandRankName::Straight, HandRankClass::KingHighStraight)]
1025    #[case("Q♦ J♠ T♦ 9♦ 8♦", 1602, HandRankName::Straight, HandRankClass::QueenHighStraight)]
1026    #[case("J♣ T♣ 9♣ 8♠ 7♣", 1603, HandRankName::Straight, HandRankClass::JackHighStraight)]
1027    #[case("T♤ 9♤ 8♡ 7♤ 6♤", 1604, HandRankName::Straight, HandRankClass::TenHighStraight)]
1028    #[case("9♡ 8♤ 7♡ 6♡ 5♡", 1605, HandRankName::Straight, HandRankClass::NineHighStraight)]
1029    #[case("8♧ 7♧ 6♡ 5♧ 4♧", 1606, HandRankName::Straight, HandRankClass::EightHighStraight)]
1030    #[case("7S 6♥ 5S 4S 3S", 1607, HandRankName::Straight, HandRankClass::SevenHighStraight)]
1031    #[case("6H 5S 4H 3H 2H", 1608, HandRankName::Straight, HandRankClass::SixHighStraight)]
1032    #[case("5D 4D 3♥ 2D AD", 1609, HandRankName::Straight, HandRankClass::FiveHighStraight)]
1033    #[case("AS AD AC KS QD", 1610, HandRankName::ThreeOfAKind, HandRankClass::ThreeAces)]
1034    #[case("AS AD AC 3S 2D", 1675, HandRankName::ThreeOfAKind, HandRankClass::ThreeAces)]
1035    #[case("KS KH KC AD QD", 1676, HandRankName::ThreeOfAKind, HandRankClass::ThreeKings)]
1036    #[case("KS KH KC 3D 2D", 1741, HandRankName::ThreeOfAKind, HandRankClass::ThreeKings)]
1037    #[case("QH QD QC AD KS", 1742, HandRankName::ThreeOfAKind, HandRankClass::ThreeQueens)]
1038    #[case("QH QD QC 3D 2S", 1807, HandRankName::ThreeOfAKind, HandRankClass::ThreeQueens)]
1039    #[case("JS JD JC AD KS", 1808, HandRankName::ThreeOfAKind, HandRankClass::ThreeJacks)]
1040    #[case("JS JD JC 3D 2S", 1873, HandRankName::ThreeOfAKind, HandRankClass::ThreeJacks)]
1041    #[case("TH TD TC AD KD", 1874, HandRankName::ThreeOfAKind, HandRankClass::ThreeTens)]
1042    #[case("TH TD TC 3D 2D", 1939, HandRankName::ThreeOfAKind, HandRankClass::ThreeTens)]
1043    #[case("9H 9D 9C AD KD", 1940, HandRankName::ThreeOfAKind, HandRankClass::ThreeNines)]
1044    #[case("9H 9D 9C 3D 2D", 2005, HandRankName::ThreeOfAKind, HandRankClass::ThreeNines)]
1045    #[case("8H 8D 8C AD KD", 2006, HandRankName::ThreeOfAKind, HandRankClass::ThreeEights)]
1046    #[case("8H 8D 8C 3D 2D", 2071, HandRankName::ThreeOfAKind, HandRankClass::ThreeEights)]
1047    #[case("7H 7D 7C AS KD", 2072, HandRankName::ThreeOfAKind, HandRankClass::ThreeSevens)]
1048    #[case("7H 7D 7C 3S 2D", 2137, HandRankName::ThreeOfAKind, HandRankClass::ThreeSevens)]
1049    #[case("6H 6D 6C AS KD", 2138, HandRankName::ThreeOfAKind, HandRankClass::ThreeSixes)]
1050    #[case("6H 6D 6C 3S 2D", 2203, HandRankName::ThreeOfAKind, HandRankClass::ThreeSixes)]
1051    #[case("5S 5H 5C AD KD", 2204, HandRankName::ThreeOfAKind, HandRankClass::ThreeFives)]
1052    #[case("5S 5H 5C 3D 2D", 2269, HandRankName::ThreeOfAKind, HandRankClass::ThreeFives)]
1053    #[case("4S 4H 4C AD KD", 2270, HandRankName::ThreeOfAKind, HandRankClass::ThreeFours)]
1054    #[case("4S 4H 4C 3D 2D", 2335, HandRankName::ThreeOfAKind, HandRankClass::ThreeFours)]
1055    #[case("3S 3H 3C AD KD", 2336, HandRankName::ThreeOfAKind, HandRankClass::ThreeTreys)]
1056    #[case("3S 3D 3C 4D 2D", 2401, HandRankName::ThreeOfAKind, HandRankClass::ThreeTreys)]
1057    #[case("2S 2H 2C AD KD", 2402, HandRankName::ThreeOfAKind, HandRankClass::ThreeDeuces)]
1058    #[case("2S 2H 2C 4S 3C", 2467, HandRankName::ThreeOfAKind, HandRankClass::ThreeDeuces)]
1059    #[case("AS AD KS KH Q♥", 2468, HandRankName::TwoPair, HandRankClass::AcesAndKings)]
1060    #[case("AS AD KS KH 2♥", 2478, HandRankName::TwoPair, HandRankClass::AcesAndKings)]
1061    #[case("AS AD QS QH K♥", 2479, HandRankName::TwoPair, HandRankClass::AcesAndQueens)]
1062    #[case("AS AD QS QH 2♥", 2489, HandRankName::TwoPair, HandRankClass::AcesAndQueens)]
1063    #[case("AS AD JS JH K♥", 2490, HandRankName::TwoPair, HandRankClass::AcesAndJacks)]
1064    #[case("AS AD JS JH 2♥", 2500, HandRankName::TwoPair, HandRankClass::AcesAndJacks)]
1065    #[case("AS AD TS TH K♥", 2501, HandRankName::TwoPair, HandRankClass::AcesAndTens)]
1066    #[case("AS AD TS TH 2♥", 2511, HandRankName::TwoPair, HandRankClass::AcesAndTens)]
1067    #[case("AS AD 9S 9H K♥", 2512, HandRankName::TwoPair, HandRankClass::AcesAndNines)]
1068    #[case("AS AD 9S 9H 2♥", 2522, HandRankName::TwoPair, HandRankClass::AcesAndNines)]
1069    #[case("AS AD 8S 8H K♥", 2523, HandRankName::TwoPair, HandRankClass::AcesAndEights)]
1070    #[case("AS AD 8S 8H 2♥", 2533, HandRankName::TwoPair, HandRankClass::AcesAndEights)]
1071    #[case("AS AD 7S 7H K♥", 2534, HandRankName::TwoPair, HandRankClass::AcesAndSevens)]
1072    #[case("AS AD 7S 7H 2♥", 2544, HandRankName::TwoPair, HandRankClass::AcesAndSevens)]
1073    #[case("AS AD 6S 6H K♥", 2545, HandRankName::TwoPair, HandRankClass::AcesAndSixes)]
1074    #[case("AS AD 6S 6H 2♥", 2555, HandRankName::TwoPair, HandRankClass::AcesAndSixes)]
1075    #[case("AS AD 5S 5H K♥", 2556, HandRankName::TwoPair, HandRankClass::AcesAndFives)]
1076    #[case("AS AD 5S 5H 2♥", 2566, HandRankName::TwoPair, HandRankClass::AcesAndFives)]
1077    #[case("AS AD 4S 4H K♥", 2567, HandRankName::TwoPair, HandRankClass::AcesAndFours)]
1078    #[case("AS AD 4S 4H 2♥", 2577, HandRankName::TwoPair, HandRankClass::AcesAndFours)]
1079    #[case("AS AD 3S 3H K♥", 2578, HandRankName::TwoPair, HandRankClass::AcesAndTreys)]
1080    #[case("AS AD 3S 3H 2♥", 2588, HandRankName::TwoPair, HandRankClass::AcesAndTreys)]
1081    #[case("AS AD 2S 2H K♥", 2589, HandRankName::TwoPair, HandRankClass::AcesAndDeuces)]
1082    #[case("AS AD 2S 2H 3♥", 2599, HandRankName::TwoPair, HandRankClass::AcesAndDeuces)]
1083    #[case("KS KH Q♥ QD AC", 2600, HandRankName::TwoPair, HandRankClass::KingsAndQueens)]
1084    #[case("KS KH Q♥ QD 2♥", 2610, HandRankName::TwoPair, HandRankClass::KingsAndQueens)]
1085    #[case("KS KH J♥ JD AC", 2611, HandRankName::TwoPair, HandRankClass::KingsAndJacks)]
1086    #[case("KS KH J♥ JD 2♥", 2621, HandRankName::TwoPair, HandRankClass::KingsAndJacks)]
1087    #[case("KS KH T♥ TD AC", 2622, HandRankName::TwoPair, HandRankClass::KingsAndTens)]
1088    #[case("KS KH T♥ TD 2♥", 2632, HandRankName::TwoPair, HandRankClass::KingsAndTens)]
1089    #[case("KS KH 9♥ 9D AC", 2633, HandRankName::TwoPair, HandRankClass::KingsAndNines)]
1090    #[case("KS KH 9♥ 9D 2♥", 2643, HandRankName::TwoPair, HandRankClass::KingsAndNines)]
1091    #[case("KS KH 8♥ 8D AC", 2644, HandRankName::TwoPair, HandRankClass::KingsAndEights)]
1092    #[case("KS KH 8♥ 8D 2♥", 2654, HandRankName::TwoPair, HandRankClass::KingsAndEights)]
1093    #[case("KS KH 7♥ 7D AC", 2655, HandRankName::TwoPair, HandRankClass::KingsAndSevens)]
1094    #[case("KS KH 7♥ 7D 2♥", 2665, HandRankName::TwoPair, HandRankClass::KingsAndSevens)]
1095    #[case("KS KH 6♥ 6D AC", 2666, HandRankName::TwoPair, HandRankClass::KingsAndSixes)]
1096    #[case("KS KH 6♥ 6D 2♥", 2676, HandRankName::TwoPair, HandRankClass::KingsAndSixes)]
1097    #[case("KS KH 5♥ 5D AC", 2677, HandRankName::TwoPair, HandRankClass::KingsAndFives)]
1098    #[case("KS KH 5♥ 5D 2♥", 2687, HandRankName::TwoPair, HandRankClass::KingsAndFives)]
1099    #[case("KS KH 4♥ 4D AC", 2688, HandRankName::TwoPair, HandRankClass::KingsAndFours)]
1100    #[case("KS KH 4♥ 4D 2♥", 2698, HandRankName::TwoPair, HandRankClass::KingsAndFours)]
1101    #[case("KS KH 3♥ 3D AC", 2699, HandRankName::TwoPair, HandRankClass::KingsAndTreys)]
1102    #[case("KS KH 3♥ 3D 2♥", 2709, HandRankName::TwoPair, HandRankClass::KingsAndTreys)]
1103    #[case("KS KH 2♥ 2D AC", 2710, HandRankName::TwoPair, HandRankClass::KingsAndDeuces)]
1104    #[case("KS KH 2♥ 2D 3♥", 2720, HandRankName::TwoPair, HandRankClass::KingsAndDeuces)]
1105    #[case("QS QH J♥ JD AC", 2721, HandRankName::TwoPair, HandRankClass::QueensAndJacks)]
1106    #[case("QS QH J♥ JD 2♥", 2731, HandRankName::TwoPair, HandRankClass::QueensAndJacks)]
1107    #[case("QS QH T♥ TD AC", 2732, HandRankName::TwoPair, HandRankClass::QueensAndTens)]
1108    #[case("QS QH T♥ TD 2♥", 2742, HandRankName::TwoPair, HandRankClass::QueensAndTens)]
1109    #[case("QS QH 9♥ 9D AC", 2743, HandRankName::TwoPair, HandRankClass::QueensAndNines)]
1110    #[case("QS QH 9♥ 9D 2♥", 2753, HandRankName::TwoPair, HandRankClass::QueensAndNines)]
1111    #[case("QS QH 8♥ 8D AC", 2754, HandRankName::TwoPair, HandRankClass::QueensAndEights)]
1112    #[case("QS QH 8♥ 8D 2♥", 2764, HandRankName::TwoPair, HandRankClass::QueensAndEights)]
1113    #[case("QS QH 7♥ 7D AC", 2765, HandRankName::TwoPair, HandRankClass::QueensAndSevens)]
1114    #[case("QS QH 7♥ 7D 2♥", 2775, HandRankName::TwoPair, HandRankClass::QueensAndSevens)]
1115    #[case("QS QH 6♥ 6D AC", 2776, HandRankName::TwoPair, HandRankClass::QueensAndSixes)]
1116    #[case("QS QH 6♥ 6D 2♥", 2786, HandRankName::TwoPair, HandRankClass::QueensAndSixes)]
1117    #[case("QS QH 5♥ 5D AC", 2787, HandRankName::TwoPair, HandRankClass::QueensAndFives)]
1118    #[case("QS QH 5♥ 5D 2♥", 2797, HandRankName::TwoPair, HandRankClass::QueensAndFives)]
1119    #[case("QS QH 4♥ 4D AC", 2798, HandRankName::TwoPair, HandRankClass::QueensAndFours)]
1120    #[case("QS QH 4♥ 4D 2♥", 2808, HandRankName::TwoPair, HandRankClass::QueensAndFours)]
1121    #[case("QS QH 3♥ 3D AC", 2809, HandRankName::TwoPair, HandRankClass::QueensAndTreys)]
1122    #[case("QS QH 3♥ 3D 2♥", 2819, HandRankName::TwoPair, HandRankClass::QueensAndTreys)]
1123    #[case("QS QH 2♥ 2D AC", 2820, HandRankName::TwoPair, HandRankClass::QueensAndDeuces)]
1124    #[case("QS QH 2♥ 2D 3♥", 2830, HandRankName::TwoPair, HandRankClass::QueensAndDeuces)]
1125    #[case("JS JH T♥ TD AC", 2831, HandRankName::TwoPair, HandRankClass::JacksAndTens)]
1126    #[case("JS JH T♥ TD 2♥", 2841, HandRankName::TwoPair, HandRankClass::JacksAndTens)]
1127    #[case("JS JH 9♥ 9D AC", 2842, HandRankName::TwoPair, HandRankClass::JacksAndNines)]
1128    #[case("JS JH 9♥ 9D 2♥", 2852, HandRankName::TwoPair, HandRankClass::JacksAndNines)]
1129    #[case("JS JH 8♥ 8D AC", 2853, HandRankName::TwoPair, HandRankClass::JacksAndEights)]
1130    #[case("JS JH 8♥ 8D 2♥", 2863, HandRankName::TwoPair, HandRankClass::JacksAndEights)]
1131    #[case("JS JH 7♥ 7D AC", 2864, HandRankName::TwoPair, HandRankClass::JacksAndSevens)]
1132    #[case("JS JH 7♥ 7D 2♥", 2874, HandRankName::TwoPair, HandRankClass::JacksAndSevens)]
1133    #[case("JS JH 6♥ 6D AC", 2875, HandRankName::TwoPair, HandRankClass::JacksAndSixes)]
1134    #[case("JS JH 6♥ 6D 2♥", 2885, HandRankName::TwoPair, HandRankClass::JacksAndSixes)]
1135    #[case("JS JH 5♥ 5D AC", 2886, HandRankName::TwoPair, HandRankClass::JacksAndFives)]
1136    #[case("JS JH 5♥ 5D 2♥", 2896, HandRankName::TwoPair, HandRankClass::JacksAndFives)]
1137    #[case("JS JH 4♥ 4D AC", 2897, HandRankName::TwoPair, HandRankClass::JacksAndFours)]
1138    #[case("JS JH 4♥ 4D 2♥", 2907, HandRankName::TwoPair, HandRankClass::JacksAndFours)]
1139    #[case("JS JH 3♥ 3D AC", 2908, HandRankName::TwoPair, HandRankClass::JacksAndTreys)]
1140    #[case("JS JH 3♥ 3D 2♥", 2918, HandRankName::TwoPair, HandRankClass::JacksAndTreys)]
1141    #[case("JS JH 2♥ 2D AC", 2919, HandRankName::TwoPair, HandRankClass::JacksAndDeuces)]
1142    #[case("JS JH 2♥ 2D 3♥", 2929, HandRankName::TwoPair, HandRankClass::JacksAndDeuces)]
1143    #[case("TS TH 9♥ 9D AC", 2930, HandRankName::TwoPair, HandRankClass::TensAndNines)]
1144    #[case("TS TH 9♥ 9D 2♥", 2940, HandRankName::TwoPair, HandRankClass::TensAndNines)]
1145    #[case("TS TH 8♥ 8D AC", 2941, HandRankName::TwoPair, HandRankClass::TensAndEights)]
1146    #[case("TS TH 8♥ 8D 2♥", 2951, HandRankName::TwoPair, HandRankClass::TensAndEights)]
1147    #[case("TS TH 7♥ 7D AC", 2952, HandRankName::TwoPair, HandRankClass::TensAndSevens)]
1148    #[case("TS TH 7♥ 7D 2♥", 2962, HandRankName::TwoPair, HandRankClass::TensAndSevens)]
1149    #[case("TS TH 6♥ 6D AC", 2963, HandRankName::TwoPair, HandRankClass::TensAndSixes)]
1150    #[case("TS TH 6♥ 6D 2♥", 2973, HandRankName::TwoPair, HandRankClass::TensAndSixes)]
1151    #[case("TS TH 5♥ 5D AC", 2974, HandRankName::TwoPair, HandRankClass::TensAndFives)]
1152    #[case("TS TH 5♥ 5D 2♥", 2984, HandRankName::TwoPair, HandRankClass::TensAndFives)]
1153    #[case("TS TH 4♥ 4D AC", 2985, HandRankName::TwoPair, HandRankClass::TensAndFours)]
1154    #[case("TS TH 4♥ 4D 2♥", 2995, HandRankName::TwoPair, HandRankClass::TensAndFours)]
1155    #[case("TS TH 3♥ 3D AC", 2996, HandRankName::TwoPair, HandRankClass::TensAndTreys)]
1156    #[case("TS TH 3♥ 3D 2♥", 3006, HandRankName::TwoPair, HandRankClass::TensAndTreys)]
1157    #[case("TS TH 2♥ 2D AC", 3007, HandRankName::TwoPair, HandRankClass::TensAndDeuces)]
1158    #[case("TS TH 2♥ 2D 3♥", 3017, HandRankName::TwoPair, HandRankClass::TensAndDeuces)]
1159    #[case("9S 9H 8♥ 8D AC", 3018, HandRankName::TwoPair, HandRankClass::NinesAndEights)]
1160    #[case("9S 9H 8♥ 8D 2♥", 3028, HandRankName::TwoPair, HandRankClass::NinesAndEights)]
1161    #[case("9S 9H 7♥ 7D AC", 3029, HandRankName::TwoPair, HandRankClass::NinesAndSevens)]
1162    #[case("9S 9H 7♥ 7D 2♥", 3039, HandRankName::TwoPair, HandRankClass::NinesAndSevens)]
1163    #[case("9S 9H 6♥ 6D AC", 3040, HandRankName::TwoPair, HandRankClass::NinesAndSixes)]
1164    #[case("9S 9H 6♥ 6D 2♥", 3050, HandRankName::TwoPair, HandRankClass::NinesAndSixes)]
1165    #[case("9S 9H 5♥ 5D AC", 3051, HandRankName::TwoPair, HandRankClass::NinesAndFives)]
1166    #[case("9S 9H 5♥ 5D 2♥", 3061, HandRankName::TwoPair, HandRankClass::NinesAndFives)]
1167    #[case("9S 9H 4♥ 4D AC", 3062, HandRankName::TwoPair, HandRankClass::NinesAndFours)]
1168    #[case("9S 9H 4♥ 4D 2♥", 3072, HandRankName::TwoPair, HandRankClass::NinesAndFours)]
1169    #[case("9S 9H 3♥ 3D AC", 3073, HandRankName::TwoPair, HandRankClass::NinesAndTreys)]
1170    #[case("9S 9H 3♥ 3D 2♥", 3083, HandRankName::TwoPair, HandRankClass::NinesAndTreys)]
1171    #[case("9S 9H 2♥ 2D AC", 3084, HandRankName::TwoPair, HandRankClass::NinesAndDeuces)]
1172    #[case("9S 9H 2♥ 2D 3♥", 3094, HandRankName::TwoPair, HandRankClass::NinesAndDeuces)]
1173    #[case("8S 8H 7♥ 7D AC", 3095, HandRankName::TwoPair, HandRankClass::EightsAndSevens)]
1174    #[case("8S 8H 7♥ 7D 2♥", 3105, HandRankName::TwoPair, HandRankClass::EightsAndSevens)]
1175    #[case("8S 8H 6♥ 6D AC", 3106, HandRankName::TwoPair, HandRankClass::EightsAndSixes)]
1176    #[case("8S 8H 6♥ 6D 2♥", 3116, HandRankName::TwoPair, HandRankClass::EightsAndSixes)]
1177    #[case("8S 8H 5♥ 5D AC", 3117, HandRankName::TwoPair, HandRankClass::EightsAndFives)]
1178    #[case("8S 8H 5♥ 5D 2♥", 3127, HandRankName::TwoPair, HandRankClass::EightsAndFives)]
1179    #[case("8S 8H 4♥ 4D AC", 3128, HandRankName::TwoPair, HandRankClass::EightsAndFours)]
1180    #[case("8S 8H 4♥ 4D 2♥", 3138, HandRankName::TwoPair, HandRankClass::EightsAndFours)]
1181    #[case("8S 8H 3♥ 3D AC", 3139, HandRankName::TwoPair, HandRankClass::EightsAndTreys)]
1182    #[case("8S 8H 3♥ 3D 2♥", 3149, HandRankName::TwoPair, HandRankClass::EightsAndTreys)]
1183    #[case("8S 8H 2♥ 2D AC", 3150, HandRankName::TwoPair, HandRankClass::EightsAndDeuces)]
1184    #[case("8S 8H 2♥ 2D 3♥", 3160, HandRankName::TwoPair, HandRankClass::EightsAndDeuces)]
1185    #[case("7♥ 7D 6S 6C A♥", 3161, HandRankName::TwoPair, HandRankClass::SevensAndSixes)]
1186    #[case("7♥ 7D 6S 6♥ 2D", 3171, HandRankName::TwoPair, HandRankClass::SevensAndSixes)]
1187    #[case("7♥ 7D 5S 5C A♥", 3172, HandRankName::TwoPair, HandRankClass::SevensAndFives)]
1188    #[case("7♥ 7D 5S 5♥ 2D", 3182, HandRankName::TwoPair, HandRankClass::SevensAndFives)]
1189    #[case("7♥ 7D 4S 4C A♥", 3183, HandRankName::TwoPair, HandRankClass::SevensAndFours)]
1190    #[case("7♥ 7D 4S 4♥ 2D", 3193, HandRankName::TwoPair, HandRankClass::SevensAndFours)]
1191    #[case("7♥ 7D 3S 3C A♥", 3194, HandRankName::TwoPair, HandRankClass::SevensAndTreys)]
1192    #[case("7♥ 7D 3S 3♥ 2D", 3204, HandRankName::TwoPair, HandRankClass::SevensAndTreys)]
1193    #[case("7♥ 7D 2S 2C A♥", 3205, HandRankName::TwoPair, HandRankClass::SevensAndDeuces)]
1194    #[case("7♥ 7D 2S 2♥ 3D", 3215, HandRankName::TwoPair, HandRankClass::SevensAndDeuces)]
1195    #[case("6♥ 6D 5S 5C A♥", 3216, HandRankName::TwoPair, HandRankClass::SixesAndFives)]
1196    #[case("6♥ 6D 5S 5♥ 2D", 3226, HandRankName::TwoPair, HandRankClass::SixesAndFives)]
1197    #[case("6♥ 6D 4S 4C A♥", 3227, HandRankName::TwoPair, HandRankClass::SixesAndFours)]
1198    #[case("6♥ 6D 4S 4♥ 2D", 3237, HandRankName::TwoPair, HandRankClass::SixesAndFours)]
1199    #[case("6♥ 6D 3S 3C A♥", 3238, HandRankName::TwoPair, HandRankClass::SixesAndTreys)]
1200    #[case("6♥ 6D 3S 3♥ 2D", 3248, HandRankName::TwoPair, HandRankClass::SixesAndTreys)]
1201    #[case("6♥ 6D 2S 2C A♥", 3249, HandRankName::TwoPair, HandRankClass::SixesAndDeuces)]
1202    #[case("6♥ 6D 2S 2♥ 3D", 3259, HandRankName::TwoPair, HandRankClass::SixesAndDeuces)]
1203    #[case("5S 5C 4S 4D A♥", 3260, HandRankName::TwoPair, HandRankClass::FivesAndFours)]
1204    #[case("5S 5♥ 4S 4C 2D", 3270, HandRankName::TwoPair, HandRankClass::FivesAndFours)]
1205    #[case("5S 5C 3S 3D A♥", 3271, HandRankName::TwoPair, HandRankClass::FivesAndTreys)]
1206    #[case("5S 5♥ 3S 3C 2D", 3281, HandRankName::TwoPair, HandRankClass::FivesAndTreys)]
1207    #[case("5S 5C 2S 2D A♥", 3282, HandRankName::TwoPair, HandRankClass::FivesAndDeuces)]
1208    #[case("5S 5♥ 2S 2C 3D", 3292, HandRankName::TwoPair, HandRankClass::FivesAndDeuces)]
1209    #[case("4♥ 4D 3S 3C A♥", 3293, HandRankName::TwoPair, HandRankClass::FoursAndTreys)]
1210    #[case("4♥ 4D 3S 3♥ 2D", 3303, HandRankName::TwoPair, HandRankClass::FoursAndTreys)]
1211    #[case("4♥ 4D 2S 2C A♥", 3304, HandRankName::TwoPair, HandRankClass::FoursAndDeuces)]
1212    #[case("4♥ 4D 2S 2♥ 3D", 3314, HandRankName::TwoPair, HandRankClass::FoursAndDeuces)]
1213    #[case("3♥ 3D 2S 2C A♥", 3315, HandRankName::TwoPair, HandRankClass::TreysAndDeuces)]
1214    #[case("3♥ 3D 2S 2♥ 4D", 3325, HandRankName::TwoPair, HandRankClass::TreysAndDeuces)]
1215    #[case("A♥ AD KS Q♥ JD", 3326, HandRankName::Pair, HandRankClass::PairOfAces)]
1216    #[case("A♥ AD 4S 3♥ 2D", 3545, HandRankName::Pair, HandRankClass::PairOfAces)]
1217    #[case("K♥ KD AS Q♥ JD", 3546, HandRankName::Pair, HandRankClass::PairOfKings)]
1218    #[case("K♥ KD 4S 3♥ 2D", 3765, HandRankName::Pair, HandRankClass::PairOfKings)]
1219    #[case("Q♥ QD AS K♥ JD", 3766, HandRankName::Pair, HandRankClass::PairOfQueens)]
1220    #[case("Q♥ QD 4S 3♥ 2D", 3985, HandRankName::Pair, HandRankClass::PairOfQueens)]
1221    #[case("J♥ JD AS K♥ QD", 3986, HandRankName::Pair, HandRankClass::PairOfJacks)]
1222    #[case("J♥ JD 4S 3♥ 2D", 4205, HandRankName::Pair, HandRankClass::PairOfJacks)]
1223    #[case("T♥ TD AS K♥ QD", 4206, HandRankName::Pair, HandRankClass::PairOfTens)]
1224    #[case("T♥ TD 4S 3♥ 2D", 4425, HandRankName::Pair, HandRankClass::PairOfTens)]
1225    #[case("9♥ 9D AS K♥ QD", 4426, HandRankName::Pair, HandRankClass::PairOfNines)]
1226    #[case("9♥ 9D 4S 3♥ 2D", 4645, HandRankName::Pair, HandRankClass::PairOfNines)]
1227    #[case("8♥ 8D AS K♥ QD", 4646, HandRankName::Pair, HandRankClass::PairOfEights)]
1228    #[case("8♥ 8D 4S 3♥ 2D", 4865, HandRankName::Pair, HandRankClass::PairOfEights)]
1229    #[case("7♥ 7D AS K♥ QD", 4866, HandRankName::Pair, HandRankClass::PairOfSevens)]
1230    #[case("7♥ 7D 4S 3♥ 2D", 5085, HandRankName::Pair, HandRankClass::PairOfSevens)]
1231    #[case("6♥ 6D AS K♥ QD", 5086, HandRankName::Pair, HandRankClass::PairOfSixes)]
1232    #[case("6♥ 6D 4S 3♥ 2D", 5305, HandRankName::Pair, HandRankClass::PairOfSixes)]
1233    #[case("5♥ 5D AS K♥ QD", 5306, HandRankName::Pair, HandRankClass::PairOfFives)]
1234    #[case("5♥ 5D 4S 3♥ 2D", 5525, HandRankName::Pair, HandRankClass::PairOfFives)]
1235    #[case("4♥ 4D AS K♥ QD", 5526, HandRankName::Pair, HandRankClass::PairOfFours)]
1236    #[case("4♥ 4D 5S 3♥ 2D", 5745, HandRankName::Pair, HandRankClass::PairOfFours)]
1237    #[case("3♥ 3D AS K♥ QD", 5746, HandRankName::Pair, HandRankClass::PairOfTreys)]
1238    #[case("3♥ 3D 5S 4♥ 2D", 5965, HandRankName::Pair, HandRankClass::PairOfTreys)]
1239    #[case("2♥ 2D AS K♥ QD", 5966, HandRankName::Pair, HandRankClass::PairOfDeuces)]
1240    #[case("2♥ 2D 5S 4♥ 3D", 6185, HandRankName::Pair, HandRankClass::PairOfDeuces)]
1241    #[case("AD KD Q♥ JD 9D", 6186, HandRankName::HighCard, HandRankClass::AceHigh)]
1242    #[case("AD 6D 4♥ 3D 2D", 6678, HandRankName::HighCard, HandRankClass::AceHigh)]
1243    #[case("KD Q♥ JD TD 8C", 6679, HandRankName::HighCard, HandRankClass::KingHigh)]
1244    #[case("KD 5D 4♥ 3D 2D", 7007, HandRankName::HighCard, HandRankClass::KingHigh)]
1245    #[case("Q♥ JD TD 9C 7D", 7008, HandRankName::HighCard, HandRankClass::QueenHigh)]
1246    #[case("QD 5D 4♥ 3D 2D", 7216, HandRankName::HighCard, HandRankClass::QueenHigh)]
1247    #[case("JD TD 9C 8D 6C", 7217, HandRankName::HighCard, HandRankClass::JackHigh)]
1248    #[case("JD 5D 4♥ 3D 2D", 7341, HandRankName::HighCard, HandRankClass::JackHigh)]
1249    #[case("TD 9C 8D 7C 5S", 7342, HandRankName::HighCard, HandRankClass::TenHigh)]
1250    #[case("TD 5D 4♥ 3D 2D", 7410, HandRankName::HighCard, HandRankClass::TenHigh)]
1251    #[case("9C 8D 7C 6S 4D", 7411, HandRankName::HighCard, HandRankClass::NineHigh)]
1252    #[case("9D 5D 4♥ 3D 2D", 7444, HandRankName::HighCard, HandRankClass::NineHigh)]
1253    #[case("8D 7C 6S 5D 3H", 7445, HandRankName::HighCard, HandRankClass::EightHigh)]
1254    #[case("8D 5D 4♥ 3D 2D", 7458, HandRankName::HighCard, HandRankClass::EightHigh)]
1255    #[case("7C 6S 5D 4H 2C", 7459, HandRankName::HighCard, HandRankClass::SevenHigh)]
1256    #[case("7D 5D 4♥ 3D 2D", 7462, HandRankName::HighCard, HandRankClass::SevenHigh)]
1257    #[case("A♠ A♠ Q♠ J♠ T♠", 0, HandRankName::Invalid, HandRankClass::Invalid)]
1258    fn determine_class(
1259        #[case] index: &'static str,
1260        #[case] hand_rank_value: HandRankValue,
1261        #[case] hand_rank_name: HandRankName,
1262        #[case] hand_rank_class: HandRankClass,
1263    ) {
1264        let hand = Five::try_from(index).unwrap();
1265
1266        let hand_rank = hand.hand_rank();
1267
1268        assert_eq!(hand_rank_value, hand_rank.value);
1269        assert_eq!(hand_rank_name, hand_rank.name);
1270        assert_eq!(hand_rank_class, hand_rank.class);
1271        assert_eq!(HandRank::determine_class(&hand_rank_value), hand_rank_class);
1272    }
1273
1274    /// This test verifies that an invalid hand passed in to be evaluated returns an invalid hand
1275    /// with a `HandRankValue` of zero. **NOTE:** not all invalid hand combinations have been
1276    /// verified.
1277    ///
1278    /// ```
1279    /// let invalid_5deuces_hand = CactusKevHand::from_index("2S 2H 2D 2C 2D").unwrap();
1280    /// assert!(invalid_5deuces_hand.is_invalid());
1281    /// ```
1282    #[test]
1283    fn panic_isolation() {
1284        let invalid_hand = five_from_index("2S 2H 2D 2C 2D").unwrap();
1285
1286        let invalid_result = HandRank::from(crate::evaluate::five_cards(invalid_hand));
1287
1288        assert_eq!(invalid_result, HandRank::default());
1289        assert!(invalid_result.is_invalid());
1290
1291        // Restore the hook so other panics aren't suppressed.
1292        // panic::set_hook(hook);
1293    }
1294}