use sendspin::audio::decode::{Decoder, PcmDecoder};
use sendspin::audio::Sample;
#[test]
fn test_decode_pcm_16bit() {
let decoder = PcmDecoder::new(16);
let data = vec![
0x00, 0x04, 0x00, 0x08, 0xFF, 0xFF, 0x00, 0x00, ];
let samples = decoder.decode(&data).unwrap();
assert_eq!(samples.len(), 4);
assert_eq!(samples[0].to_i16(), 1024);
assert_eq!(samples[1].to_i16(), 2048);
assert_eq!(samples[2].to_i16(), -1);
assert_eq!(samples[3].to_i16(), 0);
}
#[test]
fn test_decode_pcm_24bit() {
let decoder = PcmDecoder::new(24);
let data = vec![
0x00, 0x10, 0x00, 0xFF, 0xFF, 0xFF, ];
let samples = decoder.decode(&data).unwrap();
assert_eq!(samples.len(), 2);
assert_eq!(samples[0], Sample(4096));
assert_eq!(samples[1], Sample(-1));
}
#[test]
fn test_decode_pcm_16bit_empty_input() {
let decoder = PcmDecoder::new(16);
let samples = decoder.decode(&[]).unwrap();
assert_eq!(samples.len(), 0);
}
#[test]
fn test_decode_pcm_24bit_empty_input() {
let decoder = PcmDecoder::new(24);
let samples = decoder.decode(&[]).unwrap();
assert_eq!(samples.len(), 0);
}
#[test]
fn test_decode_pcm_16bit_misaligned_trailing_byte_dropped() {
let decoder = PcmDecoder::new(16);
let data = vec![0x00, 0x04, 0xFF];
let samples = decoder.decode(&data).unwrap();
assert_eq!(samples.len(), 1);
assert_eq!(samples[0].to_i16(), 1024);
}
#[test]
fn test_decode_pcm_24bit_misaligned_trailing_bytes_dropped() {
let decoder = PcmDecoder::new(24);
let data = vec![0x00, 0x10, 0x00, 0xAB, 0xCD];
let samples = decoder.decode(&data).unwrap();
assert_eq!(samples.len(), 1);
assert_eq!(samples[0], Sample(4096));
}
#[test]
fn test_decode_pcm_16bit_single_sample_max() {
let decoder = PcmDecoder::new(16);
let data = vec![0xFF, 0x7F]; let samples = decoder.decode(&data).unwrap();
assert_eq!(samples.len(), 1);
assert_eq!(samples[0].to_i16(), i16::MAX);
}
#[test]
fn test_decode_pcm_16bit_single_sample_min() {
let decoder = PcmDecoder::new(16);
let data = vec![0x00, 0x80]; let samples = decoder.decode(&data).unwrap();
assert_eq!(samples.len(), 1);
assert_eq!(samples[0].to_i16(), i16::MIN);
}
#[test]
fn test_decode_pcm_24bit_single_sample_max() {
let decoder = PcmDecoder::new(24);
let data = vec![0xFF, 0xFF, 0x7F];
let samples = decoder.decode(&data).unwrap();
assert_eq!(samples.len(), 1);
assert_eq!(samples[0], Sample::MAX);
}
#[test]
fn test_decode_pcm_24bit_single_sample_min() {
let decoder = PcmDecoder::new(24);
let data = vec![0x00, 0x00, 0x80]; let samples = decoder.decode(&data).unwrap();
assert_eq!(samples.len(), 1);
assert_eq!(samples[0], Sample::MIN);
}
#[test]
fn test_decode_pcm_zero_bit_depth_unsupported() {
let decoder = PcmDecoder::new(0);
let result = decoder.decode(&[0x00]);
assert!(result.is_err());
}
#[test]
fn test_decode_pcm_unsupported_bit_depth() {
let decoder = PcmDecoder::new(8);
let result = decoder.decode(&[0x00, 0x01]);
assert!(result.is_err());
}
#[test]
fn test_decode_pcm_32bit_unsupported() {
let decoder = PcmDecoder::new(32);
let result = decoder.decode(&[0x00; 4]);
assert!(result.is_err());
}
#[test]
fn test_decode_pcm_16bit_sub_sample_input() {
let decoder = PcmDecoder::new(16);
let samples = decoder.decode(&[0xFF]).unwrap();
assert_eq!(samples.len(), 0);
}
#[test]
fn test_decode_pcm_24bit_sub_sample_input() {
let decoder = PcmDecoder::new(24);
let samples = decoder.decode(&[0xFF, 0xFF]).unwrap();
assert_eq!(samples.len(), 0);
}