use crate::card::Rank;
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
pub enum HandRank {
HighCard = 0,
OnePair = 1_000_000,
TwoPair = 2_000_000,
ThreeOfAKind = 3_000_000,
Straight = 4_000_000,
Flush = 5_000_000,
FullHouse = 6_000_000,
FourOfAKind = 7_000_000,
StraightFlush = 8_000_000,
}
pub fn calculate_hand_score(ranks: Vec<Rank>, hand_rank: HandRank) -> u32 {
let rank_score = calculate_rank_score(ranks);
let hand_score = hand_rank as u32;
hand_score + rank_score
}
fn calculate_rank_score(ranks: Vec<Rank>) -> u32 {
if ranks.is_empty() {
return 0;
}
let mut score: u32 = 0;
for rank in ranks.into_iter() {
score = (score << 4) | (rank as u32);
}
score
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_calculate_rank_score() {
let ranks = vec![Rank::Ace, Rank::Ace, Rank::Ace, Rank::Ace, Rank::King];
assert_eq!(calculate_rank_score(ranks), 978669);
let ranks = vec![Rank::Ace, Rank::Ace, Rank::Ace, Rank::Ace, Rank::Queen];
assert_eq!(calculate_rank_score(ranks), 978668);
let ranks = vec![Rank::Ace, Rank::King, Rank::Queen, Rank::Jack, Rank::Ten];
assert_eq!(calculate_rank_score(ranks), 974010);
let ranks = vec![Rank::Ace, Rank::King, Rank::Queen, Rank::Jack, Rank::Nine];
assert_eq!(calculate_rank_score(ranks), 974009);
let score = calculate_rank_score(vec![Rank::Ace, Rank::King, Rank::Queen]);
assert_eq!(score, 0b1110_1101_1100);
let score = calculate_rank_score(vec![Rank::Two, Rank::Three, Rank::Four]);
assert_eq!(score, 0b0010_0011_0100);
let score = calculate_rank_score(vec![Rank::Ten, Rank::Nine, Rank::Eight]);
assert_eq!(score, 0b1010_1001_1000);
let score = calculate_rank_score(vec![Rank::Two, Rank::Ace, Rank::Three]);
assert_eq!(score, 0b0010_1110_0011);
let score = calculate_rank_score(vec![Rank::Ace, Rank::Ace, Rank::King]);
assert_eq!(score, 0b1110_1110_1101);
}
#[test]
fn test_calculate_rank_score_empty() {
let result = calculate_rank_score(vec![]);
assert_eq!(result, 0);
}
}