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