open_pql/range_parser/ast/
suit.rs

1use super::{Error, LocInfo, ResultE};
2
3#[derive(Copy, Clone, PartialEq, Eq, Debug)]
4pub enum Const {
5    S,
6    H,
7    D,
8    C,
9}
10
11#[derive(Copy, Clone, PartialEq, Eq, Debug)]
12pub enum Var {
13    W,
14    X,
15    Y,
16    Z,
17}
18
19#[derive(Copy, Clone, PartialEq, Eq, Debug)]
20pub enum Suit {
21    Const(Const),
22    Var(Var),
23}
24
25impl Suit {
26    pub(crate) fn from_token(c: char, loc: LocInfo) -> ResultE<'static, Self> {
27        match c {
28            's' | 'S' => Ok(Self::Const(Const::S)),
29            'h' | 'H' => Ok(Self::Const(Const::H)),
30            'd' | 'D' => Ok(Self::Const(Const::D)),
31            'c' | 'C' => Ok(Self::Const(Const::C)),
32
33            'w' | 'W' => Ok(Self::Var(Var::W)),
34            'x' | 'X' => Ok(Self::Var(Var::X)),
35            'y' | 'Y' => Ok(Self::Var(Var::Y)),
36            'z' | 'Z' => Ok(Self::Var(Var::Z)),
37
38            _ => Err(Error::InvalidSuit(loc).into()),
39        }
40    }
41}
42
43#[cfg(test)]
44pub mod tests {
45    use super::{
46        super::{
47            super::tests::parse_card as p, Suit, SuitConst as SC,
48            SuitVar as SV, card::RangeCard as C,
49        },
50        *,
51    };
52
53    impl quickcheck::Arbitrary for Const {
54        fn arbitrary(g: &mut quickcheck::Gen) -> Self {
55            *g.choose(&[Self::S, Self::H, Self::D, Self::C]).unwrap()
56        }
57    }
58
59    impl Const {
60        pub fn to_src(&self) -> String {
61            match self {
62                Self::S => 's',
63                Self::H => 'h',
64                Self::D => 'd',
65                Self::C => 'c',
66            }
67            .to_string()
68        }
69    }
70
71    impl quickcheck::Arbitrary for Var {
72        fn arbitrary(g: &mut quickcheck::Gen) -> Self {
73            *g.choose(&[Self::W, Self::X, Self::Y, Self::Z]).unwrap()
74        }
75    }
76
77    impl Var {
78        pub fn to_src(&self) -> String {
79            match self {
80                Self::W => 'w',
81                Self::X => 'x',
82                Self::Y => 'y',
83                Self::Z => 'z',
84            }
85            .to_string()
86        }
87    }
88
89    #[test]
90    fn test_card_suit_const() {
91        assert_eq!(p("S"), Ok(C::AC(SC::S)));
92        assert_eq!(p("H"), Ok(C::AC(SC::H)));
93        assert_eq!(p("D"), Ok(C::AC(SC::D)));
94        assert_eq!(p("C"), Ok(C::AC(SC::C)));
95
96        assert_eq!(p("s"), Ok(C::AC(SC::S)));
97        assert_eq!(p("h"), Ok(C::AC(SC::H)));
98        assert_eq!(p("d"), Ok(C::AC(SC::D)));
99        assert_eq!(p("c"), Ok(C::AC(SC::C)));
100    }
101
102    #[test]
103    fn test_card_suit_var() {
104        assert_eq!(p("W"), Ok(C::AV(SV::W)));
105        assert_eq!(p("X"), Ok(C::AV(SV::X)));
106        assert_eq!(p("Y"), Ok(C::AV(SV::Y)));
107        assert_eq!(p("Z"), Ok(C::AV(SV::Z)));
108
109        assert_eq!(p("w"), Ok(C::AV(SV::W)));
110        assert_eq!(p("x"), Ok(C::AV(SV::X)));
111        assert_eq!(p("y"), Ok(C::AV(SV::Y)));
112        assert_eq!(p("z"), Ok(C::AV(SV::Z)));
113    }
114
115    #[test]
116    fn test_from_token() {
117        // unreachable
118        assert![Suit::from_token('?', (0, 1)).is_err()];
119    }
120}