timmy 0.3.0

A time tracker mainly for programming tasks
Documentation
extern crate chrono;
extern crate timmy;

use chrono::*;
use timmy::chronny::*;

fn now() -> DateTime<FixedOffset> {
    DateTime::parse_from_rfc3339("2016-08-23T16:30:00+01:00").unwrap()
}

#[test]
fn test_now() {
    assert_eq!(parse_datetime("now", now()), Some(now()));
    assert_eq!(parse_datetime("today", now()), Some(now()));
}

#[test]
fn test_absolute_date() {
    let yesterday = now() - Duration::days(1);
    let first = DateTime::parse_from_rfc3339("2016-08-01T16:30:00+01:00").unwrap();
    assert_eq!(parse_datetime("yesterday", now()), Some(yesterday));
    assert_eq!(parse_datetime("01/08/16", now()), Some(first));
    assert_eq!(parse_datetime("01/08/2016", now()), Some(first));
    assert_eq!(parse_datetime("1/8/2016", now()), Some(first));
    assert_eq!(parse_datetime("01/08", now()), Some(first));
}

#[test]
fn test_relative_date() {
    let yesterday = now() - Duration::days(1);
    let three_days_ago = now() - Duration::days(3);
    let in_four_days = now() + Duration::days(4);
    assert_eq!(parse_datetime("1 day ago", now()), Some(yesterday));
    assert_eq!(parse_datetime("3 days ago", now()), Some(three_days_ago));
    assert_eq!(parse_datetime("in 4 days", now()), Some(in_four_days));
}

#[test]
fn test_absolute_time() {
    let in_one_hour = now() + Duration::hours(1);
    let two_hours_ago = now() - Duration::hours(2);
    assert_eq!(parse_datetime("17:30", now()), Some(in_one_hour));
    assert_eq!(parse_datetime("14:30", now()), Some(two_hours_ago));
}

#[test]
fn test_relative_time() {
    let in_one_hour = now() + Duration::hours(1);
    let in_thirty_mins = now() + Duration::minutes(30);
    let three_hours_ago = now() - Duration::hours(3);
    assert_eq!(parse_datetime("in 1 hr", now()), Some(in_one_hour));
    assert_eq!(parse_datetime("in 1 hours", now()), Some(in_one_hour));
    assert_eq!(parse_datetime("in 30 mins", now()), Some(in_thirty_mins));
    assert_eq!(parse_datetime("in 30 minutes", now()), Some(in_thirty_mins));
    assert_eq!(parse_datetime("3 hrs ago", now()), Some(three_hours_ago));
}

#[test]
fn test_kitchen_sink() {
    let yesterday_two = now() - Duration::days(1) - Duration::hours(2) - Duration::minutes(30);
    assert_eq!(parse_datetime("yesterday 14:00", now()), Some(yesterday_two));
}