mod iso_8601;
mod rfc_2822;
mod unix_seconds;
pub use iso_8601::Iso8601;
pub use rfc_2822::Rfc2822;
pub use unix_seconds::UnixSeconds;
#[cfg(test)]
mod tests {
use std::time::{Duration, SystemTime};
use serde::{Deserialize, Serialize};
use super::*;
use crate::Clock;
#[test]
fn assert_json_format() {
let clock = Clock::new_frozen_at(SystemTime::UNIX_EPOCH + Duration::from_millis(10_123_456));
let dates = Dates {
iso: clock.system_time_as::<Iso8601>(),
rfc: clock.system_time_as::<Rfc2822>(),
unix: clock.system_time_as::<UnixSeconds>(),
};
let json = serde_json::to_string(&dates).unwrap();
assert_eq!(
json,
r#"{"iso":"1970-01-01T02:48:43.456Z","rfc":"Thu, 01 Jan 1970 02:48:43 GMT","unix":10123}"#
);
}
#[test]
fn assert_display_format() {
let clock = Clock::new_frozen_at(SystemTime::UNIX_EPOCH + Duration::from_millis(10_123_456));
let dates = Dates {
iso: clock.system_time_as::<Iso8601>(),
rfc: clock.system_time_as::<Rfc2822>(),
unix: clock.system_time_as::<UnixSeconds>(),
};
let formatted = format!("iso: {}, unix: {}, rfc: {}", dates.iso, dates.unix, dates.rfc);
assert_eq!(
formatted,
"iso: 1970-01-01T02:48:43.456Z, unix: 10123, rfc: Thu, 01 Jan 1970 02:48:43 GMT"
);
}
#[test]
fn json_roundtrip() {
let clock = Clock::new_frozen_at(SystemTime::UNIX_EPOCH + Duration::from_secs(10123));
let dates = Dates {
iso: clock.system_time_as::<Iso8601>(),
rfc: clock.system_time_as::<Rfc2822>(),
unix: clock.system_time_as::<UnixSeconds>(),
};
let json = serde_json::to_string(&dates).unwrap();
let parsed: Dates = serde_json::from_str(&json).unwrap();
assert_eq!(dates, parsed);
}
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
struct Dates {
iso: Iso8601,
rfc: Rfc2822,
unix: UnixSeconds,
}
#[test]
fn unix_epoch_values_are_aligned() {
let iso_epoch: SystemTime = Iso8601::UNIX_EPOCH.into();
let rfc_epoch: SystemTime = Rfc2822::UNIX_EPOCH.into();
let unix_epoch: SystemTime = UnixSeconds::UNIX_EPOCH.into();
assert_eq!(iso_epoch, SystemTime::UNIX_EPOCH, "Iso8601::UNIX_EPOCH should be Unix epoch");
assert_eq!(rfc_epoch, SystemTime::UNIX_EPOCH, "Rfc2822::UNIX_EPOCH should be Unix epoch");
assert_eq!(unix_epoch, SystemTime::UNIX_EPOCH, "UnixSeconds::UNIX_EPOCH should be Unix epoch");
assert_eq!(Iso8601::from(Rfc2822::UNIX_EPOCH), Iso8601::UNIX_EPOCH);
assert_eq!(Iso8601::from(UnixSeconds::UNIX_EPOCH), Iso8601::UNIX_EPOCH);
assert_eq!(Rfc2822::from(Iso8601::UNIX_EPOCH), Rfc2822::UNIX_EPOCH);
assert_eq!(Rfc2822::from(UnixSeconds::UNIX_EPOCH), Rfc2822::UNIX_EPOCH);
assert_eq!(UnixSeconds::from(Iso8601::UNIX_EPOCH), UnixSeconds::UNIX_EPOCH);
assert_eq!(UnixSeconds::from(Rfc2822::UNIX_EPOCH), UnixSeconds::UNIX_EPOCH);
}
#[test]
fn max_values_are_aligned() {
let iso_max: SystemTime = Iso8601::MAX.into();
let rfc_max: SystemTime = Rfc2822::MAX.into();
let unix_max: SystemTime = UnixSeconds::MAX.into();
assert_eq!(iso_max, rfc_max, "Iso8601::MAX and Rfc2822::MAX should be equal");
assert_eq!(iso_max, unix_max, "Iso8601::MAX and UnixSeconds::MAX should be equal");
assert_eq!(Iso8601::from(Rfc2822::MAX), Iso8601::MAX);
assert_eq!(Iso8601::from(UnixSeconds::MAX), Iso8601::MAX);
assert_eq!(Rfc2822::from(Iso8601::MAX), Rfc2822::MAX);
assert_eq!(Rfc2822::from(UnixSeconds::MAX), Rfc2822::MAX);
assert_eq!(UnixSeconds::from(Iso8601::MAX), UnixSeconds::MAX);
assert_eq!(UnixSeconds::from(Rfc2822::MAX), UnixSeconds::MAX);
}
}