blob: 96ee160b27d17f284107ea44351ebd4debe87458 [file] [log] [blame] [edit]
// Copyright 2022 Google LLC
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use core::mem;
use uguid::{guid, Guid, GuidFromStrError, Variant};
#[test]
fn test_guid() {
assert_eq!(mem::size_of::<Guid>(), 16);
assert_eq!(mem::align_of::<Guid>(), 4);
// Constructors.
let guid = Guid::new(
0x01234567_u32.to_le_bytes(),
0x89ab_u16.to_le_bytes(),
0xcdef_u16.to_le_bytes(),
0x01,
0x23,
[0x45, 0x67, 0x89, 0xab, 0xcd, 0xef],
);
let guid2 = Guid::from_bytes([
0x67, 0x45, 0x23, 0x01, 0xab, 0x89, 0xef, 0xcd, 0x01, 0x23, 0x45, 0x67,
0x89, 0xab, 0xcd, 0xef,
]);
assert_eq!(guid, guid2);
// Accessors.
assert_eq!(guid.time_low(), [0x67, 0x45, 0x23, 0x01]);
assert_eq!(guid.time_mid(), [0xab, 0x89]);
assert_eq!(guid.time_high_and_version(), [0xef, 0xcd]);
assert_eq!(guid.clock_seq_high_and_reserved(), 0x01);
assert_eq!(guid.clock_seq_low(), 0x23);
assert_eq!(guid.node(), [0x45, 0x67, 0x89, 0xab, 0xcd, 0xef]);
// To byte array.
assert_eq!(
guid.to_bytes(),
[
0x67, 0x45, 0x23, 0x01, 0xab, 0x89, 0xef, 0xcd, 0x01, 0x23, 0x45,
0x67, 0x89, 0xab, 0xcd, 0xef
]
);
// Formatting.
assert_eq!(
guid.to_ascii_hex_lower(),
*b"01234567-89ab-cdef-0123-456789abcdef"
);
assert_eq!(guid.to_string(), "01234567-89ab-cdef-0123-456789abcdef");
// Parsing.
assert_eq!(
"01234567-89ab-cdef-0123-456789abcdef"
.parse::<Guid>()
.unwrap(),
guid
);
assert_eq!(
Guid::try_parse("01234567-89ab-cdef-0123-456789abcdef").unwrap(),
guid
);
// Macro.
assert_eq!(guid!("01234567-89ab-cdef-0123-456789abcdef"), guid);
}
#[test]
fn test_from_random_bytes() {
let random_bytes = [
0x68, 0xc0, 0x5f, 0xd7, 0x78, 0x21, 0xf9, 0x01, 0x66, 0x15, 0xab, 0x54,
0xe9, 0xcc, 0x44, 0xb0,
];
let expected_bytes = [
0x68, 0xc0, 0x5f, 0xd7, 0x78, 0x21, 0xf9, 0x4f, 0xa6, 0x15, 0xab, 0x54,
0xe9, 0xcc, 0x44, 0xb0,
];
let guid = Guid::from_random_bytes(random_bytes);
assert_eq!(guid.to_bytes(), expected_bytes);
assert_eq!(guid.variant(), Variant::Rfc4122);
assert_eq!(guid.version(), 4);
}
#[test]
fn test_parse_or_panic_success() {
let _g = Guid::parse_or_panic("01234567-89ab-cdef-0123-456789abcdef");
}
#[test]
#[should_panic]
fn test_parse_or_panic_len() {
let _g = Guid::parse_or_panic("01234567-89ab-cdef-0123-456789abcdef0");
}
#[test]
#[should_panic]
fn test_parse_or_panic_sep() {
let _g = Guid::parse_or_panic("01234567089ab-cdef-0123-456789abcdef");
}
#[test]
#[should_panic]
fn test_parse_or_panic_hex() {
let _g = Guid::parse_or_panic("g1234567-89ab-cdef-0123-456789abcdef");
}
#[test]
fn test_guid_error() {
// Wrong length.
let s = "01234567-89ab-cdef-0123-456789abcdef0";
assert_eq!(s.len(), 37);
assert_eq!(s.parse::<Guid>(), Err(GuidFromStrError::Length));
// Wrong separator.
let s = "01234567089ab-cdef-0123-456789abcdef";
assert_eq!(s.parse::<Guid>(), Err(GuidFromStrError::Separator(8)));
let s = "01234567-89ab0cdef-0123-456789abcdef";
assert_eq!(s.parse::<Guid>(), Err(GuidFromStrError::Separator(13)));
let s = "01234567-89ab-cdef00123-456789abcdef";
assert_eq!(s.parse::<Guid>(), Err(GuidFromStrError::Separator(18)));
let s = "01234567-89ab-cdef-01230456789abcdef";
assert_eq!(s.parse::<Guid>(), Err(GuidFromStrError::Separator(23)));
// Invalid hex.
let s = "g1234567-89ab-cdef-0123-456789abcdef";
assert_eq!(s.parse::<Guid>(), Err(GuidFromStrError::Hex(0)));
assert_eq!(
GuidFromStrError::Length.to_string(),
"GUID string has wrong length (expected 36 bytes)"
);
assert_eq!(
GuidFromStrError::Separator(8).to_string(),
"GUID string is missing a separator (`-`) at index 8"
);
assert_eq!(
GuidFromStrError::Hex(10).to_string(),
"GUID string contains invalid ASCII hex at index 10"
);
}
#[test]
fn test_guid_variant() {
assert_eq!(
guid!("00000000-0000-0000-0000-000000000000").variant(),
Variant::ReservedNcs
);
assert_eq!(
guid!("00000000-0000-0000-8000-000000000000").variant(),
Variant::Rfc4122
);
assert_eq!(
guid!("00000000-0000-0000-c000-000000000000").variant(),
Variant::ReservedMicrosoft
);
assert_eq!(
guid!("00000000-0000-0000-e000-000000000000").variant(),
Variant::ReservedFuture
);
}
#[test]
fn test_guid_version() {
assert_eq!(guid!("00000000-0000-0000-8000-000000000000").version(), 0);
assert_eq!(guid!("00000000-0000-1000-8000-000000000000").version(), 1);
assert_eq!(guid!("00000000-0000-2000-8000-000000000000").version(), 2);
assert_eq!(guid!("00000000-0000-4000-8000-000000000000").version(), 4);
}
#[test]
fn test_guid_is_zero() {
assert!(guid!("00000000-0000-0000-0000-000000000000").is_zero());
assert!(!guid!("308bbc16-a308-47e8-8977-5e5646c5291f").is_zero());
}
/// Inner module that only imports the `guid!` macro.
mod inner {
use uguid::guid;
/// Test that the `guid!` macro works without importing anything
/// else.
#[test]
fn test_guid_macro_paths() {
let _g = guid!("01234567-89ab-cdef-0123-456789abcdef");
}
}