btt 0.5.0

Binary to text encodings
Documentation
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]);
	}
}