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