use super::GuardedF64;
use crate::FloatError;
impl TryFrom<f64> for GuardedF64 {
type Error = FloatError;
fn try_from(value: f64) -> Result<Self, Self::Error> {
Self::new(value)
}
}
impl From<GuardedF64> for f64 {
fn from(value: GuardedF64) -> Self {
value.0
}
}
impl std::ops::Deref for GuardedF64 {
type Target = f64;
fn deref(&self) -> &Self::Target {
&self.0
}
}
#[cfg(test)]
mod tests {
#![allow(clippy::float_cmp)]
use super::*;
use crate::f64::tests::{invalid_f64, valid_f64};
use proptest::prelude::*;
proptest! {
#[test]
fn test_from_valid(a in valid_f64()) {
prop_assert_eq!(GuardedF64::new(a), Ok(GuardedF64(a)));
prop_assert_eq!(GuardedF64::new(a).map(f64::from), Ok(a));
prop_assert_eq!(*GuardedF64::new(a).unwrap(), a);
prop_assert_eq!(GuardedF64::try_from(a), Ok(GuardedF64(a)));
}
#[test]
fn test_from_invalid(a in invalid_f64()) {
let float_error = if a.is_nan() {
FloatError::NaN
} else if a.is_infinite() {
FloatError::Infinity
} else {
unreachable!()
};
prop_assert_eq!(GuardedF64::new(a), Err(float_error));
prop_assert_eq!(GuardedF64::try_from(a), Err(float_error));
}
}
}