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/bengali/base.llev");
let file = crate::phonetic::llev::parse_str(content)
.expect("Invalid embedded bengali/base.llev - this is a bug in liblevenshtein");
RuleSetChar::from_llev(&file)
.expect("Failed to compile Bengali 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(), "Bengali base rules should not be empty");
assert!(
rules.len() >= 70,
"expected >=70 base rules, got {}",
rules.len()
);
}
#[test]
fn test_inherent_vowel_is_o_not_a() {
let rules = base();
let result = rules.apply("অ");
assert!(
result.contains('o') || result.contains('ɔ'),
"অ should become o (Bengali inherent vowel), got: {}",
result
);
}
#[test]
fn test_retroflex_flap() {
let rules = base();
let result = rules.apply("ড়");
assert!(
result.contains("ɽ") || result.contains("r"),
"ড় should become ɽ (IPA) or r, got: {}",
result
);
}
#[test]
fn test_nukta_ya() {
let rules = base();
let result = rules.apply("য়");
assert!(result.contains("YY"), "য় should become YY, got: {}", result);
}
#[test]
fn test_khanda_ta() {
let rules = base();
let result = rules.apply("ৎ");
assert!(result.contains('t'), "ৎ should become t, 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('i'), "ই should become i, got: {}", result);
let result = rules.apply("এ");
assert!(result.contains('e'), "এ should become e, got: {}", result);
}
#[test]
fn test_diphthongs() {
let rules = base();
let result = rules.apply("ঐ");
assert!(result.contains("oɪ"), "ঐ should become OI, got: {}", result);
let result = rules.apply("ঔ");
assert!(result.contains("oʊ"), "ঔ should become OU, 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('ɡ'), "গ should become g, got: {}", result);
}
#[test]
fn test_ya_becomes_j() {
let rules = base();
let result = rules.apply("য");
assert!(
result.contains('j') || result.contains('ʝ'),
"য should become j (Bengali pronunciation), 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);
}
#[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('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("oɪ"), "ৈ should become OI, got: {}", result);
}
#[test]
fn test_word_bangla() {
let rules = base();
let result = rules.apply_full("বাংলা");
assert!(
result.contains('b') && result.contains('l'),
"বাংলা should contain b, l, got: {}",
result
);
}
#[test]
fn test_word_kolkata() {
let rules = base();
let result = rules.apply_full("কলকাতা");
assert!(
result.contains('k') && result.contains('l') && result.contains('t'),
"কলকাতা should contain k, l, t, got: {}",
result
);
}
#[test]
fn test_word_dhaka() {
let rules = base();
let result = rules.apply_full("ঢাকা");
assert!(result.contains('k'), "ঢাকা should contain k, 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);
}
}