]> git.lizzy.rs Git - rust.git/blob - tests/ui/derives/derive-partial-ord.rs
add tests for 107090
[rust.git] / tests / ui / derives / derive-partial-ord.rs
1 // Checks that in a derived implementation of PartialOrd the lt, le, ge, gt methods are consistent
2 // with partial_cmp. Also verifies that implementation is consistent with that for tuples.
3 //
4 // run-pass
5
6 #[derive(PartialEq, PartialOrd)]
7 struct P(f64, f64);
8
9 fn main() {
10     let values: &[f64] = &[1.0, 2.0, f64::NAN];
11     for a in values {
12         for b in values {
13             for c in values {
14                 for d in values {
15                     // Check impl for a tuple.
16                     check(&(*a, *b), &(*c, *d));
17
18                     // Check derived impl.
19                     check(&P(*a, *b), &P(*c, *d));
20
21                     // Check that impls agree with each other.
22                     assert_eq!(
23                         PartialOrd::partial_cmp(&(*a, *b), &(*c, *d)),
24                         PartialOrd::partial_cmp(&P(*a, *b), &P(*c, *d)),
25                     );
26                 }
27             }
28         }
29     }
30 }
31
32 fn check<T: PartialOrd>(a: &T, b: &T) {
33     use std::cmp::Ordering::*;
34     match PartialOrd::partial_cmp(a, b) {
35         None => {
36             assert!(!(a < b));
37             assert!(!(a <= b));
38             assert!(!(a > b));
39             assert!(!(a >= b));
40         }
41         Some(Equal) => {
42             assert!(!(a < b));
43             assert!(a <= b);
44             assert!(!(a > b));
45             assert!(a >= b);
46         }
47         Some(Less) => {
48             assert!(a < b);
49             assert!(a <= b);
50             assert!(!(a > b));
51             assert!(!(a >= b));
52         }
53         Some(Greater) => {
54             assert!(!(a < b));
55             assert!(!(a <= b));
56             assert!(a > b);
57             assert!(a >= b);
58         }
59     }
60 }