From 9397938adf979f360853e9c96689bdf2bc759ca6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Gro=C3=9F?= Date: Thu, 15 Jan 2026 01:23:05 +0100 Subject: [PATCH] Add unit tests for TTS --- src/tts.rs | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/src/tts.rs b/src/tts.rs index 82db48bd..bbadfd07 100644 --- a/src/tts.rs +++ b/src/tts.rs @@ -687,4 +687,73 @@ impl TTS { let replacement = |amount: usize| format!(""); return TTS::merge_pauses_xml(str, &CONSECUTIVE_BREAKS, &PAUSE_AMOUNT, replacement); } -} \ No newline at end of file +} + +#[cfg(test)] +mod tests { + use super::*; + use yaml_rust::YamlLoader; + + #[test] + /// Verifies pronounce YAML builds and renders all supported fields. + fn pronounce_build_and_display() { + let yaml = YamlLoader::load_from_str( + r#" +- text: "alpha" +- ipa: "a" +- sapi5: "b" +- eloquence: "c" +"#, + ) + .unwrap(); + let values = &yaml[0]; + let rule = TTS::build("pronounce", values).unwrap(); + let rendered = format!("{rule}"); + + assert!(rendered.contains("text: 'alpha'")); + assert!(rendered.contains("ipa: 'a'")); + assert!(rendered.contains("sapi5: 'b'")); + assert!(rendered.contains("eloquence: 'c'")); + } + + #[test] + /// Ensures pronounce requires a text entry and rejects missing text. + fn pronounce_requires_text() { + let yaml = YamlLoader::load_from_str( + r#" +- ipa: "a" +"#, + ) + .unwrap(); + let values = &yaml[0]; + let err = TTS::build("pronounce", values).unwrap_err(); + assert!(err.to_string().contains("'text' key/value is required")); + } + + #[test] + /// Coalesces adjacent punctuation pauses for the None engine. + fn merge_pauses_none_coalesces() { + let input = "a,,;b"; + let output = TTS::None.merge_pauses(input); + assert!(!output.contains(",,")); + assert!(output.contains(";")); + } + + #[test] + /// Uses the maximum pause when merging consecutive SSML breaks. + fn merge_pauses_ssml_keeps_max() { + let input = ""; + let output = TTS::SSML.merge_pauses(input); + assert!(!output.contains("100ms")); + assert!(output.contains("300ms")); + } + + #[test] + /// Uses the maximum pause when merging consecutive SAPI5 breaks. + fn merge_pauses_sapi5_keeps_max() { + let input = ""; + let output = TTS::SAPI5.merge_pauses(input); + assert!(!output.contains("100ms")); + assert!(output.contains("300ms")); + } +}