Skip to main content

ps_uuid/variant/methods/
prefix.rs

1use crate::Variant;
2
3impl Variant {
4    #[must_use]
5    pub const fn prefix(self) -> u8 {
6        match self {
7            Self::NCS => 0x00,
8            Self::OSF => 0x80,
9            Self::DCOM => 0xC0,
10            Self::Reserved => 0xE0,
11        }
12    }
13}
14
15#[cfg(test)]
16mod tests {
17    use super::Variant;
18
19    #[test]
20    fn ncs_prefix_is_zero() {
21        assert_eq!(Variant::NCS.prefix(), 0x00);
22    }
23
24    #[test]
25    fn osf_prefix_is_0x80() {
26        assert_eq!(Variant::OSF.prefix(), 0x80);
27    }
28
29    #[test]
30    fn dcom_prefix_is_0xc0() {
31        assert_eq!(Variant::DCOM.prefix(), 0xC0);
32    }
33
34    #[test]
35    fn reserved_prefix_is_0xe0() {
36        assert_eq!(Variant::Reserved.prefix(), 0xE0);
37    }
38
39    #[test]
40    fn prefix_values_are_distinct() {
41        let prefixes = [
42            Variant::NCS.prefix(),
43            Variant::OSF.prefix(),
44            Variant::DCOM.prefix(),
45            Variant::Reserved.prefix(),
46        ];
47
48        for (i, &prefix_a) in prefixes.iter().enumerate() {
49            for &prefix_b in prefixes.iter().skip(i + 1) {
50                assert_ne!(prefix_a, prefix_b);
51            }
52        }
53    }
54
55    #[test]
56    fn prefix_preserves_variant_bit_pattern() {
57        // NCS: 0b0xxxxxxx
58        assert_eq!(Variant::NCS.prefix() & 0x80, 0x00);
59
60        // OSF: 0b10xxxxxx
61        assert_eq!(Variant::OSF.prefix() & 0xC0, 0x80);
62
63        // DCOM: 0b110xxxxx
64        assert_eq!(Variant::DCOM.prefix() & 0xE0, 0xC0);
65
66        // Reserved: 0b111xxxxx
67        assert_eq!(Variant::Reserved.prefix() & 0xE0, 0xE0);
68    }
69}