| 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)); | 
 | } |