openpql_range_parser/ast/
suit.rs1use 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 assert![CardSuit::from_token('?', (0, 1)).is_err()];
84 }
85}