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/catalan/base.llev");
let file = crate::phonetic::llev::parse_str(content)
.expect("Invalid embedded catalan/base.llev - this is a bug in liblevenshtein");
RuleSetChar::from_llev(&file)
.expect("Failed to compile Catalan 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(), "Catalan base rules should not be empty");
assert!(
rules.len() >= 20,
"expected >=20 base rules, got {}",
rules.len()
);
}
#[test]
fn test_ela_geminada() {
let rules = base();
let result = rules.apply("l·l");
assert!(result.contains('L'), "l·l should become L, got: {}", result);
}
#[test]
fn test_ny_digraph() {
let rules = base();
let result = rules.apply("ny");
assert!(
result.contains('ɲ') || result.contains('Ñ'),
"ny should become ɲ, got: {}",
result
);
}
#[test]
fn test_tx_digraph() {
let rules = base();
let result = rules.apply("tx");
assert!(
result.contains("t͡ʃ") || result.contains('Č'),
"tx should become t͡ʃ, got: {}",
result
);
}
#[test]
fn test_ll_digraph() {
let rules = base();
let result = rules.apply("ll");
assert!(
result.contains('ʎ') || result.contains('Λ'),
"ll should become ʎ, got: {}",
result
);
}
#[test]
fn test_c_cedilla() {
let rules = base();
let result = rules.apply("ç");
assert!(
result.contains('s') || result.contains('ʃ'),
"ç should become s, got: {}",
result
);
}
#[test]
fn test_x_to_x() {
let rules = base();
let result = rules.apply("x");
assert!(
result.contains('ʃ') || result.contains('X'),
"x should become ʃ, got: {}",
result
);
}
#[test]
fn test_v_to_b() {
let rules = base();
let result = rules.apply("v");
assert!(result.contains('b'), "v should become b, got: {}", result);
}
#[test]
fn test_accented_vowels() {
let rules = base();
let result = rules.apply("à");
assert!(result.contains('a'), "à should become a, got: {}", result);
let result = rules.apply("é");
assert!(result.contains('e'), "é should become e, got: {}", result);
let result = rules.apply("ó");
assert!(
result.contains('o') || result.contains('ɔ'),
"ó should become o, got: {}",
result
);
}
#[test]
fn test_word_catalunya() {
let rules = base();
let result = rules.apply("Catalunya");
assert!(
result.contains('ɲ') || result.contains('Ñ'),
"Catalunya should contain ɲ, got: {}",
result
);
}
#[test]
fn test_word_barcelona() {
let rules = base();
let result = rules.apply("Barcelona");
let lower = result.to_lowercase();
assert!(
lower.contains('b') && lower.contains('a'),
"Barcelona should contain b and a, got: {}",
result
);
}
}