atagen

macltok

public
Star0
Watch0
dc73ad5eb906122a9266ab9bd189a11bc706c31f
3
ssh://brewery@pls.lobotomise.me:33/atagen/macltok.git

Blame: src/search/text_tests.rs

74befbc72bafatagen2026-10-25 11:18 UTC1
use super::*;
74befbc72bafatagen2026-10-25 11:18 UTC2
74befbc72bafatagen2026-10-25 11:18 UTC3
fn tokens(text: &str) -> Vec<String> {
74befbc72bafatagen2026-10-25 11:18 UTC4
    let mut analyzer = analyzer();
74befbc72bafatagen2026-10-25 11:18 UTC5
    let mut stream = analyzer.token_stream(text);
74befbc72bafatagen2026-10-25 11:18 UTC6
    let mut found = Vec::new();
74befbc72bafatagen2026-10-25 11:18 UTC7
    while stream.advance() {
74befbc72bafatagen2026-10-25 11:18 UTC8
        found.push(stream.token().text.clone());
74befbc72bafatagen2026-10-25 11:18 UTC9
    }
74befbc72bafatagen2026-10-25 11:18 UTC10
    found
74befbc72bafatagen2026-10-25 11:18 UTC11
}
74befbc72bafatagen2026-10-25 11:18 UTC12
74befbc72bafatagen2026-10-25 11:18 UTC13
fn highlights(query: &str) -> Result<Vec<String>, ErrorKind> {
74befbc72bafatagen2026-10-25 11:18 UTC14
    build_query(Field::from_field_id(0), query)
74befbc72bafatagen2026-10-25 11:18 UTC15
        .map(|(_, terms)| terms)
74befbc72bafatagen2026-10-25 11:18 UTC16
        .map_err(|error| error.kind)
74befbc72bafatagen2026-10-25 11:18 UTC17
}
74befbc72bafatagen2026-10-25 11:18 UTC18
74befbc72bafatagen2026-10-25 11:18 UTC19
#[test]
74befbc72bafatagen2026-10-25 11:18 UTC20
fn unspaced_scripts_become_singles_and_pairs() {
74befbc72bafatagen2026-10-25 11:18 UTC21
    assert_eq!(tokens("東京都"), vec!["東", "東京", "京", "京都", "都"]);
74befbc72bafatagen2026-10-25 11:18 UTC22
    assert_eq!(tokens("ok 日本"), vec!["ok", "日", "日本", "本"]);
74befbc72bafatagen2026-10-25 11:18 UTC23
}
74befbc72bafatagen2026-10-25 11:18 UTC24
74befbc72bafatagen2026-10-25 11:18 UTC25
#[test]
74befbc72bafatagen2026-10-25 11:18 UTC26
fn the_word_limit_counts_chars_not_bytes() {
74befbc72bafatagen2026-10-25 11:18 UTC27
    let sha = "a".repeat(40);
74befbc72bafatagen2026-10-25 11:18 UTC28
    let cyrillic = "щ".repeat(40);
74befbc72bafatagen2026-10-25 11:18 UTC29
    assert_eq!(tokens(&format!("{sha} {cyrillic}")).len(), 2);
74befbc72bafatagen2026-10-25 11:18 UTC30
    assert!(tokens(&"x".repeat(65)).is_empty());
74befbc72bafatagen2026-10-25 11:18 UTC31
}
74befbc72bafatagen2026-10-25 11:18 UTC32
74befbc72bafatagen2026-10-25 11:18 UTC33
/// a colon used to mean a field to the query parser, so "re: deploy" lost both words
74befbc72bafatagen2026-10-25 11:18 UTC34
#[test]
74befbc72bafatagen2026-10-25 11:18 UTC35
fn queries_have_no_field_syntax() {
74befbc72bafatagen2026-10-25 11:18 UTC36
    assert_eq!(highlights("re: deploy").unwrap(), vec!["deploy", "re"]);
74befbc72bafatagen2026-10-25 11:18 UTC37
    assert_eq!(
74befbc72bafatagen2026-10-25 11:18 UTC38
        highlights("https://example.org/x").unwrap(),
74befbc72bafatagen2026-10-25 11:18 UTC39
        vec!["example", "https", "org", "x"]
74befbc72bafatagen2026-10-25 11:18 UTC40
    );
74befbc72bafatagen2026-10-25 11:18 UTC41
    assert_eq!(highlights("sender:@a").unwrap(), vec!["a", "sender"]);
74befbc72bafatagen2026-10-25 11:18 UTC42
}
74befbc72bafatagen2026-10-25 11:18 UTC43
74befbc72bafatagen2026-10-25 11:18 UTC44
#[test]
74befbc72bafatagen2026-10-25 11:18 UTC45
fn nothing_but_exclusions_or_wildcards_is_invalid() {
74befbc72bafatagen2026-10-25 11:18 UTC46
    assert_eq!(highlights("-spam"), Err(ErrorKind::Invalid));
74befbc72bafatagen2026-10-25 11:18 UTC47
    assert_eq!(highlights("*"), Err(ErrorKind::Invalid));
74befbc72bafatagen2026-10-25 11:18 UTC48
    assert_eq!(highlights("   "), Err(ErrorKind::Invalid));
74befbc72bafatagen2026-10-25 11:18 UTC49
    assert_eq!(highlights("ham -spam").unwrap(), vec!["ham"]);
74befbc72bafatagen2026-10-25 11:18 UTC50
}
74befbc72bafatagen2026-10-25 11:18 UTC51
74befbc72bafatagen2026-10-25 11:18 UTC52
#[test]
74befbc72bafatagen2026-10-25 11:18 UTC53
fn a_cjk_word_query_needs_its_pairs() {
74befbc72bafatagen2026-10-25 11:18 UTC54
    assert_eq!(highlights("東京").unwrap(), vec!["東京"]);
74befbc72bafatagen2026-10-25 11:18 UTC55
    assert_eq!(highlights("東").unwrap(), vec!["東"]);
74befbc72bafatagen2026-10-25 11:18 UTC56
}
74befbc72bafatagen2026-10-25 11:18 UTC57
74befbc72bafatagen2026-10-25 11:18 UTC58
#[test]
74befbc72bafatagen2026-10-25 11:18 UTC59
fn match_ranges_join_overlapping_pairs() {
74befbc72bafatagen2026-10-25 11:18 UTC60
    assert_eq!(
74befbc72bafatagen2026-10-25 11:18 UTC61
        match_ranges("Café, CAFE and cafés", &["cafe".to_owned()]),
74befbc72bafatagen2026-10-25 11:18 UTC62
        vec![(0, 5), (7, 11)]
74befbc72bafatagen2026-10-25 11:18 UTC63
    );
74befbc72bafatagen2026-10-25 11:18 UTC64
    assert_eq!(
74befbc72bafatagen2026-10-25 11:18 UTC65
        match_ranges("東京都", &["東京".to_owned(), "京都".to_owned()]),
74befbc72bafatagen2026-10-25 11:18 UTC66
        vec![(0, 9)]
74befbc72bafatagen2026-10-25 11:18 UTC67
    );
74befbc72bafatagen2026-10-25 11:18 UTC68
}