#![allow(missing_docs)]
use dtt::prelude::*;
use proptest::prelude::*;
use time::UtcOffset;
proptest! {
#[test]
fn rfc3339_round_trip(
year in 0i32..=9999,
month in 1u8..=12,
day in 1u8..=28, hour in 0u8..=23,
minute in 0u8..=59,
second in 0u8..=59,
offset_hours in -23i8..=23,
offset_minutes in 0u8..=59,
) {
let signed_minutes = if offset_hours < 0 {
-(i8::try_from(offset_minutes).unwrap())
} else {
i8::try_from(offset_minutes).unwrap()
};
let offset = UtcOffset::from_hms(offset_hours, signed_minutes, 0)
.unwrap();
let dt = DateTime::from_components(
year, month, day, hour, minute, second, offset,
)
.unwrap();
let serialised = dt.format_rfc3339().unwrap();
let parsed = DateTime::parse(&serialised).unwrap();
prop_assert_eq!(dt, parsed);
}
#[test]
fn validator_matches_parser(s in "\\PC{0,64}") {
prop_assert_eq!(
DateTime::is_valid_iso_8601(&s),
DateTime::parse(&s).is_ok(),
);
}
#[test]
fn add_days_is_reversible(days in -10_000i64..=10_000) {
let dt = DateTime::from_components(
2024, 6, 15, 12, 0, 0, UtcOffset::UTC,
)
.unwrap();
if let Ok(forward) = dt.add_days(days) {
let back = forward.add_days(-days).unwrap();
prop_assert_eq!(dt, back);
}
}
#[test]
fn equal_instants_hash_equally(
year in 1u16..=9999,
month in 1u8..=12,
day in 1u8..=28,
hour in 0u8..=23,
minute in 0u8..=59,
offset_hours in -12i8..=12,
) {
use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};
let offset = UtcOffset::from_hms(offset_hours, 0, 0).unwrap();
let a = DateTime::from_components(
i32::from(year), month, day, hour, minute, 0, UtcOffset::UTC,
)
.unwrap();
let b = a.convert_to_tz("UTC").unwrap();
prop_assert_eq!(a, b);
let _ = offset;
let mut ha = DefaultHasher::new();
a.hash(&mut ha);
let mut hb = DefaultHasher::new();
b.hash(&mut hb);
prop_assert_eq!(ha.finish(), hb.finish());
}
#[test]
fn add_months_12_equals_add_years_1(year in -9998i32..=9998) {
let dt = DateTime::from_components(
year, 6, 15, 0, 0, 0, UtcOffset::UTC,
)
.unwrap();
let via_months = dt.add_months(12);
let via_years = dt.add_years(1);
prop_assert_eq!(via_months, via_years);
}
}