@@ -5,16 +5,119 @@ fn should_pass() {}
5
5
fn should_panic ( ) {
6
6
panic ! ( ) ;
7
7
}
8
- #[ test]
9
- #[ should_panic]
10
- fn div_by_zero ( ) {
11
- let zero = std:: hint:: black_box ( 0 ) ;
12
- let res = 64 / zero;
13
- std:: hint:: black_box ( res) ;
14
- }
15
8
fn main ( ) {
16
- println ! ( "Hi!" ) ;
17
- for arg in std:: env:: args ( ) {
18
- println ! ( "arg:{arg:?}" ) ;
9
+ select_nth_unstable ( ) ;
10
+ }
11
+
12
+ fn select_nth_unstable ( ) {
13
+ use core:: cmp:: Ordering :: { Equal , Greater , Less } ;
14
+
15
+ use rand:: seq:: SliceRandom ;
16
+ use rand:: Rng ;
17
+ let mut rng = rand:: thread_rng ( ) ;
18
+ let mut v = [ 0 ; 500 ] ;
19
+ for pivot in 0 ..v. len ( ) {
20
+ println ! ( "{}:{}" , file!( ) , line!( ) ) ;
21
+ v. select_nth_unstable_by ( pivot, |_, _| {
22
+ * [ Less , Equal , Greater ] . choose ( & mut rng) . unwrap ( )
23
+ } ) ;
24
+ v. sort ( ) ;
25
+ for i in 0 ..v. len ( ) {
26
+ println ! ( "{}:{}" , file!( ) , line!( ) ) ;
27
+ assert_eq ! ( v[ i] , i as i32 ) ;
28
+ }
29
+ }
30
+
31
+ for len in ( 2 ..21 ) . chain ( 500 ..501 ) {
32
+ let mut orig = vec ! [ 0 ; len] ;
33
+ println ! ( "{}:{}" , file!( ) , line!( ) ) ;
34
+ for & modulus in & [ 5 , 10 , 1000 ] {
35
+ for _ in 0 ..10 {
36
+ println ! ( "{}:{}" , file!( ) , line!( ) ) ;
37
+ for i in 0 ..len {
38
+ println ! ( "{}:{}" , file!( ) , line!( ) ) ;
39
+ orig[ i] = rng. gen :: < i32 > ( ) % modulus;
40
+ }
41
+
42
+ let v_sorted = {
43
+ let mut v = orig. clone ( ) ;
44
+ v. sort ( ) ;
45
+ v
46
+ } ;
47
+
48
+ // Sort in default order.
49
+ for pivot in 0 ..len {
50
+ println ! ( "{}:{}" , file!( ) , line!( ) ) ;
51
+ let mut v = orig. clone ( ) ;
52
+ v. select_nth_unstable ( pivot) ;
53
+
54
+ assert_eq ! ( v_sorted[ pivot] , v[ pivot] ) ;
55
+ for i in 0 ..pivot {
56
+ for j in pivot..len {
57
+ assert ! ( v[ i] <= v[ j] ) ;
58
+ }
59
+ }
60
+ }
61
+
62
+ // Sort in ascending order.
63
+ for pivot in 0 ..len {
64
+ println ! ( "{}:{}" , file!( ) , line!( ) ) ;
65
+ let mut v = orig. clone ( ) ;
66
+ let ( left, pivot, right) = v. select_nth_unstable_by ( pivot, |a, b| a. cmp ( b) ) ;
67
+
68
+ assert_eq ! ( left. len( ) + right. len( ) , len - 1 ) ;
69
+
70
+ for l in left {
71
+ assert ! ( l <= pivot) ;
72
+ for r in right. iter_mut ( ) {
73
+ assert ! ( l <= r) ;
74
+ assert ! ( pivot <= r) ;
75
+ }
76
+ }
77
+ }
78
+
79
+ // Sort in descending order.
80
+ let sort_descending_comparator = |a : & i32 , b : & i32 | b. cmp ( a) ;
81
+ let v_sorted_descending = {
82
+ let mut v = orig. clone ( ) ;
83
+ v. sort_by ( sort_descending_comparator) ;
84
+ v
85
+ } ;
86
+
87
+ for pivot in 0 ..len {
88
+ println ! ( "{}:{}" , file!( ) , line!( ) ) ;
89
+ let mut v = orig. clone ( ) ;
90
+ v. select_nth_unstable_by ( pivot, sort_descending_comparator) ;
91
+
92
+ assert_eq ! ( v_sorted_descending[ pivot] , v[ pivot] ) ;
93
+ for i in 0 ..pivot {
94
+ for j in pivot..len {
95
+ assert ! ( v[ j] <= v[ i] ) ;
96
+ }
97
+ }
98
+ }
99
+ }
100
+ }
101
+ }
102
+
103
+ // Sort at index using a completely random comparison function.
104
+ // This will reorder the elements *somehow*, but won't panic.
105
+ let mut v = [ 0 ; 500 ] ;
106
+ for i in 0 ..v. len ( ) {
107
+ println ! ( "{}:{}" , file!( ) , line!( ) ) ;
108
+ v[ i] = i as i32 ;
19
109
}
110
+
111
+ // Should not panic.
112
+ [ ( ) ; 10 ] . select_nth_unstable ( 0 ) ;
113
+ [ ( ) ; 10 ] . select_nth_unstable ( 5 ) ;
114
+ [ ( ) ; 10 ] . select_nth_unstable ( 9 ) ;
115
+ [ ( ) ; 100 ] . select_nth_unstable ( 0 ) ;
116
+ [ ( ) ; 100 ] . select_nth_unstable ( 50 ) ;
117
+ [ ( ) ; 100 ] . select_nth_unstable ( 99 ) ;
118
+
119
+ let mut v = [ 0xDEADBEEFu64 ] ;
120
+ v. select_nth_unstable ( 0 ) ;
121
+ assert ! ( v == [ 0xDEADBEEF ] ) ;
122
+ println ! ( "v:{v:?}" ) ;
20
123
}
0 commit comments