use super::*;
#[test]
fn test_buffer_short_input_returns_none() {
let new_samples = vec![0.0; 100];
let mut buffer = Vec::new();
let result = prepare_audio_buffer(&new_samples, &mut buffer);
assert!(result.is_none());
assert_eq!(buffer.len(), 100);
}
#[test]
fn test_buffer_exact_frame() {
let new_samples = vec![1.0; N_FFT];
let mut buffer = Vec::new();
let result = prepare_audio_buffer(&new_samples, &mut buffer);
assert!(result.is_some());
let usable = result.unwrap();
assert_eq!(usable, N_FFT);
consume_audio_buffer(&mut buffer, usable);
assert!(buffer.is_empty());
}
#[test]
fn test_buffer_leftover_correct() {
let new_samples = vec![1.0; N_FFT + 50];
let mut buffer = Vec::new();
let result = prepare_audio_buffer(&new_samples, &mut buffer);
assert!(result.is_some());
let usable = result.unwrap();
assert_eq!(usable, N_FFT); consume_audio_buffer(&mut buffer, usable);
assert_eq!(buffer.len(), 50);
}
#[test]
fn test_buffer_accumulates_across_calls() {
let mut buffer = Vec::new();
let result = prepare_audio_buffer(&vec![1.0; 200], &mut buffer);
assert!(result.is_none());
assert_eq!(buffer.len(), 200);
let result = prepare_audio_buffer(&vec![2.0; 200], &mut buffer);
assert!(result.is_some());
let usable = result.unwrap();
assert_eq!(usable, 320);
consume_audio_buffer(&mut buffer, usable);
assert_eq!(buffer.len(), 80);
}
#[test]
fn test_buffer_truncation_at_5s() {
let mut buffer = vec![0.0; 90000];
let new_samples = vec![1.0; 1000];
let result = prepare_audio_buffer(&new_samples, &mut buffer);
assert!(result.is_some());
let usable = result.unwrap();
consume_audio_buffer(&mut buffer, usable);
assert!(usable + buffer.len() <= MAX_BUFFER_SAMPLES);
}
#[test]
fn test_buffer_multi_frame() {
let new_samples = vec![1.0; N_FFT + HOP_LENGTH];
let mut buffer = Vec::new();
let result = prepare_audio_buffer(&new_samples, &mut buffer);
assert!(result.is_some());
let usable = result.unwrap();
assert_eq!(usable, N_FFT + HOP_LENGTH);
consume_audio_buffer(&mut buffer, usable);
assert!(buffer.is_empty());
}
#[test]
fn test_prepare_buffer_empty_input() {
let mut buffer = vec![1.0; 100];
let result = prepare_audio_buffer(&[], &mut buffer);
assert!(result.is_none());
assert_eq!(buffer.len(), 100);
}
#[test]
fn test_prepare_buffer_exactly_max() {
let new_samples = vec![1.0; MAX_BUFFER_SAMPLES];
let mut buffer = Vec::new();
let result = prepare_audio_buffer(&new_samples, &mut buffer);
assert!(result.is_some());
let usable = result.unwrap();
consume_audio_buffer(&mut buffer, usable);
assert!(usable + buffer.len() <= MAX_BUFFER_SAMPLES);
}
#[test]
fn test_prepare_buffer_one_over_max() {
let new_samples = vec![1.0; MAX_BUFFER_SAMPLES + 1];
let mut buffer = Vec::new();
let result = prepare_audio_buffer(&new_samples, &mut buffer);
assert!(result.is_some());
let usable = result.unwrap();
consume_audio_buffer(&mut buffer, usable);
assert!(usable + buffer.len() <= MAX_BUFFER_SAMPLES);
}
#[test]
fn test_parse_pcm16_basic() {
let data: &[u8] = &[0x00, 0x40, 0x00, 0xC0]; let mut pending: Option<u8> = None;
let samples = parse_pcm16_with_carry(data, &mut pending);
assert_eq!(samples.len(), 2);
assert!(pending.is_none());
assert!((samples[0] - 0.5).abs() < 0.001);
assert!((samples[1] + 0.5).abs() < 0.001);
}
#[test]
fn test_parse_pcm16_odd_length_carry() {
let mut pending: Option<u8> = None;
let samples = parse_pcm16_with_carry(&[0x00, 0x00, 0xFF], &mut pending);
assert_eq!(samples.len(), 1);
assert_eq!(pending, Some(0xFF));
let samples = parse_pcm16_with_carry(&[0x7F], &mut pending);
assert_eq!(samples.len(), 1);
assert!(pending.is_none());
}
#[test]
fn test_parse_pcm16_empty() {
let mut pending: Option<u8> = None;
let samples = parse_pcm16_with_carry(&[], &mut pending);
assert!(samples.is_empty());
assert!(pending.is_none());
}
#[test]
fn test_sample_budget_pure() {
assert_eq!(max_samples_for_secs(None, 16000), usize::MAX);
assert_eq!(max_samples_for_secs(Some(0.0), 16000), usize::MAX);
assert_eq!(max_samples_for_secs(Some(-5.0), 16000), usize::MAX);
assert_eq!(max_samples_for_secs(Some(1800.0), 16000), 1800 * 16000);
assert_eq!(max_samples_for_secs(Some(1800.0), 96_000), 1800 * 96_000);
assert_eq!(
max_samples_for_secs(Some(1800.0), 192_000),
4 * max_samples_for_secs(Some(1800.0), 48_000),
);
}
#[test]
fn test_whole_buffer_limit_clamps_but_only_downward() {
assert_eq!(whole_buffer_limit_secs(None), WHOLE_BUFFER_MAX_AUDIO_SECS);
assert_eq!(
whole_buffer_limit_secs(Some(0.0)),
WHOLE_BUFFER_MAX_AUDIO_SECS
);
assert_eq!(whole_buffer_limit_secs(Some(300.0)), 300.0);
assert_eq!(
whole_buffer_limit_secs(Some(10_000.0)),
WHOLE_BUFFER_MAX_AUDIO_SECS
);
}