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/irish/base.llev");
let file = crate::phonetic::llev::parse_str(content)
.expect("Invalid embedded irish/base.llev - this is a bug in liblevenshtein");
RuleSetChar::from_llev(&file)
.expect("Failed to compile Irish 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(), "Irish base rules should not be empty");
assert!(
rules.len() >= 20,
"expected >=20 base rules, got {}",
rules.len()
);
}
#[test]
fn test_bh_lenition() {
let rules = base();
let result = rules.apply("bh");
assert!(result.contains('v'), "bh should become v, got: {}", result);
}
#[test]
fn test_ch_lenition() {
let rules = base();
let result = rules.apply("ch");
assert!(result.contains('x'), "ch should become x, got: {}", result);
}
#[test]
fn test_fh_silent() {
let rules = base();
let result = rules.apply("fh");
assert!(
result.is_empty(),
"fh should be silent (empty), got: '{}'",
result
);
}
#[test]
fn test_mh_lenition() {
let rules = base();
let result = rules.apply("mh");
assert!(result.contains('v'), "mh should become v, got: {}", result);
}
#[test]
fn test_ph_lenition() {
let rules = base();
let result = rules.apply("ph");
assert!(result.contains('f'), "ph should become f, got: {}", result);
}
#[test]
fn test_sh_lenition() {
let rules = base();
let result = rules.apply("sh");
assert!(result.contains('h'), "sh should become h, got: {}", result);
}
#[test]
fn test_th_lenition() {
let rules = base();
let result = rules.apply("th");
assert!(result.contains('h'), "th should become h, got: {}", result);
}
#[test]
fn test_a_fada() {
let rules = base();
let result = rules.apply("á");
assert!(result.contains('a'), "á should become a, got: {}", result);
}
#[test]
fn test_o_fada() {
let rules = base();
let result = rules.apply("ó");
assert!(result.contains('o'), "ó should become o, got: {}", result);
}
#[test]
fn test_c_to_k() {
let rules = base();
let result = rules.apply("c");
assert!(result.contains('k'), "c should become k, got: {}", result);
}
#[test]
fn test_word_eire() {
let rules = base();
let result = rules.apply_full("éire");
let lower = result.to_lowercase();
assert!(
lower.contains('e') && lower.contains('i') && lower.contains('r'),
"éire should contain e, i, r, got: {}",
result
);
}
#[test]
fn test_word_baile() {
let rules = base();
let result = rules.apply_full("baile");
let lower = result.to_lowercase();
assert!(
lower.contains('b') && lower.contains('a') && lower.contains('l'),
"baile should contain b, a, l, got: {}",
result
);
}
#[test]
fn test_word_slainte() {
let rules = base();
let result = rules.apply_full("sláinte");
let lower = result.to_lowercase();
assert!(
lower.contains('s') && lower.contains('l') && lower.contains('a'),
"sláinte should contain s, l, a, got: {}",
result
);
}
}