Skip to content

Commit a65a614

Browse files
committed
fix: subtle evaluator.rs bug; an incorrect test case gave false positive, but cards that were both Flush and FullHouse were evaluated as Flush
1 parent a29bd54 commit a65a614

1 file changed

Lines changed: 10 additions & 7 deletions

File tree

src/cards/evaluator.rs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,10 @@ impl From<Hand> for Evaluator {
2828

2929
impl Evaluator {
3030
pub fn find_ranking(&self) -> Ranking {
31-
None.or_else(|| self.find_flush())
31+
None.or_else(|| self.find_straight_flush())
3232
.or_else(|| self.find_4_oak())
3333
.or_else(|| self.find_3_oak_2_oak())
34+
.or_else(|| self.find_flush())
3435
.or_else(|| self.find_straight())
3536
.or_else(|| self.find_3_oak())
3637
.or_else(|| self.find_2_oak_2_oak())
@@ -98,14 +99,16 @@ impl Evaluator {
9899
self.find_rank_of_straight(self.0).map(Ranking::Straight)
99100
}
100101
fn find_flush(&self) -> Option<Ranking> {
102+
self.find_suit_of_flush().map(|suit| {
103+
let bits = u16::from(self.0.of(&suit));
104+
let rank = Rank::from(bits);
105+
Ranking::Flush(rank)
106+
})
107+
}
108+
fn find_straight_flush(&self) -> Option<Ranking> {
101109
self.find_suit_of_flush().and_then(|suit| {
102110
self.find_rank_of_straight_flush(suit)
103111
.map(Ranking::StraightFlush)
104-
.or_else(|| {
105-
let bits = u16::from(self.0.of(&suit));
106-
let rank = Rank::from(bits);
107-
Some(Ranking::Flush(rank))
108-
})
109112
})
110113
}
111114

@@ -291,7 +294,7 @@ mod tests {
291294

292295
#[test]
293296
fn full_house_over_flush() {
294-
let eval = Evaluator::from(Hand::try_from("Kh Ah Ad As Ks Qs Js").unwrap());
297+
let eval = Evaluator::from(Hand::try_from("Kh Ah Ad As Ks Qs Js 9s").unwrap());
295298
let ranking = eval.find_ranking();
296299
let kickers = eval.find_kickers(ranking);
297300
assert_eq!(ranking, Ranking::FullHouse(Rank::Ace, Rank::King));

0 commit comments

Comments
 (0)