ayumu 0.3.6

A small, lightweight, user-oriented query language for search forms.
Documentation
use crate::{
    ast::{Operator, SaveRepr, Term, Value},
    parser::{self, WithPos},
};

#[test]
pub fn simple() {
    debug_assert_eq!(parser::parse_query(r#""#), Ok(vec![]));

    debug_assert_eq!(
        parser::parse_query(r#" keyword  "#),
        Ok(vec![Term::Keyword {
            keyword: WithPos {
                value: "keyword".to_string(),
                start: 1,
                end: 8
            }
        }])
    );

    debug_assert_eq!(
        parser::parse_query(r#"  _column1234 !~ "\"Hello\" world" "#),
        Ok(vec![Term::Operation {
            column: WithPos {
                value: "_column1234".to_string(),
                start: 2,
                end: 13
            },
            operator: WithPos {
                value: Operator::NotContains,
                start: 14,
                end: 16
            },
            value: WithPos {
                value: Value::String("\"Hello\" world".to_string()),
                start: 17,
                end: 34
            }
        }])
    );
}

#[test]
pub fn simple_repr() {
    assert_eq!(
        parser::parse_query("").map(|ts| ts.save_repr()),
        Ok("".to_string())
    );

    assert_eq!(
        parser::parse_query(r#" stars >= 5"#).map(|v| v.save_repr()),
        Ok("stars >= 5".to_string())
    );

    assert_eq!(
        parser::parse_query(
            r#" hello
        world ,, one two"#
        )
        .map(|ts| ts.save_repr()),
        Ok("hello world ,, one two".to_string())
    );

    assert_eq!(
        parser::parse_query(r#" _column1234 !~ "\"Hello\" world" "#).map(|ts| ts.save_repr()),
        Ok("_column1234 !~ \"\\\"Hello\\\" world\"".to_string())
    );
}

#[test]
pub fn query_samples() {
    assert_eq!(
        parser::parse_query(r#"A  simple sequence of keywords"#).map(|ts| ts.save_repr()),
        Ok("A simple sequence of keywords".to_string())
    );

    assert_eq!(
        parser::parse_query(
            r#"Hayao sortby:title title ~ "%one two%" release >= 2000  Miyazaki sortby: release   desc"#
        )
        .map(|ts| ts.save_repr()),
        Ok("Hayao sortby:title title ~ \"%one two%\" release >= 2000 Miyazaki sortby:release desc".to_string())
    );

    assert_eq!(
        parser::parse_query(
            r#"
            title  ~ "%猫%
            物語%ep%"
            sortby : foo
            stars > 5
            sortby : tag asc
            stars <= 5
            sortby:stars
        "#
        )
        .map(|ts| ts.save_repr()),
        Ok("title ~ \"%猫%\\n            物語%ep%\" sortby:foo stars > 5 sortby:tag asc stars <= 5 sortby:stars".to_string())
    );
}

#[test]
pub fn sortby_expansion() {
    assert_eq!(
        parser::parse_query(r#" sOrtBy:foo  asc"#).map(|ts| ts.save_repr()),
        Ok("sortby:foo asc".to_string())
    );
    assert_eq!(
        parser::parse_query(r#" sOrtBy : foo , keyword"#).map(|ts| ts.save_repr()),
        Ok("sortby:foo , keyword".to_string())
    );
}