open_pql/functions/
has_second_board_rank.rs

1use super::*;
2/// # Panics
3/// board is always non-empty
4#[pqlfn(arg, rtn, eval)]
5pub fn has_second_board_rank(
6    hand: &Hand,
7    street: PQLStreet,
8    board: Board,
9) -> PQLBoolean {
10    let mut board: Rank16 = board_ranks(street, board);
11
12    let top_rank = board.max_rank().unwrap();
13
14    board.unset(top_rank);
15
16    match board.max_rank() {
17        Some(second_rank) => {
18            for c in hand {
19                if c.rank == second_rank {
20                    return true;
21                }
22            }
23
24            false
25        }
26        None => false,
27    }
28}
29
30#[cfg(test)]
31mod tests {
32    use super::*;
33    use crate::*;
34
35    #[quickcheck]
36    fn test_has_second_board_rank(hbg: HandBoardGame) -> TestResult {
37        let HandBoardGame {
38            hand,
39            board,
40            street,
41            ..
42        } = hbg;
43
44        let second = nth_rank(2, board_ranks(street, board));
45        let has_second = hand.iter().any(|c| Some(c.rank) == second);
46
47        TestResult::from_bool(
48            has_second == has_second_board_rank(hand.as_ref(), street, board),
49        )
50    }
51
52    #[test]
53    fn test_has_second_board_rank_none() {
54        let board = board!("AsAhAcAdKs");
55        let hand = cards!("2s2h");
56
57        assert!(!has_second_board_rank(&hand, PQLStreet::Flop, board,));
58    }
59}