shoulda_core 0.2.1

derive macro for test assertions
Documentation
use crate::epsilon_provider::EpsilonProvider;

pub trait ShouldaEqual {
    fn should_eq<Epsilon: EpsilonProvider>(&self, other: &Self) -> bool;
}

macro_rules! eq_assertable_impl {
    ($x:ty) => {
        impl ShouldaEqual for $x {
            fn should_eq<Epsilon: EpsilonProvider>(&self, other: &Self) -> bool {
                self.eq(other)
            }
        }
    };
}

macro_rules! float_assertable_impl {
    ($x:ty) => {
        impl ShouldaEqual for $x {
            fn should_eq<Epsilon: EpsilonProvider>(&self, other: &Self) -> bool {
                (self - other).abs() < (Epsilon::diff() as $x)
            }
        }
    };
}

eq_assertable_impl!(String);
eq_assertable_impl!(&str);
eq_assertable_impl!(str);
eq_assertable_impl!(std::ffi::CString);
eq_assertable_impl!(std::ffi::CStr);
eq_assertable_impl!(std::ffi::OsString);
eq_assertable_impl!(std::ffi::OsStr);
eq_assertable_impl!(std::fs::FileType);
eq_assertable_impl!(std::fs::Permissions);
eq_assertable_impl!(std::net::Ipv4Addr);
eq_assertable_impl!(std::net::Ipv6Addr);
eq_assertable_impl!(std::net::SocketAddrV4);
eq_assertable_impl!(std::net::SocketAddrV6);
eq_assertable_impl!(std::path::Path);
eq_assertable_impl!(std::path::PathBuf);
eq_assertable_impl!(std::thread::ThreadId);
eq_assertable_impl!(std::time::Duration);
eq_assertable_impl!(std::time::Instant);
eq_assertable_impl!(std::time::SystemTime);

eq_assertable_impl!(bool);
eq_assertable_impl!(u8);
eq_assertable_impl!(i8);
eq_assertable_impl!(u16);
eq_assertable_impl!(i16);
eq_assertable_impl!(u32);
eq_assertable_impl!(i32);
eq_assertable_impl!(u64);
eq_assertable_impl!(i64);
eq_assertable_impl!(u128);
eq_assertable_impl!(i128);
eq_assertable_impl!(usize);
eq_assertable_impl!(isize);
eq_assertable_impl!(char);

eq_assertable_impl!(std::num::NonZeroU8);
eq_assertable_impl!(std::num::NonZeroI8);
eq_assertable_impl!(std::num::NonZeroU16);
eq_assertable_impl!(std::num::NonZeroI16);
eq_assertable_impl!(std::num::NonZeroU32);
eq_assertable_impl!(std::num::NonZeroI32);
eq_assertable_impl!(std::num::NonZeroU64);
eq_assertable_impl!(std::num::NonZeroI64);
eq_assertable_impl!(std::num::NonZeroU128);
eq_assertable_impl!(std::num::NonZeroI128);
eq_assertable_impl!(std::num::NonZeroUsize);
eq_assertable_impl!(std::num::NonZeroIsize);

float_assertable_impl!(f32);
float_assertable_impl!(f64);

impl<T> ShouldaEqual for &T
where
    T: ShouldaEqual,
{
    fn should_eq<Epsilon: EpsilonProvider>(&self, other: &Self) -> bool {
        T::should_eq::<Epsilon>(self, other)
    }
}