use dever_runtime::time::{ self, calendar::{Date, DateTime, Duration, Time}, }; #[test] fn rfc3339_offsets_normalize_to_utc_at_millisecond_precision() { assert_eq!( DateTime::parse("2024-02-29T12:34:56.12+08:00") .unwrap() .format() .unwrap(), "2024-02-29T04:34:56.120Z" ); for value in [ "1969-12-31T23:59:59.999Z", "0000-01-01T00:00:00Z", "9999-12-31T23:59:59.999Z", ] { assert_eq!(DateTime::parse(value).unwrap().format().unwrap(), value); } for value in [ "2023-02-29T00:00:00Z", "2024-02-29T00:00:00.1230Z", "2024-02-29T00:00:00.1234Z", "2024-12-31T23:59:60Z", "2024-01-01T00:00:00", "9999-12-31T23:30:00-01:00", "0000-01-01T00:00:00+01:00", ] { assert!(DateTime::parse(value).is_err(), "{value}"); } } #[test] fn date_and_time_spellings_are_strict_and_zero_fractions_normalize() { assert_eq!( Date::parse("2024-02-29").unwrap().format().unwrap(), "2024-02-29" ); for value in ["2024-2-29", "2023-02-29", "10000-01-01", "2024-01-01 "] { assert!(Date::parse(value).is_err(), "{value}"); } assert_eq!( Time::parse("12:34:56.000").unwrap().format().unwrap(), "12:34:56" ); assert_eq!( Time::parse("12:34:56.001").unwrap().format().unwrap(), "12:34:56.001" ); for value in [ "24:00:00", "23:60:00", "23:59:60", "12:34:56.1", "12:34:56.12", "12:34:56.1234", " 12:34:56", ] { assert!(Time::parse(value).is_err(), "{value}"); } } #[test] fn arithmetic_keeps_i64_values_and_checks_overflow_separately_from_formatting() { let epoch = DateTime::parse("1970-01-01T00:00:00Z").unwrap(); assert_eq!( epoch .checked_sub(Duration::from_millis(1)) .unwrap() .format() .unwrap(), "1969-12-31T23:59:59.999Z" ); let maximum = epoch.checked_add(Duration::from_millis(i64::MAX)).unwrap(); let minimum = epoch.checked_add(Duration::from_millis(i64::MIN)).unwrap(); assert!(maximum.format().is_err()); assert!(maximum.checked_add(Duration::from_millis(1)).is_err()); assert!(minimum.checked_sub(Duration::from_millis(1)).is_err()); assert!(maximum.difference(minimum).is_err()); assert_eq!(epoch.difference(epoch).unwrap().millis(), 0); } #[test] fn temporal_values_are_inline_and_clocks_round_trip() { assert_eq!(std::mem::size_of::(), 8); assert_eq!(std::mem::size_of::(), 8); assert_eq!(std::mem::size_of::