use lac::{decode_frame, encode_frame};
fn lfsr_noise(n: usize, bit_depth: u8, seed: u32) -> Vec<i32> {
assert!((1..=24).contains(&bit_depth));
let mut state = if seed == 0 { 0xACE1_ACE1 } else { seed };
let shift = 32 - bit_depth as u32;
let max: i32 = (1i32 << (bit_depth - 1)) - 1;
(0..n)
.map(|_| {
let lsb = state & 1;
state >>= 1;
if lsb != 0 {
state ^= 0x8020_0003;
}
((state as i32) >> shift).max(-max)
})
.collect()
}
#[test]
fn encode_byte_equal_on_same_input_silence() {
let samples = vec![0i32; 4096];
let a = encode_frame(&samples);
let b = encode_frame(&samples);
assert_eq!(a, b, "encoder produced different bytes for identical input");
}
#[test]
fn encode_byte_equal_on_same_input_noise() {
let samples = lfsr_noise(4096, 16, 0xDEAD);
let a = encode_frame(&samples);
let b = encode_frame(&samples);
assert_eq!(
a,
b,
"encoder produced different bytes on a noisy input (first {} bytes)",
a.len().min(16)
);
}
#[test]
fn encode_byte_equal_on_same_input_24bit_full_scale() {
let samples = vec![(1 << 23) - 1; 2048];
let a = encode_frame(&samples);
let b = encode_frame(&samples);
assert_eq!(a, b);
}
#[test]
fn encode_byte_equal_across_many_repeats() {
let samples = lfsr_noise(2048, 20, 0xBEEF);
let reference = encode_frame(&samples);
for i in 1..10 {
let current = encode_frame(&samples);
assert_eq!(
current, reference,
"encode #{} differs from the reference encode",
i
);
}
}
#[test]
fn decode_byte_equal_on_same_input() {
let samples = lfsr_noise(2048, 16, 0xF00D);
let bytes = encode_frame(&samples);
let a = decode_frame(&bytes).expect("decode a");
let b = decode_frame(&bytes).expect("decode b");
assert_eq!(
a, b,
"decoder produced different samples for identical bytes"
);
assert_eq!(a, samples, "decoder output doesn't match original samples");
}