summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2017-11-11 01:39:31 +0100
committerMatthias Beyer <mail@beyermatthias.de>2017-11-11 02:36:59 +0100
commite5ed730a4aa0413f05c9c0d0a6a1d903ba3b31dd (patch)
treeb4739788dfc5918a30f6914dfc55d279a98723fe
parent5d4670be62cb59900a026247795d7418905966d0 (diff)
Add tests for iso8601 parsing
-rw-r--r--src/parser.rs59
1 files 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<ExactDate>, alt!(
+// The order is relevant here, because datetime is longer than date, we must parse datetime before
+// date.
+named!(exact_date_parser<ExactDate>, 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)]
@@ -424,6 +426,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"[..]);
assert!(res.is_done());