From 8603a823e4b75e4503d869bf6f6d7624d3c4e0e7 Mon Sep 17 00:00:00 2001 From: Jens Krause <47693+sectore@users.noreply.github.com> Date: Mon, 6 Jan 2025 19:22:02 +0100 Subject: [PATCH] fix(footer): 12-hour format incl. tests (#43) --- demo/local-time.gif | Bin 17153 -> 17857 bytes src/common.rs | 58 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/demo/local-time.gif b/demo/local-time.gif index b1da6d2183ec9ba7482380f95aa3461ec3790bb8..ea5c39fa75a8c9b237ca6628a6a6d61500d216c5 100644 GIT binary patch delta 12681 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 Some("[hour]:[minute]:[second]"), AppTimeFormat::HhMm => Some("[hour]:[minute]"), - AppTimeFormat::Hh12Mm => Some("[hour]:[minute] [period]"), + AppTimeFormat::Hh12Mm => Some("[hour repr:12 padding:none]:[minute] [period]"), AppTimeFormat::Hidden => None, }; @@ -127,3 +127,59 @@ impl AppTime { } } } + +#[cfg(test)] +mod tests { + + use super::*; + use time::{Date, Month, PrimitiveDateTime, Time}; + + #[test] + fn test_format_app_time() { + let dt = PrimitiveDateTime::new( + Date::from_calendar_date(2025, Month::January, 6).unwrap(), + Time::from_hms(18, 6, 10).unwrap(), + ) + .assume_utc(); + // hh:mm:ss + assert_eq!( + AppTime::Utc(dt).format(&AppTimeFormat::HhMmSs), + "18:06:10", + "utc" + ); + assert_eq!( + AppTime::Local(dt).format(&AppTimeFormat::HhMmSs), + "18:06:10", + "local" + ); + // hh:mm + assert_eq!( + AppTime::Utc(dt).format(&AppTimeFormat::HhMm), + "18:06", + "utc" + ); + assert_eq!( + AppTime::Local(dt).format(&AppTimeFormat::HhMm), + "18:06", + "local" + ); + // hh:mm period + assert_eq!( + AppTime::Utc(dt).format(&AppTimeFormat::Hh12Mm), + "6:06 PM", + "utc" + ); + assert_eq!( + AppTime::Local(dt).format(&AppTimeFormat::Hh12Mm), + "6:06 PM", + "local" + ); + // hidden + assert_eq!(AppTime::Utc(dt).format(&AppTimeFormat::Hidden), "", "utc"); + assert_eq!( + AppTime::Local(dt).format(&AppTimeFormat::Hidden), + "", + "local" + ); + } +}