From e9b8f7a43e5e124d4d695bd47deea94f39764545 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Tue, 31 Mar 2026 09:17:07 +0200 Subject: [PATCH] Deduplicate test helpers using Display and expect_in_range Replace hand-rolled format_offset_colon / format_for_assert helpers with the new Display impls. Replace local expect_in_range_datetime test helpers with ParsedDateTime::expect_in_range(). --- src/items/builder.rs | 21 +++++++------------ src/items/mod.rs | 49 ++++++++++---------------------------------- tests/common/mod.rs | 30 +++------------------------ 3 files changed, 21 insertions(+), 79 deletions(-) diff --git a/src/items/builder.rs b/src/items/builder.rs index 107d317..3465178 100644 --- a/src/items/builder.rs +++ b/src/items/builder.rs @@ -538,7 +538,7 @@ impl TryFrom> for DateTimeBuilder { #[cfg(test)] mod tests { use super::*; - use jiff::{civil::DateTime, tz::TimeZone, Zoned}; + use jiff::{civil::DateTime, tz::TimeZone}; fn timestamp() -> epoch::Timestamp { let mut input = "@1234567890"; @@ -630,13 +630,6 @@ mod tests { } } - fn expect_in_range_datetime(parsed: ParsedDateTime) -> Zoned { - match parsed { - ParsedDateTime::InRange(z) => z, - ParsedDateTime::Extended(dt) => panic!("expected in-range datetime, got {dt:?}"), - } - } - #[test] fn duplicate_items_error() { let test_cases = vec![ @@ -919,7 +912,7 @@ mod tests { Item::Relative(relative_day()), ]) .unwrap(); - let z = expect_in_range_datetime(builder.set_base(base).build().unwrap()); + let z = builder.set_base(base).build().unwrap().expect_in_range(); assert_eq!(z.strftime("%Y-%m-%d").to_string(), "9999-02-01"); } @@ -953,7 +946,7 @@ mod tests { Item::Relative(relative_month()), ]) .unwrap(); - let z = expect_in_range_datetime(builder.set_base(base).build().unwrap()); + let z = builder.set_base(base).build().unwrap().expect_in_range(); assert_eq!(z.strftime("%Y-%m-%d").to_string(), "2021-03-03"); } @@ -995,7 +988,7 @@ mod tests { .unwrap(); let mut builder = DateTimeBuilder::new(); builder.base = Some(base); - let z = expect_in_range_datetime(builder.build_extended().unwrap()); + let z = builder.build_extended().unwrap().expect_in_range(); assert_eq!( z.strftime("%Y-%m-%d %H:%M:%S%.9f").to_string(), "2000-01-01 10:11:12.123456789" @@ -1019,12 +1012,12 @@ mod tests { } #[test] - #[should_panic(expected = "expected in-range datetime")] - fn expect_in_range_datetime_panics_for_extended_input() { + #[should_panic(expected = "ParsedDateTime is not representable as jiff::Zoned")] + fn expect_in_range_panics_for_extended_input() { let parsed = DateTimeBuilder::try_from(vec![Item::Date(date_large("10000-01-01"))]) .unwrap() .build() .unwrap(); - let _ = expect_in_range_datetime(parsed); + let _ = parsed.expect_in_range(); } } diff --git a/src/items/mod.rs b/src/items/mod.rs index 1f4c446..a1529bb 100644 --- a/src/items/mod.rs +++ b/src/items/mod.rs @@ -300,33 +300,13 @@ mod tests { .to_string() } - fn format_offset_colon(seconds: i32) -> String { - let sign = if seconds < 0 { '-' } else { '+' }; - let abs = seconds.unsigned_abs(); - let hours = abs / 3600; - let minutes = (abs % 3600) / 60; - format!("{sign}{hours:02}:{minutes:02}") - } - fn assert_extended_datetime(input: &str, base: Zoned, expected: &str) { - match parse_at_date(base, input).unwrap() { - ParsedDateTime::Extended(dt) => { - let actual = format!( - "{:04}-{:02}-{:02} {:02}:{:02}:{:02}{}", - dt.year, - dt.month, - dt.day, - dt.hour, - dt.minute, - dt.second, - format_offset_colon(dt.offset_seconds) - ); - assert_eq!(actual, expected, "{input}"); - } - ParsedDateTime::InRange(z) => { - panic!("expected extended datetime, got in-range: {z}"); - } - } + let parsed = parse_at_date(base, input).unwrap(); + assert!( + matches!(parsed, ParsedDateTime::Extended(_)), + "expected extended datetime, got in-range for: {input}" + ); + assert_eq!(parsed.to_string(), expected, "{input}"); } fn expect_extended_datetime(parsed: ParsedDateTime) -> crate::ExtendedDateTime { @@ -336,13 +316,6 @@ mod tests { } } - fn expect_in_range_datetime(parsed: ParsedDateTime) -> Zoned { - match parsed { - ParsedDateTime::InRange(z) => z, - ParsedDateTime::Extended(dt) => panic!("expected in-range datetime, got {dt:?}"), - } - } - #[test] fn date_and_time() { assert_eq!( @@ -600,7 +573,7 @@ mod tests { .to_zoned(TimeZone::UTC) .unwrap(); let result = parse_at_date(base, "10000-01-01 -1000 years").unwrap(); - let z = expect_in_range_datetime(result); + let z = result.expect_in_range(); assert_eq!( z.strftime("%Y-%m-%d %H:%M:%S%:z").to_string(), "9000-01-01 00:00:00+00:00" @@ -615,7 +588,7 @@ mod tests { .to_zoned(TimeZone::UTC) .unwrap(); let result = parse_at_date(base, "TZ=\"Europe/Paris\" 10000-01-01 -1000 years").unwrap(); - let z = expect_in_range_datetime(result); + let z = result.expect_in_range(); assert_eq!( z.strftime("%Y-%m-%d %H:%M:%S%:z").to_string(), "9000-01-01 00:00:00+01:00" @@ -659,15 +632,15 @@ mod tests { } #[test] - #[should_panic(expected = "expected in-range datetime")] - fn expect_in_range_datetime_panics_for_extended_input() { + #[should_panic(expected = "ParsedDateTime is not representable as jiff::Zoned")] + fn expect_in_range_panics_for_extended_input() { let base = "2000-01-01 00:00:00" .parse::() .unwrap() .to_zoned(TimeZone::UTC) .unwrap(); let parsed = parse_at_date(base, "10000-01-01").unwrap(); - let _ = expect_in_range_datetime(parsed); + let _ = parsed.expect_in_range(); } #[test] diff --git a/tests/common/mod.rs b/tests/common/mod.rs index 1348e68..5980fd3 100644 --- a/tests/common/mod.rs +++ b/tests/common/mod.rs @@ -4,31 +4,7 @@ use std::env; use jiff::Zoned; -use parse_datetime::{parse_datetime, parse_datetime_at_date, ParsedDateTime}; - -fn format_offset_colon(seconds: i32) -> String { - let sign = if seconds < 0 { '-' } else { '+' }; - let abs = seconds.unsigned_abs(); - let h = abs / 3600; - let m = (abs % 3600) / 60; - format!("{sign}{h:02}:{m:02}") -} - -fn format_for_assert(parsed: ParsedDateTime) -> String { - match parsed { - ParsedDateTime::InRange(z) => z.strftime("%Y-%m-%d %H:%M:%S%:z").to_string(), - ParsedDateTime::Extended(dt) => format!( - "{:04}-{:02}-{:02} {:02}:{:02}:{:02}{}", - dt.year, - dt.month, - dt.day, - dt.hour, - dt.minute, - dt.second, - format_offset_colon(dt.offset_seconds) - ), - } -} +use parse_datetime::{parse_datetime, parse_datetime_at_date}; pub fn check_absolute(input: &str, expected: &str) { env::set_var("TZ", "UTC0"); @@ -38,7 +14,7 @@ pub fn check_absolute(input: &str, expected: &str) { Err(e) => panic!("Failed to parse date from value '{input}': {e}"), }; - assert_eq!(format_for_assert(parsed), expected, "Input value: {input}"); + assert_eq!(parsed.to_string(), expected, "Input value: {input}"); } pub fn check_relative(now: Zoned, input: &str, expected: &str) { @@ -49,5 +25,5 @@ pub fn check_relative(now: Zoned, input: &str, expected: &str) { Err(e) => panic!("Failed to parse date from value '{input}': {e}"), }; - assert_eq!(format_for_assert(parsed), expected, "Input value: {input}"); + assert_eq!(parsed.to_string(), expected, "Input value: {input}"); }