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)
    }
}