add proper testing for cases where divisions fail

This commit is contained in:
Lars Schumann 2025-02-24 19:34:00 +01:00
parent 374c3874af
commit edcf19da0d
2 changed files with 98 additions and 20 deletions

View File

@ -15,17 +15,17 @@ fn divide(a: i64, b: i64) -> Result<i64, DivisionError> {
} }
// TODO: Add the correct return type and complete the function body. // TODO: Add the correct return type and complete the function body.
// Desired output: `Ok([1, 11, 1426, 3])` // For numbers = [27, 297, 38502, 81] and divisor = 27,
fn result_with_list() { // the desired output is: `Ok([1, 11, 1426, 3])`
let numbers = [27, 297, 38502, 81]; fn result_with_list(numbers: Vec<i64>, divisor: i64) {
let division_results = numbers.into_iter().map(|n| divide(n, 27)); let division_results = numbers.into_iter().map(|n| divide(n, divisor));
} }
// TODO: Add the correct return type and complete the function body. // TODO: Add the correct return type and complete the function body.
// Desired output: `[Ok(1), Ok(11), Ok(1426), Ok(3)]` // For numbers = [27, 297, 38502, 81] and divisor = 27,
fn list_of_results() { // the desired output is: `[Ok(1), Ok(11), Ok(1426), Ok(3)]`
let numbers = [27, 297, 38502, 81]; fn list_of_results(numbers: Vec<i64>, divisor: i64) {
let division_results = numbers.into_iter().map(|n| divide(n, 27)); let division_results = numbers.into_iter().map(|n| divide(n, divisor));
} }
fn main() { fn main() {
@ -63,11 +63,51 @@ mod tests {
#[test] #[test]
fn test_result_with_list() { 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] #[test]
fn test_list_of_results() { 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)
]
);
} }
} }

View File

@ -24,19 +24,17 @@ fn divide(a: i64, b: i64) -> Result<i64, DivisionError> {
Ok(a / b) Ok(a / b)
} }
fn result_with_list() -> Result<Vec<i64>, DivisionError> { fn result_with_list(numbers: Vec<i64>, divisor: i64) -> Result<Vec<i64>, DivisionError> {
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
let numbers = [27, 297, 38502, 81]; let division_results = numbers.into_iter().map(|n| divide(n, divisor));
let division_results = numbers.into_iter().map(|n| divide(n, 27));
// Collects to the expected return type. Returns the first error in the // Collects to the expected return type. Returns the first error in the
// division results (if one exists). // division results (if one exists).
division_results.collect() division_results.collect()
} }
fn list_of_results() -> Vec<Result<i64, DivisionError>> { fn list_of_results(numbers: Vec<i64>, divisor: i64) -> Vec<Result<i64, DivisionError>> {
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
let numbers = [27, 297, 38502, 81]; let division_results = numbers.into_iter().map(|n| divide(n, divisor));
let division_results = numbers.into_iter().map(|n| divide(n, 27));
// Collects to the expected return type. // Collects to the expected return type.
division_results.collect() division_results.collect()
} }
@ -76,11 +74,51 @@ mod tests {
#[test] #[test]
fn test_result_with_list() { 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] #[test]
fn test_list_of_results() { 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)
]
);
} }
} }