open_pql/range_parser/ast/
card.rs1use 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}