use crate::phonetic::llev::RuleSetChar;
use std::sync::OnceLock;
pub fn base() -> &'static RuleSetChar {
static RULESET: OnceLock<RuleSetChar> = OnceLock::new();
RULESET.get_or_init(|| {
let content = include_str!("../../../data/rules/telugu/base.llev");
let file = crate::phonetic::llev::parse_str(content)
.expect("Invalid embedded telugu/base.llev - this is a bug in liblevenshtein");
RuleSetChar::from_llev(&file)
.expect("Failed to compile Telugu base rules - this is a bug in liblevenshtein")
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_base_loads() {
let rules = base();
assert!(!rules.is_empty(), "Telugu base rules should not be empty");
assert!(
rules.len() >= 70,
"expected >=70 base rules, got {}",
rules.len()
);
}
#[test]
fn test_retroflex_lateral() {
let rules = base();
let result = rules.apply("ళ");
assert!(
result.contains("ɭ"),
"ళ should become ɭ (retroflex lateral), got: {}",
result
);
}
#[test]
fn test_alveolar_trill() {
let rules = base();
let result = rules.apply("ఱ");
assert!(
result.contains("ɽ"),
"ఱ should become ɽ (retroflex flap), got: {}",
result
);
}
#[test]
fn test_independent_vowels() {
let rules = base();
let result = rules.apply("అ");
assert!(result.contains('a'), "అ should become a, got: {}", result);
let result = rules.apply("ఆ");
assert!(result.contains("aː"), "ఆ should become A, got: {}", result);
let result = rules.apply("ఇ");
assert!(result.contains('i'), "ఇ should become i, got: {}", result);
}
#[test]
fn test_short_long_vowels() {
let rules = base();
let result = rules.apply("ఎ");
assert!(result.contains('e'), "ఎ should become e, got: {}", result);
let result = rules.apply("ఏ");
assert!(
result.contains("eː"),
"ఏ should become eː (long e), got: {}",
result
);
let result = rules.apply("ఒ");
assert!(result.contains('o'), "ఒ should become o, got: {}", result);
let result = rules.apply("ఓ");
assert!(
result.contains("oː"),
"ఓ should become oː (long o), got: {}",
result
);
}
#[test]
fn test_diphthongs() {
let rules = base();
let result = rules.apply("ఐ");
assert!(result.contains("aɪ"), "ఐ should become AI, got: {}", result);
let result = rules.apply("ఔ");
assert!(result.contains("aʊ"), "ఔ should become AU, got: {}", result);
}
#[test]
fn test_velar_consonants() {
let rules = base();
let result = rules.apply("క");
assert!(result.contains('k'), "క should become k, got: {}", result);
let result = rules.apply("ఖ");
assert!(result.contains("kh"), "ఖ should become kh, got: {}", result);
let result = rules.apply("గ");
assert!(
result.contains('ɡ') || result.contains('g'),
"గ should become ɡ (IPA g), got: {}",
result
);
}
#[test]
fn test_retroflex_consonants() {
let rules = base();
let result = rules.apply("ట");
assert!(result.contains("ʈ"), "ట should become TT, got: {}", result);
let result = rules.apply("డ");
assert!(result.contains("ɖ"), "డ should become DD, got: {}", result);
let result = rules.apply("ణ");
assert!(result.contains("ɳ"), "ణ should become NN, got: {}", result);
}
#[test]
fn test_sibilants() {
let rules = base();
let result = rules.apply("శ");
assert!(result.contains("ʃ"), "శ should become SH, got: {}", result);
let result = rules.apply("ష");
assert!(result.contains("ʂ"), "ష should become SS, got: {}", result);
let result = rules.apply("స");
assert!(result.contains('s'), "స should become s, got: {}", result);
}
#[test]
fn test_vowel_matras() {
let rules = base();
let result = rules.apply("ా");
assert!(result.contains("aː"), "ా should become A, got: {}", result);
let result = rules.apply("ి");
assert!(result.contains('i'), "ి should become i, got: {}", result);
let result = rules.apply("ై");
assert!(result.contains("aɪ"), "ై should become AI, got: {}", result);
}
#[test]
fn test_word_telugu() {
let rules = base();
let result = rules.apply_full("తెలుగు");
assert!(
result.contains('t')
&& result.contains('l')
&& (result.contains('ɡ') || result.contains('g')),
"తెలుగు should contain t, l, ɡ (IPA g), got: {}",
result
);
}
#[test]
fn test_word_hyderabad() {
let rules = base();
let result = rules.apply_full("హైదరాబాద్");
assert!(
result.contains('h') && result.contains('d') && result.contains('r'),
"హైదరాబాద్ should contain h, d, r, got: {}",
result
);
}
#[test]
fn test_word_andhra() {
let rules = base();
let result = rules.apply_full("ఆంధ్ర");
assert!(
result.contains("aː") && result.contains('r'),
"ఆంధ్ర should contain A, r, got: {}",
result
);
}
#[test]
fn test_numerals() {
let rules = base();
let result = rules.apply("౦");
assert!(result.contains('0'), "౦ should become 0, got: {}", result);
let result = rules.apply("౫");
assert!(result.contains('5'), "౫ should become 5, got: {}", result);
let result = rules.apply("౯");
assert!(result.contains('9'), "౯ should become 9, got: {}", result);
}
}