use std::hash::BuildHasher;
use btt::{
Base64, Base64Unpadded, Base64UrlPadded, Base64UrlUnpadded, DynEncoder, HexLower, HexUpper, Z85
};
#[test]
fn hex_lower() {
random(&HexLower);
}
#[test]
fn hex_upper() {
random(&HexUpper);
}
#[test]
fn base64() {
random(&Base64);
}
#[test]
fn base64_unpadded() {
random(&Base64Unpadded);
}
#[test]
fn base64_url_unpadded() {
random(&Base64UrlUnpadded);
}
#[test]
fn base64_url_padded() {
random(&Base64UrlPadded);
}
#[test]
fn base85() {
random(&Z85);
}
fn random(encoder: &dyn DynEncoder) {
fn check(encoder: &dyn DynEncoder, data: &[u8]) {
let Some(encoded_len) = encoder.encoded_len(data.len()) else { return };
let encoded = encoder.encode_string(data).unwrap();
assert_eq!(encoded.len(), encoded_len);
assert_eq!(encoder.decoded_len(encoded.as_bytes()).unwrap(), data.len());
assert_eq!(encoder.decode_vec(encoded.as_bytes()).unwrap(), data);
}
let mut rng = std::collections::hash_map::RandomState::new().hash_one(0);
let mut rng = move || {
rng = rng.wrapping_mul(6364136223846793005).wrapping_add(1);
rng.rotate_left(8) as u8
};
let mut buf = [0; 1 << 10];
buf.iter_mut().for_each(|b| *b = rng());
for len in 0..buf.len() {
check(encoder, &buf[..len]);
}
}