use matchsorter::{Ranking, get_match_ranking};
#[test]
fn ac02_equal() {
assert_eq!(get_match_ranking("Green", "green", false), Ranking::Equal);
}
#[test]
fn ac03_case_sensitive_equal() {
assert_eq!(
get_match_ranking("Green", "Green", false),
Ranking::CaseSensitiveEqual,
);
}
#[test]
fn ac04_starts_with() {
assert_eq!(
get_match_ranking("Greenland", "green", false),
Ranking::StartsWith,
);
}
#[test]
fn ac05_word_starts_with() {
assert_eq!(
get_match_ranking("San Francisco", "fran", false),
Ranking::WordStartsWith,
);
}
#[test]
fn ac06_contains() {
assert_eq!(get_match_ranking("abcdef", "cde", false), Ranking::Contains,);
}
#[test]
fn ac07_acronym() {
assert_eq!(
get_match_ranking("North-West Airlines", "nwa", false),
Ranking::Acronym,
);
}
#[test]
fn ac08_fuzzy_matches_sub_score() {
let result = get_match_ranking("playground", "plgnd", false);
if let Ranking::Matches(score) = result {
assert!(
score > 1.0 && score < 2.0,
"expected sub-score in (1.0, 2.0), got {score}",
);
} else {
panic!("expected Matches variant, got {result:?}");
}
}
#[test]
fn ac09_no_match() {
assert_eq!(get_match_ranking("abc", "xyz", false), Ranking::NoMatch,);
}
#[test]
fn ac10_diacritics_stripped() {
let result = get_match_ranking("caf\u{00e9}", "cafe", false);
assert_eq!(result, Ranking::CaseSensitiveEqual);
assert!(result >= Ranking::Equal);
}
#[test]
fn ac11_diacritics_kept() {
let result = get_match_ranking("caf\u{00e9}", "cafe", true);
assert_eq!(result, Ranking::NoMatch);
}
#[test]
fn ac12_single_char_no_match() {
assert_eq!(get_match_ranking("abcdef", "x", false), Ranking::NoMatch,);
}
#[test]
fn ac13_empty_query() {
assert_eq!(
get_match_ranking("anything", "", false),
Ranking::StartsWith,
);
}
#[test]
fn ac14_word_boundary_spaces_only() {
assert_eq!(
get_match_ranking("North-West", "west", false),
Ranking::Contains,
);
assert_eq!(
get_match_ranking("snake_case", "case", false),
Ranking::Contains,
);
}
#[test]
fn fuzzy_sub_score_exact_value() {
let result = get_match_ranking("playground", "plgnd", false);
if let Ranking::Matches(score) = result {
let expected = 1.0 + 1.0 / 9.0;
assert!(
(score - expected).abs() < f64::EPSILON,
"expected {expected}, got {score}",
);
} else {
panic!("expected Matches variant, got {result:?}");
}
}
#[test]
fn diacritics_multiple_accents() {
let result = get_match_ranking("\u{00fc}ber-ma\u{00f1}ana", "uber", false);
assert_eq!(result, Ranking::StartsWith);
}
#[test]
fn tier_ordering_through_public_api() {
let case_sensitive = get_match_ranking("test", "test", false);
let equal = get_match_ranking("Test", "test", false);
let starts_with = get_match_ranking("testing", "test", false);
let word_starts = get_match_ranking("unit test", "test", false);
let contains = get_match_ranking("attest", "test", false);
let no_match = get_match_ranking("xyz", "test", false);
assert!(case_sensitive > equal);
assert!(equal > starts_with);
assert!(starts_with > word_starts);
assert!(word_starts > contains);
assert!(contains > no_match);
}
#[test]
fn empty_query_empty_candidate() {
assert_eq!(
get_match_ranking("", "", false),
Ranking::CaseSensitiveEqual,
);
}
#[test]
fn query_longer_than_candidate() {
assert_eq!(get_match_ranking("ab", "abcdef", false), Ranking::NoMatch,);
}