open_pql/range_parser/ast/
card.rs

1use super::{
2    Rank, RankConst as RankC, RankVar as RankV, Suit, SuitConst as SuitC,
3    SuitVar as SuitV,
4};
5
6#[derive(Copy, Clone, PartialEq, Eq, Debug)]
7pub enum RangeCard {
8    CC(RankC, SuitC),
9    CV(RankC, SuitV),
10    CA(RankC),
11    VC(RankV, SuitC),
12    VV(RankV, SuitV),
13    VA(RankV),
14    AC(SuitC),
15    AV(SuitV),
16    AA,
17}
18
19impl From<(Rank, Suit)> for RangeCard {
20    fn from(t: (Rank, Suit)) -> Self {
21        match t {
22            (Rank::Const(r), Suit::Const(s)) => Self::CC(r, s),
23            (Rank::Const(r), Suit::Var(s)) => Self::CV(r, s),
24            (Rank::Var(r), Suit::Const(s)) => Self::VC(r, s),
25            (Rank::Var(r), Suit::Var(s)) => Self::VV(r, s),
26            (Rank::Any, Suit::Const(s)) => Self::AC(s),
27            (Rank::Any, Suit::Var(s)) => Self::AV(s),
28        }
29    }
30}
31
32impl From<Rank> for RangeCard {
33    fn from(r: Rank) -> Self {
34        match r {
35            Rank::Const(c) => Self::CA(c),
36            Rank::Var(v) => Self::VA(v),
37            Rank::Any => Self::AA,
38        }
39    }
40}
41
42impl From<Suit> for RangeCard {
43    fn from(s: Suit) -> Self {
44        match s {
45            Suit::Const(c) => Self::AC(c),
46            Suit::Var(v) => Self::AV(v),
47        }
48    }
49}
50
51#[cfg(test)]
52mod tests {
53    use super::{
54        super::super::tests::parse_card as p, RangeCard as C, RankC as RC,
55        RankV as RV, SuitC as SC, SuitV as SV, *,
56    };
57
58    impl quickcheck::Arbitrary for RangeCard {
59        fn arbitrary(g: &mut quickcheck::Gen) -> Self {
60            match *g.choose(&[0u8, 1, 2, 3, 4, 5, 6, 7, 8]).unwrap() {
61                0 => Self::CC(RC::arbitrary(g), SC::arbitrary(g)),
62                1 => Self::CV(RC::arbitrary(g), SV::arbitrary(g)),
63                2 => Self::CA(RC::arbitrary(g)),
64                3 => Self::VC(RV::arbitrary(g), SC::arbitrary(g)),
65                4 => Self::VV(RV::arbitrary(g), SV::arbitrary(g)),
66                5 => Self::VA(RV::arbitrary(g)),
67                6 => Self::AC(SC::arbitrary(g)),
68                7 => Self::AV(SV::arbitrary(g)),
69                8.. => Self::AA,
70            }
71        }
72    }
73
74    impl RangeCard {
75        pub fn to_src(&self) -> String {
76            match self {
77                Self::CC(r, s) => format!("{}{}", r.to_src(), s.to_src()),
78                Self::CV(r, s) => format!("{}{}", r.to_src(), s.to_src()),
79                Self::CA(r) => r.to_src(),
80                Self::VC(r, s) => format!("{}{}", r.to_src(), s.to_src()),
81                Self::VV(r, s) => format!("{}{}", r.to_src(), s.to_src()),
82                Self::VA(r) => r.to_src(),
83                Self::AC(s) => s.to_src(),
84                Self::AV(s) => s.to_src(),
85                Self::AA => "*".into(),
86            }
87        }
88    }
89
90    #[test]
91    fn test_card_cc() {
92        assert_eq!(p("As"), Ok(C::CC(RC::RA, SC::S)));
93    }
94
95    #[test]
96    fn test_card_cv() {
97        assert_eq!(p("Aw"), Ok(C::CV(RC::RA, SV::W)));
98    }
99
100    #[test]
101    fn test_card_ca() {
102        assert_eq!(p("A"), Ok(C::CA(RC::RA)));
103    }
104
105    #[test]
106    fn test_card_vc() {
107        assert_eq!(p("Bs"), Ok(C::VC(RV::RB, SC::S)));
108    }
109
110    #[test]
111    fn test_card_vv() {
112        assert_eq!(p("Bw"), Ok(C::VV(RV::RB, SV::W)));
113    }
114
115    #[test]
116    fn test_card_va() {
117        assert_eq!(p("B"), Ok(C::VA(RV::RB)));
118    }
119
120    #[test]
121    fn test_card_ac() {
122        assert_eq!(p("s"), Ok(C::AC(SC::S)));
123        assert_eq!(p("*s"), Ok(C::AC(SC::S)));
124    }
125
126    #[test]
127    fn test_card_av() {
128        assert_eq!(p("w"), Ok(C::AV(SV::W)));
129        assert_eq!(p("*w"), Ok(C::AV(SV::W)));
130    }
131
132    #[test]
133    fn test_card_aa() {
134        assert_eq!(p("*"), Ok(C::AA));
135    }
136}