use super::*;
fn build_synthetic_wav(junk_chunks: usize) -> Vec<u8> {
let mut data = Vec::new();
data.extend_from_slice(b"RIFF");
data.extend_from_slice(&0u32.to_le_bytes()); data.extend_from_slice(b"WAVE");
for _ in 0..junk_chunks {
data.extend_from_slice(b"JUNK");
data.extend_from_slice(&0u32.to_le_bytes()); }
data.extend_from_slice(b"fmt ");
data.extend_from_slice(&16u32.to_le_bytes());
data.extend_from_slice(&1u16.to_le_bytes()); data.extend_from_slice(&1u16.to_le_bytes()); data.extend_from_slice(&48000u32.to_le_bytes());
data.extend_from_slice(&(48000u32 * 2).to_le_bytes()); data.extend_from_slice(&2u16.to_le_bytes()); data.extend_from_slice(&16u16.to_le_bytes());
data.extend_from_slice(b"data");
data.extend_from_slice(&16u32.to_le_bytes());
for _ in 0..8 {
data.extend_from_slice(&0i16.to_le_bytes());
}
let total = (data.len() - 8) as u32;
data[4..8].copy_from_slice(&total.to_le_bytes());
data
}
#[test]
fn junk_zero_size_chunk_flood_aborts_scan() {
let wav = build_synthetic_wav(10_000);
let result = parse_wav(&wav);
assert!(result.is_err(), "junk-chunk flood must be rejected");
let msg = result.err().unwrap().to_string();
assert!(
msg.contains("fmt ") || msg.contains("not found"),
"unexpected error: {msg}"
);
}
#[test]
fn find_chunk_returns_none_after_scan_cap() {
let junk_id = *b"JUNK";
let mut data = Vec::new();
data.extend_from_slice(b"RIFF");
data.extend_from_slice(&0u32.to_le_bytes());
data.extend_from_slice(b"WAVE");
for _ in 0..(MAX_CHUNKS_SCANNED + 16) {
data.extend_from_slice(&junk_id);
data.extend_from_slice(&0u32.to_le_bytes());
}
assert!(find_chunk(&data, b"fmt ", 12).is_none());
assert!(find_chunk(&data, &junk_id, 12).is_some());
}
#[test]
fn junk_chunks_within_cap_still_parse() {
let wav = build_synthetic_wav(100);
let (samples, rate) = parse_wav(&wav).expect("valid WAV with junk must parse");
assert_eq!(rate, 48000);
assert_eq!(samples.len(), 8);
}
#[test]
fn scan_cap_boundary_exact() {
let below = build_synthetic_wav(MAX_CHUNKS_SCANNED - 2);
assert!(parse_wav(&below).is_ok());
let at_cap = build_synthetic_wav(MAX_CHUNKS_SCANNED - 1);
let err = parse_wav(&at_cap).expect_err("scan cap must abort before data");
assert!(err.to_string().contains("not found"), "unexpected: {err}");
}