use crate::runner::aligner::{
normalizer::{NormalizationError, NormalizedText, TextNormalizer},
normalizers::latin::LatinNormalizer,
};
#[derive(Default, Clone, Copy, Debug)]
pub struct EnglishNormalizer;
impl EnglishNormalizer {
pub const fn new() -> Self {
Self
}
}
impl TextNormalizer for EnglishNormalizer {
fn normalize<'a>(&self, text: &'a str) -> Result<NormalizedText<'a>, NormalizationError> {
LatinNormalizer::english().normalize(text)
}
fn use_word_delimiter(&self) -> bool {
LatinNormalizer::english().use_word_delimiter()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn lowercase_and_strip_punct() {
let n = EnglishNormalizer::new();
let nt = n.normalize("Hello, World!").unwrap();
assert_eq!(nt.normalized(), "hello world");
assert_eq!(nt.original_words().len(), 2);
}
#[test]
fn contraction_stays_one_word() {
let n = EnglishNormalizer::new();
let nt = n.normalize("Don't go.").unwrap();
assert_eq!(nt.normalized(), "don't go");
assert_eq!(nt.original_words()[0], "Don't");
}
#[test]
fn empty_input_errors() {
let n = EnglishNormalizer::new();
let err = n.normalize(" .,!? ").unwrap_err();
assert!(matches!(err, NormalizationError::EmptyText));
}
#[test]
fn delegates_use_word_delimiter() {
let n = EnglishNormalizer::new();
assert!(n.use_word_delimiter());
}
#[test]
fn original_words_preserve_source_casing() {
let n = EnglishNormalizer::new();
let nt = n.normalize("Hello World").unwrap();
assert_eq!(nt.original_words()[0], "Hello");
assert_eq!(nt.original_words()[1], "World");
}
}