#![allow(unused, clippy::assertions_on_constants, clippy::const_is_empty)]
#![warn(clippy::bool_assert_comparison)]

use std::ops::Not;

macro_rules! a {
    () => {
        true
    };
}
macro_rules! b {
    () => {
        true
    };
}

// Implements the Not trait but with an output type
// that's not bool. Should not suggest a rewrite
#[derive(Debug, Clone, Copy)]
enum ImplNotTraitWithoutBool {
    VariantX(bool),
    VariantY(u32),
}

impl PartialEq<bool> for ImplNotTraitWithoutBool {
    fn eq(&self, other: &bool) -> bool {
        match *self {
            ImplNotTraitWithoutBool::VariantX(b) => b == *other,
            _ => false,
        }
    }
}

impl Not for ImplNotTraitWithoutBool {
    type Output = Self;

    fn not(self) -> Self::Output {
        match self {
            ImplNotTraitWithoutBool::VariantX(b) => ImplNotTraitWithoutBool::VariantX(!b),
            ImplNotTraitWithoutBool::VariantY(0) => ImplNotTraitWithoutBool::VariantY(1),
            ImplNotTraitWithoutBool::VariantY(_) => ImplNotTraitWithoutBool::VariantY(0),
        }
    }
}

// This type implements the Not trait with an Output of
// type bool. Using assert!(..) must be suggested
#[derive(Debug, Clone, Copy)]
struct ImplNotTraitWithBool;

impl PartialEq<bool> for ImplNotTraitWithBool {
    fn eq(&self, other: &bool) -> bool {
        false
    }
}

impl Not for ImplNotTraitWithBool {
    type Output = bool;

    fn not(self) -> Self::Output {
        true
    }
}

#[derive(Debug)]
struct NonCopy;

impl PartialEq<bool> for NonCopy {
    fn eq(&self, other: &bool) -> bool {
        false
    }
}

impl Not for NonCopy {
    type Output = bool;

    fn not(self) -> Self::Output {
        true
    }
}

fn main() {
    let a = ImplNotTraitWithoutBool::VariantX(true);
    let b = ImplNotTraitWithBool;

    assert_eq!("a".len(), 1);
    assert!(!"a".is_empty());
    //~^ bool_assert_comparison
    assert!("".is_empty());
    //~^ bool_assert_comparison
    assert!("".is_empty());
    //~^ bool_assert_comparison
    assert_eq!(a!(), b!());
    assert_eq!(a!(), "".is_empty());
    assert_eq!("".is_empty(), b!());
    assert_eq!(a, true);
    assert!(b);
    //~^ bool_assert_comparison

    assert_ne!("a".len(), 1);
    assert!("a".is_empty());
    //~^ bool_assert_comparison
    assert!(!"".is_empty());
    //~^ bool_assert_comparison
    assert!(!"".is_empty());
    //~^ bool_assert_comparison
    assert_ne!(a!(), b!());
    assert_ne!(a!(), "".is_empty());
    assert_ne!("".is_empty(), b!());
    assert_ne!(a, true);
    assert!(!b);
    //~^ bool_assert_comparison

    debug_assert_eq!("a".len(), 1);
    debug_assert!(!"a".is_empty());
    //~^ bool_assert_comparison
    debug_assert!("".is_empty());
    //~^ bool_assert_comparison
    debug_assert!("".is_empty());
    //~^ bool_assert_comparison
    debug_assert_eq!(a!(), b!());
    debug_assert_eq!(a!(), "".is_empty());
    debug_assert_eq!("".is_empty(), b!());
    debug_assert_eq!(a, true);
    debug_assert!(b);
    //~^ bool_assert_comparison

    debug_assert_ne!("a".len(), 1);
    debug_assert!("a".is_empty());
    //~^ bool_assert_comparison
    debug_assert!(!"".is_empty());
    //~^ bool_assert_comparison
    debug_assert!(!"".is_empty());
    //~^ bool_assert_comparison
    debug_assert_ne!(a!(), b!());
    debug_assert_ne!(a!(), "".is_empty());
    debug_assert_ne!("".is_empty(), b!());
    debug_assert_ne!(a, true);
    debug_assert!(!b);
    //~^ bool_assert_comparison

    // assert with error messages
    assert_eq!("a".len(), 1, "tadam {}", 1);
    assert_eq!("a".len(), 1, "tadam {}", true);
    assert!(!"a".is_empty(), "tadam {}", 1);
    //~^ bool_assert_comparison
    assert!(!"a".is_empty(), "tadam {}", true);
    //~^ bool_assert_comparison
    assert!(!"a".is_empty(), "tadam {}", true);
    //~^ bool_assert_comparison
    assert_eq!(a, true, "tadam {}", false);

    debug_assert_eq!("a".len(), 1, "tadam {}", 1);
    debug_assert_eq!("a".len(), 1, "tadam {}", true);
    debug_assert!(!"a".is_empty(), "tadam {}", 1);
    //~^ bool_assert_comparison
    debug_assert!(!"a".is_empty(), "tadam {}", true);
    //~^ bool_assert_comparison
    debug_assert!(!"a".is_empty(), "tadam {}", true);
    //~^ bool_assert_comparison
    debug_assert_eq!(a, true, "tadam {}", false);

    assert!(a!());
    //~^ bool_assert_comparison
    assert!(b!());
    //~^ bool_assert_comparison

    use debug_assert_eq as renamed;
    renamed!(a, true);
    debug_assert!(b);
    //~^ bool_assert_comparison

    let non_copy = NonCopy;
    assert_eq!(non_copy, true);
    // changing the above to `assert!(non_copy)` would cause a `borrow of moved value`
    println!("{non_copy:?}");

    macro_rules! in_macro {
        ($v:expr) => {{
            assert_eq!($v, true);
        }};
    }
    in_macro!(a);

    assert!("".is_empty());
    //~^ bool_assert_comparison
    assert!("".is_empty());
    //~^ bool_assert_comparison
    assert!(!"requires negation".is_empty());
    //~^ bool_assert_comparison
    assert!(!"requires negation".is_empty());
    //~^ bool_assert_comparison

    debug_assert!("".is_empty());
    //~^ bool_assert_comparison
    debug_assert!("".is_empty());
    //~^ bool_assert_comparison
    debug_assert!(!"requires negation".is_empty());
    //~^ bool_assert_comparison
    debug_assert!(!"requires negation".is_empty());
    //~^ bool_assert_comparison
}
