use rand::distributions::Alphanumeric;
use rand::{thread_rng, Rng};
use levenshtein_diff as levenshtein;
#[test]
fn test_regeneration_of_target() {
let source = "SATURDAY";
let target = "SUNDAY";
let expected_leven = 3;
let (dist, mat) = levenshtein::distance(source.as_bytes(), target.as_bytes());
assert_eq!(expected_leven, dist);
let edits = levenshtein::generate_edits(source.as_bytes(), target.as_bytes(), &mat)
.unwrap_or_else(|err| panic!("{}", err));
let generated_target_vec = levenshtein::apply_edits(source.as_bytes(), &edits);
let generated_target = match std::str::from_utf8(&generated_target_vec) {
Ok(v) => v,
Err(e) => panic!("Invalid UTF-8 sequence: {}", e),
};
assert_eq!(target, generated_target);
}
#[test]
fn test_strings_have_same_distances() {
fn rand_alnum_string(n: usize) -> String {
thread_rng()
.sample_iter(&Alphanumeric)
.take(n)
.map(char::from)
.collect()
}
let mut rng = thread_rng();
let random_len_1: usize = rng.gen_range(1..10);
let random_len_2: usize = rng.gen_range(1..10);
let random_str_1 = rand_alnum_string(random_len_1);
let random_str_2 = rand_alnum_string(random_len_2);
let leven_naive =
levenshtein::levenshtein_naive(random_str_1.as_bytes(), random_str_2.as_bytes());
let (leven_tab, _) =
levenshtein::levenshtein_tabulation(random_str_1.as_bytes(), random_str_2.as_bytes());
let (leven_memo, _) =
levenshtein::levenshtein_memoization(random_str_1.as_bytes(), random_str_2.as_bytes());
assert_eq!(leven_naive, leven_tab);
assert_eq!(leven_naive, leven_memo);
assert_eq!(leven_tab, leven_memo);
}
#[test]
fn test_for_cases_that_differ_by_one_item() {
let source_collection: Vec<String> = vec!["Hello".into(), "World".into()];
let target_collection: Vec<String> = vec!["World".into()];
let (distance, matrix) = levenshtein_diff::distance(&source_collection, &target_collection);
assert_eq!(distance, 1);
let edits =
levenshtein_diff::generate_edits(&source_collection, &target_collection, &matrix).unwrap();
let generated_target_vec = levenshtein::apply_edits(&source_collection, &edits);
assert_eq!(target_collection.len(), generated_target_vec.len())
}