diff --git a/exercises/practice/armstrong-numbers/.meta/example.rs b/exercises/practice/armstrong-numbers/.meta/example.rs index baa37f282..a14413c63 100644 --- a/exercises/practice/armstrong-numbers/.meta/example.rs +++ b/exercises/practice/armstrong-numbers/.meta/example.rs @@ -3,6 +3,6 @@ pub fn is_armstrong_number(num: u32) -> bool { let l = s.len(); s.chars() .map(|c| c.to_digit(10).unwrap().pow(l as u32)) - .sum::() - == num + .try_fold(0u32, u32::checked_add) + == Some(num) } diff --git a/exercises/practice/armstrong-numbers/tests/armstrong-numbers.rs b/exercises/practice/armstrong-numbers/tests/armstrong-numbers.rs index 2163451f1..8e5713b05 100644 --- a/exercises/practice/armstrong-numbers/tests/armstrong-numbers.rs +++ b/exercises/practice/armstrong-numbers/tests/armstrong-numbers.rs @@ -52,3 +52,30 @@ fn test_seven_digit_armstrong_number() { fn test_seven_digit_non_armstrong_number() { assert!(!is_armstrong_number(9_926_316)) } + +#[test] +#[ignore] +fn test_nine_digit_armstrong_number() { + assert!(is_armstrong_number(912_985_153)); +} + +#[test] +#[ignore] +fn test_nine_digit_non_armstrong_number() { + assert!(!is_armstrong_number(999_999_999)); +} + +#[test] +#[ignore] +fn test_ten_digit_non_armstrong_number() { + assert!(!is_armstrong_number(3_999_999_999)); +} + +// The following number has an Armstrong sum equal to 2^32 plus itself, +// and therefore will be detected as an Armstrong number if you are +// incorrectly using wrapping arithmetic. +#[test] +#[ignore] +fn test_properly_handles_overflow() { + assert!(!is_armstrong_number(4_106_098_957)); +}