From 6af18526113a9f61a735fdcc42bc3d521835f51d Mon Sep 17 00:00:00 2001 From: RumovZ Date: Thu, 14 Jan 2021 19:10:12 +0100 Subject: [PATCH] Add errorkind test --- rslib/src/search/parser.rs | 137 ++++++++++++++++++++++++++++++++----- 1 file changed, 119 insertions(+), 18 deletions(-) diff --git a/rslib/src/search/parser.rs b/rslib/src/search/parser.rs index d526912a5..df6fd219a 100644 --- a/rslib/src/search/parser.rs +++ b/rslib/src/search/parser.rs @@ -593,11 +593,6 @@ mod test { assert_eq!(parse("")?, vec![Search(SearchNode::WholeCollection)]); assert_eq!(parse(" ")?, vec![Search(SearchNode::WholeCollection)]); - // leading/trailing boolean operators - assert!(parse("foo and").is_err()); - assert!(parse("and foo").is_err()); - assert!(parse("and").is_err()); - // leading/trailing/interspersed whitespace assert_eq!( parse(" t t2 ")?, @@ -658,11 +653,6 @@ mod test { assert_eq!(parse(r#""field:va\"lue""#)?, parse(r#"field:"va\"lue""#)?,); assert_eq!(parse(r#""field:va\"lue""#)?, parse(r#"field:va\"lue"#)?,); - // only \":()-*_ are escapable - assert!(parse(r"\").is_err()); - assert!(parse(r"\a").is_err()); - assert!(parse(r"\%").is_err()); - // parser unescapes ":()- assert_eq!( parse(r#"\"\:\(\)\-"#)?, @@ -677,11 +667,8 @@ mod test { // escaping parentheses is optional (only) inside quotes assert_eq!(parse(r#""\)\(""#), parse(r#"")(""#)); - assert!(parse(")(").is_err()); // escaping : is optional if it is preceded by another : - assert!(parse(":test").is_err()); - assert!(parse(":").is_err()); assert_eq!(parse("field:val:ue"), parse(r"field:val\:ue")); assert_eq!(parse(r#""field:val:ue""#), parse(r"field:val\:ue")); assert_eq!(parse(r#"field:"val:ue""#), parse(r"field:val\:ue")); @@ -703,7 +690,6 @@ mod test { parse(r#"re:te\"st"#)?, vec![Search(Regex(r#"te"st"#.into()))] ); - assert!(parse(r#"re:te"st"#).is_err()); // spaces are optional if node separation is clear assert_eq!(parse(r#"a"b"(c)"#)?, parse("a b (c)")?); @@ -734,11 +720,8 @@ mod test { parse("nid:1237123712,2,3")?, vec![Search(NoteIDs("1237123712,2,3"))] ); - assert!(parse("nid:1237123712_2,3").is_err()); assert_eq!(parse("is:due")?, vec![Search(State(StateKind::Due))]); assert_eq!(parse("flag:3")?, vec![Search(Flag(3))]); - assert!(parse("flag:-1").is_err()); - assert!(parse("flag:5").is_err()); assert_eq!( parse("prop:ivl>3")?, @@ -747,7 +730,6 @@ mod test { kind: PropertyKind::Interval(3) })] ); - assert!(parse("prop:ivl>3.3").is_err()); assert_eq!( parse("prop:ease<=3.3")?, vec![Search(Property { @@ -758,4 +740,123 @@ mod test { Ok(()) } + + #[test] + fn errors() -> Result<()> { + use crate::err::AnkiError; + use FailKind::*; + + fn assert_err_kind(input: &str, kind: FailKind) { + assert_eq!(parse(input), Err(AnkiError::SearchError(kind))); + } + + assert_err_kind("foo and", MisplacedAnd); + assert_err_kind("and foo", MisplacedAnd); + assert_err_kind("and", MisplacedAnd); + + assert_err_kind("foo or", MisplacedOr); + assert_err_kind("or foo", MisplacedOr); + assert_err_kind("or", MisplacedOr); + + assert_err_kind("()", EmptyGroup); + assert_err_kind("( )", EmptyGroup); + assert_err_kind("(foo () bar)", EmptyGroup); + + assert_err_kind(")", UnopenedGroup); + assert_err_kind("foo ) bar", UnopenedGroup); + assert_err_kind("(foo) bar)", UnopenedGroup); + + assert_err_kind("(", UnclosedGroup); + assert_err_kind("foo ( bar", UnclosedGroup); + assert_err_kind("(foo (bar)", UnclosedGroup); + + assert_err_kind(r#""""#, EmptyQuote); + assert_err_kind(r#"foo:"""#, EmptyQuote); + + assert_err_kind(r#" " "#, UnclosedQuote); + assert_err_kind(r#"" foo"#, UnclosedQuote); + assert_err_kind(r#""\"#, UnclosedQuote); + assert_err_kind(r#"foo:"bar"#, UnclosedQuote); + assert_err_kind(r#"foo:"bar\"#, UnclosedQuote); + + assert_err_kind(":", MissingKey); + assert_err_kind(":foo", MissingKey); + assert_err_kind(r#":"foo""#, MissingKey); + + assert_err_kind(r"\", UnknownEscape(r"\".to_string())); + assert_err_kind(r"\%", UnknownEscape(r"\%".to_string())); + assert_err_kind(r"foo\", UnknownEscape(r"\".to_string())); + assert_err_kind(r"\foo", UnknownEscape(r"\f".to_string())); + assert_err_kind(r"\ ", UnknownEscape(r"\".to_string())); + assert_err_kind(r#""\ ""#, UnknownEscape(r"\ ".to_string())); + + assert_err_kind("nid:1_2,3", InvalidIdList); + assert_err_kind("nid:1,2,x", InvalidIdList); + assert_err_kind("nid:,2,3", InvalidIdList); + assert_err_kind("nid:1,2,", InvalidIdList); + assert_err_kind("cid:1_2,3", InvalidIdList); + assert_err_kind("cid:1,2,x", InvalidIdList); + assert_err_kind("cid:,2,3", InvalidIdList); + assert_err_kind("cid:1,2,", InvalidIdList); + + assert_err_kind("is:foo", InvalidState); + assert_err_kind("is:DUE", InvalidState); + assert_err_kind("is:New", InvalidState); + assert_err_kind("is:", InvalidState); + assert_err_kind(r#""is:learn ""#, InvalidState); + + assert_err_kind(r#""flag: ""#, InvalidFlag); + assert_err_kind("flag:-0", InvalidFlag); + assert_err_kind("flag:", InvalidFlag); + assert_err_kind("flag:5", InvalidFlag); + assert_err_kind("flag:1.1", InvalidFlag); + + assert_err_kind("added:1.1", InvalidAdded); + assert_err_kind("added:-1", InvalidAdded); + assert_err_kind("added:", InvalidAdded); + assert_err_kind("added:foo", InvalidAdded); + + assert_err_kind("edited:1.1", InvalidEdited); + assert_err_kind("edited:-1", InvalidEdited); + assert_err_kind("edited:", InvalidEdited); + assert_err_kind("edited:foo", InvalidEdited); + + assert_err_kind("rated:1.1", InvalidRatedDays); + assert_err_kind("rated:-1", InvalidRatedDays); + assert_err_kind("rated:", InvalidRatedDays); + assert_err_kind("rated:foo", InvalidRatedDays); + + assert_err_kind("rated:1:", InvalidRatedEase); + assert_err_kind("rated:2:-1", InvalidRatedEase); + assert_err_kind("rated:3:1.1", InvalidRatedEase); + assert_err_kind("rated:0:foo", InvalidRatedEase); + + assert_err_kind("dupe:", InvalidDupeMid); + assert_err_kind("dupe:1.1", InvalidDupeMid); + assert_err_kind("dupe:foo", InvalidDupeMid); + + assert_err_kind("dupe:123", InvalidDupeText); + + assert_err_kind("prop:", InvalidPropProperty); + assert_err_kind("prop:=1", InvalidPropProperty); + assert_err_kind("prop:DUE<5", InvalidPropProperty); + + assert_err_kind("prop:lapses", InvalidPropOperator); + assert_err_kind("prop:pos~1", InvalidPropOperator); + assert_err_kind("prop:reps10", InvalidPropOperator); + + assert_err_kind("prop:ease>", InvalidPropFloat); + assert_err_kind("prop:ease!=one", InvalidPropFloat); + assert_err_kind("prop:ease<1,3", InvalidPropFloat); + + assert_err_kind("prop:due>", InvalidPropInteger); + assert_err_kind("prop:due=0.5", InvalidPropInteger); + assert_err_kind("prop:due", InvalidPropUnsigned); + assert_err_kind("prop:reps=1.1", InvalidPropUnsigned); + assert_err_kind("prop:lapses!=-1", InvalidPropUnsigned); + + Ok(()) + } }