tokistamp 0.1.4

Small Unix timestamp and datestamp types with formatting helpers.
Documentation
use std::str::FromStr;

use tokistamp::{Date, Duration};

#[test]
fn creates_date_from_date_string() {
    let date = Date::parse("2026-05-08").unwrap();

    assert_eq!(date.year(), 2026);
    assert_eq!(date.month(), 5);
    assert_eq!(date.day(), 8);
}

#[test]
fn creates_date_from_date_time_string() {
    let date = Date::parse("2026-05-08 12:34:56.789").unwrap();

    assert_eq!(date.year(), 2026);
    assert_eq!(date.month(), 5);
    assert_eq!(date.day(), 8);
}

#[test]
fn creates_date_with_from_str() {
    let date = Date::from_str("2026-05-08").unwrap();

    assert_eq!(date.to_string(), "2026-05-08");
}

#[test]
fn formats_date_as_yyyy_mm_dd() {
    let date = Date::parse("2026-05-08").unwrap();

    assert_eq!(date.to_string(), "2026-05-08");
}

#[test]
fn adds_duration_to_date_from_midnight() {
    let date = Date::parse("2026-05-08").unwrap();
    let result = date.add_duration(Duration::from_hours(26));

    assert_eq!(result.to_string(), "2026-05-09 02:00:00.000");
}

#[test]
fn subtracts_duration_from_date_midnight() {
    let date = Date::parse("2026-05-08").unwrap();
    let result = date.sub_duration(Duration::from_millis(1));

    assert_eq!(result.to_string(), "2026-05-07 23:59:59.999");
}

#[test]
fn subtracts_date_as_duration() {
    let left = Date::parse("2026-05-10").unwrap();
    let right = Date::parse("2026-05-08").unwrap();

    assert_eq!(
        (left - right).as_millis(),
        Duration::from_days(2).as_millis()
    );
    assert_eq!(
        (right - left).as_millis(),
        Duration::from_days(-2).as_millis()
    );
}

#[test]
fn rejects_invalid_date_string() {
    assert!(Date::parse("2026-02-29").is_err());
    assert!(Date::parse("2026-00-08").is_err());
    assert!(Date::parse("2026-13-08").is_err());
    assert!(Date::parse("2026-05-00").is_err());
    assert!(Date::parse("2026/05/08").is_err());
}

#[test]
fn now_creates_valid_date() {
    let date = Date::now();

    assert!(date.month() >= 1 && date.month() <= 12);
    assert!(date.day() >= 1 && date.day() <= 31);
}