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/indonesian/base.llev");
let file = crate::phonetic::llev::parse_str(content)
.expect("Invalid embedded indonesian/base.llev - this is a bug in liblevenshtein");
RuleSetChar::from_llev(&file)
.expect("Failed to compile Indonesian 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(),
"Indonesian base rules should not be empty"
);
assert!(
rules.len() >= 5,
"expected >=5 base rules, got {}",
rules.len()
);
}
#[test]
fn test_ng_digraph() {
let rules = base();
let result = rules.apply("ng");
assert!(result.contains("ŋ"), "ng should become NG, got: {}", result);
}
#[test]
fn test_ny_digraph() {
let rules = base();
let result = rules.apply("ny");
assert!(result.contains("ɲ"), "ny should become NY, got: {}", result);
}
#[test]
fn test_sy_digraph() {
let rules = base();
let result = rules.apply("sy");
assert!(result.contains("ʃ"), "sy should become SH, got: {}", result);
}
#[test]
fn test_kh_digraph() {
let rules = base();
let result = rules.apply("kh");
assert!(result.contains("x"), "kh should become KH, got: {}", result);
}
#[test]
fn test_c_to_ch() {
let rules = base();
let result = rules.apply("c");
assert!(result.contains("t͡ʃ"), "c should become CH, got: {}", result);
}
#[test]
fn test_v_to_f() {
let rules = base();
let result = rules.apply("v");
assert!(result.contains('f'), "v should become f, got: {}", result);
}
#[test]
fn test_word_dengan() {
let rules = base();
let result = rules.apply("dengan");
assert!(
result.contains("ŋ"),
"dengan should contain NG, got: {}",
result
);
}
#[test]
fn test_word_cari() {
let rules = base();
let result = rules.apply("cari");
assert!(
result.contains("t͡ʃ"),
"cari should contain CH, got: {}",
result
);
}
#[test]
fn test_word_indonesia() {
let rules = base();
let result = rules.apply("indonesia");
assert!(
result.contains('i') && result.contains('n') && result.contains('a'),
"indonesia should contain i, n, a, got: {}",
result
);
}
}