1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
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!(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!(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) } }