mod cases;
const FILLER: [u8; 512] = [b'~'; 512];
#[test]
fn test_encode() {
for &(val, s) in cases::TEST_CASES.iter() {
assert_eq!(s, bs58::encode(val).into_string());
assert_eq!(s.as_bytes(), &*bs58::encode(val).into_vec());
{
let mut bytes = FILLER;
assert_eq!(Ok(s.len()), bs58::encode(val).onto(&mut bytes[..]));
assert_eq!(s.as_bytes(), &bytes[..s.len()]);
assert_eq!(&FILLER[s.len()..], &bytes[s.len()..]);
}
{
let mut bytes = FILLER;
if !s.is_empty() {
bytes[(s.len() - 1)..=s.len()].copy_from_slice("Ę".as_bytes());
}
let string = core::str::from_utf8_mut(&mut bytes[..]).unwrap();
assert_eq!(Ok(s.len()), bs58::encode(val).onto(string));
assert_eq!(s.as_bytes(), &bytes[..s.len()]);
if !s.is_empty() {
assert_eq!(0, bytes[s.len()]);
}
assert_eq!(&FILLER[(s.len() + 1)..], &bytes[(s.len() + 1)..]);
}
const PREFIX: &[u8] = &[0, 1, 2];
{
let mut vec = PREFIX.to_vec();
assert_eq!(Ok(s.len()), bs58::encode(val).onto(&mut vec));
assert_eq!((PREFIX, s.as_bytes()), vec.split_at(3));
}
#[cfg(feature = "smallvec")]
{
let mut vec = smallvec::SmallVec::<[u8; 36]>::from(PREFIX);
assert_eq!(Ok(s.len()), bs58::encode(val).onto(&mut vec));
assert_eq!((PREFIX, s.as_bytes()), vec.split_at(3));
}
#[cfg(feature = "tinyvec")]
{
{
let mut vec = tinyvec::ArrayVec::<[u8; 36]>::from_iter(PREFIX.iter().copied());
let res = bs58::encode(val).onto(&mut vec);
if PREFIX.len() + s.len() <= vec.capacity() {
assert_eq!(Ok(s.len()), res);
assert_eq!((PREFIX, s.as_bytes()), vec.split_at(3));
} else {
assert_eq!(Err(bs58::encode::Error::BufferTooSmall), res);
}
}
{
let mut array = [0; 36];
array[..PREFIX.len()].copy_from_slice(PREFIX);
let mut vec = tinyvec::SliceVec::from_slice_len(&mut array, PREFIX.len());
let res = bs58::encode(val).onto(&mut vec);
if PREFIX.len() + s.len() <= vec.capacity() {
assert_eq!(Ok(s.len()), res);
assert_eq!((PREFIX, s.as_bytes()), vec.split_at(3));
} else {
assert_eq!(Err(bs58::encode::Error::BufferTooSmall), res);
}
}
{
let mut vec = tinyvec::TinyVec::<[u8; 36]>::from(PREFIX);
assert_eq!(Ok(s.len()), bs58::encode(val).onto(&mut vec));
assert_eq!((PREFIX, s.as_bytes()), vec.split_at(3));
}
}
}
}
#[test]
#[cfg(feature = "check")]
fn test_encode_check() {
for &(val, s) in cases::CHECK_TEST_CASES.iter() {
assert_eq!(s, bs58::encode(val).with_check().into_string());
assert_eq!(s.as_bytes(), &*bs58::encode(val).with_check().into_vec());
{
let mut bytes = FILLER;
assert_eq!(
Ok(s.len()),
bs58::encode(val).with_check().onto(&mut bytes[..])
);
assert_eq!(s.as_bytes(), &bytes[..s.len()]);
assert_eq!(&FILLER[s.len()..], &bytes[s.len()..]);
if !val.is_empty() {
assert_eq!(
Ok(s.len()),
bs58::encode(&val[1..])
.with_check_version(val[0])
.onto(&mut bytes[..])
);
assert_eq!(s.as_bytes(), &bytes[..s.len()]);
assert_eq!(&FILLER[s.len()..], &bytes[s.len()..]);
}
}
{
let mut bytes = FILLER;
if !s.is_empty() {
bytes[(s.len() - 1)..=s.len()].copy_from_slice("Ę".as_bytes());
}
let string = core::str::from_utf8_mut(&mut bytes[..]).unwrap();
assert_eq!(Ok(s.len()), bs58::encode(val).with_check().onto(string));
assert_eq!(s.as_bytes(), &bytes[..s.len()]);
if !s.is_empty() {
assert_eq!(0, bytes[s.len()]);
}
assert_eq!(&FILLER[(s.len() + 1)..], &bytes[(s.len() + 1)..]);
}
}
}
#[test]
fn append() {
let mut buf = "hello world".to_string();
bs58::encode(&[92]).onto(&mut buf).unwrap();
assert_eq!("hello world2b", buf.as_str());
}
#[test]
fn test_buffer_too_small() {
let mut output = [0u8; 256];
for &(val, s) in cases::TEST_CASES.iter() {
let expected_len = s.len();
if expected_len > 0 {
let res = bs58::encode(val).onto(&mut output[..(expected_len - 1)]);
assert_eq!(Err(bs58::encode::Error::BufferTooSmall), res);
}
let res = bs58::encode(val).onto(&mut output[..expected_len]);
assert_eq!(Ok(expected_len), res);
}
}
#[test]
#[cfg(feature = "check")]
fn test_buffer_too_small_check() {
let mut output = [0u8; 256];
for &(val, s) in cases::CHECK_TEST_CASES.iter() {
let expected_len = s.len();
if expected_len > 0 {
let res = bs58::encode(val)
.with_check()
.onto(&mut output[..(expected_len - 1)]);
assert_eq!(Err(bs58::encode::Error::BufferTooSmall), res);
}
let res = bs58::encode(val)
.with_check()
.onto(&mut output[..expected_len]);
assert_eq!(Ok(expected_len), res);
}
}
#[test]
fn encode_stress_test() {
let input = b"\xff".repeat(512);
for len in 0..=input.len() {
bs58::encode(&input[..len]).into_string();
#[cfg(feature = "check")]
bs58::encode(&input[..len]).with_check().into_string();
#[cfg(feature = "check")]
bs58::encode(&input[..len])
.with_check_version(255)
.into_string();
}
}