202 lines
7.5 KiB
Rust
202 lines
7.5 KiB
Rust
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(&[]));
|
|
}
|
|
}
|