#[cfg(test)]
mod tests {
use crate::leb128;
use rand;
use rand::Rng;
macro_rules! test_leb128 {
($name:tt, $primitive:ty) => {
#[test]
fn $name() {
let value = rand::rng().random::<u128>() as $primitive;
let mut buffer = leb128::serialize(value);
let result = leb128::parse::<$primitive>(&mut buffer);
match result {
Some(outcome) => assert_eq!(value, outcome),
None => panic!(),
}
}
};
}
test_leb128!(test_u8, u8);
test_leb128!(test_u16, u16);
test_leb128!(test_u32, u32);
test_leb128!(test_u64, u64);
test_leb128!(test_u128, u128);
test_leb128!(test_usize, usize);
test_leb128!(test_i8, i8);
test_leb128!(test_i16, i16);
test_leb128!(test_i32, i32);
test_leb128!(test_i64, i64);
test_leb128!(test_i128, i128);
test_leb128!(test_isize, isize);
macro_rules! test_leb128_bytesize {
($name:tt, $expected_bytesize:expr, $negative:expr) => {
#[test]
fn $name() {
let mut value = 1 << (($expected_bytesize - 1) * 7 + 5);
if $negative {
value *= -1;
}
let mut buffer = leb128::serialize::<i128>(value);
assert_eq!($expected_bytesize, buffer.len());
let result = leb128::parse::<i128>(&mut buffer);
match result {
Some(outcome) => assert_eq!(value, outcome),
None => panic!(),
}
}
};
}
test_leb128_bytesize!(test_bytesize_1_positive, 1, false);
test_leb128_bytesize!(test_bytesize_1_negative, 1, true);
test_leb128_bytesize!(test_bytesize_2_positive, 2, false);
test_leb128_bytesize!(test_bytesize_2_negative, 2, true);
test_leb128_bytesize!(test_bytesize_3_positive, 3, false);
test_leb128_bytesize!(test_bytesize_3_negative, 3, true);
test_leb128_bytesize!(test_bytesize_4_positive, 4, false);
test_leb128_bytesize!(test_bytesize_4_negative, 4, true);
test_leb128_bytesize!(test_bytesize_5_positive, 5, false);
test_leb128_bytesize!(test_bytesize_5_negative, 5, true);
test_leb128_bytesize!(test_bytesize_6_positive, 6, false);
test_leb128_bytesize!(test_bytesize_6_negative, 6, true);
test_leb128_bytesize!(test_bytesize_7_positive, 7, false);
test_leb128_bytesize!(test_bytesize_7_negative, 7, true);
test_leb128_bytesize!(test_bytesize_8_positive, 8, false);
test_leb128_bytesize!(test_bytesize_8_negative, 8, true);
test_leb128_bytesize!(test_bytesize_9_positive, 9, false);
test_leb128_bytesize!(test_bytesize_9_negative, 9, true);
test_leb128_bytesize!(test_bytesize_10_positive, 10, false);
test_leb128_bytesize!(test_bytesize_10_negative, 10, true);
test_leb128_bytesize!(test_bytesize_11_positive, 11, false);
test_leb128_bytesize!(test_bytesize_11_negative, 11, true);
test_leb128_bytesize!(test_bytesize_12_positive, 12, false);
test_leb128_bytesize!(test_bytesize_12_negative, 12, true);
test_leb128_bytesize!(test_bytesize_13_positive, 13, false);
test_leb128_bytesize!(test_bytesize_13_negative, 13, true);
test_leb128_bytesize!(test_bytesize_14_positive, 14, false);
test_leb128_bytesize!(test_bytesize_14_negative, 14, true);
test_leb128_bytesize!(test_bytesize_15_positive, 15, false);
test_leb128_bytesize!(test_bytesize_15_negative, 15, true);
test_leb128_bytesize!(test_bytesize_16_positive, 16, false);
test_leb128_bytesize!(test_bytesize_16_negative, 16, true);
macro_rules! test_leb128_single_byte_type {
($name:tt, $prim_type:ty, $value:expr) => {
#[test]
fn $name() {
let mut buffer = leb128::serialize::<$prim_type>($value);
assert_eq!(1, buffer.len());
let result = leb128::parse::<$prim_type>(&mut buffer);
match result {
Some(outcome) => assert_eq!($value, outcome),
None => panic!(),
}
}
};
}
test_leb128_single_byte_type!(test_single_byte_type_u8_0, u8, 0);
test_leb128_single_byte_type!(test_single_byte_type_u8_255, u8, 255);
test_leb128_single_byte_type!(test_single_byte_type_i8_n128, i8, -128);
test_leb128_single_byte_type!(test_single_byte_type_i8_127, i8, 127);
}