1use core::cmp::Ordering;
2use core::fmt;
3use serde::{Deserialize, Serialize};
4use strum::EnumIter;
5
6#[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 #[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#[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#[allow(clippy::module_name_repetitions)]
427pub type HandRankValue = u16;
428
429pub const NO_HAND_RANK_VALUE: HandRankValue = 0;
430
431#[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#[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 #[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 }
1294}