use super::*;
pub struct SampleILInt {
pub value: u64,
pub encoded_size: usize,
pub encoded: [u8; 10],
}
const FILLER: u8 = 0xA5;
const SAMPLE_VALUES: [SampleILInt; 10] =
[SampleILInt {
value : 0xF7,
encoded_size: 1,
encoded: [0xF7, FILLER, FILLER, FILLER, FILLER, FILLER, FILLER, FILLER, FILLER, FILLER]},
SampleILInt{
value : 0xF8,
encoded_size: 2,
encoded: [0xF8, 0x00, FILLER, FILLER, FILLER, FILLER, FILLER, FILLER, FILLER, FILLER]},
SampleILInt{
value : 0x021B,
encoded_size: 3,
encoded: [0xF9, 0x01, 0x23, FILLER, FILLER, FILLER, FILLER, FILLER, FILLER, FILLER]},
SampleILInt{
value : 0x01243D,
encoded_size: 4,
encoded: [0xFA, 0x01, 0x23, 0x45, FILLER, FILLER, FILLER, FILLER, FILLER, FILLER]},
SampleILInt{
value : 0x0123465F,
encoded_size: 5,
encoded: [0xFB, 0x01, 0x23, 0x45, 0x67, FILLER, FILLER, FILLER, FILLER, FILLER]},
SampleILInt{
value : 0x0123456881,
encoded_size: 6,
encoded: [0xFC, 0x01, 0x23, 0x45, 0x67, 0x89, FILLER, FILLER, FILLER, FILLER]},
SampleILInt{
value : 0x012345678AA3,
encoded_size: 7,
encoded: [0xFD, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, FILLER, FILLER, FILLER]},
SampleILInt{
value : 0x123456789ACC5,
encoded_size: 8,
encoded: [0xFE, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, FILLER, FILLER]},
SampleILInt{
value : 0x123456789ABCEE7,
encoded_size: 9,
encoded: [0xFF, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, FILLER]},
SampleILInt{
value : 0xFFFFFFFFFFFFFFFF,
encoded_size: 9,
encoded: [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, FILLER]},
];
#[test]
fn test_constants() {
assert_eq!(ILINT_BASE, 0xF8);
}
#[test]
fn test_encoded_size() {
assert_eq!(encoded_size(0), 1);
assert_eq!(encoded_size(ILINT_BASE_U64 - 1), 1);
assert_eq!(encoded_size(ILINT_BASE_U64), 2);
assert_eq!(encoded_size(ILINT_BASE_U64 + 0xFF), 2);
assert_eq!(encoded_size(ILINT_BASE_U64 + 0x100), 3);
assert_eq!(encoded_size(ILINT_BASE_U64 + 0xFFFF), 3);
assert_eq!(encoded_size(ILINT_BASE_U64 + 0x10000), 4);
assert_eq!(encoded_size(ILINT_BASE_U64 + 0xFFFFFF), 4);
assert_eq!(encoded_size(ILINT_BASE_U64 + 0x1000000), 5);
assert_eq!(encoded_size(ILINT_BASE_U64 + 0xFFFFFFFF), 5);
assert_eq!(encoded_size(ILINT_BASE_U64 + 0x100000000), 6);
assert_eq!(encoded_size(ILINT_BASE_U64 + 0xFFFFFFFFFF), 6);
assert_eq!(encoded_size(ILINT_BASE_U64 + 0x10000000000), 7);
assert_eq!(encoded_size(ILINT_BASE_U64 + 0xFFFFFFFFFFFF), 7);
assert_eq!(encoded_size(ILINT_BASE_U64 + 0x1000000000000), 8);
assert_eq!(encoded_size(ILINT_BASE_U64 + 0xFFFFFFFFFFFFFF), 8);
assert_eq!(encoded_size(ILINT_BASE_U64 + 0x100000000000000), 9);
assert_eq!(encoded_size(0xFFFFFFFFFFFFFFFF), 9);
}
#[test]
fn test_encode() {
for i in 0..0xF8 {
let mut buff: [u8; 1] = [0];
match encode(i as u64, &mut buff) {
Ok(v) => assert_eq!(v, 1),
_ => panic!("Success expected!"),
}
assert_eq!(buff[0], i as u8);
match encode(i as u64, &mut buff[0..0]) {
Err(ErrorKind::InsufficientBuffer) => (),
_ => panic!("Expected Err(ErrorKind::InsufficientBuffer)"),
}
}
for sample in &SAMPLE_VALUES {
let mut buff: [u8;10] = [FILLER; 10];
let enc_size = sample.encoded_size;
match encode(sample.value, &mut buff[0..enc_size]) {
Ok(v) => assert_eq!(v, enc_size),
_ => panic!("Success expected!"),
}
assert_eq!(buff, sample.encoded);
}
}
#[test]
fn test_decoded_size() {
for i in 0..0xF8 {
assert_eq!(decoded_size(i), 1);
}
assert_eq!(decoded_size(0xF8), 2);
assert_eq!(decoded_size(0xF9), 3);
assert_eq!(decoded_size(0xFA), 4);
assert_eq!(decoded_size(0xFB), 5);
assert_eq!(decoded_size(0xFC), 6);
assert_eq!(decoded_size(0xFD), 7);
assert_eq!(decoded_size(0xFE), 8);
assert_eq!(decoded_size(0xFF), 9);
}
#[test]
fn test_decode() {
for i in 0..0xF8 {
let mut buff: [u8; 1] = [0];
buff[0] = i as u8;
match decode(&mut buff) {
Ok((v, s)) => {
assert_eq!(v, i as u64);
assert_eq!(s, 1);
},
_ => panic!(),
}
}
for sample in &SAMPLE_VALUES {
let enc_size = sample.encoded_size;
match decode(&sample.encoded[0..enc_size]) {
Ok((v, s)) => {
assert_eq!(v, sample.value);
assert_eq!(s, sample.encoded_size);
},
_ => panic!(),
}
}
let mut encoded: [u8; 9] = [0; 9];
for size in 2..10 {
encoded[0] = ILINT_BASE + (size - 2) as u8;
for bad_size in 0..size {
match decode(&encoded[0..bad_size]) {
Err(ErrorKind::InsufficientBuffer) => {},
_ => panic!("Corrupted data expected."),
}
}
}
let mut encoded: [u8; 9] = [0xFF; 9];
for last in 0x08..0x100 {
encoded[8] = last as u8;
match decode(&encoded[0..9]) {
Err(ErrorKind::Overflow) => {},
_ => panic!("Overflow expected."),
}
}
}