use crate::data::LIAISONS_AVAL;
use crate::decoder::{extract_phonemes_word, SyllableMode};
use crate::phoneme::{classify, PhonClass};
pub fn liaison_amont(word: &str) -> bool {
let phonemes = extract_phonemes_word(word, false, SyllableMode::Written);
match phonemes.first() {
Some(p) if p.code == "#_h_muet" => true,
Some(p) => classify(&p.code) == PhonClass::Vowel,
None => false,
}
}
pub fn liaison_aval(word: &str) -> bool {
let lower: String = word.chars().flat_map(|c| c.to_lowercase()).collect();
LIAISONS_AVAL.iter().any(|w| *w == lower)
}
pub fn liaison_possible(previous: &str, next: &str) -> bool {
liaison_aval(previous) && liaison_amont(next)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn amont_h_muet() {
assert!(liaison_amont("hôtel"));
assert!(liaison_amont("homme"));
}
#[test]
fn amont_h_aspire() {
assert!(!liaison_amont("homard"));
assert!(!liaison_amont("haricot"));
assert!(!liaison_amont("héros"));
}
#[test]
fn amont_voyelle_initiale() {
assert!(liaison_amont("arbre"));
assert!(liaison_amont("enfant"));
assert!(liaison_amont("œuf"));
}
#[test]
fn amont_consonne_initiale() {
assert!(!liaison_amont("chat"));
assert!(!liaison_amont("papa"));
}
#[test]
fn amont_semi_voyelle_initiale() {
assert!(!liaison_amont("hier"));
}
#[test]
fn aval_liste() {
assert!(liaison_aval("les"));
assert!(liaison_aval("des"));
assert!(liaison_aval("trois"));
assert!(liaison_aval("sans"));
}
#[test]
fn aval_case_insensible() {
assert!(liaison_aval("LES"));
assert!(liaison_aval("Les"));
}
#[test]
fn aval_hors_liste() {
assert!(!liaison_aval("chat"));
assert!(!liaison_aval("grand"));
}
#[test]
fn aval_liste_complete_40_mots() {
assert_eq!(LIAISONS_AVAL.len(), 40);
}
#[test]
fn possible_cas_canoniques() {
assert!(liaison_possible("les", "hôtels"));
assert!(liaison_possible("des", "enfants"));
assert!(liaison_possible("trois", "amis"));
}
#[test]
fn possible_bloque_par_amont() {
assert!(!liaison_possible("les", "chats"));
assert!(!liaison_possible("les", "héros"));
}
#[test]
fn possible_bloque_par_aval() {
assert!(!liaison_possible("le", "hôtel"));
assert!(!liaison_possible("chat", "hôtels"));
}
}