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/romanian/base.llev");
let file = crate::phonetic::llev::parse_str(content)
.expect("Invalid embedded romanian/base.llev - this is a bug in liblevenshtein");
RuleSetChar::from_llev(&file)
.expect("Failed to compile Romanian 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(), "Romanian base rules should not be empty");
assert!(
rules.len() >= 10,
"expected >=10 base rules, got {}",
rules.len()
);
}
#[test]
fn test_s_cedilla() {
let rules = base();
let result = rules.apply("ș");
assert!(result.contains("ʃ"), "ș should become SH, got: {}", result);
}
#[test]
fn test_t_cedilla() {
let rules = base();
let result = rules.apply("ț");
assert!(result.contains("t͡s"), "ț should become TS, got: {}", result);
}
#[test]
fn test_a_breve() {
let rules = base();
let result = rules.apply("ă");
assert!(
result.contains('ə') || result.contains('a'),
"ă should become ə (schwa), got: {}",
result
);
}
#[test]
fn test_a_circumflex() {
let rules = base();
let result = rules.apply("â");
assert!(
result.contains('ɨ') || result.contains('i'),
"â should become ɨ (close central unrounded), got: {}",
result
);
}
#[test]
fn test_i_circumflex() {
let rules = base();
let result = rules.apply("î");
assert!(
result.contains('ɨ') || result.contains('i'),
"î should become ɨ (close central unrounded), got: {}",
result
);
}
#[test]
fn test_ch_digraph() {
let rules = base();
let result = rules.apply("ch");
assert!(
result.contains('k') || result.contains('K'),
"ch should become k, got: {}",
result
);
}
#[test]
fn test_gh_digraph() {
let rules = base();
let result = rules.apply("gh");
assert!(
result.contains('ɡ') || result.contains('g') || result.contains('G'),
"gh should become ɡ (voiced velar stop), got: {}",
result
);
}
#[test]
fn test_j_to_zh() {
let rules = base();
let result = rules.apply("j");
assert!(result.contains("ʒ"), "j should become ZH, got: {}", result);
}
#[test]
fn test_word_romania() {
let rules = base();
let result = rules.apply("România");
assert!(
result.contains('ɨ') || result.contains('i'),
"România should contain ɨ (from â), got: {}",
result
);
}
#[test]
fn test_word_bucuresti() {
let rules = base();
let result = rules.apply("București");
assert!(
result.contains("ʃ"),
"București should contain SH, got: {}",
result
);
}
}