164 lines
4.3 KiB
Rust
164 lines
4.3 KiB
Rust
|
|
//! Integration tests.
|
||
|
|
|
||
|
|
/// Hexadecimal test vectors
|
||
|
|
struct HexVector {
|
||
|
|
/// Raw bytes
|
||
|
|
raw: &'static [u8],
|
||
|
|
/// Lower hex encoded
|
||
|
|
lower_hex: &'static [u8],
|
||
|
|
/// Upper hex encoded
|
||
|
|
upper_hex: &'static [u8],
|
||
|
|
}
|
||
|
|
|
||
|
|
const HEX_TEST_VECTORS: &[HexVector] = &[
|
||
|
|
HexVector {
|
||
|
|
raw: b"",
|
||
|
|
lower_hex: b"",
|
||
|
|
upper_hex: b"",
|
||
|
|
},
|
||
|
|
HexVector {
|
||
|
|
raw: b"\0",
|
||
|
|
lower_hex: b"00",
|
||
|
|
upper_hex: b"00",
|
||
|
|
},
|
||
|
|
HexVector {
|
||
|
|
raw: b"***",
|
||
|
|
lower_hex: b"2a2a2a",
|
||
|
|
upper_hex: b"2A2A2A",
|
||
|
|
},
|
||
|
|
HexVector {
|
||
|
|
raw: b"\x01\x02\x03\x04",
|
||
|
|
lower_hex: b"01020304",
|
||
|
|
upper_hex: b"01020304",
|
||
|
|
},
|
||
|
|
HexVector {
|
||
|
|
raw: b"\xAD\xAD\xAD\xAD\xAD",
|
||
|
|
lower_hex: b"adadadadad",
|
||
|
|
upper_hex: b"ADADADADAD",
|
||
|
|
},
|
||
|
|
HexVector {
|
||
|
|
raw: b"\xFF\xFF\xFF\xFF\xFF",
|
||
|
|
lower_hex: b"ffffffffff",
|
||
|
|
upper_hex: b"FFFFFFFFFF",
|
||
|
|
},
|
||
|
|
];
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn lower_encode() {
|
||
|
|
for vector in HEX_TEST_VECTORS {
|
||
|
|
// 10 is the size of the largest encoded test vector
|
||
|
|
let mut buf = [0u8; 10];
|
||
|
|
let out = base16ct::lower::encode(vector.raw, &mut buf).unwrap();
|
||
|
|
assert_eq!(vector.lower_hex, out);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn lower_decode() {
|
||
|
|
for vector in HEX_TEST_VECTORS {
|
||
|
|
// 5 is the size of the largest decoded test vector
|
||
|
|
let mut buf = [0u8; 5];
|
||
|
|
let out = base16ct::lower::decode(vector.lower_hex, &mut buf).unwrap();
|
||
|
|
assert_eq!(vector.raw, out);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn lower_reject_odd_size_input() {
|
||
|
|
let mut out = [0u8; 3];
|
||
|
|
assert_eq!(
|
||
|
|
Err(base16ct::Error::InvalidLength),
|
||
|
|
base16ct::lower::decode(b"12345", &mut out),
|
||
|
|
)
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn upper_encode() {
|
||
|
|
for vector in HEX_TEST_VECTORS {
|
||
|
|
// 10 is the size of the largest encoded test vector
|
||
|
|
let mut buf = [0u8; 10];
|
||
|
|
let out = base16ct::upper::encode(vector.raw, &mut buf).unwrap();
|
||
|
|
assert_eq!(vector.upper_hex, out);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn upper_decode() {
|
||
|
|
for vector in HEX_TEST_VECTORS {
|
||
|
|
// 5 is the size of the largest decoded test vector
|
||
|
|
let mut buf = [0u8; 5];
|
||
|
|
let out = base16ct::upper::decode(vector.upper_hex, &mut buf).unwrap();
|
||
|
|
assert_eq!(vector.raw, out);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn upper_reject_odd_size_input() {
|
||
|
|
let mut out = [0u8; 3];
|
||
|
|
assert_eq!(
|
||
|
|
Err(base16ct::Error::InvalidLength),
|
||
|
|
base16ct::upper::decode(b"12345", &mut out),
|
||
|
|
)
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn mixed_decode() {
|
||
|
|
for vector in HEX_TEST_VECTORS {
|
||
|
|
// 5 is the size of the largest decoded test vector
|
||
|
|
let mut buf = [0u8; 5];
|
||
|
|
let out = base16ct::mixed::decode(vector.upper_hex, &mut buf).unwrap();
|
||
|
|
assert_eq!(vector.raw, out);
|
||
|
|
let out = base16ct::mixed::decode(vector.lower_hex, &mut buf).unwrap();
|
||
|
|
assert_eq!(vector.raw, out);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn mixed_reject_odd_size_input() {
|
||
|
|
let mut out = [0u8; 3];
|
||
|
|
assert_eq!(
|
||
|
|
Err(base16ct::Error::InvalidLength),
|
||
|
|
base16ct::mixed::decode(b"12345", &mut out),
|
||
|
|
)
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
#[cfg(feature = "alloc")]
|
||
|
|
fn encode_and_decode_various_lengths() {
|
||
|
|
let data = [b'X'; 64];
|
||
|
|
|
||
|
|
for i in 0..data.len() {
|
||
|
|
let encoded = base16ct::lower::encode_string(&data[..i]);
|
||
|
|
let decoded = base16ct::lower::decode_vec(encoded).unwrap();
|
||
|
|
assert_eq!(decoded.as_slice(), &data[..i]);
|
||
|
|
|
||
|
|
let encoded = base16ct::upper::encode_string(&data[..i]);
|
||
|
|
let decoded = base16ct::upper::decode_vec(encoded).unwrap();
|
||
|
|
assert_eq!(decoded.as_slice(), &data[..i]);
|
||
|
|
|
||
|
|
let encoded = base16ct::lower::encode_string(&data[..i]);
|
||
|
|
let decoded = base16ct::mixed::decode_vec(encoded).unwrap();
|
||
|
|
assert_eq!(decoded.as_slice(), &data[..i]);
|
||
|
|
|
||
|
|
let encoded = base16ct::upper::encode_string(&data[..i]);
|
||
|
|
let decoded = base16ct::mixed::decode_vec(encoded).unwrap();
|
||
|
|
assert_eq!(decoded.as_slice(), &data[..i]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn hex_display_upper() {
|
||
|
|
for vector in HEX_TEST_VECTORS {
|
||
|
|
let hex = format!("{:X}", base16ct::HexDisplay(vector.raw));
|
||
|
|
assert_eq!(hex.as_bytes(), vector.upper_hex);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn hex_display_lower() {
|
||
|
|
for vector in HEX_TEST_VECTORS {
|
||
|
|
let hex = format!("{:x}", base16ct::HexDisplay(vector.raw));
|
||
|
|
assert_eq!(hex.as_bytes(), vector.lower_hex);
|
||
|
|
}
|
||
|
|
}
|