git_heckout/
similarity.rs

1pub fn sublime(pattern: &str, string: &str) -> isize {
2	sublime_fuzzy::best_match(pattern, string).map_or(0, |result| result.score())
3}
4
5#[cfg(test)]
6mod tests {
7	#[test]
8	fn sublime_substrings_same_score() {
9		// Sub-strings have the same score
10		assert!(super::sublime("master", "m") == super::sublime("master", "ma"));
11		assert!(super::sublime("master", "ma") == super::sublime("master", "mas"));
12		assert!(super::sublime("master", "mas") == super::sublime("master", "mast"));
13		assert!(super::sublime("master", "mast") == super::sublime("master", "maste"));
14		// even across different comparison strings (transitively)
15		assert!(super::sublime("masterz", "m") == super::sublime("master", "m"));
16		assert!(super::sublime("masterz", "ma") == super::sublime("master", "ma"));
17		assert!(super::sublime("masterz", "mas") == super::sublime("master", "mas"));
18		assert!(super::sublime("masterz", "mast") == super::sublime("master", "mast"));
19		assert!(super::sublime("masterz", "maste") == super::sublime("master", "maste"));
20	}
21
22	#[test]
23	fn sublime_substrings_lower_than_equal() {
24		// Sub-strings have a lower score than self-similarity
25		assert!(super::sublime("master", "maste") < super::sublime("master", "master"));
26	}
27
28	#[test]
29	fn sublime_substrings_less_than_self_similiarity_even_for_shorter() {
30		// Self-similarity always trumps substring scores, even for short strings
31		assert!(super::sublime("master", "m") < super::sublime("m", "m"));
32		assert!(super::sublime("master", "ma") < super::sublime("ma", "ma"));
33		assert!(super::sublime("master", "mas") < super::sublime("mas", "mas"));
34		assert!(super::sublime("master", "mast") < super::sublime("mast", "mast"));
35		assert!(super::sublime("master", "maste") < super::sublime("maste", "maste"));
36	}
37
38	#[test]
39	fn sublime_self_similiarity_stronger_for_longer_strings() {
40		// Self-similarity scores are higher for longer strings
41		assert!(super::sublime("m", "m") < super::sublime("ma", "ma"));
42		assert!(super::sublime("ma", "ma") < super::sublime("mas", "mas"));
43		assert!(super::sublime("mas", "mas") < super::sublime("mast", "mast"));
44		assert!(super::sublime("mast", "mast") < super::sublime("maste", "maste"));
45		assert!(super::sublime("maste", "maste") < super::sublime("master", "master"));
46		assert!(super::sublime("master", "master") < super::sublime("masterz", "masterz"));
47	}
48}