diff --git a/exercises/18_iterators/iterators3.rs b/exercises/18_iterators/iterators3.rs index 65a0573..6b1eca1 100644 --- a/exercises/18_iterators/iterators3.rs +++ b/exercises/18_iterators/iterators3.rs @@ -1,12 +1,16 @@ #[derive(Debug, PartialEq, Eq)] enum DivisionError { + // Example: 42 / 0 DivideByZero, + // Only case for `i64`: `i64::MIN / -1` because the result is `i64::MAX + 1` + IntegerOverflow, + // Example: 5 / 2 = 2.5 NotDivisible, } // TODO: Calculate `a` divided by `b` if `a` is evenly divisible by `b`. // Otherwise, return a suitable error. -fn divide(a: i32, b: i32) -> Result { +fn divide(a: i64, b: i64) -> Result { todo!(); } @@ -42,6 +46,11 @@ mod tests { assert_eq!(divide(81, 0), Err(DivisionError::DivideByZero)); } + #[test] + fn test_integer_overflow() { + assert_eq!(divide(i64::MIN, -1), Err(DivisionError::IntegerOverflow)); + } + #[test] fn test_not_divisible() { assert_eq!(divide(81, 6), Err(DivisionError::NotDivisible)); diff --git a/solutions/18_iterators/iterators3.rs b/solutions/18_iterators/iterators3.rs index d66d1ef..11aa1ec 100644 --- a/solutions/18_iterators/iterators3.rs +++ b/solutions/18_iterators/iterators3.rs @@ -1,6 +1,10 @@ #[derive(Debug, PartialEq, Eq)] enum DivisionError { + // Example: 42 / 0 DivideByZero, + // Only case for `i64`: `i64::MIN / -1` because the result is `i64::MAX + 1` + IntegerOverflow, + // Example: 5 / 2 = 2.5 NotDivisible, } @@ -9,6 +13,10 @@ fn divide(a: i64, b: i64) -> Result { return Err(DivisionError::DivideByZero); } + if a == i64::MIN && b == -1 { + return Err(DivisionError::IntegerOverflow); + } + if a % b != 0 { return Err(DivisionError::NotDivisible); } @@ -51,6 +59,11 @@ mod tests { assert_eq!(divide(81, 0), Err(DivisionError::DivideByZero)); } + #[test] + fn test_integer_overflow() { + assert_eq!(divide(i64::MIN, -1), Err(DivisionError::IntegerOverflow)); + } + #[test] fn test_not_divisible() { assert_eq!(divide(81, 6), Err(DivisionError::NotDivisible));