use shabda::prelude::*;
#[test]
fn test_hello_world() {
let g2p = G2PEngine::new(Language::English);
let events = g2p.convert("hello world").unwrap();
assert!(!events.is_empty(), "should produce phoneme events");
assert!(events.len() > 4, "hello world needs multiple phonemes");
}
#[test]
fn test_empty_input_errors() {
let g2p = G2PEngine::new(Language::English);
assert!(g2p.convert("").is_err());
assert!(g2p.convert(" ").is_err());
}
#[test]
fn test_dictionary_lookup() {
let g2p = G2PEngine::new(Language::English);
let events = g2p.convert("the").unwrap();
assert!(!events.is_empty());
}
#[test]
fn test_rule_fallback() {
let g2p = G2PEngine::new(Language::English);
let events = g2p.convert("flurb").unwrap();
assert!(!events.is_empty());
}
#[test]
fn test_speak_produces_audio() {
let g2p = G2PEngine::new(Language::English);
let voice = svara::voice::VoiceProfile::new_male();
let samples = g2p.speak("hello", &voice, 44100.0).unwrap();
assert!(!samples.is_empty());
assert!(samples.iter().all(|s| s.is_finite()));
let max_amp: f32 = samples.iter().map(|s| s.abs()).fold(0.0, f32::max);
assert!(max_amp > 0.001, "should produce audible output");
}
#[test]
fn test_speak_sentence() {
let g2p = G2PEngine::new(Language::English);
let voice = svara::voice::VoiceProfile::new_female();
let samples = g2p.speak("hello world", &voice, 44100.0).unwrap();
assert!(!samples.is_empty());
assert!(samples.iter().all(|s| s.is_finite()));
}
#[test]
fn test_question_intonation() {
let g2p = G2PEngine::new(Language::English);
let voice = svara::voice::VoiceProfile::new_male();
let samples = g2p.speak("hello?", &voice, 44100.0).unwrap();
assert!(!samples.is_empty());
}
#[test]
fn test_custom_dictionary_entry() {
let mut g2p = G2PEngine::new(Language::English);
g2p.dictionary_mut().insert(
"agnos",
&[
svara::phoneme::Phoneme::VowelAsh,
svara::phoneme::Phoneme::PlosiveG,
svara::phoneme::Phoneme::NasalN,
svara::phoneme::Phoneme::VowelO,
svara::phoneme::Phoneme::FricativeS,
],
);
let events = g2p.convert("agnos").unwrap();
assert!(events.len() >= 5);
}
#[test]
fn test_content_vs_function_word_stress() {
let g2p = G2PEngine::new(Language::English);
let events = g2p.convert("the cat").unwrap();
let the_events: Vec<_> = events.iter().take(2).collect(); assert_eq!(the_events[0].stress, svara::prosody::Stress::Unstressed);
}
#[test]
fn test_serde_roundtrip_language() {
let json = serde_json::to_string(&Language::English).unwrap();
let l2: Language = serde_json::from_str(&json).unwrap();
assert_eq!(l2, Language::English);
}
#[test]
fn test_serde_roundtrip_engine() {
let engine = G2PEngine::new(Language::English);
let json = serde_json::to_string(&engine).unwrap();
let e2: G2PEngine = serde_json::from_str(&json).unwrap();
assert_eq!(e2.language(), Language::English);
assert_eq!(e2.dictionary().len(), engine.dictionary().len());
}
#[test]
fn test_serde_roundtrip_error() {
let err = ShabdaError::UnknownWord("test".into());
let json = serde_json::to_string(&err).unwrap();
let e2: ShabdaError = serde_json::from_str(&json).unwrap();
assert_eq!(err.to_string(), e2.to_string());
}
#[test]
fn test_phrase_pause_comma() {
let g2p = G2PEngine::new(Language::English);
let events = g2p.convert("hello, world").unwrap();
let pauses: Vec<_> = events
.iter()
.filter(|e| e.phoneme == svara::phoneme::Phoneme::Silence && e.duration > 0.1)
.collect();
assert!(!pauses.is_empty(), "comma should produce a phrase pause");
}
#[test]
fn test_phrase_pause_period() {
let g2p = G2PEngine::new(Language::English);
let events = g2p.convert("hello. world").unwrap();
let pauses: Vec<_> = events
.iter()
.filter(|e| e.phoneme == svara::phoneme::Phoneme::Silence && e.duration > 0.2)
.collect();
assert!(
!pauses.is_empty(),
"period should produce a longer phrase pause"
);
}
#[test]
fn test_number_expansion_in_pipeline() {
let g2p = G2PEngine::new(Language::English);
let events = g2p.convert("42").unwrap();
assert!(
events.len() > 4,
"number should expand to words with phonemes"
);
}