summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2017-11-19 13:57:26 +0100
committerGitHub <noreply@github.com>2017-11-19 13:57:26 +0100
commit11a71c0f00d22b8ab3d42ad9429ba676f193d650 (patch)
treefad46963ea9d499ad36ec71eaa2327f2daa8dfb2
parent8222ca0769259c73da0d77793f68d14fafa3300f (diff)
parent715ce5669c0da78e2a39d2945050c45968ffe28c (diff)
Merge pull request #4 from matthiasbeyer/parser-fixes
Parser fixes
-rw-r--r--src/parser.rs67
1 files changed, 62 insertions, 5 deletions
diff --git a/src/parser.rs b/src/parser.rs
index 2cbf046..7a2e7a1 100644
--- a/src/parser.rs
+++ b/src/parser.rs
@@ -277,8 +277,10 @@ impl Into<timetype::TimeType> for ExactDate {
}
named!(date<Date>, do_parse!(
- exact:exact_date_parser >>
- o: opt!(do_parse!(sp >> op:operator_parser >> a:amount_expr >> (op, a))) >>
+ exact: exact_date_parser >>
+ o: opt!(
+ complete!(do_parse!(sp >> op:operator_parser >> sp >> a:amount_expr >> (op, a)))
+ ) >>
(Date(exact, o))
));
@@ -323,14 +325,14 @@ impl Into<timetype::TimeType> for TimeType {
}
}
-named!(until_spec<UntilSpec>, alt!(
+named!(until_spec<UntilSpec>, alt_complete!(
do_parse!(
- tag!("until") >>
+ tag!("until") >> sp >>
exact: exact_date_parser >>
(UntilSpec::Exact(exact))
) |
do_parse!(
- num: integer >>
+ num: integer >> sp >>
tag!("times") >>
(UntilSpec::Times(num))
)
@@ -512,6 +514,61 @@ mod tests {
}
#[test]
+ fn test_simple_date_1() {
+ let res = exact_date_parser(&b"today"[..]);
+ assert!(res.is_done(), format!("Not done: {:?}", res));
+
+ let res = date(&b"today"[..]);
+ assert!(res.is_done(), format!("Not done: {:?}", res));
+ }
+
+ #[test]
+ fn test_simple_date_2() {
+ let res = date(&b"2017-01-01"[..]);
+ assert!(res.is_done(), format!("Not done: {:?}", res));
+ let (_, o) = res.unwrap();
+
+ println!("{:#?}", o);
+
+ let calc_res : timetype::TimeType = o.into();
+ let calc_res = calc_res.calculate();
+ assert!(calc_res.is_ok());
+
+ let calc_res = calc_res.unwrap();
+ println!("{:#?}", calc_res);
+
+ assert_eq!(calc_res.get_moment().unwrap().year() , 2017);
+ assert_eq!(calc_res.get_moment().unwrap().month() , 01);
+ assert_eq!(calc_res.get_moment().unwrap().day() , 01);
+ assert_eq!(calc_res.get_moment().unwrap().hour() , 00);
+ assert_eq!(calc_res.get_moment().unwrap().minute(), 00);
+ assert_eq!(calc_res.get_moment().unwrap().second(), 00);
+ }
+
+ #[test]
+ fn test_simple_date_3() {
+ let res = date(&b"2017-01-01T01:02:03"[..]);
+ assert!(res.is_done(), format!("Not done: {:?}", res));
+ let (_, o) = res.unwrap();
+
+ println!("{:#?}", o);
+
+ let calc_res : timetype::TimeType = o.into();
+ let calc_res = calc_res.calculate();
+ assert!(calc_res.is_ok());
+
+ let calc_res = calc_res.unwrap();
+ println!("{:#?}", calc_res);
+
+ assert_eq!(calc_res.get_moment().unwrap().year() , 2017);
+ assert_eq!(calc_res.get_moment().unwrap().month() , 01);
+ assert_eq!(calc_res.get_moment().unwrap().day() , 01);
+ assert_eq!(calc_res.get_moment().unwrap().hour() , 01);
+ assert_eq!(calc_res.get_moment().unwrap().minute(), 02);
+ assert_eq!(calc_res.get_moment().unwrap().second(), 03);
+ }
+
+ #[test]
fn test_expressions_to_date() {
let res = amount_expr(&b"5min + 12min"[..]);
assert!(res.is_done());