negate 0.1.1

Attribute macro that generates negated versions of functions that return booleans.
Documentation
use negate::negate;

#[negate]
fn is_even(x: i32) -> bool {
    x % 2 == 0
}

#[negate(
    name = "are_not_equal",
    docs = "`are_not_equal` returns true if the two given arguments are not equal"
)]
fn are_equal<T>(x: T, y: T) -> bool
where
    T: Eq,
{
    x == y
}

#[allow(dead_code)]
enum UnsignedInteger {
    U8(u8),
    U16(u16),
    U32(u32),
    U64(u64),
}

impl UnsignedInteger {
    #[negate]
    pub fn is_zero(&self) -> bool {
        let self_as_u64: u64 = self.into();
        self_as_u64 == 0
    }
}

impl From<&UnsignedInteger> for u64 {
    fn from(int: &UnsignedInteger) -> Self {
        match int {
            UnsignedInteger::U8(u) => (*u).into(),
            UnsignedInteger::U16(u) => (*u).into(),
            UnsignedInteger::U32(u) => (*u).into(),
            UnsignedInteger::U64(u) => (*u).into(),
        }
    }
}

#[test]
fn are_equal_test_case() {
    assert!(are_equal(2, 2));
    assert!(are_not_equal(3, 2));
    assert!(!are_equal("Andrew", "Johnathan"));
    assert!(are_not_equal("Andrew", "Johnathan"));
}

#[test]
fn associated_fn_is_zero() {
    let int = UnsignedInteger::U32(5);
    assert!(!int.is_zero());
    assert!(int.is_not_zero());
}

#[test]
fn is_even_test_case() {
    assert!(is_even(2));
    assert!(!is_even(3));
    assert!(is_not_even(3));
    assert!(!is_not_even(4));

    let even_numbers: Vec<_> = (0..100).filter(|x| x % 2 == 0).collect();

    for num in even_numbers {
        assert!(is_even(num));
        assert!(!is_not_even(num));
    }
}