padded_number/
ordering.rs

1use std::cmp::Ordering;
2
3use crate::*;
4
5impl<const A: u8, const B: u8> Ord for PaddedNumber<A, B> {
6    fn cmp(&self, other: &Self) -> Ordering {
7        match self.len().cmp(&other.len()) {
8            Ordering::Less => Ordering::Less,
9            Ordering::Greater => Ordering::Greater,
10            Ordering::Equal => self.number.cmp(&other.number),
11        }
12    }
13}
14
15impl<const A: u8, const B: u8> PartialOrd for PaddedNumber<A, B> {
16    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
17        Some(self.cmp(other))
18    }
19}
20
21#[cfg(test)]
22mod tests {
23    use crate::tests::mock_from_str;
24
25    #[test]
26    fn ordering() {
27        // Longer numbers of greater length are always greater than those with fewer
28        assert_ordering("", "0");
29        assert_ordering("0", "00");
30        assert_ordering("10", "001");
31        assert_ordering("9", "00");
32
33        assert_ordering("46720", "46730");
34
35        // matching length compares remaining number
36        assert_ordering("0012", "0120");
37
38        fn assert_ordering(number_str_0: &str, number_str_1: &str) {
39            let number_0 = mock_from_str::<0, 10>(number_str_0);
40            let number_1 = mock_from_str::<0, 10>(number_str_1);
41            assert!(number_0 < number_1);
42            assert!(number_1 > number_0);
43        }
44    }
45}