#[cfg(test)]
mod tests {
use bitio_rs::byte_order::ByteOrder;
use bitio_rs::reader::{BitReader, BulkBitReader, PeekableBitReader};
use bitio_rs::traits::{BitPeek, BitRead};
use std::io::{Cursor, ErrorKind, Read};
#[test]
fn test_big_endian_read_bit() {
let data = [0b1010_1010];
let mut reader = BitReader::new(Cursor::new(data));
assert_eq!(reader.read_bits(1).unwrap(), 1); assert_eq!(reader.read_bits(1).unwrap(), 0);
assert_eq!(reader.read_bits(1).unwrap(), 1);
assert_eq!(reader.read_bits(5).unwrap(), 0b01010); }
#[test]
fn test_little_endian_read_bit() {
let data = [0b1010_1010];
let mut reader = BitReader::with_byte_order(ByteOrder::LittleEndian, Cursor::new(data));
assert_eq!(reader.read_bits(1).unwrap(), 0); assert_eq!(reader.read_bits(1).unwrap(), 1);
assert_eq!(reader.read_bits(1).unwrap(), 0);
assert_eq!(reader.read_bits(5).unwrap(), 0b10101); }
#[test]
fn test_big_endian_cross_byte_read() {
let data = [0b1100_1100, 0b1010_1010];
let mut reader = BitReader::new(Cursor::new(data));
assert_eq!(reader.read_bits(3).unwrap(), 0b110); assert_eq!(reader.read_bits(10).unwrap(), 0b0_11001010_1); }
#[test]
fn test_little_endian_cross_byte_read() {
let data = [0b0000_0001, 0b1000_0000]; let mut reader = BitReader::with_byte_order(ByteOrder::LittleEndian, Cursor::new(data));
assert_eq!(reader.read_bits(1).unwrap(), 1); assert_eq!(reader.read_bits(8).unwrap(), 0); assert_eq!(reader.read_bits(1).unwrap(), 0); assert_eq!(reader.read_bits(1).unwrap(), 0); assert_eq!(reader.read_bits(5).unwrap(), 0b10000); }
#[test]
fn test_big_endian_cross_bytes_read() {
let data = [
0b0000_0001,
0b1000_0000,
0b1000_0000,
0b1000_0000,
0b1000_0000,
0b1000_0000,
0b1100_1100,
0b1100_1100,
0b0000_0001,
0b1000_0000,
0b1000_0000,
0b1000_0000,
0b1000_0000,
0b1000_0000,
0b1100_1100,
0b1100_1100,
0b0000_0001,
0b1000_0000,
0b1000_0000,
0b1000_0000,
0b1000_0000,
0b1000_0000,
0b1100_1100,
0b1100_1100,
]; let mut reader = BitReader::with_byte_order(ByteOrder::BigEndian, Cursor::new(data));
assert_eq!(
reader.read_bits(64).unwrap(),
0b00000001_10000000_10000000_10000000_10000000_10000000_11001100_11001100
); assert_eq!(reader.read_bits(8).unwrap(), 0b0000_0001);
assert_eq!(reader.read_bits(1).unwrap(), 0b1);
assert_eq!(reader.read_bits(1).unwrap(), 0b0);
assert_eq!(reader.read_bits(1).unwrap(), 0b0);
}
#[test]
fn test_peek_bits() {
let data = [0b1100_1111];
let mut reader = PeekableBitReader::new(Cursor::new(data));
assert_eq!(reader.peek_bits(4).unwrap(), 0b1100); assert_eq!(reader.read_bits(4).unwrap(), 0b1100); assert_eq!(reader.peek_bits(4).unwrap(), 0b1111); }
#[test]
fn test_aligned_byte_read_big_endian() {
let data = [0x12, 0x34, 0x56];
let mut reader = BitReader::new(Cursor::new(data));
assert_eq!(reader.read_bits(8).unwrap(), 0x12); assert_eq!(reader.read_bits(16).unwrap(), 0x3456); }
#[test]
fn test_aligned_byte_read_little_endian() {
let data = [0x12, 0x34, 0x56];
let mut reader = BitReader::with_byte_order(ByteOrder::LittleEndian, Cursor::new(data));
assert_eq!(reader.read_bits(8).unwrap(), 0x12);
assert_eq!(reader.read_bits(16).unwrap(), 0x5634);
}
#[test]
fn test_little_endian_multi_byte() {
let data = [0b0000_0001, 0b0000_0010, 0b0000_0011, 0b0000_0100]; let mut reader = BitReader::with_byte_order(ByteOrder::LittleEndian, Cursor::new(data));
assert_eq!(reader.read_bits(31).unwrap(), 0x04030201);
assert_eq!(reader.read_bits(1).unwrap(), 0b0);
assert!(reader.read_bits(1).is_err());
}
#[test]
fn test_read_past_end() {
let data = [0x12, 0x34];
let mut reader = BitReader::new(Cursor::new(data));
assert_eq!(reader.read_bits(16).unwrap(), 0x1234);
assert!(reader.read_bits(1).is_err());
assert!(reader.read_bits(8).is_err());
}
#[test]
fn test_partial_read_at_end() {
let data = [0b1010_1010, 0b1100_1100];
let mut reader = BitReader::new(Cursor::new(data));
assert_eq!(reader.read_bits(12).unwrap(), 0b1010_1010_1100);
assert_eq!(reader.read_bits(4).unwrap(), 0b1100);
assert!(reader.read_bits(1).is_err());
}
#[test]
fn test_buffer_refill() {
let data = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA]; let mut reader = BitReader::new(Cursor::new(data));
assert_eq!(reader.read_bits(64).unwrap(), 0xFFFFFFFFFFFFFFFF);
assert_eq!(reader.read_bits(8).unwrap(), 0xAA);
}
#[test]
fn test_read_zero_bits_panics() {
let data = [0xAA];
let mut reader = BitReader::new(Cursor::new(data));
assert!(reader.read_bits(0).is_err());
}
#[test]
fn bulk_read_bits_zero_error() {
let data = vec![0u8; 1];
let mut reader = BulkBitReader::new(Cursor::new(data));
assert!(reader.read_bits(0).is_err());
}
#[test]
fn bulk_read_bits_across_chunks() {
let data = vec![0xFFu8; 10];
let mut reader = BulkBitReader::new(Cursor::new(data));
let chunks = reader.read_bits(80).unwrap();
assert_eq!(chunks.len(), 2);
assert_eq!(chunks[0], u64::MAX);
assert_eq!(chunks[1] & 0xFFFF, 0xFFFF);
}
#[test]
fn test_byte_then_bit() {
let data = vec![0xAA, 0b10110011, 0xFF];
let mut reader = BitReader::new(Cursor::new(data));
let mut byte = [0u8; 1];
assert_eq!(reader.read(&mut byte).unwrap(), 1);
assert_eq!(byte[0], 0xAA);
assert_eq!(reader.read_bits(4).unwrap(), 0b1011);
assert_eq!(reader.read_bits(4).unwrap(), 0b0011);
let mut b2 = [0u8; 1];
assert_eq!(reader.read(&mut b2).unwrap(), 1);
assert_eq!(b2[0], 0xFF);
}
#[test]
fn test_byte_aligned_read() {
let data = vec![0xAA, 0xBB, 0xCC];
let mut reader = BitReader::new(Cursor::new(data.clone()));
let mut buf = [0u8; 3];
let n = reader.read(&mut buf).unwrap();
assert_eq!(n, 3);
assert_eq!(buf, [0xAA, 0xBB, 0xCC]);
}
#[test]
fn test_read_bits_then_error_on_unaligned_read() {
let data = vec![0b1010_1111, 0x11];
let mut reader = BitReader::new(Cursor::new(data));
let bits = reader.read_bits(4).unwrap();
assert_eq!(bits, 0b1010);
let mut buf = [0u8; 1];
let err = reader.read(&mut buf).unwrap_err();
assert_eq!(err.kind(), ErrorKind::Other); }
#[test]
fn test_partial_buffer_consumption() {
let data = vec![0xAB, 0xCD];
let mut reader = BitReader::new(Cursor::new(data.clone()));
let b = reader.read_bits(8).unwrap() as u8;
assert_eq!(b, 0xAB);
let mut buf = [0u8; 1];
let n = reader.read(&mut buf).unwrap();
assert_eq!(n, 1);
assert_eq!(buf, [0xCD]);
}
#[test]
fn test_read_bytes_auto_align_and_consume_buffer() {
let data = vec![0xFE, 0xEF, 0x01];
let mut reader = BitReader::new(Cursor::new(data));
let chunks = reader.read_bits(16).unwrap();
assert_eq!(chunks, 0xFEEF);
let mut buf = [0u8; 1];
let n = reader.read(&mut buf).unwrap();
assert_eq!(n, 1);
assert_eq!(buf, [0x01]);
}
}