ps_uuid/methods/
set_variant.rs1use 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}