diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2017-11-19 13:57:26 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-19 13:57:26 +0100 |
commit | 11a71c0f00d22b8ab3d42ad9429ba676f193d650 (patch) | |
tree | fad46963ea9d499ad36ec71eaa2327f2daa8dfb2 | |
parent | 8222ca0769259c73da0d77793f68d14fafa3300f (diff) | |
parent | 715ce5669c0da78e2a39d2945050c45968ffe28c (diff) |
Merge pull request #4 from matthiasbeyer/parser-fixes
Parser fixes
-rw-r--r-- | src/parser.rs | 67 |
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()); |