use crate::FloatError;
use super::UnguardedF32;
impl TryFrom<UnguardedF32> for f32 {
type Error = FloatError;
fn try_from(value: UnguardedF32) -> Result<Self, Self::Error> {
value.check().map(Self::from)
}
}
impl From<f32> for UnguardedF32 {
fn from(value: f32) -> Self {
Self::new(value)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::GuardedF32;
use crate::f32::tests::{invalid_f32, valid_f32};
use proptest::prelude::*;
proptest! {
#[test]
fn test_from_valid(a in valid_f32()) {
let checked_a = UnguardedF32::new(a);
prop_assert_eq!(checked_a.check(), GuardedF32::new(a));
prop_assert_eq!(f32::try_from(checked_a), Ok(a));
}
#[test]
fn test_from_invalid(a in invalid_f32()) {
let checked_a = UnguardedF32::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!(f32::try_from(checked_a), Err(float_error));
}
}
}