74befbc72baf | atagen | 2026-10-25 11:18 UTC | 1 | use super::*; |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 2 | |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 3 | fn tokens(text: &str) -> Vec<String> { |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 4 | let mut analyzer = analyzer(); |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 5 | let mut stream = analyzer.token_stream(text); |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 6 | let mut found = Vec::new(); |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 7 | while stream.advance() { |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 8 | found.push(stream.token().text.clone()); |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 9 | } |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 10 | found |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 11 | } |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 12 | |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 13 | fn highlights(query: &str) -> Result<Vec<String>, ErrorKind> { |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 14 | build_query(Field::from_field_id(0), query) |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 15 | .map(|(_, terms)| terms) |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 16 | .map_err(|error| error.kind) |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 17 | } |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 18 | |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 19 | #[test] |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 20 | fn unspaced_scripts_become_singles_and_pairs() { |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 21 | assert_eq!(tokens("東京都"), vec!["東", "東京", "京", "京都", "都"]); |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 22 | assert_eq!(tokens("ok 日本"), vec!["ok", "日", "日本", "本"]); |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 23 | } |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 24 | |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 25 | #[test] |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 26 | fn the_word_limit_counts_chars_not_bytes() { |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 27 | let sha = "a".repeat(40); |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 28 | let cyrillic = "щ".repeat(40); |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 29 | assert_eq!(tokens(&format!("{sha} {cyrillic}")).len(), 2); |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 30 | assert!(tokens(&"x".repeat(65)).is_empty()); |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 31 | } |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 32 | |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 33 | /// a colon used to mean a field to the query parser, so "re: deploy" lost both words |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 34 | #[test] |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 35 | fn queries_have_no_field_syntax() { |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 36 | assert_eq!(highlights("re: deploy").unwrap(), vec!["deploy", "re"]); |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 37 | assert_eq!( |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 38 | highlights("https://example.org/x").unwrap(), |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 39 | vec!["example", "https", "org", "x"] |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 40 | ); |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 41 | assert_eq!(highlights("sender:@a").unwrap(), vec!["a", "sender"]); |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 42 | } |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 43 | |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 44 | #[test] |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 45 | fn nothing_but_exclusions_or_wildcards_is_invalid() { |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 46 | assert_eq!(highlights("-spam"), Err(ErrorKind::Invalid)); |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 47 | assert_eq!(highlights("*"), Err(ErrorKind::Invalid)); |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 48 | assert_eq!(highlights(" "), Err(ErrorKind::Invalid)); |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 49 | assert_eq!(highlights("ham -spam").unwrap(), vec!["ham"]); |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 50 | } |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 51 | |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 52 | #[test] |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 53 | fn a_cjk_word_query_needs_its_pairs() { |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 54 | assert_eq!(highlights("東京").unwrap(), vec!["東京"]); |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 55 | assert_eq!(highlights("東").unwrap(), vec!["東"]); |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 56 | } |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 57 | |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 58 | #[test] |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 59 | fn match_ranges_join_overlapping_pairs() { |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 60 | assert_eq!( |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 61 | match_ranges("Café, CAFE and cafés", &["cafe".to_owned()]), |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 62 | vec![(0, 5), (7, 11)] |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 63 | ); |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 64 | assert_eq!( |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 65 | match_ranges("東京都", &["東京".to_owned(), "京都".to_owned()]), |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 66 | vec![(0, 9)] |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 67 | ); |
74befbc72baf | atagen | 2026-10-25 11:18 UTC | 68 | } |