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/hindi/base.llev");
let file = crate::phonetic::llev::parse_str(content)
.expect("Invalid embedded hindi/base.llev - this is a bug in liblevenshtein");
RuleSetChar::from_llev(&file)
.expect("Failed to compile Hindi 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(), "Hindi base rules should not be empty");
assert!(
rules.len() > 65,
"expected >65 base rules, got {}",
rules.len()
);
}
#[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);
let result = rules.apply("ऊ");
assert!(result.contains("uː"), "ऊ should become uː, 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('ɡ'), "ग should become ɡ, got: {}", result);
let result = rules.apply("घ");
assert!(result.contains("gh"), "घ should become gh, 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_dental_consonants() {
let rules = base();
let result = rules.apply("त");
assert!(result.contains('t'), "त should become t, got: {}", result);
let result = rules.apply("द");
assert!(result.contains('d'), "द should become d, got: {}", result);
let result = rules.apply("न");
assert!(result.contains('n'), "न should become n, got: {}", result);
}
#[test]
fn test_labial_consonants() {
let rules = base();
let result = rules.apply("प");
assert!(result.contains('p'), "प should become p, got: {}", result);
let result = rules.apply("ब");
assert!(result.contains('b'), "ब should become b, got: {}", result);
let result = rules.apply("म");
assert!(result.contains('m'), "म should become m, 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_nukta_consonants() {
let rules = base();
let result = rules.apply("क़");
assert!(
result.contains('q') || result.contains('k'),
"क़ should become q or k, got: {}",
result
);
let result = rules.apply("ज़");
assert!(
result.contains('z') || result.contains('j'),
"ज़ should become z or j, got: {}",
result
);
let result = rules.apply("फ़");
assert!(
result.contains('f') || result.contains("ph"),
"फ़ should become f or ph, got: {}",
result
);
let result = rules.apply("ड़");
assert!(
result.contains('ɽ') || result.contains('ɖ'),
"ड़ should become ɽ or ɖ (retroflex), 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("ɛː"), "ै should become ɛː, 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);
}
#[test]
fn test_word_hindi() {
let rules = base();
let result = rules.apply("हिन्दी");
assert!(
result.contains('h') && result.contains('n') && result.contains('d'),
"हिन्दी should contain h, n, d, got: {}",
result
);
}
#[test]
fn test_word_namaste() {
let rules = base();
let result = rules.apply("नमस्ते");
assert!(
result.contains('n') && result.contains('m') && result.contains('s'),
"नमस्ते should contain n, m, s, got: {}",
result
);
}
}