use super::BitWriter;
use alloc::vec;
#[test]
fn from_existing() {
let mut existing_vec = vec![255_u8];
let mut bw = BitWriter::from(&mut existing_vec);
bw.write_bits(0u8, 8);
bw.flush();
assert_eq!(vec![255, 0], existing_vec);
}
#[test]
fn change_bits() {
let mut writer = BitWriter::new();
writer.write_bits(0u32, 24);
writer.change_bits(8, 0xFFu8, 8);
assert_eq!(vec![0, 0xFF, 0], writer.dump());
let mut writer = BitWriter::new();
writer.write_bits(0u32, 24);
writer.change_bits(6, 0x0FFFu16, 12);
assert_eq!(vec![0b11000000, 0xFF, 0b00000011], writer.dump());
}
#[test]
fn single_byte_written_4_4() {
let mut bw = BitWriter::new();
bw.write_bits(0b1111u8, 4);
bw.write_bits(0b0000u8, 4);
let output = bw.dump();
assert!(
output.len() == 1,
"Single byte written into writer returned a vec that wasn't one byte, vec was {} elements long",
output.len()
);
assert_eq!(
0b0000_1111, output[0],
"4 bits and 4 bits written into buffer"
);
}
#[test]
fn single_byte_written_3_5() {
let mut bw = BitWriter::new();
bw.write_bits(0b111u8, 3);
bw.write_bits(0b0_0000u8, 5);
let output = bw.dump();
assert!(
output.len() == 1,
"Single byte written into writer return a vec that wasn't one byte, vec was {} elements long",
output.len()
);
assert_eq!(0b0000_0111, output[0], "3 and 5 bits written into buffer");
}
#[test]
fn single_byte_written_1_7() {
let mut bw = BitWriter::new();
bw.write_bits(0b1u8, 1);
bw.write_bits(0u8, 7);
let output = bw.dump();
assert!(
output.len() == 1,
"Single byte written into writer return a vec that wasn't one byte, vec was {} elements long",
output.len()
);
assert_eq!(0b0000_0001, output[0], "1 and 7 bits written into buffer");
}
#[test]
fn single_byte_written_8() {
let mut bw = BitWriter::new();
bw.write_bits(1u8, 8);
let output = bw.dump();
assert!(
output.len() == 1,
"Single byte written into writer return a vec that wasn't one byte, vec was {} elements long",
output.len()
);
assert_eq!(1, output[0], "1 and 7 bits written into buffer");
}
#[test]
fn multi_byte_clean_boundary_4_4_4_4() {
let mut bw = BitWriter::new();
bw.write_bits(0u8, 4);
bw.write_bits(0b1111u8, 4);
bw.write_bits(0b1111u8, 4);
bw.write_bits(0u8, 4);
assert_eq!(vec![0b1111_0000, 0b0000_1111], bw.dump());
}
#[test]
fn multi_byte_clean_boundary_16_8() {
let mut bw = BitWriter::new();
bw.write_bits(0x0100u16, 16);
bw.write_bits(69u8, 8);
assert_eq!(vec![0, 1, 69], bw.dump())
}
#[test]
fn multi_byte_boundary_crossed_4_12() {
let mut bw = BitWriter::new();
bw.write_bits(0b1111u8, 4);
bw.write_bits(0b0000_0011_0100_0010u16, 12);
assert_eq!(vec![0b0010_1111, 0b0011_0100], bw.dump());
}
#[test]
fn multi_byte_boundary_crossed_4_5_7() {
let mut bw = BitWriter::new();
bw.write_bits(0b1111u8, 4);
bw.write_bits(0b0_0000u8, 5);
bw.write_bits(0b111_1111u8, 7);
assert_eq!(vec![0b0000_1111, 0b1111_1110], bw.dump());
}
#[test]
fn multi_byte_boundary_crossed_1_9_6() {
let mut bw = BitWriter::new();
bw.write_bits(0b1u8, 1);
bw.write_bits(0b0_0000_0000u16, 9);
bw.write_bits(0b11_1111u8, 6);
assert_eq!(vec![0b0000_0001, 0b1111_1100], bw.dump());
}
#[test]
#[should_panic]
fn catches_unaligned_dump() {
let mut bw = BitWriter::new();
bw.write_bits(0u8, 1);
bw.dump();
}
#[test]
#[should_panic]
fn catches_dirty_upper_bits() {
let mut bw = BitWriter::new();
bw.write_bits(10u8, 1);
}
#[test]
fn add_multiple_aligned() {
let mut bw = BitWriter::new();
bw.write_bits(0x00_0F_F0_FFu32, 32);
assert_eq!(vec![0xFF, 0xF0, 0x0F, 0x00], bw.dump());
}