use ans::{decode, encode, FrequencyTable};
#[test]
fn roundtrip_small_known_sequence() {
let table = FrequencyTable::from_counts(&[10u32, 20, 70], 14).unwrap();
let message = [0u32, 2, 1, 2, 2, 0];
let bytes = encode(&message, &table).unwrap();
let recovered = decode(&bytes, &table, message.len()).unwrap();
assert_eq!(recovered, message, "decode must invert encode exactly");
}
#[test]
fn roundtrip_empty_message() {
let table = FrequencyTable::from_counts(&[5u32, 3, 2], 12).unwrap();
let message: [u32; 0] = [];
let bytes = encode(&message, &table).unwrap();
let recovered = decode(&bytes, &table, message.len()).unwrap();
assert_eq!(
bytes.len(),
4,
"empty message encodes to just the state word"
);
assert!(recovered.is_empty(), "decode of empty message is empty");
}
#[test]
fn roundtrip_skewed_distribution() {
let table = FrequencyTable::from_counts(&[990u32, 5, 3, 1, 1], 14).unwrap();
let message: Vec<u32> = (0..500)
.map(|i| match i % 100 {
0 => 1,
37 => 2,
73 => 3,
91 => 4,
_ => 0,
})
.collect();
let bytes = encode(&message, &table).unwrap();
let recovered = decode(&bytes, &table, message.len()).unwrap();
assert_eq!(recovered, message, "skewed-model round-trip must be exact");
}
#[test]
fn compression_beats_naive_on_compressible_input() {
let table = FrequencyTable::from_counts(&[990u32, 5, 3, 1, 1], 14).unwrap();
let message: Vec<u32> = (0..1000)
.map(|i| if i % 100 == 0 { 1 } else { 0 })
.collect();
let bytes = encode(&message, &table).unwrap();
let naive_size = message.len();
assert!(
bytes.len() < naive_size,
"expected compression: {} encoded bytes vs {} naive bytes",
bytes.len(),
naive_size
);
let recovered = decode(&bytes, &table, message.len()).unwrap();
assert_eq!(recovered, message, "compressed bytes must round-trip");
}