use weezl::decode::Decoder;
use weezl::encode::Encoder;
use weezl::BitOrder;
#[test]
fn corrupt_input_does_not_panic_in_derive_burst() {
let inputs: &[(&str, &[u8])] = &[
("hello_world", b"Hello, world"),
("zero_run_4k", &[0u8; 4096]),
("ff_run_4k", &[0xffu8; 4096]),
("alphabet", b"abcdefghijklmnopqrstuvwxyz"),
("ramp_256", &{
let mut r = [0u8; 256];
for (i, b) in r.iter_mut().enumerate() {
*b = i as u8;
}
r
}),
];
for &order in &[BitOrder::Lsb, BitOrder::Msb] {
for &min_code_size in &[8u8, 9, 12] {
for (label, data) in inputs {
let encoded = Encoder::new(order, min_code_size)
.encode(data)
.unwrap_or_else(|e| {
panic!("encode {} {:?}/{}: {:?}", label, order, min_code_size, e)
});
let decoded = Decoder::new(order, min_code_size)
.decode(&encoded)
.unwrap_or_else(|e| {
panic!("decode {} {:?}/{}: {:?}", label, order, min_code_size, e)
});
assert_eq!(
decoded, *data,
"round-trip mismatch for {} at {:?}/{}",
label, order, min_code_size
);
}
}
}
let encoded = Encoder::new(BitOrder::Lsb, 12)
.encode(b"Hello, world")
.expect("encode baseline");
assert!(
encoded.len() > 3,
"encoded baseline too short to mutate at byte 3"
);
let mut corrupt = encoded.clone();
corrupt[3] ^= 0x08;
let _ = Decoder::new(BitOrder::Lsb, 12).decode(&corrupt);
}