#[cfg(test)]
mod test_integration {
use std::convert::TryFrom;
use std::io::Cursor;
use vu64::{
self, encoded_len,
io::{ReadVu64, WriteVu64},
signed, Vu64,
};
#[test]
fn kitchen_sink_integration_test() {
let i64_values: Vec<i64> = vec![
0,
-1,
1,
i64::MAX,
i64::MIN,
12345,
-54321,
63,
-64,
64,
-65,
];
let u64_values: Vec<u64> = vec![0, 1, u64::MAX, 127, 128, 16383, 16384, 9876543210];
let zigzag_encoded_values: Vec<u64> = i64_values
.iter()
.map(|&v| signed::zigzag::encode(v))
.collect();
let mut all_values = u64_values.clone();
all_values.extend_from_slice(&zigzag_encoded_values);
all_values.sort(); all_values.dedup();
let mut encoded_bytes_buffer: Vec<u8> = Vec::new();
for &value in &all_values {
let vu64_val = vu64::encode(value);
assert_eq!(format!("{:?}", vu64_val), format!("V64({})", value));
assert_eq!(vu64_val.as_ref().len(), encoded_len(value) as usize);
let mut cursor = Cursor::new(Vec::new());
let write_res = cursor.encode_and_write_vu64(value);
assert!(write_res.is_ok());
encoded_bytes_buffer.extend_from_slice(cursor.get_ref());
let vu64_from_slice = Vu64::try_from(cursor.get_ref().as_slice()).unwrap();
assert_eq!(vu64_from_slice, vu64_val);
}
let mut reader = Cursor::new(encoded_bytes_buffer);
let mut decoded_values: Vec<u64> = Vec::new();
while let Ok(decoded_val) = reader.read_and_decode_vu64() {
decoded_values.push(decoded_val);
}
assert_eq!(
decoded_values, all_values,
"The final decoded list of values should match the original sorted list."
);
let mut full_buffer_reader = Cursor::new(reader.into_inner());
for &original_value in &all_values {
let current_pos = full_buffer_reader.position() as usize;
let remaining_bytes = &full_buffer_reader.get_ref()[current_pos..];
let len = vu64::decoded_len(remaining_bytes[0]) as usize;
let val1 = vu64::decode(&remaining_bytes[..len]).unwrap();
assert_eq!(val1, original_value);
let val2 = vu64::decode2(remaining_bytes[0], &remaining_bytes[1..len]).unwrap();
assert_eq!(val2, original_value);
let mut buf3 = [0u8; 8];
if len > 1 {
buf3[..len - 1].copy_from_slice(&remaining_bytes[1..len]);
}
let follow_le = u64::from_le_bytes(buf3);
let val3 = vu64::decode3(remaining_bytes[0], follow_le).unwrap();
assert_eq!(val3, original_value);
full_buffer_reader.set_position(full_buffer_reader.position() + len as u64);
}
assert_eq!(
full_buffer_reader.position() as usize,
full_buffer_reader.get_ref().len()
);
}
}