//! This test case utilizes `f64` an easy example for `PartialOrd` only types
//! but the lint itself actually validates any expression where the left
//! operand implements `PartialOrd` but not `Ord`.

use std::cmp::Ordering;

#[allow(clippy::unnested_or_patterns)]
#[warn(clippy::neg_cmp_op_on_partial_ord)]
fn main() {
    let a_value = 1.0;
    let another_value = 7.0;

    // --- Bad ---

    // Not Less but potentially Greater, Equal or Uncomparable.
    let _not_less = !(a_value < another_value);

    // Not Less or Equal but potentially Greater or Uncomparable.
    let _not_less_or_equal = !(a_value <= another_value);

    // Not Greater but potentially Less, Equal or Uncomparable.
    let _not_greater = !(a_value > another_value);

    // Not Greater or Equal but potentially Less or Uncomparable.
    let _not_greater_or_equal = !(a_value >= another_value);

    // --- Good ---

    let _not_less = match a_value.partial_cmp(&another_value) {
        None | Some(Ordering::Greater) | Some(Ordering::Equal) => true,
        _ => false,
    };
    let _not_less_or_equal = match a_value.partial_cmp(&another_value) {
        None | Some(Ordering::Greater) => true,
        _ => false,
    };
    let _not_greater = match a_value.partial_cmp(&another_value) {
        None | Some(Ordering::Less) | Some(Ordering::Equal) => true,
        _ => false,
    };
    let _not_greater_or_equal = match a_value.partial_cmp(&another_value) {
        None | Some(Ordering::Less) => true,
        _ => false,
    };

    // --- Should not trigger ---

    let _ = a_value < another_value;
    let _ = a_value <= another_value;
    let _ = a_value > another_value;
    let _ = a_value >= another_value;

    // --- regression tests ---

    // Issue 2856: False positive on assert!()
    //
    // The macro always negates the result of the given comparison in its
    // internal check which automatically triggered the lint. As it's an
    // external macro there was no chance to do anything about it which led
    // to a whitelisting of all external macros.
    assert!(a_value < another_value);
}
