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/turkish/base.llev");
let file = crate::phonetic::llev::parse_str(content)
.expect("Invalid embedded turkish/base.llev - this is a bug in liblevenshtein");
RuleSetChar::from_llev(&file)
.expect("Failed to compile Turkish 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(), "Turkish base rules should not be empty");
assert!(
rules.len() > 20,
"expected >20 base rules, got {}",
rules.len()
);
}
#[test]
fn test_special_consonants() {
let rules = base();
let result = rules.apply("ş");
assert!(
result.contains('ʃ') || result.contains('S'),
"ş should become ʃ, got: {}",
result
);
let result = rules.apply("ç");
assert!(
result.contains("t͡ʃ") || result.contains('C'),
"ç should become t͡ʃ, got: {}",
result
);
let result = rules.apply("ğ");
assert!(
result.contains('ɣ') || result.contains('G'),
"ğ should become ɣ, got: {}",
result
);
}
#[test]
fn test_dotted_undotted_i() {
let rules = base();
let result = rules.apply("ı");
assert!(
result.contains('ɯ') || result.contains('I'),
"ı should become ɯ, got: {}",
result
);
let result = rules.apply("İ");
assert!(
result.contains('i') || result.contains('ɯ'),
"İ should become i or ɯ, got: {}",
result
);
}
#[test]
fn test_front_vowels() {
let rules = base();
let result = rules.apply("ö");
assert!(
result.contains('ø') || result.contains('O'),
"ö should become ø, got: {}",
result
);
let result = rules.apply("ü");
assert!(
result.contains('y') || result.contains('U'),
"ü should become y, got: {}",
result
);
}
#[test]
fn test_consonant_transforms() {
let rules = base();
let result = rules.apply("c");
assert!(
result.contains("t͡ʃ") || result.contains("d͡ʒ") || result.contains("DJ"),
"c should become t͡ʃ or d͡ʒ, got: {}",
result
);
let result = rules.apply("j");
assert!(
result.contains('ʒ') || result.contains('Z'),
"j should become ʒ, got: {}",
result
);
}
#[test]
fn test_word_istanbul() {
let rules = base();
let result = rules.apply("İstanbul");
assert!(
result.contains('s') && result.contains('t'),
"İstanbul should normalize properly, got: {}",
result
);
}
#[test]
fn test_word_turkiye() {
let rules = base();
let result = rules.apply("Türkiye");
assert!(
(result.contains('y') || result.contains('U')) && result.contains('k'),
"Türkiye should have y (from ü), got: {}",
result
);
}
#[test]
fn test_word_dag() {
let rules = base();
let result = rules.apply("dağ");
assert!(
(result.contains('ɣ') || result.contains('G'))
&& result.contains('d')
&& result.contains('a'),
"dağ should have ɣ (from ğ), got: {}",
result
);
}
#[test]
fn test_word_gunes() {
let rules = base();
let result = rules.apply("güneş");
assert!(
(result.contains('y') || result.contains('U')) && result.contains('ʃ'),
"güneş should have y and ʃ, got: {}",
result
);
}
}