use adk_audio::{AudioFormat, AudioFrame, decode, encode};
use proptest::prelude::*;
fn arb_audio_format() -> impl Strategy<Value = AudioFormat> {
prop_oneof![
Just(AudioFormat::Pcm16),
Just(AudioFormat::Opus),
Just(AudioFormat::Mp3),
Just(AudioFormat::Wav),
Just(AudioFormat::Flac),
Just(AudioFormat::Ogg),
]
}
fn valid_pcm16_frame() -> AudioFrame {
AudioFrame::silence(16000, 1, 10)
}
fn valid_encoded_data(format: AudioFormat) -> Vec<u8> {
match format {
AudioFormat::Pcm16 => {
vec![0u8; 20]
}
AudioFormat::Wav => {
let frame = valid_pcm16_frame();
encode(&frame, AudioFormat::Wav).unwrap().to_vec()
}
_ => vec![0u8; 64],
}
}
proptest! {
#![proptest_config(ProptestConfig::with_cases(100))]
#[test]
fn prop_supports_encode_matches_encode(format in arb_audio_format()) {
let frame = valid_pcm16_frame();
let result = encode(&frame, format);
if format.supports_encode() {
prop_assert!(
result.is_ok(),
"supports_encode() returned true for {format:?} but encode() failed: {:?}",
result.err()
);
} else {
prop_assert!(
result.is_err(),
"supports_encode() returned false for {format:?} but encode() succeeded"
);
}
}
#[test]
fn prop_supports_decode_matches_decode(format in arb_audio_format()) {
let data = valid_encoded_data(format);
let result = decode(&data, format);
if format.supports_decode() {
prop_assert!(
result.is_ok(),
"supports_decode() returned true for {format:?} but decode() failed: {:?}",
result.err()
);
} else {
prop_assert!(
result.is_err(),
"supports_decode() returned false for {format:?} but decode() succeeded"
);
}
}
}
#[test]
fn test_all_variants_have_capability_answer() {
let all_formats = [
AudioFormat::Pcm16,
AudioFormat::Opus,
AudioFormat::Mp3,
AudioFormat::Wav,
AudioFormat::Flac,
AudioFormat::Ogg,
];
for format in &all_formats {
let can_encode: bool = format.supports_encode();
let can_decode: bool = format.supports_decode();
match format {
AudioFormat::Pcm16 | AudioFormat::Wav => {
assert!(can_encode, "{format:?} should support encoding");
assert!(can_decode, "{format:?} should support decoding");
}
AudioFormat::Opus | AudioFormat::Mp3 | AudioFormat::Flac | AudioFormat::Ogg => {
assert!(!can_encode, "{format:?} should NOT support encoding");
assert!(!can_decode, "{format:?} should NOT support decoding");
}
}
}
}