openpql_prelude/card/
rank_idx.rs

1use super::{Display, Hash, Idx, Rank};
2
3/// Rank index representation.
4///
5/// Converts ranks to numeric indices (0-12).
6#[derive(
7    Copy, Clone, PartialEq, Eq, Debug, Ord, PartialOrd, Hash, Display, Default,
8)]
9pub struct RankIdx(pub(crate) Idx);
10
11impl RankIdx {
12    pub const fn to_rank(self) -> Option<Rank> {
13        match self.0 {
14            0 => Some(Rank::R2),
15            1 => Some(Rank::R3),
16            2 => Some(Rank::R4),
17            3 => Some(Rank::R5),
18            4 => Some(Rank::R6),
19            5 => Some(Rank::R7),
20            6 => Some(Rank::R8),
21            7 => Some(Rank::R9),
22            8 => Some(Rank::RT),
23            9 => Some(Rank::RJ),
24            10 => Some(Rank::RQ),
25            11 => Some(Rank::RK),
26            12 => Some(Rank::RA),
27            _ => None,
28        }
29    }
30}
31
32impl From<Rank> for RankIdx {
33    fn from(rank: Rank) -> Self {
34        Self(rank as Idx)
35    }
36}
37
38#[cfg(test)]
39#[cfg_attr(coverage_nightly, coverage(off))]
40mod tests {
41    use super::*;
42
43    #[test]
44    fn test_from_rank() {
45        assert_eq!(RankIdx::from(Rank::R2).0, 0);
46        assert_eq!(RankIdx::from(Rank::R3).0, 1);
47        assert_eq!(RankIdx::from(Rank::R4).0, 2);
48        assert_eq!(RankIdx::from(Rank::R5).0, 3);
49        assert_eq!(RankIdx::from(Rank::R6).0, 4);
50        assert_eq!(RankIdx::from(Rank::R7).0, 5);
51        assert_eq!(RankIdx::from(Rank::R8).0, 6);
52        assert_eq!(RankIdx::from(Rank::R9).0, 7);
53        assert_eq!(RankIdx::from(Rank::RT).0, 8);
54        assert_eq!(RankIdx::from(Rank::RJ).0, 9);
55        assert_eq!(RankIdx::from(Rank::RQ).0, 10);
56        assert_eq!(RankIdx::from(Rank::RK).0, 11);
57        assert_eq!(RankIdx::from(Rank::RA).0, 12);
58    }
59
60    #[test]
61    fn test_to_rank() {
62        assert_eq!(RankIdx(0).to_rank(), Some(Rank::R2));
63        assert_eq!(RankIdx(1).to_rank(), Some(Rank::R3));
64        assert_eq!(RankIdx(2).to_rank(), Some(Rank::R4));
65        assert_eq!(RankIdx(3).to_rank(), Some(Rank::R5));
66        assert_eq!(RankIdx(4).to_rank(), Some(Rank::R6));
67        assert_eq!(RankIdx(5).to_rank(), Some(Rank::R7));
68        assert_eq!(RankIdx(6).to_rank(), Some(Rank::R8));
69        assert_eq!(RankIdx(7).to_rank(), Some(Rank::R9));
70        assert_eq!(RankIdx(8).to_rank(), Some(Rank::RT));
71        assert_eq!(RankIdx(9).to_rank(), Some(Rank::RJ));
72        assert_eq!(RankIdx(10).to_rank(), Some(Rank::RQ));
73        assert_eq!(RankIdx(11).to_rank(), Some(Rank::RK));
74        assert_eq!(RankIdx(12).to_rank(), Some(Rank::RA));
75
76        assert!(RankIdx(13).to_rank().is_none());
77        assert!(RankIdx(-1).to_rank().is_none());
78    }
79}