From e5ed730a4aa0413f05c9c0d0a6a1d903ba3b31dd Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Sat, 11 Nov 2017 01:39:31 +0100 Subject: Add tests for iso8601 parsing --- src/parser.rs | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 3 deletions(-) diff --git a/src/parser.rs b/src/parser.rs index bfa70e7..251ec31 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -206,12 +206,14 @@ impl AmountExpr { use iso8601::parsers::parse_date; use iso8601::parsers::parse_datetime; -named!(exact_date_parser, alt!( +// The order is relevant here, because datetime is longer than date, we must parse datetime before +// date. +named!(exact_date_parser, alt_complete!( tag!("today") => { |_| ExactDate::Today } | tag!("yesterday") => { |_| ExactDate::Yesterday } | tag!("tomorrow") => { |_| ExactDate::Tomorrow } | - do_parse!(d: parse_date >> (ExactDate::Iso8601Date(d))) | - do_parse!(d: parse_datetime >> (ExactDate::Iso8601DateTime(d))) + do_parse!(d: parse_datetime >> (ExactDate::Iso8601DateTime(d))) | + do_parse!(d: parse_date >> (ExactDate::Iso8601Date(d))) )); #[derive(Debug, PartialEq, Eq)] @@ -423,6 +425,57 @@ mod tests { })); } + #[test] + fn test_parse_expressions_date() { + use iso8601::Date; + let res = exact_date_parser(&b"2017-01-01"[..]); + assert!(res.is_done()); + + match res.unwrap().1 { + ExactDate::Iso8601DateTime(_) => assert!(false), + ExactDate::Iso8601Date(d) => { + match d { + Date::YMD { year, month, day } => { + assert_eq!(year, 2017); + assert_eq!(month, 1); + assert_eq!(day, 1) + }, + _ => assert!(false), + } + }, + ExactDate::Tomorrow => assert!(false), + ExactDate::Yesterday => assert!(false), + ExactDate::Today => assert!(false), + }; + } + + #[test] + fn test_parse_expressions_datetime() { + use iso8601::Date; + let res = exact_date_parser(&b"2017-01-01T22:00:11"[..]); + assert!(res.is_done()); + + match res.unwrap().1 { + ExactDate::Iso8601DateTime(obj) => { + match obj.date { + Date::YMD { year, month, day } => { + assert_eq!(year, 2017); + assert_eq!(month, 1); + assert_eq!(day, 1) + }, + _ => assert!(false), + } + assert_eq!(obj.time.hour, 22); + assert_eq!(obj.time.minute, 0); + assert_eq!(obj.time.second, 11); + }, + ExactDate::Iso8601Date(_) => assert!(false), + ExactDate::Tomorrow => assert!(false), + ExactDate::Yesterday => assert!(false), + ExactDate::Today => assert!(false), + }; + } + #[test] fn test_expressions_to_date() { let res = amount_expr(&b"5min + 12min"[..]); -- cgit v1.2.3