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/basque/base.llev");
let file = crate::phonetic::llev::parse_str(content)
.expect("Invalid embedded basque/base.llev - this is a bug in liblevenshtein");
RuleSetChar::from_llev(&file)
.expect("Failed to compile Basque 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(), "Basque base rules should not be empty");
assert!(
rules.len() >= 10,
"expected >=10 base rules, got {}",
rules.len()
);
}
#[test]
fn test_tx_digraph() {
let rules = base();
let result = rules.apply("tx");
assert!(
result.contains("t͡ʃ"),
"tx should become CH, got: {}",
result
);
}
#[test]
fn test_ts_digraph() {
let rules = base();
let result = rules.apply("ts");
assert!(
result.contains("t͡s"),
"ts should become TS, got: {}",
result
);
}
#[test]
fn test_tz_digraph() {
let rules = base();
let result = rules.apply("tz");
assert!(
result.contains("t͡s̻") || result.contains("t͡s"),
"tz should become t͡s̻ or t͡s, got: {}",
result
);
}
#[test]
fn test_rr_digraph() {
let rules = base();
let result = rules.apply("rr");
assert!(
result.contains("r") || result.contains("ɾ"),
"rr should become r or ɾ (trilled/tapped r), got: {}",
result
);
}
#[test]
fn test_x_to_sh() {
let rules = base();
let result = rules.apply("x");
assert!(result.contains("ʃ"), "x should become SH, got: {}", result);
}
#[test]
fn test_z_to_s() {
let rules = base();
let result = rules.apply("z");
assert!(
result.contains("s̻") || result.contains('s'),
"z should become s̻ or s (not z!), got: {}",
result
);
}
#[test]
fn test_n_tilde() {
let rules = base();
let result = rules.apply("ñ");
assert!(result.contains("ɲ"), "ñ should become NY, got: {}", result);
}
#[test]
fn test_word_etxe() {
let rules = base();
let result = rules.apply("etxe");
assert!(
result.contains("t͡ʃ"),
"etxe should contain CH (from tx), got: {}",
result
);
}
#[test]
fn test_word_euskara() {
let rules = base();
let result = rules.apply("euskara");
assert!(
result.contains('e') && result.contains('u') && result.contains('a'),
"euskara should contain e, u, a, got: {}",
result
);
}
#[test]
fn test_word_bilbo() {
let rules = base();
let result = rules.apply("bilbo");
assert!(
result.contains('b') && result.contains('i') && result.contains('l'),
"bilbo should contain b, i, l, got: {}",
result
);
}
}