date_time 2.2.0

Date_Time is a high-level rust library for use in situations where precision beyond seconds is not necessary.
Documentation
extern crate date_time;

use date_time::date_tuple::{Date, DateTuple};

#[test]
fn test_year_too_large() {
    assert!(DateTuple::new(10000, 6, 10).is_err());
}

#[test]
fn test_min_value() {
    assert_eq!(DateTuple::new(0, 1, 1).unwrap(), DateTuple::min_value());
}

#[test]
fn test_today_does_not_panic() {
    DateTuple::today();
}

#[test]
fn test_getters() {
    let date = DateTuple::new(2000, 5, 10).unwrap();
    assert_eq!(2000, date.get_year());
    assert_eq!(5, date.get_month());
    assert_eq!(10, date.get_date());
}

#[test]
fn test_to_string() {
    let tuple = DateTuple::new(2000, 6, 10).unwrap();
    assert_eq!(String::from("2000-06-10"), tuple.to_string());
}

#[test]
fn test_to_readable_string() {
    let tuple = DateTuple::new(2000, 6, 10).unwrap();
    assert_eq!(String::from("10 Jun 2000"), tuple.to_readable_string());
}

#[test]
fn test_equals() {
    let tuple1 = DateTuple::new(2000, 6, 10).unwrap();
    let tuple2 = DateTuple::new(2000, 6, 10).unwrap();
    assert_eq!(tuple1, tuple2);
}

#[test]
fn test_comparisons() {
    let tuple1 = DateTuple::new(2000, 6, 5).unwrap();
    let tuple2 = DateTuple::new(2000, 6, 5).unwrap();
    let tuple3 = DateTuple::new(2000, 7, 4).unwrap();
    let tuple4 = DateTuple::new(2001, 1, 1).unwrap();
    assert!(tuple1 <= tuple2);
    assert!(!(tuple1 < tuple2));
    assert!(tuple1 >= tuple2);
    assert!(tuple1 < tuple3);
    assert!(tuple3 < tuple4);
    assert!(tuple4 > tuple2);
}

#[test]
fn test_validity() {
    assert!(DateTuple::new(2000, 6, 5).is_ok());
    assert!(DateTuple::new(2000, 7, 31).is_ok());
    assert!(DateTuple::new(2000, 2, 2).is_ok());
    assert!(DateTuple::new(2000, 2, 29).is_ok());

    assert!(DateTuple::new(2000, 6, 31).is_err());
    assert!(DateTuple::new(2001, 2, 29).is_err());
    assert!(DateTuple::new(2000, 13, 5).is_err());
}

#[test]
fn test_from_string() {
    let tuple = DateTuple::new(2000, 6, 10).unwrap();
    assert_eq!(tuple, str::parse("2000-06-10").unwrap());
    assert!(str::parse::<DateTuple>("2000-16-10").is_err());
    assert!(str::parse::<DateTuple>("2O00061O").is_err());
}

#[test]
fn test_from_legacy_string() {
    let tuple = DateTuple::new(2000, 6, 10).unwrap();
    assert_eq!(tuple, str::parse("20000610").unwrap());
    assert!(str::parse::<DateTuple>("20001610").is_err());
}

#[test]
fn test_add_days() {
    let mut tuple1 = DateTuple::new(2000, 6, 5).unwrap();
    let tuple1_orig = DateTuple::new(2000, 6, 5).unwrap();
    let mut tuple2 = DateTuple::new(2000, 12, 31).unwrap();
    let tuple2_orig = DateTuple::new(2000, 12, 31).unwrap();
    tuple1.add_days(1);
    assert_eq!(tuple1, tuple1_orig.next_date());
    tuple2.add_days(2);
    assert_eq!(tuple2, tuple2_orig.next_date().next_date());
}

#[test]
fn test_subtract_days() {
    let mut tuple1 = DateTuple::new(2000, 6, 5).unwrap();
    let tuple1_orig = DateTuple::new(2000, 6, 5).unwrap();
    let mut tuple2 = DateTuple::new(2000, 12, 31).unwrap();
    let tuple2_orig = DateTuple::new(2000, 12, 31).unwrap();
    tuple1.subtract_days(1);
    assert_eq!(tuple1, tuple1_orig.previous_date());
    tuple2.subtract_days(2);
    assert_eq!(tuple2, tuple2_orig.previous_date().previous_date());
}

#[test]
fn test_add_months() {
    let mut tuple1 = DateTuple::new(2000, 6, 1).unwrap();
    let mut tuple2 = DateTuple::new(2000, 7, 31).unwrap();
    tuple1.add_months(1);
    assert_eq!(tuple1, DateTuple::new(2000, 7, 1).unwrap());
    tuple1.add_months(1);
    assert_eq!(tuple1, DateTuple::new(2000, 8, 1).unwrap());
    tuple2.add_months(2);
    assert_eq!(tuple2, DateTuple::new(2000, 9, 30).unwrap());
}

#[test]
fn test_subtract_months() {
    let mut tuple1 = DateTuple::new(2000, 6, 1).unwrap();
    let mut tuple2 = DateTuple::new(2000, 7, 31).unwrap();
    let mut tuple3 = DateTuple::new(2000, 11, 30).unwrap();
    tuple1.subtract_months(1);
    assert_eq!(tuple1, DateTuple::new(2000, 5, 1).unwrap());
    tuple2.subtract_months(3);
    assert_eq!(tuple2, DateTuple::new(2000, 4, 30).unwrap());
    tuple3.subtract_months(1);
    assert_eq!(tuple3, DateTuple::new(2000, 10, 30).unwrap());
}

#[test]
fn test_add_and_subtract_years() {
    let mut tuple1 = Date::new(2000, 2, 29).unwrap();
    let mut tuple2 = Date::new(2000, 2, 29).unwrap();
    tuple1.add_years(1);
    tuple2.add_years(4);
    assert_eq!(Date::new(2001, 2, 28).unwrap(), tuple1);
    assert_eq!(Date::new(2004, 2, 29).unwrap(), tuple2);
    tuple1.subtract_years(1);
    tuple2.subtract_years(4);
    assert_eq!(Date::new(2000, 2, 28).unwrap(), tuple1);
    assert_eq!(Date::new(2000, 2, 29).unwrap(), tuple2);
    tuple2.subtract_years(1);
    assert_eq!(Date::new(1999, 2, 28).unwrap(), tuple2);
    let mut tuple3 = Date::new(9999, 6, 10).unwrap();
    let mut tuple4 = Date::new(0, 6, 10).unwrap();
    tuple3.add_years(1);
    tuple4.subtract_years(1);
    assert_eq!(9999, tuple3.get_year());
    assert_eq!(0, tuple4.get_year());
}

#[test]
fn test_to_days() {
    let feb_29_2000 = DateTuple::new(2000, 2, 29).unwrap();
    assert_eq!(730_545, feb_29_2000.to_days());
}

#[test]
fn test_from_days() {
    let feb_29_2000 = DateTuple::new(2000, 2, 29).unwrap();
    assert_eq!(feb_29_2000, DateTuple::from_days(730_545).unwrap());
    assert!(DateTuple::from_days(0).is_err());
}