#[cfg(test)]
mod test5 {
use std::io::{self, Cursor, Read, Write};
use vu64::io::{ReadVu64, WriteVu64};
struct ChunkedReader<R: Read> {
inner: R,
chunk_size: usize,
}
impl<R: Read> Read for ChunkedReader<R> {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
let bytes_to_read = self.chunk_size.min(buf.len());
self.inner.read(&mut buf[..bytes_to_read])
}
}
struct VecWriter {
buf: Vec<u8>,
}
impl Write for VecWriter {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
self.buf.extend_from_slice(buf);
Ok(buf.len())
}
fn flush(&mut self) -> io::Result<()> {
Ok(())
}
}
#[test]
fn test_io_with_custom_reader_and_writer() {
let values: Vec<u64> = vec![
0,
1,
127,
128,
16383,
16384,
2097151,
2097152,
u64::MAX,
42,
999999,
];
let mut writer = VecWriter { buf: Vec::new() };
for &value in &values {
let result = writer.encode_and_write_vu64(value);
assert!(result.is_ok());
}
let encoded_data = writer.buf;
for chunk_size in 1..=10 {
let cursor = Cursor::new(encoded_data.clone());
let mut reader = ChunkedReader {
inner: cursor,
chunk_size,
};
let mut decoded_values = Vec::new();
while let Ok(val) = reader.read_and_decode_vu64() {
decoded_values.push(val);
}
assert_eq!(
decoded_values, values,
"Failed with chunk size: {}",
chunk_size
);
}
}
#[test]
fn test_signed_io_with_custom_reader_and_writer() {
let values: Vec<i64> = vec![0, -1, 1, -100, 100, i64::MAX, i64::MIN, 12345, -54321];
let mut writer = VecWriter { buf: Vec::new() };
for &value in &values {
let result = writer.encode_and_write_vi64(value);
assert!(result.is_ok());
}
let encoded_data = writer.buf;
let cursor = Cursor::new(encoded_data);
let mut reader = ChunkedReader {
inner: cursor,
chunk_size: 3, };
let mut decoded_values = Vec::new();
while let Ok(val) = reader.read_and_decode_vi64() {
decoded_values.push(val);
}
assert_eq!(decoded_values, values);
}
}