Revision control

Copy as Markdown

Other Tools

use std::num::NonZero;
use time::format_description::modifier::{Hour, WeekNumber, WeekNumberRepr};
use time::format_description::{BorrowedFormatItem, Component};
use time::parsing::Parsed;
use time::{Month, Time, Weekday, error};
#[test]
fn getters_setters() {
macro_rules! getters_setters {
($( $(#[$attr:meta])* $setter:ident $getter:ident $value:expr;)*) => {$(
$(#[$attr])*
{
let mut parsed = Parsed::new();
parsed.$setter($value);
assert_eq!(parsed.$getter(), Some($value));
}
)*};
}
getters_setters! {
set_year year 5;
set_year_last_two year_last_two 5;
set_iso_year iso_year 5;
set_iso_year_last_two iso_year_last_two 5;
set_month month Month::May;
set_sunday_week_number sunday_week_number 5;
set_monday_week_number monday_week_number 5;
set_iso_week_number iso_week_number NonZero::new(5).expect("valid value");
set_weekday weekday Weekday::Monday;
set_ordinal ordinal NonZero::new(5).expect("valid value");
set_day day NonZero::new(5).expect("valid value");
set_hour_24 hour_24 5;
set_hour_12 hour_12 NonZero::new(5).expect("valid value");
set_hour_12_is_pm hour_12_is_pm true;
set_minute minute 5;
set_second second 5;
set_subsecond subsecond 5;
set_offset_hour offset_hour 5;
#[expect(deprecated)] set_offset_minute offset_minute 5;
set_offset_minute_signed offset_minute_signed -5;
#[expect(deprecated)] set_offset_second offset_second 5;
set_offset_second_signed offset_second_signed -5;
}
#[expect(deprecated)]
{
let mut parsed = Parsed::new();
parsed.set_offset_minute(200);
assert_eq!(parsed.offset_minute(), None);
parsed.set_offset_second(200);
assert_eq!(parsed.offset_second(), None);
}
}
#[test]
fn builder_methods() {
#[expect(deprecated)]
let parsed = Parsed::new()
.with_year(5)
.and_then(|parsed| parsed.with_year_last_two(5))
.and_then(|parsed| parsed.with_iso_year(5))
.and_then(|parsed| parsed.with_iso_year_last_two(5))
.and_then(|parsed| parsed.with_month(Month::May))
.and_then(|parsed| parsed.with_sunday_week_number(5))
.and_then(|parsed| parsed.with_monday_week_number(5))
.and_then(|parsed| parsed.with_iso_week_number(NonZero::new(5).expect("valid value")))
.and_then(|parsed| parsed.with_weekday(Weekday::Monday))
.and_then(|parsed| parsed.with_ordinal(NonZero::new(5).expect("valid value")))
.and_then(|parsed| parsed.with_day(NonZero::new(5).expect("valid value")))
.and_then(|parsed| parsed.with_hour_24(5))
.and_then(|parsed| parsed.with_hour_12(NonZero::new(5).expect("valid value")))
.and_then(|parsed| parsed.with_hour_12_is_pm(true))
.and_then(|parsed| parsed.with_minute(5))
.and_then(|parsed| parsed.with_second(5))
.and_then(|parsed| parsed.with_subsecond(5))
.and_then(|parsed| parsed.with_offset_hour(5))
.and_then(|parsed| parsed.with_offset_minute(5))
.and_then(|parsed| parsed.with_offset_second(5))
.expect("all values are valid");
assert_eq!(parsed.year(), Some(5));
assert_eq!(parsed.year_last_two(), Some(5));
assert_eq!(parsed.iso_year(), Some(5));
assert_eq!(parsed.iso_year_last_two(), Some(5));
assert_eq!(parsed.month(), Some(Month::May));
assert_eq!(parsed.sunday_week_number(), Some(5));
assert_eq!(parsed.monday_week_number(), Some(5));
assert_eq!(
parsed.iso_week_number(),
Some(NonZero::new(5).expect("valid value"))
);
assert_eq!(parsed.weekday(), Some(Weekday::Monday));
assert_eq!(
parsed.ordinal(),
Some(NonZero::new(5).expect("valid value"))
);
assert_eq!(parsed.day(), Some(NonZero::new(5).expect("valid value")));
assert_eq!(parsed.hour_24(), Some(5));
assert_eq!(
parsed.hour_12(),
Some(NonZero::new(5).expect("valid value"))
);
assert_eq!(parsed.hour_12_is_pm(), Some(true));
assert_eq!(parsed.minute(), Some(5));
assert_eq!(parsed.second(), Some(5));
assert_eq!(parsed.subsecond(), Some(5));
assert_eq!(parsed.offset_hour(), Some(5));
#[expect(deprecated)]
{
assert_eq!(parsed.offset_minute(), Some(5));
assert_eq!(parsed.offset_second(), Some(5));
}
let parsed = Parsed::new()
.with_offset_minute_signed(-5)
.and_then(|parsed| parsed.with_offset_second_signed(-5))
.expect("all values are valid");
assert_eq!(parsed.offset_minute_signed(), Some(-5));
assert_eq!(parsed.offset_second_signed(), Some(-5));
#[expect(deprecated)]
{
assert!(Parsed::new().with_offset_minute(200).is_none());
assert!(Parsed::new().with_offset_second(200).is_none());
}
}
#[test]
fn single_item_parse() {
assert!(Time::parse("a", &BorrowedFormatItem::Literal(b"a")).is_err());
assert!(Time::parse("b", &BorrowedFormatItem::Literal(b"a")).is_err());
}
#[test]
fn component_err() {
macro_rules! input_or_empty {
() => {
b""
};
($input:expr) => {
$input
};
}
macro_rules! assert_invalid_component {
($component_name:expr, $component:expr $(, $input:expr)?) => {{
let mut parsed = Parsed::new();
assert_eq!(
parsed.parse_component(input_or_empty!($($input)?), $component),
Err(error::ParseFromDescription::InvalidComponent(
$component_name
))
);
}};
}
assert_invalid_component!("day", Component::Day(<_>::default()));
assert_invalid_component!("month", Component::Month(<_>::default()));
assert_invalid_component!("ordinal", Component::Ordinal(<_>::default()));
assert_invalid_component!("weekday", Component::Weekday(<_>::default()));
assert_invalid_component!("week number", Component::WeekNumber(<_>::default()));
assert_invalid_component!("year", Component::Year(<_>::default()));
assert_invalid_component!("minute", Component::Minute(<_>::default()));
assert_invalid_component!("period", Component::Period(<_>::default()));
assert_invalid_component!("second", Component::Second(<_>::default()));
assert_invalid_component!("subsecond", Component::Subsecond(<_>::default()));
assert_invalid_component!("offset hour", Component::OffsetHour(<_>::default()));
assert_invalid_component!("offset minute", Component::OffsetMinute(<_>::default()));
assert_invalid_component!("offset second", Component::OffsetSecond(<_>::default()));
assert_invalid_component!(
"week number",
Component::WeekNumber(WeekNumber::default().with_repr(WeekNumberRepr::Iso)),
b"00"
);
assert_invalid_component!(
"hour",
Component::Hour(Hour::default().with_is_12_hour_clock(true)),
b"00"
);
}