diff --git a/src/naive/date.rs b/src/naive/date.rs index 3cbdab9852..48aee9795d 100644 --- a/src/naive/date.rs +++ b/src/naive/date.rs @@ -65,7 +65,7 @@ impl Weeklike for NaiveWeek { fn first_day(&self) -> Self::Day { 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 }; + let days = if start > end { 7 - start + end } else { end - start }; self.date - Duration::days(days.into()) } } @@ -2440,27 +2440,23 @@ mod tests { } #[test] - fn test_naiveweek_less_than_weekday() { + fn test_naiveweek_first_and_last_day() { 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)); + let asserts = vec![ + (Weekday::Mon, "2022-05-16", "2022-05-22"), + (Weekday::Tue, "2022-05-17", "2022-05-23"), + (Weekday::Wed, "2022-05-18", "2022-05-24"), + (Weekday::Thu, "2022-05-12", "2022-05-18"), + (Weekday::Fri, "2022-05-13", "2022-05-19"), + (Weekday::Sat, "2022-05-14", "2022-05-20"), + (Weekday::Sun, "2022-05-15", "2022-05-21"), + ]; + for (start, first_day, last_day) in asserts { + let week = date.week(start); + let days = week.days(); + assert_eq!(Ok(week.first_day()), NaiveDate::parse_from_str(first_day, "%Y-%m-%d")); + assert_eq!(Ok(week.last_day()), NaiveDate::parse_from_str(last_day, "%Y-%m-%d")); + assert!(days.contains(&date)); + } } }