#![warn(clippy::eq_op)]
#![allow(clippy::useless_vec)]

// lint also in macro definition
macro_rules! assert_in_macro_def {
    () => {
        let a = 42;
        assert_eq!(a, a);
        //~^ eq_op
        assert_ne!(a, a);
        //~^ eq_op
        debug_assert_eq!(a, a);
        //~^ eq_op
        debug_assert_ne!(a, a);
        //~^ eq_op
    };
}

// lint identical args in assert-like macro invocations (see #3574)
fn main() {
    assert_in_macro_def!();

    let a = 1;
    let b = 2;

    // lint identical args in `assert_eq!`
    assert_eq!(a, a);
    //~^ eq_op

    assert_eq!(a + 1, a + 1);
    //~^ eq_op

    // ok
    assert_eq!(a, b);
    assert_eq!(a, a + 1);
    assert_eq!(a + 1, b + 1);

    // lint identical args in `assert_ne!`
    assert_ne!(a, a);
    //~^ eq_op

    assert_ne!(a + 1, a + 1);
    //~^ eq_op

    // ok
    assert_ne!(a, b);
    assert_ne!(a, a + 1);
    assert_ne!(a + 1, b + 1);

    // lint identical args in `debug_assert_eq!`
    debug_assert_eq!(a, a);
    //~^ eq_op

    debug_assert_eq!(a + 1, a + 1);
    //~^ eq_op

    // ok
    debug_assert_eq!(a, b);
    debug_assert_eq!(a, a + 1);
    debug_assert_eq!(a + 1, b + 1);

    // lint identical args in `debug_assert_ne!`
    debug_assert_ne!(a, a);
    //~^ eq_op

    debug_assert_ne!(a + 1, a + 1);
    //~^ eq_op

    // ok
    debug_assert_ne!(a, b);
    debug_assert_ne!(a, a + 1);
    debug_assert_ne!(a + 1, b + 1);

    let my_vec = vec![1; 5];
    let mut my_iter = my_vec.iter();
    assert_ne!(my_iter.next(), my_iter.next());
}
