From 785dd1cc2a98df24e38f4bafe72ad097eb9c956d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Estrella?= <2049686+sestrella@users.noreply.github.com> Date: Tue, 17 May 2022 00:04:29 -0500 Subject: [PATCH] Fix first_day implementation --- src/date.rs | 15 +++++++++------ src/naive/date.rs | 48 ++++++++++++++++++++++++++--------------------- src/traits.rs | 12 ++++++------ 3 files changed, 42 insertions(+), 33 deletions(-) diff --git a/src/date.rs b/src/date.rs index 38b751dc65..0ef2def82f 100644 --- a/src/date.rs +++ b/src/date.rs @@ -525,10 +525,10 @@ where #[cfg(test)] mod tests { - use crate::{Datelike, TimeZone, Utc, Weekday, Weeklike}; + use crate::{Local, Weekday, Weeklike}; #[test] - fn test_week_first_day() { + fn test_week() { let weekdays = [ Weekday::Mon, Weekday::Tue, @@ -538,10 +538,13 @@ mod tests { Weekday::Sat, Weekday::Sun, ]; - let date = Utc.ymd(2022, 4, 18); - assert_eq!(date.weekday(), Weekday::Mon); - for weekday in weekdays { - assert!(date.week(weekday).first_day() <= date); + let date = Local::today(); + for start in weekdays { + let week = date.week(start); + let days = week.days(); + assert!(week.first_day() <= date); + assert!(week.last_day() >= date); + assert!(days.contains(&date)); } } } diff --git a/src/naive/date.rs b/src/naive/date.rs index cba55e3ab5..3cbdab9852 100644 --- a/src/naive/date.rs +++ b/src/naive/date.rs @@ -19,8 +19,7 @@ use crate::format::{parse, ParseError, ParseResult, Parsed, StrftimeItems}; use crate::format::{Item, Numeric, Pad}; use crate::naive::{IsoWeek, NaiveDateTime, NaiveTime}; use crate::oldtime::Duration as OldDuration; -use crate::traits::Weeklike; -use crate::{Datelike, Duration, Weekday}; +use crate::{Datelike, Duration, Weekday, Weeklike}; use super::internals::{self, DateImpl, Mdf, Of, YearFlags}; use super::isoweek; @@ -64,10 +63,10 @@ impl Weeklike for NaiveWeek { #[inline] fn first_day(&self) -> Self::Day { - let start = self.date.weekday().num_days_from_monday(); - let end = self.start.num_days_from_monday(); - let days = if start > end { start - end } else { end - start }; - self.date - Duration::days(7 - days as i64) + let start = self.start.num_days_from_monday(); + let end = self.date.weekday().num_days_from_monday(); + let days = if start > end { 7 - end } else { end - start }; + self.date - Duration::days(days.into()) } } @@ -2441,20 +2440,27 @@ mod tests { } #[test] - fn test_naiveweek_first_day() { - let weekdays = [ - Weekday::Mon, - Weekday::Tue, - Weekday::Wed, - Weekday::Thu, - Weekday::Fri, - Weekday::Sat, - Weekday::Sun, - ]; - let date = NaiveDate::from_ymd(2022, 4, 18); - assert_eq!(date.weekday(), Weekday::Mon); - for start in weekdays { - assert!(date.week(start).first_day() <= date); - } + fn test_naiveweek_less_than_weekday() { + let date = NaiveDate::from_ymd(2022, 5, 18); + let week = date.week(Weekday::Mon); + assert_eq!(week.first_day(), NaiveDate::from_ymd(2022, 5, 16)); + assert_eq!(week.last_day(), NaiveDate::from_ymd(2022, 5, 22)); + } + + #[test] + fn test_naiveweek_equal_to_weekday() { + let date = NaiveDate::from_ymd(2022, 5, 18); + let week = date.week(Weekday::Wed); + assert_eq!(week.first_day(), date); + assert_eq!(week.last_day(), NaiveDate::from_ymd(2022, 5, 24)); + } + + /// TODO: Fix this test + #[test] + fn test_naiveweek_greater_than_weekday() { + let date = NaiveDate::from_ymd(2022, 5, 18); + let week = date.week(Weekday::Fri); + assert_eq!(week.first_day(), NaiveDate::from_ymd(2022, 5, 13)); + assert_eq!(week.last_day(), NaiveDate::from_ymd(2022, 5, 19)); } } diff --git a/src/traits.rs b/src/traits.rs index c64fecad92..c8b2520ba2 100644 --- a/src/traits.rs +++ b/src/traits.rs @@ -313,20 +313,20 @@ mod tests { #[test] fn test_weeklike_last_day() { - let first_day = NaiveDate::from_ymd(2022, 4, 18); - let week = FakeWeek { date: first_day }; + let date = NaiveDate::from_ymd(2022, 4, 18); + let week = FakeWeek { date }; let last_day = week.last_day(); - assert_eq!(first_day.weekday(), Weekday::Mon); + assert_eq!(date.weekday(), Weekday::Mon); assert_eq!(last_day.weekday(), Weekday::Sun); assert_eq!(last_day, NaiveDate::from_ymd(2022, 4, 24)); } #[test] fn test_weeklike_days() { - let first_day = NaiveDate::from_ymd(2022, 4, 18); - let week = FakeWeek { date: first_day }; + let date = NaiveDate::from_ymd(2022, 4, 18); + let week = FakeWeek { date }; let days = week.days(); - assert_eq!(days.start(), &first_day); + assert_eq!(days.start(), &week.first_day()); assert_eq!(days.end(), &week.last_day()); } }