openpql_range_parser/ast/
suit.rs

1use super::{Display, Error, LocInfo, ResultE};
2
3pub type SuitConst = openpql_prelude::Suit;
4
5#[derive(Copy, Clone, PartialEq, Eq, Debug, Display)]
6pub enum SuitVar {
7    #[display("w")]
8    W,
9    #[display("x")]
10    X,
11    #[display("y")]
12    Y,
13    #[display("z")]
14    Z,
15}
16
17#[derive(Copy, Clone, PartialEq, Eq, Debug, Display)]
18pub enum CardSuit {
19    #[display("{_0}")]
20    Const(SuitConst),
21    #[display("{_0}")]
22    Var(SuitVar),
23}
24
25impl CardSuit {
26    pub(crate) fn from_token(c: char, loc: LocInfo) -> ResultE<'static, Self> {
27        match c {
28            's' | 'S' => Ok(Self::Const(SuitConst::S)),
29            'h' | 'H' => Ok(Self::Const(SuitConst::H)),
30            'd' | 'D' => Ok(Self::Const(SuitConst::D)),
31            'c' | 'C' => Ok(Self::Const(SuitConst::C)),
32
33            'w' | 'W' => Ok(Self::Var(SuitVar::W)),
34            'x' | 'X' => Ok(Self::Var(SuitVar::X)),
35            'y' | 'Y' => Ok(Self::Var(SuitVar::Y)),
36            'z' | 'Z' => Ok(Self::Var(SuitVar::Z)),
37
38            _ => Err(Error::InvalidSuit(loc).into()),
39        }
40    }
41}
42
43#[cfg(test)]
44pub mod tests {
45    use super::*;
46    use crate::*;
47
48    impl Arbitrary for SuitVar {
49        fn arbitrary(g: &mut quickcheck::Gen) -> Self {
50            *g.choose(&[Self::W, Self::X, Self::Y, Self::Z]).unwrap()
51        }
52    }
53
54    #[test]
55    fn test_card_suit_const() {
56        assert_range_card("S", "s");
57        assert_range_card("H", "h");
58        assert_range_card("D", "d");
59        assert_range_card("C", "c");
60
61        assert_range_card("s", "s");
62        assert_range_card("h", "h");
63        assert_range_card("d", "d");
64        assert_range_card("c", "c");
65    }
66
67    #[test]
68    fn test_card_suit_var() {
69        assert_range_card("W", "w");
70        assert_range_card("X", "x");
71        assert_range_card("Y", "y");
72        assert_range_card("Z", "z");
73
74        assert_range_card("w", "w");
75        assert_range_card("x", "x");
76        assert_range_card("y", "y");
77        assert_range_card("z", "z");
78    }
79
80    #[test]
81    fn test_from_token() {
82        // unreachable
83        assert![CardSuit::from_token('?', (0, 1)).is_err()];
84    }
85}