diff --git a/src/display.rs b/src/display.rs index a3754ed9..0bbc407c 100644 --- a/src/display.rs +++ b/src/display.rs @@ -8,7 +8,7 @@ impl Display for Date { // like `2015-11-02` Date::YMD { year, month, day } => write!(f, "{:04}-{:02}-{:02}", year, month, day), // like `2015-W45-01` - Date::Week { year, ww, d } => write!(f, "{:04}-{:02}-{:02}", year, ww, d), + Date::Week { year, ww, d } => write!(f, "{:04}-W{:02}-{:01}", year, ww, d), // like `2015-306` Date::Ordinal { year, ddd } => write!(f, "{:04}-{:03}", year, ddd), } diff --git a/src/parsers/tests.rs b/src/parsers/tests.rs index 4dc2362c..ff64f379 100644 --- a/src/parsers/tests.rs +++ b/src/parsers/tests.rs @@ -116,6 +116,10 @@ fn test_date_ordinal_date() { #[test] fn format_equivalence() { + assert_eq!( + parse_datetime(b"2001-02-03T04:05:06+07:00.001"), + parse_datetime(b"20010203T040506+0700.001") + ); assert_eq!( parse_datetime(b"2001-02-03T04:05:06+07:00"), parse_datetime(b"20010203T040506+0700") @@ -156,6 +160,49 @@ fn test_datetime_error() { } } +#[rustfmt::skip] +#[test] +fn datetime_roundtrip_ymd() { + assert_parser!( + parse_datetime, "2001-02-03T04:05:06.000+07:00", + DateTime{ + date: Date::YMD{year: 2001, month: 2, day: 3}, + time: Time { hour: 4, minute: 5, second: 6, millisecond: 0, tz_offset_hours: 7, tz_offset_minutes: 0 } + } + ); + assert_parser!( + parse_datetime, "2001-02-03T04:05:06.001+07:00", + DateTime{ + date: Date::YMD{year: 2001, month: 2, day: 3}, + time: Time { hour: 4, minute: 5, second: 6, millisecond: 1, tz_offset_hours: 7, tz_offset_minutes: 0 } + } + ); +} + +#[rustfmt::skip] +#[test] +fn datetime_roundtrip_week() { + assert_parser!( + parse_datetime, "2015-W05-6T04:05:06.001+07:00", + DateTime{ + date: Date::Week { year: 2015, ww: 5, d: 6 }, + time: Time { hour: 4, minute: 5, second: 6, millisecond: 1, tz_offset_hours: 7, tz_offset_minutes: 0 } + } + ); +} + +#[rustfmt::skip] +#[test] +fn datetime_roundtrip_ordinal() { + assert_parser!( + parse_datetime, "2001-035T04:05:06.001+07:00", + DateTime{ + date: Date::Ordinal { year: 2001, ddd: 35 }, + time: Time { hour: 4, minute: 5, second: 6, millisecond: 1, tz_offset_hours: 7, tz_offset_minutes: 0 } + } + ); +} + #[test] fn disallows_notallowed() { assert!(parse_time(b"30:90:90").is_err()); @@ -287,13 +334,13 @@ fn test_duration_datetime_error() { #[test] fn test_duration_second_and_millisecond2() { assert_parser!( - parse_duration, "PT30S", + parse_duration, "PT30S", Duration::YMDHMS { year: 0, month: 0, day: 0, hour: 0, minute: 0, second: 30, millisecond: 0 } ); assert_parser!( - parse_duration, "PT30.123S", + parse_duration, "PT30.123S", Duration::YMDHMS { year: 0, month: 0, day: 0, hour: 0, minute: 0, second: 30, millisecond: 123 } ); @@ -339,6 +386,14 @@ fn duration_roundtrip() { parse_duration, "P2021Y11M16DT0.471S", Duration::YMDHMS { year: 2021, month: 11, day: 16, hour: 0, minute: 0, second: 0, millisecond: 471 } ); + assert_parser!( + parse_duration, "P2021Y11M16DT0.042S", + Duration::YMDHMS { year: 2021, month: 11, day: 16, hour: 0, minute: 0, second: 0, millisecond: 42 } + ); + assert_parser!( + parse_duration, "P2021Y11M16DT0.004S", + Duration::YMDHMS { year: 2021, month: 11, day: 16, hour: 0, minute: 0, second: 0, millisecond: 4 } + ); assert_parser!( parse_duration, "P2021Y11M", Duration::YMDHMS { year: 2021, month: 11, day: 0, hour: 0, minute: 0, second: 0, millisecond: 0 } diff --git a/tests/lib.rs b/tests/lib.rs index 1578be70..469fc841 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -38,6 +38,28 @@ fn test_millisecond() { ); i += 1; } + assert_eq!( + Ok(Time { + hour: 16, + minute: 43, + second: 0, + millisecond: 42, + tz_offset_hours: 0, + tz_offset_minutes: 0 + }), + time("16:43:00.042") + ); + assert_eq!( + Ok(Time { + hour: 16, + minute: 43, + second: 0, + millisecond: 10, + tz_offset_hours: 0, + tz_offset_minutes: 0 + }), + time("16:43:00.01") + ); assert_eq!( Ok(Time { hour: 16,