From edcf19da0dd3d8f42ea6c38e21c31b84a11ad1f0 Mon Sep 17 00:00:00 2001
From: Lars Schumann <LarsSchumann@mail.de>
Date: Mon, 24 Feb 2025 19:34:00 +0100
Subject: [PATCH 1/2] add proper testing for cases where divisions fail

---
 exercises/18_iterators/iterators3.rs | 60 +++++++++++++++++++++++-----
 solutions/18_iterators/iterators3.rs | 58 ++++++++++++++++++++++-----
 2 files changed, 98 insertions(+), 20 deletions(-)

diff --git a/exercises/18_iterators/iterators3.rs b/exercises/18_iterators/iterators3.rs
index 6b1eca1734..05d49cc311 100644
--- a/exercises/18_iterators/iterators3.rs
+++ b/exercises/18_iterators/iterators3.rs
@@ -15,17 +15,17 @@ fn divide(a: i64, b: i64) -> Result<i64, DivisionError> {
 }
 
 // TODO: Add the correct return type and complete the function body.
-// Desired output: `Ok([1, 11, 1426, 3])`
-fn result_with_list() {
-    let numbers = [27, 297, 38502, 81];
-    let division_results = numbers.into_iter().map(|n| divide(n, 27));
+// For numbers = [27, 297, 38502, 81] and divisor = 27,
+// the desired output is: `Ok([1, 11, 1426, 3])`
+fn result_with_list(numbers: Vec<i64>, divisor: i64) {
+    let division_results = numbers.into_iter().map(|n| divide(n, divisor));
 }
 
 // TODO: Add the correct return type and complete the function body.
-// Desired output: `[Ok(1), Ok(11), Ok(1426), Ok(3)]`
-fn list_of_results() {
-    let numbers = [27, 297, 38502, 81];
-    let division_results = numbers.into_iter().map(|n| divide(n, 27));
+// For numbers = [27, 297, 38502, 81] and divisor = 27,
+// the desired output is: `[Ok(1), Ok(11), Ok(1426), Ok(3)]`
+fn list_of_results(numbers: Vec<i64>, divisor: i64) {
+    let division_results = numbers.into_iter().map(|n| divide(n, divisor));
 }
 
 fn main() {
@@ -63,11 +63,51 @@ mod tests {
 
     #[test]
     fn test_result_with_list() {
-        assert_eq!(result_with_list().unwrap(), [1, 11, 1426, 3]);
+        assert_eq!(
+            result_with_list(vec![27, 297, 38502, 81], 27),
+            Ok(vec![1, 11, 1426, 3])
+        );
+        assert_eq!(
+            result_with_list(vec![27, 297, 38502, 28], 27),
+            Err(DivisionError::NotDivisible)
+        );
+        assert_eq!(
+            result_with_list(vec![27, 297, 38502, 28], 0),
+            Err(DivisionError::DivideByZero)
+        );
+        assert_eq!(
+            result_with_list(vec![27, 297, i64::MIN, 28], -1),
+            Err(DivisionError::IntegerOverflow)
+        );
     }
 
     #[test]
     fn test_list_of_results() {
-        assert_eq!(list_of_results(), [Ok(1), Ok(11), Ok(1426), Ok(3)]);
+        assert_eq!(
+            list_of_results(vec![27, 297, 38502, 81], 27),
+            vec![Ok(1), Ok(11), Ok(1426), Ok(3)]
+        );
+        assert_eq!(
+            list_of_results(vec![27, 297, 38502, 28], 27),
+            vec![Ok(1), Ok(11), Ok(1426), Err(DivisionError::NotDivisible)]
+        );
+        assert_eq!(
+            list_of_results(vec![27, 297, 38502, 81], 0),
+            vec![
+                Err(DivisionError::DivideByZero),
+                Err(DivisionError::DivideByZero),
+                Err(DivisionError::DivideByZero),
+                Err(DivisionError::DivideByZero)
+            ]
+        );
+        assert_eq!(
+            list_of_results(vec![27, 297, i64::MIN, 81], -1),
+            vec![
+                Ok(-27),
+                Ok(-297),
+                Err(DivisionError::IntegerOverflow),
+                Ok(-81)
+            ]
+        );
     }
 }
diff --git a/solutions/18_iterators/iterators3.rs b/solutions/18_iterators/iterators3.rs
index 11aa1ec8ce..ede28ef9a4 100644
--- a/solutions/18_iterators/iterators3.rs
+++ b/solutions/18_iterators/iterators3.rs
@@ -24,19 +24,17 @@ fn divide(a: i64, b: i64) -> Result<i64, DivisionError> {
     Ok(a / b)
 }
 
-fn result_with_list() -> Result<Vec<i64>, DivisionError> {
-    //                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-    let numbers = [27, 297, 38502, 81];
-    let division_results = numbers.into_iter().map(|n| divide(n, 27));
+fn result_with_list(numbers: Vec<i64>, divisor: i64) -> Result<Vec<i64>, DivisionError> {
+    //                                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    let division_results = numbers.into_iter().map(|n| divide(n, divisor));
     // Collects to the expected return type. Returns the first error in the
     // division results (if one exists).
     division_results.collect()
 }
 
-fn list_of_results() -> Vec<Result<i64, DivisionError>> {
-    //               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-    let numbers = [27, 297, 38502, 81];
-    let division_results = numbers.into_iter().map(|n| divide(n, 27));
+fn list_of_results(numbers: Vec<i64>, divisor: i64) -> Vec<Result<i64, DivisionError>> {
+    //                                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    let division_results = numbers.into_iter().map(|n| divide(n, divisor));
     // Collects to the expected return type.
     division_results.collect()
 }
@@ -76,11 +74,51 @@ mod tests {
 
     #[test]
     fn test_result_with_list() {
-        assert_eq!(result_with_list().unwrap(), [1, 11, 1426, 3]);
+        assert_eq!(
+            result_with_list(vec![27, 297, 38502, 81], 27),
+            Ok(vec![1, 11, 1426, 3])
+        );
+        assert_eq!(
+            result_with_list(vec![27, 297, 38502, 28], 27),
+            Err(DivisionError::NotDivisible)
+        );
+        assert_eq!(
+            result_with_list(vec![27, 297, 38502, 28], 0),
+            Err(DivisionError::DivideByZero)
+        );
+        assert_eq!(
+            result_with_list(vec![27, 297, i64::MIN, 28], -1),
+            Err(DivisionError::IntegerOverflow)
+        );
     }
 
     #[test]
     fn test_list_of_results() {
-        assert_eq!(list_of_results(), [Ok(1), Ok(11), Ok(1426), Ok(3)]);
+        assert_eq!(
+            list_of_results(vec![27, 297, 38502, 81], 27),
+            vec![Ok(1), Ok(11), Ok(1426), Ok(3)]
+        );
+        assert_eq!(
+            list_of_results(vec![27, 297, 38502, 28], 27),
+            vec![Ok(1), Ok(11), Ok(1426), Err(DivisionError::NotDivisible)]
+        );
+        assert_eq!(
+            list_of_results(vec![27, 297, 38502, 81], 0),
+            vec![
+                Err(DivisionError::DivideByZero),
+                Err(DivisionError::DivideByZero),
+                Err(DivisionError::DivideByZero),
+                Err(DivisionError::DivideByZero)
+            ]
+        );
+        assert_eq!(
+            list_of_results(vec![27, 297, i64::MIN, 81], -1),
+            vec![
+                Ok(-27),
+                Ok(-297),
+                Err(DivisionError::IntegerOverflow),
+                Ok(-81)
+            ]
+        );
     }
 }

From b99e942ef294eaff754269f482938890f2ae74ea Mon Sep 17 00:00:00 2001
From: Lars Schumann <larsschumann@mail.de>
Date: Mon, 24 Feb 2025 20:01:32 +0100
Subject: [PATCH 2/2] Update iterators3.rs

---
 exercises/18_iterators/iterators3.rs | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/exercises/18_iterators/iterators3.rs b/exercises/18_iterators/iterators3.rs
index 05d49cc311..db121a2f27 100644
--- a/exercises/18_iterators/iterators3.rs
+++ b/exercises/18_iterators/iterators3.rs
@@ -72,11 +72,11 @@ mod tests {
             Err(DivisionError::NotDivisible)
         );
         assert_eq!(
-            result_with_list(vec![27, 297, 38502, 28], 0),
+            result_with_list(vec![27, 297, 38502, 81], 0),
             Err(DivisionError::DivideByZero)
         );
         assert_eq!(
-            result_with_list(vec![27, 297, i64::MIN, 28], -1),
+            result_with_list(vec![27, 297, i64::MIN, 81], -1),
             Err(DivisionError::IntegerOverflow)
         );
     }