shoulda_core/
shoulda_equal.rs1use crate::epsilon_provider::EpsilonProvider;
2
3pub trait ShouldaEqual {
4 fn should_eq<Epsilon: EpsilonProvider>(&self, other: &Self) -> bool;
5}
6
7macro_rules! eq_assertable_impl {
8 ($x:ty) => {
9 impl ShouldaEqual for $x {
10 fn should_eq<Epsilon: EpsilonProvider>(&self, other: &Self) -> bool {
11 self.eq(other)
12 }
13 }
14 };
15}
16
17macro_rules! float_assertable_impl {
18 ($x:ty) => {
19 impl ShouldaEqual for $x {
20 fn should_eq<Epsilon: EpsilonProvider>(&self, other: &Self) -> bool {
21 (self - other).abs() < (Epsilon::diff() as $x)
22 }
23 }
24 };
25}
26
27eq_assertable_impl!(String);
28eq_assertable_impl!(&str);
29eq_assertable_impl!(str);
30eq_assertable_impl!(std::ffi::CString);
31eq_assertable_impl!(std::ffi::CStr);
32eq_assertable_impl!(std::ffi::OsString);
33eq_assertable_impl!(std::ffi::OsStr);
34eq_assertable_impl!(std::fs::FileType);
35eq_assertable_impl!(std::fs::Permissions);
36eq_assertable_impl!(std::net::Ipv4Addr);
37eq_assertable_impl!(std::net::Ipv6Addr);
38eq_assertable_impl!(std::net::SocketAddrV4);
39eq_assertable_impl!(std::net::SocketAddrV6);
40eq_assertable_impl!(std::path::Path);
41eq_assertable_impl!(std::path::PathBuf);
42eq_assertable_impl!(std::thread::ThreadId);
43eq_assertable_impl!(std::time::Duration);
44eq_assertable_impl!(std::time::Instant);
45eq_assertable_impl!(std::time::SystemTime);
46
47eq_assertable_impl!(bool);
48eq_assertable_impl!(u8);
49eq_assertable_impl!(i8);
50eq_assertable_impl!(u16);
51eq_assertable_impl!(i16);
52eq_assertable_impl!(u32);
53eq_assertable_impl!(i32);
54eq_assertable_impl!(u64);
55eq_assertable_impl!(i64);
56eq_assertable_impl!(u128);
57eq_assertable_impl!(i128);
58eq_assertable_impl!(usize);
59eq_assertable_impl!(isize);
60eq_assertable_impl!(char);
61
62eq_assertable_impl!(std::num::NonZeroU8);
63eq_assertable_impl!(std::num::NonZeroI8);
64eq_assertable_impl!(std::num::NonZeroU16);
65eq_assertable_impl!(std::num::NonZeroI16);
66eq_assertable_impl!(std::num::NonZeroU32);
67eq_assertable_impl!(std::num::NonZeroI32);
68eq_assertable_impl!(std::num::NonZeroU64);
69eq_assertable_impl!(std::num::NonZeroI64);
70eq_assertable_impl!(std::num::NonZeroU128);
71eq_assertable_impl!(std::num::NonZeroI128);
72eq_assertable_impl!(std::num::NonZeroUsize);
73eq_assertable_impl!(std::num::NonZeroIsize);
74
75float_assertable_impl!(f32);
76float_assertable_impl!(f64);
77
78impl<T> ShouldaEqual for &T
79where
80 T: ShouldaEqual,
81{
82 fn should_eq<Epsilon: EpsilonProvider>(&self, other: &Self) -> bool {
83 T::should_eq::<Epsilon>(self, other)
84 }
85}