@@ -5,16 +5,119 @@ fn should_pass() {}
55fn should_panic ( ) {
66 panic ! ( ) ;
77}
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- }
158fn 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 ;
19109 }
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:?}" ) ;
20123}
0 commit comments