open_pql/functions/
straight_board.rs

1use super::*;
2
3#[pqlfn(arg, rtn, eval)]
4pub fn straight_board(
5    street: PQLStreet,
6    (game, board): (PQLGame, Board),
7) -> PQLBoolean {
8    let rs = board_ranks(street, board).to_u16();
9
10    match game {
11        PQLGame::Holdem | PQLGame::Omaha => {
12            for bits in ARR_STRAIGHT {
13                if (bits & rs).count_ones() >= 3 {
14                    return true;
15                }
16            }
17        }
18
19        PQLGame::ShortDeck => {
20            for bits in ARR_STRAIGHT_SHORT {
21                if (bits & rs).count_ones() >= 3 {
22                    return true;
23                }
24            }
25        }
26    }
27
28    false
29}
30
31#[cfg(test)]
32mod tests {
33    use super::*;
34    use crate::*;
35
36    #[quickcheck]
37    fn test_straight_board(hbg: HandBoardGame) -> TestResult {
38        let rs = board_ranks(hbg.street, hbg.board).to_u16();
39
40        let is_straight_board = (match hbg.game {
41            PQLGame::ShortDeck => &ARR_STRAIGHT_SHORT as &[_],
42            _ => &ARR_STRAIGHT as &[_],
43        })
44        .iter()
45        .any(|bits| (bits & rs).count_ones() >= 3);
46
47        TestResult::from_bool(
48            is_straight_board
49                == straight_board(hbg.street, (hbg.game, hbg.board)),
50        )
51    }
52}