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

use std::ops::{Add, 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
    }
}

impl Add for ImplNotTraitWithBool {
    type Output = Self;

    fn add(self, other: Self) -> Self::Output {
        self
    }
}

#[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
    assert!(!b);
    //~^ bool_assert_comparison
    assert!(!(!b));
    //~^ bool_assert_comparison
    assert!(!!(b + b));
    //~^ bool_assert_comparison
    assert!(!(b + b));
    //~^ bool_assert_comparison
}

fn issue16279() {
    macro_rules! is_empty {
        ($x:expr) => {
            $x.is_empty()
        };
    }

    assert!(!is_empty!("a"));
    //~^ bool_assert_comparison
    assert!(is_empty!(""));
    //~^ bool_assert_comparison
}
