open_pql/range_parser/ast/
suit.rs1use 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 assert![Suit::from_token('?', (0, 1)).is_err()];
119 }
120}