From b76c1179794d3b1e6d0ade20676a0f68e319e72e Mon Sep 17 00:00:00 2001 From: Nate Butler Date: Thu, 2 Nov 2023 10:37:33 -0400 Subject: [PATCH] Update naive_format_distance and tests --- crates/ui2/src/utils/format_distance.rs | 113 +++++++++++++----------- 1 file changed, 60 insertions(+), 53 deletions(-) diff --git a/crates/ui2/src/utils/format_distance.rs b/crates/ui2/src/utils/format_distance.rs index 6835e530d225fcd47c0c59016224c4763f34df4e..8a33619910285fe011d46fd2436c8a8d231e7d20 100644 --- a/crates/ui2/src/utils/format_distance.rs +++ b/crates/ui2/src/utils/format_distance.rs @@ -2,7 +2,7 @@ use chrono::NaiveDateTime; fn distance_in_seconds(date: NaiveDateTime, base_date: NaiveDateTime) -> i64 { let duration = date.signed_duration_since(base_date); - duration.num_seconds() + -duration.num_seconds() } fn distance_string(distance: i64, include_seconds: bool, add_suffix: bool) -> String { @@ -46,16 +46,25 @@ fn distance_string(distance: i64, include_seconds: bool, add_suffix: bool) -> St "about 1 month".to_string() } else if d < 7776000 { "about 2 months".to_string() - } else if d < 31536000 { + } else if d < 31540000 { format!("{} months", months) - } else if d < 39408000 { + } else if d < 39425000 { "about 1 year".to_string() - } else if d < 47318400 { + } else if d < 55195000 { "over 1 year".to_string() - } else if d < 63072000 { + } else if d < 63080000 { "almost 2 years".to_string() } else { - format!("{} years", years) + let years = d / 31536000; + let remaining_months = (d % 31536000) / 2592000; + + if remaining_months < 3 { + format!("about {} years", years) + } else if remaining_months < 9 { + format!("over {} years", years) + } else { + format!("almost {} years", years + 1) + } }; if add_suffix { @@ -91,53 +100,42 @@ mod tests { use super::*; use chrono::NaiveDateTime; - // #[test] - // fn test_naive_format_distance() { - // let date = NaiveDateTime::from_timestamp_opt(0, 0); - // let base_date = NaiveDateTime::from_timestamp_opt(9400, 0); - - // assert_eq!( - // "about 2 hours ago", - // naive_format_distance( - // date.expect("invalid datetime"), - // base_date.expect("invalid datetime"), - // false, - // true - // ) - // ); - // } - - // #[test] - // fn test_naive_format_distance_with_seconds() { - // let date = NaiveDateTime::from_timestamp_opt(0, 0); - // let base_date = NaiveDateTime::from_timestamp_opt(10, 0); - - // assert_eq!( - // "less than 30 seconds ago", - // naive_format_distance( - // date.expect("invalid datetime"), - // base_date.expect("invalid datetime"), - // true, - // true - // ) - // ); - // } - - // #[test] - // fn test_naive_format_distance_with_future_date() { - // let date = NaiveDateTime::from_timestamp_opt(3400, 0); - // let base_date = NaiveDateTime::from_timestamp_opt(00, 0); - - // assert_eq!( - // "about 56 from now", - // naive_format_distance( - // date.expect("invalid datetime"), - // base_date.expect("invalid datetime"), - // false, - // true - // ) - // ); - // } + #[test] + fn test_naive_format_distance() { + let date = + NaiveDateTime::from_timestamp_opt(9600, 0).expect("Invalid NaiveDateTime for date"); + let base_date = + NaiveDateTime::from_timestamp_opt(0, 0).expect("Invalid NaiveDateTime for base_date"); + + assert_eq!( + "about 2 hours", + naive_format_distance(date, base_date, false, false) + ); + } + + #[test] + fn test_naive_format_distance_with_suffix() { + let date = + NaiveDateTime::from_timestamp_opt(9600, 0).expect("Invalid NaiveDateTime for date"); + let base_date = + NaiveDateTime::from_timestamp_opt(0, 0).expect("Invalid NaiveDateTime for base_date"); + + assert_eq!( + "about 2 hours from now", + naive_format_distance(date, base_date, false, true) + ); + } + + #[test] + fn test_naive_format_distance_from_now() { + let date = NaiveDateTime::parse_from_str("1969-07-20T00:00:00Z", "%Y-%m-%dT%H:%M:%SZ") + .expect("Invalid NaiveDateTime for date"); + + assert_eq!( + "over 54 years ago", + naive_format_distance_from_now(date, false, true) + ); + } #[test] fn test_naive_format_distance_string() { @@ -152,6 +150,15 @@ mod tests { assert_eq!(distance_string(18002, false, false), "about 5 hours"); assert_eq!(distance_string(86470, false, false), "1 day"); assert_eq!(distance_string(345880, false, false), "4 days"); + assert_eq!(distance_string(2764800, false, false), "about 1 month"); + assert_eq!(distance_string(5184000, false, false), "about 2 months"); + assert_eq!(distance_string(10368000, false, false), "4 months"); + assert_eq!(distance_string(34694000, false, false), "about 1 year"); + assert_eq!(distance_string(47310000, false, false), "over 1 year"); + assert_eq!(distance_string(61503000, false, false), "almost 2 years"); + assert_eq!(distance_string(160854000, false, false), "about 5 years"); + assert_eq!(distance_string(236550000, false, false), "over 7 years"); + assert_eq!(distance_string(249166000, false, false), "almost 8 years"); } #[test]