Revision control
Copy as Markdown
Other Tools
use std::cmp::Ordering;
use std::collections::hash_map::DefaultHasher;
use std::hash::Hash;
use time::error::{self, ConversionRange, IndeterminateOffset, TryFromParsed};
use time::ext::NumericalDuration;
use time::format_description::{self, modifier, well_known, Component, BorrowedFormatItem, OwnedFormatItem};
use time::macros::{date, offset, time, utc_datetime, datetime};
use time::parsing::Parsed;
use time::{Duration, Error, Month, Time, Weekday};
#[expect(deprecated)]
use time::Instant;
macro_rules! assert_cloned_eq {
($x:expr) => {
assert_eq!($x.clone(), $x)
};
}
fn component_range_error() -> error::ComponentRange {
Time::from_hms(24, 0, 0).expect_err("24 is not a valid hour")
}
fn invalid_format_description() -> error::InvalidFormatDescription {
format_description::parse("[").expect_err("format description is invalid")
}
#[expect(clippy::cognitive_complexity, reason = "all test the same thing")]
#[test]
fn clone() {
#[expect(deprecated)]
let instant = Instant::now();
assert_cloned_eq!(date!(2021-001));
assert_cloned_eq!(time!(0:00));
assert_cloned_eq!(offset!(UTC));
assert_cloned_eq!(datetime!(2021-001 0:00));
assert_cloned_eq!(datetime!(2021-001 0:00 UTC));
assert_cloned_eq!(utc_datetime!(2021-001 0:00));
assert_cloned_eq!(Weekday::Monday);
assert_cloned_eq!(Month::January);
assert_cloned_eq!(Duration::ZERO);
assert_cloned_eq!(instant);
assert_cloned_eq!(IndeterminateOffset);
assert_cloned_eq!(ConversionRange);
assert_cloned_eq!(invalid_format_description());
assert_cloned_eq!(TryFromParsed::InsufficientInformation);
#[expect(clippy::clone_on_copy)] // needed for coverage
let _ = Parsed::new().clone();
assert_cloned_eq!(error::Parse::ParseFromDescription(
error::ParseFromDescription::InvalidComponent("foo")
));
assert_cloned_eq!(error::DifferentVariant);
assert_cloned_eq!(error::InvalidVariant);
assert_cloned_eq!(error::ParseFromDescription::InvalidComponent("foo"));
assert_cloned_eq!(Component::OffsetSecond(modifier::OffsetSecond::default()));
assert_cloned_eq!(well_known::Rfc2822);
assert_cloned_eq!(well_known::Rfc3339);
assert_cloned_eq!(well_known::Iso8601::DEFAULT);
assert_cloned_eq!(well_known::iso8601::FormattedComponents::None);
assert_cloned_eq!(well_known::iso8601::DateKind::Calendar);
assert_cloned_eq!(well_known::iso8601::TimePrecision::Hour {
decimal_digits: None
});
assert_cloned_eq!(well_known::iso8601::OffsetPrecision::Hour);
assert_cloned_eq!(well_known::iso8601::FormattedComponents::None);
assert_cloned_eq!(component_range_error());
assert_cloned_eq!(BorrowedFormatItem::Literal(b""));
assert_cloned_eq!(modifier::Day::default());
assert_cloned_eq!(modifier::MonthRepr::default());
assert_cloned_eq!(modifier::Month::default());
assert_cloned_eq!(modifier::Ordinal::default());
assert_cloned_eq!(modifier::WeekdayRepr::default());
assert_cloned_eq!(modifier::Weekday::default());
assert_cloned_eq!(modifier::WeekNumberRepr::default());
assert_cloned_eq!(modifier::WeekNumber::default());
assert_cloned_eq!(modifier::YearRepr::default());
assert_cloned_eq!(modifier::Year::default());
assert_cloned_eq!(modifier::Hour::default());
assert_cloned_eq!(modifier::Minute::default());
assert_cloned_eq!(modifier::Period::default());
assert_cloned_eq!(modifier::Second::default());
assert_cloned_eq!(modifier::SubsecondDigits::default());
assert_cloned_eq!(modifier::Subsecond::default());
assert_cloned_eq!(modifier::OffsetHour::default());
assert_cloned_eq!(modifier::OffsetMinute::default());
assert_cloned_eq!(modifier::OffsetSecond::default());
assert_cloned_eq!(modifier::Padding::default());
}
#[test]
fn hash() {
let mut hasher = DefaultHasher::new();
date!(2021-001).hash(&mut hasher);
time!(0:00).hash(&mut hasher);
offset!(UTC).hash(&mut hasher);
datetime!(2021-001 0:00).hash(&mut hasher);
datetime!(2021-001 0:00 UTC).hash(&mut hasher);
utc_datetime!(2021-001 0:00).hash(&mut hasher);
Weekday::Monday.hash(&mut hasher);
Month::January.hash(&mut hasher);
#[expect(deprecated)]
Instant::now().hash(&mut hasher);
Duration::ZERO.hash(&mut hasher);
component_range_error().hash(&mut hasher);
}
#[test]
fn partial_ord() {
#[expect(deprecated)]
let instant = Instant::now();
assert_eq!(offset!(UTC).partial_cmp(&offset!(+1)), Some(Ordering::Less));
assert_eq!(
offset!(+1).partial_cmp(&offset!(UTC)),
Some(Ordering::Greater)
);
assert_eq!(
(instant - 1.seconds()).partial_cmp(&instant),
Some(Ordering::Less)
);
assert_eq!(
(instant + 1.seconds()).partial_cmp(&instant),
Some(Ordering::Greater)
);
}
#[test]
fn ord() {
assert_eq!(offset!(UTC).cmp(&offset!(+1)), Ordering::Less);
assert_eq!(offset!(+1).cmp(&offset!(UTC)), Ordering::Greater);
assert_eq!(offset!(UTC).cmp(&offset!(UTC)), Ordering::Equal);
}
#[test]
fn debug() {
macro_rules! debug_all {
() => {};
(#[$meta:meta] $x:expr; $($rest:tt)*) => {
#[$meta]
let _unused = format!("{:?}", $x);
debug_all!($($rest)*);
};
($x:expr; $($rest:tt)*) => {
let _unused = format!("{:?}", $x);
debug_all!($($rest)*);
};
}
debug_all! {
utc_datetime!(2021-001 0:00);
Duration::ZERO;
IndeterminateOffset;
ConversionRange;
TryFromParsed::InsufficientInformation;
Parsed::new();
#[expect(deprecated)]
Instant::now();
error::ParseFromDescription::InvalidComponent("foo");
error::Format::InvalidComponent("foo");
well_known::Rfc2822;
well_known::Rfc3339;
well_known::Iso8601::DEFAULT;
well_known::iso8601::FormattedComponents::None;
well_known::iso8601::DateKind::Calendar;
well_known::iso8601::TimePrecision::Hour { decimal_digits: None };
well_known::iso8601::OffsetPrecision::Hour;
well_known::iso8601::Config::DEFAULT;
component_range_error();
Error::ConversionRange(ConversionRange);
modifier::Day::default();
modifier::MonthRepr::default();
modifier::Month::default();
modifier::Ordinal::default();
modifier::WeekdayRepr::default();
modifier::Weekday::default();
modifier::WeekNumberRepr::default();
modifier::WeekNumber::default();
modifier::YearRepr::default();
modifier::Year::default();
modifier::Hour::default();
modifier::Minute::default();
modifier::Period::default();
modifier::Second::default();
modifier::SubsecondDigits::default();
modifier::Subsecond::default();
modifier::OffsetHour::default();
modifier::OffsetMinute::default();
modifier::OffsetSecond::default();
modifier::Padding::default();
BorrowedFormatItem::Literal(b"abcdef");
BorrowedFormatItem::Compound(&[BorrowedFormatItem::Component(Component::Day(modifier::Day::default()))]);
BorrowedFormatItem::Optional(&BorrowedFormatItem::Compound(&[]));
BorrowedFormatItem::First(&[]);
OwnedFormatItem::from(BorrowedFormatItem::Literal(b"abcdef"));
OwnedFormatItem::from(BorrowedFormatItem::Compound(&[BorrowedFormatItem::Component(Component::Day(modifier::Day::default()))]));
OwnedFormatItem::from(BorrowedFormatItem::Optional(&BorrowedFormatItem::Compound(&[])));
OwnedFormatItem::from(BorrowedFormatItem::First(&[]));
}
}