Skip to content

Commit

Permalink
Rollup merge of rust-lang#54119 - phansch:unit_test_find_best_match_f…
Browse files Browse the repository at this point in the history
…or_name, r=nikomatsakis

Add some unit tests for find_best_match_for_name

There were only some UI tests that covered this function.
Since there's more diagnostic work going on, I think it makes
sense to have this unit tested.
  • Loading branch information
kennytm committed Sep 13, 2018
2 parents 344dc53 + 09973d2 commit 8018d63
Showing 1 changed file with 40 additions and 2 deletions.
42 changes: 40 additions & 2 deletions src/libsyntax/util/lev_distance.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
use std::cmp;
use symbol::Symbol;

/// To find the Levenshtein distance between two strings
/// Find the Levenshtein distance between two strings
pub fn lev_distance(a: &str, b: &str) -> usize {
// cases which don't require further computation
if a.is_empty() {
Expand Down Expand Up @@ -41,10 +41,12 @@ pub fn lev_distance(a: &str, b: &str) -> usize {
} dcol[t_last + 1]
}

/// To find the best match for a given string from an iterator of names
/// Find the best match for a given word in the given iterator
///
/// As a loose rule to avoid the obviously incorrect suggestions, it takes
/// an optional limit for the maximum allowable edit distance, which defaults
/// to one-third of the given word.
///
/// Besides Levenshtein, we use case insensitive comparison to improve accuracy on an edge case with
/// a lower(upper)case letters mismatch.
pub fn find_best_match_for_name<'a, T>(iter_names: T,
Expand Down Expand Up @@ -105,3 +107,39 @@ fn test_lev_distance() {
assert_eq!(lev_distance(b, c), 1);
assert_eq!(lev_distance(c, b), 1);
}

#[test]
fn test_find_best_match_for_name() {
use with_globals;
with_globals(|| {
let input = vec![Symbol::intern("aaab"), Symbol::intern("aaabc")];
assert_eq!(
find_best_match_for_name(input.iter(), "aaaa", None),
Some(Symbol::intern("aaab"))
);

assert_eq!(
find_best_match_for_name(input.iter(), "1111111111", None),
None
);

let input = vec![Symbol::intern("aAAA")];
assert_eq!(
find_best_match_for_name(input.iter(), "AAAA", None),
Some(Symbol::intern("aAAA"))
);

let input = vec![Symbol::intern("AAAA")];
// Returns None because `lev_distance > max_dist / 3`
assert_eq!(
find_best_match_for_name(input.iter(), "aaaa", None),
None
);

let input = vec![Symbol::intern("AAAA")];
assert_eq!(
find_best_match_for_name(input.iter(), "aaaa", Some(4)),
Some(Symbol::intern("AAAA"))
);
})
}

0 comments on commit 8018d63

Please sign in to comment.