use crate::phonetic::llev::RuleSetChar;
use std::sync::OnceLock;
pub fn gurmukhi() -> &'static RuleSetChar {
static RULESET: OnceLock<RuleSetChar> = OnceLock::new();
RULESET.get_or_init(|| {
let content = include_str!("../../../data/rules/punjabi/gurmukhi.llev");
let file = crate::phonetic::llev::parse_str(content)
.expect("Invalid embedded punjabi/gurmukhi.llev - this is a bug in liblevenshtein");
RuleSetChar::from_llev(&file)
.expect("Failed to compile Punjabi Gurmukhi rules - this is a bug in liblevenshtein")
})
}
pub fn shahmukhi() -> &'static RuleSetChar {
static RULESET: OnceLock<RuleSetChar> = OnceLock::new();
RULESET.get_or_init(|| {
let content = include_str!("../../../data/rules/punjabi/shahmukhi.llev");
let file = crate::phonetic::llev::parse_str(content)
.expect("Invalid embedded punjabi/shahmukhi.llev - this is a bug in liblevenshtein");
RuleSetChar::from_llev(&file)
.expect("Failed to compile Punjabi Shahmukhi rules - this is a bug in liblevenshtein")
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_gurmukhi_loads() {
let rules = gurmukhi();
assert!(
!rules.is_empty(),
"Punjabi Gurmukhi rules should not be empty"
);
assert!(
rules.len() >= 65,
"expected >=65 Gurmukhi rules, got {}",
rules.len()
);
}
#[test]
fn test_gurmukhi_nukta_consonants() {
let rules = gurmukhi();
let result = rules.apply("ਸ਼");
assert!(result.contains("ʃ"), "ਸ਼ should become ʃ, got: {}", result);
let result = rules.apply("ੜ");
assert!(
result.contains("ɽ") || result.contains("r"),
"ੜ should become ɽ (retroflex flap), got: {}",
result
);
}
#[test]
fn test_gurmukhi_vowels() {
let rules = gurmukhi();
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("ɛː") || result.contains("aɪ"),
"ਐ should become ɛː (IPA), got: {}",
result
);
}
#[test]
fn test_gurmukhi_consonants() {
let rules = gurmukhi();
let result = rules.apply("ਕ");
assert!(result.contains('k'), "ਕ should become k, got: {}", result);
let result = rules.apply("ਪ");
assert!(result.contains('p'), "ਪ should become p, got: {}", result);
let result = rules.apply("ਮ");
assert!(result.contains('m'), "ਮ should become m, got: {}", result);
}
#[test]
fn test_gurmukhi_word_punjabi() {
let rules = gurmukhi();
let result = rules.apply_full("ਪੰਜਾਬੀ");
assert!(
result.contains('p')
&& (result.contains('j') || result.contains('ʝ'))
&& result.contains('b'),
"ਪੰਜਾਬੀ should contain p, j, b, got: {}",
result
);
}
#[test]
fn test_gurmukhi_word_lahore() {
let rules = gurmukhi();
let result = rules.apply_full("ਲਾਹੌਰ");
assert!(
result.contains('l') && result.contains('h') && result.contains('r'),
"ਲਾਹੌਰ should contain l, h, r, got: {}",
result
);
}
#[test]
fn test_gurmukhi_numerals() {
let rules = gurmukhi();
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);
}
#[test]
fn test_shahmukhi_loads() {
let rules = shahmukhi();
assert!(
!rules.is_empty(),
"Punjabi Shahmukhi rules should not be empty"
);
assert!(
rules.len() >= 40,
"expected >=40 Shahmukhi rules, got {}",
rules.len()
);
}
#[test]
fn test_shahmukhi_consonants() {
let rules = shahmukhi();
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("ʃ"), "ش should become SH, got: {}", result);
}
#[test]
fn test_shahmukhi_retroflex() {
let rules = shahmukhi();
let result = rules.apply("ٹ");
assert!(result.contains("ʈ"), "ٹ should become ʈ, got: {}", result);
let result = rules.apply("ڑ");
assert!(
result.contains("ɽ") || result.contains("r"),
"ڑ should become ɽ (retroflex flap), got: {}",
result
);
}
#[test]
fn test_shahmukhi_word_punjabi() {
let rules = shahmukhi();
let result = rules.apply_full("پنجابی");
assert!(
result.contains('p')
&& result.contains('n')
&& (result.contains('j') || result.contains('ʝ')),
"پنجابی should contain p, n, j, got: {}",
result
);
}
}