diff --git a/src/args/fraction.rs b/src/args/fraction.rs index 8a1639fc..e7bef60a 100644 --- a/src/args/fraction.rs +++ b/src/args/fraction.rs @@ -18,12 +18,18 @@ pub enum ConversionError { /// Provided value is less than 0. #[display("less than 0")] LowerBound, + /// Provided value is `NaN`. + #[display("not a number")] + NotANumber, } impl Fraction { /// Create a [`Fraction`]. pub fn new(value: f32) -> Result { use ConversionError::*; + if value.is_nan() { + return Err(NotANumber); + } if value >= 1.0 { return Err(UpperBound); } diff --git a/tests/args_fraction.rs b/tests/args_fraction.rs index d436b097..6413218f 100644 --- a/tests/args_fraction.rs +++ b/tests/args_fraction.rs @@ -48,6 +48,18 @@ fn equal_to_one() { ); } +#[test] +fn not_a_number() { + let actual_error = "NaN".parse::().expect_err("cause nan error"); + let actual_message = actual_error.to_string(); + let expected_error = Conversion(NotANumber); + let expected_message = "not a number".to_string(); + assert_eq!( + (actual_error, actual_message), + (expected_error, expected_message), + ); +} + #[test] fn invalid_float_literal() { let actual = "a"