Skip to main content

ps_uuid/methods/
set_variant.rs

1use crate::{Variant, UUID};
2
3impl UUID {
4    pub const fn set_variant(&mut self, variant: Variant) {
5        self.bytes[8] &= variant.bitmask();
6        self.bytes[8] |= variant.prefix();
7    }
8}
9
10#[cfg(test)]
11mod tests {
12    use super::{Variant, UUID};
13
14    const fn make_uuid_with_byte_8(byte: u8) -> UUID {
15        let mut bytes = [0u8; 16];
16        bytes[8] = byte;
17        UUID { bytes }
18    }
19
20    #[test]
21    fn set_variant_ncs() {
22        let mut uuid = make_uuid_with_byte_8(0xFF);
23        uuid.set_variant(Variant::NCS);
24        assert_eq!(uuid.get_variant(), Variant::NCS);
25        assert_eq!(uuid.bytes[8] & 0x80, 0x00);
26    }
27
28    #[test]
29    fn set_variant_osf() {
30        let mut uuid = make_uuid_with_byte_8(0x00);
31        uuid.set_variant(Variant::OSF);
32        assert_eq!(uuid.get_variant(), Variant::OSF);
33        assert_eq!(uuid.bytes[8] & 0xC0, 0x80);
34    }
35
36    #[test]
37    fn set_variant_dcom() {
38        let mut uuid = make_uuid_with_byte_8(0x3F);
39        uuid.set_variant(Variant::DCOM);
40        assert_eq!(uuid.get_variant(), Variant::DCOM);
41        assert_eq!(uuid.bytes[8] & 0xE0, 0xC0);
42    }
43
44    #[test]
45    fn set_variant_reserved() {
46        let mut uuid = make_uuid_with_byte_8(0x00);
47        uuid.set_variant(Variant::Reserved);
48        assert_eq!(uuid.get_variant(), Variant::Reserved);
49        assert_eq!(uuid.bytes[8] & 0xE0, 0xE0);
50    }
51
52    #[test]
53    fn set_variant_preserves_other_bytes() {
54        let original_bytes = [1, 2, 3, 4, 5, 6, 7, 8, 0xFF, 10, 11, 12, 13, 14, 15, 16];
55        let mut uuid = UUID {
56            bytes: original_bytes,
57        };
58
59        uuid.set_variant(Variant::OSF);
60
61        for (i, &byte) in uuid.bytes.iter().enumerate() {
62            if i != 8 {
63                assert_eq!(byte, original_bytes[i]);
64            }
65        }
66    }
67
68    #[test]
69    fn set_variant_can_change_variants() {
70        let mut uuid = make_uuid_with_byte_8(0x00);
71
72        uuid.set_variant(Variant::NCS);
73        assert_eq!(uuid.get_variant(), Variant::NCS);
74
75        uuid.set_variant(Variant::OSF);
76        assert_eq!(uuid.get_variant(), Variant::OSF);
77
78        uuid.set_variant(Variant::DCOM);
79        assert_eq!(uuid.get_variant(), Variant::DCOM);
80
81        uuid.set_variant(Variant::Reserved);
82        assert_eq!(uuid.get_variant(), Variant::Reserved);
83    }
84
85    #[test]
86    fn set_variant_idempotent() {
87        let mut uuid = make_uuid_with_byte_8(0xA5);
88
89        uuid.set_variant(Variant::OSF);
90        let first_result = uuid.bytes[8];
91
92        uuid.set_variant(Variant::OSF);
93        let second_result = uuid.bytes[8];
94
95        assert_eq!(first_result, second_result);
96    }
97}