From fac88739443b99d52c8b492e44c59dc3286b2923 Mon Sep 17 00:00:00 2001 From: "Guillaume W. Bres" Date: Fri, 2 Dec 2022 20:17:03 +0100 Subject: [PATCH] weekday: wrapping arithmetics Signed-off-by: Guillaume W. Bres --- src/weekday.rs | 12 +++++++++--- tests/weekday.rs | 23 ++++++++++++++++++----- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/weekday.rs b/src/weekday.rs index f7dbfc45..82fb7124 100644 --- a/src/weekday.rs +++ b/src/weekday.rs @@ -40,12 +40,12 @@ impl Default for Weekday { impl Weekday { /// Max: last weekday <=> `Sunday` - pub const MAX: Self = Self::Sunday; + pub const MAX: u8 = 7; } impl From for Weekday { fn from(u: u8) -> Self { - match u.rem_euclid(Self::MAX.into()) { + match u.rem_euclid(Self::MAX) { 0 => Self::Monday, 1 => Self::Tuesday, 2 => Self::Wednesday, @@ -57,6 +57,12 @@ impl From for Weekday { } } +impl From for Weekday { + fn from(i: i8) -> Self { + Self::from((i.rem_euclid(Self::MAX as i8) +Self::MAX as i8) as u8) + } +} + impl From for u8 { fn from(week: Weekday) -> Self { match week { @@ -112,7 +118,7 @@ impl Add for Weekday { impl Sub for Weekday { type Output = Self; fn sub(self, rhs: u8) -> Self { - Self::from(self as u8 - rhs) + Self::from(self as i8 - rhs as i8) } } diff --git a/tests/weekday.rs b/tests/weekday.rs index 432c3399..6a62f819 100644 --- a/tests/weekday.rs +++ b/tests/weekday.rs @@ -11,11 +11,24 @@ use std::f64::EPSILON; #[test] fn test_basic_ops() { assert_eq!(Weekday::default(), Weekday::Monday); - let weekday = Weekday::default(); - for i in 1..24 { - // test (+) wrapping - let add = weekday + i; + + let monday = Weekday::default(); + for i in 0..24 { // wrapping + let add = monday +i; let expected: Weekday = i.rem_euclid(Weekday::MAX.into()).into(); - assert_eq!(add, expected); + assert_eq!(add, expected, "test failed, expecting {:?} got {:?} for {:02} conversion", expected, add, i); } + + assert_eq!(monday-1, Weekday::Sunday); + assert_eq!(monday-2, Weekday::Saturday); + assert_eq!(monday-3, Weekday::Friday); + assert_eq!(monday-4, Weekday::Thursday); + assert_eq!(monday-5, Weekday::Wednesday); + assert_eq!(monday-6, Weekday::Tuesday); + assert_eq!(monday-7, monday); + assert_eq!(monday-8, Weekday::Sunday); + assert_eq!(monday-9, Weekday::Saturday); + assert_eq!(monday-13, Weekday::Tuesday); + assert_eq!(monday-14, monday); + assert_eq!(monday-15, Weekday::Sunday); }