Skip to main content

ps_uuid/methods/
from_parts_v4.rs

1use crate::UUID;
2
3impl UUID {
4    /// Constructs a Version 4 (random) UUID from 16 bytes.
5    ///
6    /// The version and variant fields are set according to RFC 4122.
7    #[must_use]
8    pub const fn from_parts_v4(bytes: [u8; 16]) -> Self {
9        Self::from_bytes(bytes).with_version(4)
10    }
11}
12
13#[allow(clippy::cast_possible_truncation)]
14#[cfg(test)]
15mod tests {
16    use crate::UUID;
17
18    #[test]
19    fn sets_version_and_variant_correctly() {
20        // All zeros
21        let uuid = UUID::from_parts_v4([0u8; 16]);
22        assert_eq!(uuid.bytes[6] >> 4, 0b0100, "Version must be 4");
23        assert_eq!(
24            uuid.bytes[8] & 0b1100_0000,
25            0b1000_0000,
26            "Variant must be RFC 4122"
27        );
28
29        // All ones
30        let uuid = UUID::from_parts_v4([0xFFu8; 16]);
31        assert_eq!(uuid.bytes[6] >> 4, 0b0100, "Version must be 4");
32        assert_eq!(
33            uuid.bytes[8] & 0b1100_0000,
34            0b1000_0000,
35            "Variant must be RFC 4122"
36        );
37
38        // Random pattern
39        let mut input = [0xABu8; 16];
40        input[6] = 0x12;
41        input[8] = 0x34;
42        let uuid = UUID::from_parts_v4(input);
43        assert_eq!(uuid.bytes[6] >> 4, 0b0100, "Version must be 4");
44        assert_eq!(
45            uuid.bytes[8] & 0b1100_0000,
46            0b1000_0000,
47            "Variant must be RFC 4122"
48        );
49    }
50
51    #[test]
52    fn preserves_other_bytes() {
53        let mut input = [0u8; 16];
54
55        for (i, item) in input.iter_mut().enumerate() {
56            *item = i as u8;
57        }
58
59        let uuid = UUID::from_parts_v4(input);
60
61        // Only bytes 6 and 8 are changed
62        for i in 0..16 {
63            if i == 6 {
64                assert_eq!(uuid.bytes[6] & 0xF0, 0x40, "Version bits must be set");
65            } else if i == 8 {
66                assert_eq!(uuid.bytes[8] & 0xC0, 0x80, "Variant bits must be set");
67            } else {
68                assert_eq!(uuid.bytes[i], i as u8, "Other bytes must be unchanged");
69            }
70        }
71    }
72
73    #[test]
74    fn version_and_variant_are_reported() {
75        let uuid = UUID::from_parts_v4([0u8; 16]);
76        assert_eq!(uuid.get_version(), Some(4));
77        // If you have a variant() method, you can also check that here.
78    }
79}