use liblevenshtein::prelude::*;
use liblevenshtein::transducer::universal::{Standard as UniversalStandard, UniversalAutomaton};
#[test]
fn test_substitution_test_to_text() {
let word = "test";
let input = "text";
let max_distance = 2;
let universal = UniversalAutomaton::<UniversalStandard>::new(max_distance);
let universal_result = universal.accepts(word, input);
let dict: DynamicDawg<()> = DynamicDawg::default();
dict.insert(word);
let transducer = Transducer::standard(dict);
let parameterized_results: Vec<_> = transducer.query(input, max_distance as usize).collect();
let parameterized_result = parameterized_results.iter().any(|w| w == word);
println!(
"Word: '{}', Input: '{}', Max distance: {}",
word, input, max_distance
);
println!("Universal result: {}", universal_result);
println!("Parameterized result: {}", parameterized_result);
if parameterized_result {
println!("Parameterized matches: {:?}", parameterized_results);
}
assert_eq!(
universal_result, parameterized_result,
"Universal and parameterized automata disagree on '{}' → '{}' (distance ≤ {})",
word, input, max_distance
);
}
#[test]
fn test_substitution_test_to_best() {
let word = "test";
let input = "best";
let max_distance = 2;
let universal = UniversalAutomaton::<UniversalStandard>::new(max_distance);
let universal_result = universal.accepts(word, input);
let dict: DynamicDawg<()> = DynamicDawg::default();
dict.insert(word);
let transducer = Transducer::standard(dict);
let parameterized_results: Vec<_> = transducer.query(input, max_distance as usize).collect();
let parameterized_result = parameterized_results.iter().any(|w| w == word);
println!(
"Word: '{}', Input: '{}', Max distance: {}",
word, input, max_distance
);
println!("Universal result: {}", universal_result);
println!("Parameterized result: {}", parameterized_result);
assert_eq!(
universal_result, parameterized_result,
"Universal and parameterized automata disagree on '{}' → '{}' (distance ≤ {})",
word, input, max_distance
);
}
#[test]
fn test_cross_validation_suite() {
let test_cases = vec![
("test", "test", 2, true), ("test", "text", 2, true), ("test", "best", 2, true), ("test", "tet", 2, true), ("test", "teast", 2, true), ("test", "hello", 2, false), ("algorithm", "algorythm", 2, true), ("", "", 2, true), ("ab", "", 2, true), ("", "ab", 2, true), ];
for (word, input, max_distance, expected) in test_cases {
let universal = UniversalAutomaton::<UniversalStandard>::new(max_distance);
let universal_result = universal.accepts(word, input);
let dict: DynamicDawg<()> = DynamicDawg::default();
dict.insert(word);
let transducer = Transducer::standard(dict);
let parameterized_results: Vec<_> =
transducer.query(input, max_distance as usize).collect();
let parameterized_result = parameterized_results.iter().any(|w| w == word);
assert_eq!(
universal_result, expected,
"Universal automaton wrong for '{}' → '{}' (expected {})",
word, input, expected
);
assert_eq!(
parameterized_result, expected,
"Parameterized automaton wrong for '{}' → '{}' (expected {})",
word, input, expected
);
assert_eq!(
universal_result, parameterized_result,
"Automata disagree on '{}' → '{}': universal={}, parameterized={}",
word, input, universal_result, parameterized_result
);
}
}