use core::cmp::Ordering::{self, *};
use core::cmp::{self};

#[test]
fn test_int_totalord() {
    assert_eq!(5.cmp(&10), Less);
    assert_eq!(10.cmp(&5), Greater);
    assert_eq!(5.cmp(&5), Equal);
    assert_eq!((-5).cmp(&12), Less);
    assert_eq!(12.cmp(&-5), Greater);
}

#[test]
fn test_bool_totalord() {
    assert_eq!(true.cmp(&false), Greater);
    assert_eq!(false.cmp(&true), Less);
    assert_eq!(true.cmp(&true), Equal);
    assert_eq!(false.cmp(&false), Equal);
}

#[test]
fn test_mut_int_totalord() {
    assert_eq!((&mut 5).cmp(&&mut 10), Less);
    assert_eq!((&mut 10).cmp(&&mut 5), Greater);
    assert_eq!((&mut 5).cmp(&&mut 5), Equal);
    assert_eq!((&mut -5).cmp(&&mut 12), Less);
    assert_eq!((&mut 12).cmp(&&mut -5), Greater);
}

#[test]
fn test_ord_max_min() {
    assert_eq!(1.max(2), 2);
    assert_eq!(2.max(1), 2);
    assert_eq!(1.min(2), 1);
    assert_eq!(2.min(1), 1);
    assert_eq!(1.max(1), 1);
    assert_eq!(1.min(1), 1);
}

#[test]
fn test_ord_min_max_by() {
    let f = |x: &i32, y: &i32| x.abs().cmp(&y.abs());
    assert_eq!(cmp::min_by(1, -1, f), 1);
    assert_eq!(cmp::min_by(1, -2, f), 1);
    assert_eq!(cmp::min_by(2, -1, f), -1);
    assert_eq!(cmp::max_by(1, -1, f), -1);
    assert_eq!(cmp::max_by(1, -2, f), -2);
    assert_eq!(cmp::max_by(2, -1, f), 2);
}

#[test]
fn test_ord_min_max_by_key() {
    let f = |x: &i32| x.abs();
    assert_eq!(cmp::min_by_key(1, -1, f), 1);
    assert_eq!(cmp::min_by_key(1, -2, f), 1);
    assert_eq!(cmp::min_by_key(2, -1, f), -1);
    assert_eq!(cmp::max_by_key(1, -1, f), -1);
    assert_eq!(cmp::max_by_key(1, -2, f), -2);
    assert_eq!(cmp::max_by_key(2, -1, f), 2);
}

#[test]
fn test_ordering_reverse() {
    assert_eq!(Less.reverse(), Greater);
    assert_eq!(Equal.reverse(), Equal);
    assert_eq!(Greater.reverse(), Less);
}

#[test]
fn test_ordering_order() {
    assert!(Less < Equal);
    assert_eq!(Greater.cmp(&Less), Greater);
}

#[test]
fn test_ordering_then() {
    assert_eq!(Equal.then(Less), Less);
    assert_eq!(Equal.then(Equal), Equal);
    assert_eq!(Equal.then(Greater), Greater);
    assert_eq!(Less.then(Less), Less);
    assert_eq!(Less.then(Equal), Less);
    assert_eq!(Less.then(Greater), Less);
    assert_eq!(Greater.then(Less), Greater);
    assert_eq!(Greater.then(Equal), Greater);
    assert_eq!(Greater.then(Greater), Greater);
}

#[test]
fn test_ordering_then_with() {
    assert_eq!(Equal.then_with(|| Less), Less);
    assert_eq!(Equal.then_with(|| Equal), Equal);
    assert_eq!(Equal.then_with(|| Greater), Greater);
    assert_eq!(Less.then_with(|| Less), Less);
    assert_eq!(Less.then_with(|| Equal), Less);
    assert_eq!(Less.then_with(|| Greater), Less);
    assert_eq!(Greater.then_with(|| Less), Greater);
    assert_eq!(Greater.then_with(|| Equal), Greater);
    assert_eq!(Greater.then_with(|| Greater), Greater);
}

#[test]
fn test_user_defined_eq() {
    // Our type.
    struct SketchyNum {
        num: isize,
    }

    // Our implementation of `PartialEq` to support `==` and `!=`.
    impl PartialEq for SketchyNum {
        // Our custom eq allows numbers which are near each other to be equal! :D
        fn eq(&self, other: &SketchyNum) -> bool {
            (self.num - other.num).abs() < 5
        }
    }

    // Now these binary operators will work when applied!
    assert!(SketchyNum { num: 37 } == SketchyNum { num: 34 });
    assert!(SketchyNum { num: 25 } != SketchyNum { num: 57 });
}

#[test]
fn ordering_const() {
    // test that the methods of `Ordering` are usable in a const context

    const ORDERING: Ordering = Greater;

    const REVERSE: Ordering = ORDERING.reverse();
    assert_eq!(REVERSE, Less);

    const THEN: Ordering = Equal.then(ORDERING);
    assert_eq!(THEN, Greater);
}

#[test]
fn ordering_structural_eq() {
    // test that consts of type `Ordering` are usable in patterns

    const ORDERING: Ordering = Greater;

    const REVERSE: Ordering = ORDERING.reverse();
    match Ordering::Less {
        REVERSE => {}
        _ => unreachable!(),
    };
}

#[test]
fn cmp_default() {
    // Test default methods in PartialOrd and PartialEq

    #[derive(Debug)]
    struct Fool(bool);

    impl PartialEq for Fool {
        fn eq(&self, other: &Fool) -> bool {
            let Fool(this) = *self;
            let Fool(other) = *other;
            this != other
        }
    }

    struct Int(isize);

    impl PartialEq for Int {
        fn eq(&self, other: &Int) -> bool {
            let Int(this) = *self;
            let Int(other) = *other;
            this == other
        }
    }

    impl PartialOrd for Int {
        fn partial_cmp(&self, other: &Int) -> Option<Ordering> {
            let Int(this) = *self;
            let Int(other) = *other;
            this.partial_cmp(&other)
        }
    }

    struct RevInt(isize);

    impl PartialEq for RevInt {
        fn eq(&self, other: &RevInt) -> bool {
            let RevInt(this) = *self;
            let RevInt(other) = *other;
            this == other
        }
    }

    impl PartialOrd for RevInt {
        fn partial_cmp(&self, other: &RevInt) -> Option<Ordering> {
            let RevInt(this) = *self;
            let RevInt(other) = *other;
            other.partial_cmp(&this)
        }
    }

    assert!(Int(2) > Int(1));
    assert!(Int(2) >= Int(1));
    assert!(Int(1) >= Int(1));
    assert!(Int(1) < Int(2));
    assert!(Int(1) <= Int(2));
    assert!(Int(1) <= Int(1));

    assert!(RevInt(2) < RevInt(1));
    assert!(RevInt(2) <= RevInt(1));
    assert!(RevInt(1) <= RevInt(1));
    assert!(RevInt(1) > RevInt(2));
    assert!(RevInt(1) >= RevInt(2));
    assert!(RevInt(1) >= RevInt(1));

    assert_eq!(Fool(true), Fool(false));
    assert!(Fool(true) != Fool(true));
    assert!(Fool(false) != Fool(false));
    assert_eq!(Fool(false), Fool(true));
}

mod const_cmp {
    use super::*;

    struct S(i32);

    impl const PartialEq for S {
        fn eq(&self, other: &Self) -> bool {
            self.0 == other.0
        }
    }

    impl const PartialOrd for S {
        fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
            let ret = match (self.0, other.0) {
                (a, b) if a > b => Ordering::Greater,
                (a, b) if a < b => Ordering::Less,
                _ => Ordering::Equal,
            };

            Some(ret)
        }
    }

    const _: () = assert!(S(1) == S(1));
    const _: () = assert!(S(0) != S(1));

    const _: () = assert!(S(1) <= S(1));
    const _: () = assert!(S(1) >= S(1));
    const _: () = assert!(S(0) < S(1));
    const _: () = assert!(S(1) > S(0));
}
