]> git.lizzy.rs Git - rust.git/blob - src/libcore/tests/slice.rs
Rust ./x.py fmt
[rust.git] / src / libcore / tests / slice.rs
1 use core::result::Result::{Err, Ok};
2
3 #[test]
4 fn test_position() {
5     let b = [1, 2, 3, 5, 5];
6     assert_eq!(b.iter().position(|&v| v == 9), None);
7     assert_eq!(b.iter().position(|&v| v == 5), Some(3));
8     assert_eq!(b.iter().position(|&v| v == 3), Some(2));
9     assert_eq!(b.iter().position(|&v| v == 0), None);
10 }
11
12 #[test]
13 fn test_rposition() {
14     let b = [1, 2, 3, 5, 5];
15     assert_eq!(b.iter().rposition(|&v| v == 9), None);
16     assert_eq!(b.iter().rposition(|&v| v == 5), Some(4));
17     assert_eq!(b.iter().rposition(|&v| v == 3), Some(2));
18     assert_eq!(b.iter().rposition(|&v| v == 0), None);
19 }
20
21 #[test]
22 fn test_binary_search() {
23     let b: [i32; 0] = [];
24     assert_eq!(b.binary_search(&5), Err(0));
25
26     let b = [4];
27     assert_eq!(b.binary_search(&3), Err(0));
28     assert_eq!(b.binary_search(&4), Ok(0));
29     assert_eq!(b.binary_search(&5), Err(1));
30
31     let b = [1, 2, 4, 6, 8, 9];
32     assert_eq!(b.binary_search(&5), Err(3));
33     assert_eq!(b.binary_search(&6), Ok(3));
34     assert_eq!(b.binary_search(&7), Err(4));
35     assert_eq!(b.binary_search(&8), Ok(4));
36
37     let b = [1, 2, 4, 5, 6, 8];
38     assert_eq!(b.binary_search(&9), Err(6));
39
40     let b = [1, 2, 4, 6, 7, 8, 9];
41     assert_eq!(b.binary_search(&6), Ok(3));
42     assert_eq!(b.binary_search(&5), Err(3));
43     assert_eq!(b.binary_search(&8), Ok(5));
44
45     let b = [1, 2, 4, 5, 6, 8, 9];
46     assert_eq!(b.binary_search(&7), Err(5));
47     assert_eq!(b.binary_search(&0), Err(0));
48
49     let b = [1, 3, 3, 3, 7];
50     assert_eq!(b.binary_search(&0), Err(0));
51     assert_eq!(b.binary_search(&1), Ok(0));
52     assert_eq!(b.binary_search(&2), Err(1));
53     assert!(match b.binary_search(&3) {
54         Ok(1..=3) => true,
55         _ => false,
56     });
57     assert!(match b.binary_search(&3) {
58         Ok(1..=3) => true,
59         _ => false,
60     });
61     assert_eq!(b.binary_search(&4), Err(4));
62     assert_eq!(b.binary_search(&5), Err(4));
63     assert_eq!(b.binary_search(&6), Err(4));
64     assert_eq!(b.binary_search(&7), Ok(4));
65     assert_eq!(b.binary_search(&8), Err(5));
66 }
67
68 #[test]
69 // Test implementation specific behavior when finding equivalent elements.
70 // It is ok to break this test but when you do a crater run is highly advisable.
71 fn test_binary_search_implementation_details() {
72     let b = [1, 1, 2, 2, 3, 3, 3];
73     assert_eq!(b.binary_search(&1), Ok(1));
74     assert_eq!(b.binary_search(&2), Ok(3));
75     assert_eq!(b.binary_search(&3), Ok(6));
76     let b = [1, 1, 1, 1, 1, 3, 3, 3, 3];
77     assert_eq!(b.binary_search(&1), Ok(4));
78     assert_eq!(b.binary_search(&3), Ok(8));
79     let b = [1, 1, 1, 1, 3, 3, 3, 3, 3];
80     assert_eq!(b.binary_search(&1), Ok(3));
81     assert_eq!(b.binary_search(&3), Ok(8));
82 }
83
84 #[test]
85 fn test_iterator_nth() {
86     let v: &[_] = &[0, 1, 2, 3, 4];
87     for i in 0..v.len() {
88         assert_eq!(v.iter().nth(i).unwrap(), &v[i]);
89     }
90     assert_eq!(v.iter().nth(v.len()), None);
91
92     let mut iter = v.iter();
93     assert_eq!(iter.nth(2).unwrap(), &v[2]);
94     assert_eq!(iter.nth(1).unwrap(), &v[4]);
95 }
96
97 #[test]
98 fn test_iterator_nth_back() {
99     let v: &[_] = &[0, 1, 2, 3, 4];
100     for i in 0..v.len() {
101         assert_eq!(v.iter().nth_back(i).unwrap(), &v[v.len() - i - 1]);
102     }
103     assert_eq!(v.iter().nth_back(v.len()), None);
104
105     let mut iter = v.iter();
106     assert_eq!(iter.nth_back(2).unwrap(), &v[2]);
107     assert_eq!(iter.nth_back(1).unwrap(), &v[0]);
108 }
109
110 #[test]
111 fn test_iterator_last() {
112     let v: &[_] = &[0, 1, 2, 3, 4];
113     assert_eq!(v.iter().last().unwrap(), &4);
114     assert_eq!(v[..1].iter().last().unwrap(), &0);
115 }
116
117 #[test]
118 fn test_iterator_count() {
119     let v: &[_] = &[0, 1, 2, 3, 4];
120     assert_eq!(v.iter().count(), 5);
121
122     let mut iter2 = v.iter();
123     iter2.next();
124     iter2.next();
125     assert_eq!(iter2.count(), 3);
126 }
127
128 #[test]
129 fn test_chunks_count() {
130     let v: &[i32] = &[0, 1, 2, 3, 4, 5];
131     let c = v.chunks(3);
132     assert_eq!(c.count(), 2);
133
134     let v2: &[i32] = &[0, 1, 2, 3, 4];
135     let c2 = v2.chunks(2);
136     assert_eq!(c2.count(), 3);
137
138     let v3: &[i32] = &[];
139     let c3 = v3.chunks(2);
140     assert_eq!(c3.count(), 0);
141 }
142
143 #[test]
144 fn test_chunks_nth() {
145     let v: &[i32] = &[0, 1, 2, 3, 4, 5];
146     let mut c = v.chunks(2);
147     assert_eq!(c.nth(1).unwrap(), &[2, 3]);
148     assert_eq!(c.next().unwrap(), &[4, 5]);
149
150     let v2: &[i32] = &[0, 1, 2, 3, 4];
151     let mut c2 = v2.chunks(3);
152     assert_eq!(c2.nth(1).unwrap(), &[3, 4]);
153     assert_eq!(c2.next(), None);
154 }
155
156 #[test]
157 fn test_chunks_nth_back() {
158     let v: &[i32] = &[0, 1, 2, 3, 4, 5];
159     let mut c = v.chunks(2);
160     assert_eq!(c.nth_back(1).unwrap(), &[2, 3]);
161     assert_eq!(c.next().unwrap(), &[0, 1]);
162     assert_eq!(c.next(), None);
163
164     let v2: &[i32] = &[0, 1, 2, 3, 4];
165     let mut c2 = v2.chunks(3);
166     assert_eq!(c2.nth_back(1).unwrap(), &[0, 1, 2]);
167     assert_eq!(c2.next(), None);
168     assert_eq!(c2.next_back(), None);
169
170     let v3: &[i32] = &[0, 1, 2, 3, 4];
171     let mut c3 = v3.chunks(10);
172     assert_eq!(c3.nth_back(0).unwrap(), &[0, 1, 2, 3, 4]);
173     assert_eq!(c3.next(), None);
174
175     let v4: &[i32] = &[0, 1, 2];
176     let mut c4 = v4.chunks(10);
177     assert_eq!(c4.nth_back(1_000_000_000usize), None);
178 }
179
180 #[test]
181 fn test_chunks_last() {
182     let v: &[i32] = &[0, 1, 2, 3, 4, 5];
183     let c = v.chunks(2);
184     assert_eq!(c.last().unwrap()[1], 5);
185
186     let v2: &[i32] = &[0, 1, 2, 3, 4];
187     let c2 = v2.chunks(2);
188     assert_eq!(c2.last().unwrap()[0], 4);
189 }
190
191 #[test]
192 fn test_chunks_zip() {
193     let v1: &[i32] = &[0, 1, 2, 3, 4];
194     let v2: &[i32] = &[6, 7, 8, 9, 10];
195
196     let res = v1
197         .chunks(2)
198         .zip(v2.chunks(2))
199         .map(|(a, b)| a.iter().sum::<i32>() + b.iter().sum::<i32>())
200         .collect::<Vec<_>>();
201     assert_eq!(res, vec![14, 22, 14]);
202 }
203
204 #[test]
205 fn test_chunks_mut_count() {
206     let v: &mut [i32] = &mut [0, 1, 2, 3, 4, 5];
207     let c = v.chunks_mut(3);
208     assert_eq!(c.count(), 2);
209
210     let v2: &mut [i32] = &mut [0, 1, 2, 3, 4];
211     let c2 = v2.chunks_mut(2);
212     assert_eq!(c2.count(), 3);
213
214     let v3: &mut [i32] = &mut [];
215     let c3 = v3.chunks_mut(2);
216     assert_eq!(c3.count(), 0);
217 }
218
219 #[test]
220 fn test_chunks_mut_nth() {
221     let v: &mut [i32] = &mut [0, 1, 2, 3, 4, 5];
222     let mut c = v.chunks_mut(2);
223     assert_eq!(c.nth(1).unwrap(), &[2, 3]);
224     assert_eq!(c.next().unwrap(), &[4, 5]);
225
226     let v2: &mut [i32] = &mut [0, 1, 2, 3, 4];
227     let mut c2 = v2.chunks_mut(3);
228     assert_eq!(c2.nth(1).unwrap(), &[3, 4]);
229     assert_eq!(c2.next(), None);
230 }
231
232 #[test]
233 fn test_chunks_mut_nth_back() {
234     let v: &mut [i32] = &mut [0, 1, 2, 3, 4, 5];
235     let mut c = v.chunks_mut(2);
236     assert_eq!(c.nth_back(1).unwrap(), &[2, 3]);
237     assert_eq!(c.next().unwrap(), &[0, 1]);
238
239     let v1: &mut [i32] = &mut [0, 1, 2, 3, 4];
240     let mut c1 = v1.chunks_mut(3);
241     assert_eq!(c1.nth_back(1).unwrap(), &[0, 1, 2]);
242     assert_eq!(c1.next(), None);
243
244     let v3: &mut [i32] = &mut [0, 1, 2, 3, 4];
245     let mut c3 = v3.chunks_mut(10);
246     assert_eq!(c3.nth_back(0).unwrap(), &[0, 1, 2, 3, 4]);
247     assert_eq!(c3.next(), None);
248
249     let v4: &mut [i32] = &mut [0, 1, 2];
250     let mut c4 = v4.chunks_mut(10);
251     assert_eq!(c4.nth_back(1_000_000_000usize), None);
252 }
253
254 #[test]
255 fn test_chunks_mut_last() {
256     let v: &mut [i32] = &mut [0, 1, 2, 3, 4, 5];
257     let c = v.chunks_mut(2);
258     assert_eq!(c.last().unwrap(), &[4, 5]);
259
260     let v2: &mut [i32] = &mut [0, 1, 2, 3, 4];
261     let c2 = v2.chunks_mut(2);
262     assert_eq!(c2.last().unwrap(), &[4]);
263 }
264
265 #[test]
266 fn test_chunks_mut_zip() {
267     let v1: &mut [i32] = &mut [0, 1, 2, 3, 4];
268     let v2: &[i32] = &[6, 7, 8, 9, 10];
269
270     for (a, b) in v1.chunks_mut(2).zip(v2.chunks(2)) {
271         let sum = b.iter().sum::<i32>();
272         for v in a {
273             *v += sum;
274         }
275     }
276     assert_eq!(v1, [13, 14, 19, 20, 14]);
277 }
278
279 #[test]
280 fn test_chunks_exact_count() {
281     let v: &[i32] = &[0, 1, 2, 3, 4, 5];
282     let c = v.chunks_exact(3);
283     assert_eq!(c.count(), 2);
284
285     let v2: &[i32] = &[0, 1, 2, 3, 4];
286     let c2 = v2.chunks_exact(2);
287     assert_eq!(c2.count(), 2);
288
289     let v3: &[i32] = &[];
290     let c3 = v3.chunks_exact(2);
291     assert_eq!(c3.count(), 0);
292 }
293
294 #[test]
295 fn test_chunks_exact_nth() {
296     let v: &[i32] = &[0, 1, 2, 3, 4, 5];
297     let mut c = v.chunks_exact(2);
298     assert_eq!(c.nth(1).unwrap(), &[2, 3]);
299     assert_eq!(c.next().unwrap(), &[4, 5]);
300
301     let v2: &[i32] = &[0, 1, 2, 3, 4, 5, 6];
302     let mut c2 = v2.chunks_exact(3);
303     assert_eq!(c2.nth(1).unwrap(), &[3, 4, 5]);
304     assert_eq!(c2.next(), None);
305 }
306
307 #[test]
308 fn test_chunks_exact_nth_back() {
309     let v: &[i32] = &[0, 1, 2, 3, 4, 5];
310     let mut c = v.chunks_exact(2);
311     assert_eq!(c.nth_back(1).unwrap(), &[2, 3]);
312     assert_eq!(c.next().unwrap(), &[0, 1]);
313     assert_eq!(c.next(), None);
314
315     let v2: &[i32] = &[0, 1, 2, 3, 4];
316     let mut c2 = v2.chunks_exact(3);
317     assert_eq!(c2.nth_back(0).unwrap(), &[0, 1, 2]);
318     assert_eq!(c2.next(), None);
319     assert_eq!(c2.next_back(), None);
320
321     let v3: &[i32] = &[0, 1, 2, 3, 4];
322     let mut c3 = v3.chunks_exact(10);
323     assert_eq!(c3.nth_back(0), None);
324 }
325
326 #[test]
327 fn test_chunks_exact_last() {
328     let v: &[i32] = &[0, 1, 2, 3, 4, 5];
329     let c = v.chunks_exact(2);
330     assert_eq!(c.last().unwrap(), &[4, 5]);
331
332     let v2: &[i32] = &[0, 1, 2, 3, 4];
333     let c2 = v2.chunks_exact(2);
334     assert_eq!(c2.last().unwrap(), &[2, 3]);
335 }
336
337 #[test]
338 fn test_chunks_exact_remainder() {
339     let v: &[i32] = &[0, 1, 2, 3, 4];
340     let c = v.chunks_exact(2);
341     assert_eq!(c.remainder(), &[4]);
342 }
343
344 #[test]
345 fn test_chunks_exact_zip() {
346     let v1: &[i32] = &[0, 1, 2, 3, 4];
347     let v2: &[i32] = &[6, 7, 8, 9, 10];
348
349     let res = v1
350         .chunks_exact(2)
351         .zip(v2.chunks_exact(2))
352         .map(|(a, b)| a.iter().sum::<i32>() + b.iter().sum::<i32>())
353         .collect::<Vec<_>>();
354     assert_eq!(res, vec![14, 22]);
355 }
356
357 #[test]
358 fn test_chunks_exact_mut_count() {
359     let v: &mut [i32] = &mut [0, 1, 2, 3, 4, 5];
360     let c = v.chunks_exact_mut(3);
361     assert_eq!(c.count(), 2);
362
363     let v2: &mut [i32] = &mut [0, 1, 2, 3, 4];
364     let c2 = v2.chunks_exact_mut(2);
365     assert_eq!(c2.count(), 2);
366
367     let v3: &mut [i32] = &mut [];
368     let c3 = v3.chunks_exact_mut(2);
369     assert_eq!(c3.count(), 0);
370 }
371
372 #[test]
373 fn test_chunks_exact_mut_nth() {
374     let v: &mut [i32] = &mut [0, 1, 2, 3, 4, 5];
375     let mut c = v.chunks_exact_mut(2);
376     assert_eq!(c.nth(1).unwrap(), &[2, 3]);
377     assert_eq!(c.next().unwrap(), &[4, 5]);
378
379     let v2: &mut [i32] = &mut [0, 1, 2, 3, 4, 5, 6];
380     let mut c2 = v2.chunks_exact_mut(3);
381     assert_eq!(c2.nth(1).unwrap(), &[3, 4, 5]);
382     assert_eq!(c2.next(), None);
383 }
384
385 #[test]
386 fn test_chunks_exact_mut_nth_back() {
387     let v: &mut [i32] = &mut [0, 1, 2, 3, 4, 5];
388     let mut c = v.chunks_exact_mut(2);
389     assert_eq!(c.nth_back(1).unwrap(), &[2, 3]);
390     assert_eq!(c.next().unwrap(), &[0, 1]);
391     assert_eq!(c.next(), None);
392
393     let v2: &mut [i32] = &mut [0, 1, 2, 3, 4];
394     let mut c2 = v2.chunks_exact_mut(3);
395     assert_eq!(c2.nth_back(0).unwrap(), &[0, 1, 2]);
396     assert_eq!(c2.next(), None);
397     assert_eq!(c2.next_back(), None);
398
399     let v3: &mut [i32] = &mut [0, 1, 2, 3, 4];
400     let mut c3 = v3.chunks_exact_mut(10);
401     assert_eq!(c3.nth_back(0), None);
402 }
403
404 #[test]
405 fn test_chunks_exact_mut_last() {
406     let v: &mut [i32] = &mut [0, 1, 2, 3, 4, 5];
407     let c = v.chunks_exact_mut(2);
408     assert_eq!(c.last().unwrap(), &[4, 5]);
409
410     let v2: &mut [i32] = &mut [0, 1, 2, 3, 4];
411     let c2 = v2.chunks_exact_mut(2);
412     assert_eq!(c2.last().unwrap(), &[2, 3]);
413 }
414
415 #[test]
416 fn test_chunks_exact_mut_remainder() {
417     let v: &mut [i32] = &mut [0, 1, 2, 3, 4];
418     let c = v.chunks_exact_mut(2);
419     assert_eq!(c.into_remainder(), &[4]);
420 }
421
422 #[test]
423 fn test_chunks_exact_mut_zip() {
424     let v1: &mut [i32] = &mut [0, 1, 2, 3, 4];
425     let v2: &[i32] = &[6, 7, 8, 9, 10];
426
427     for (a, b) in v1.chunks_exact_mut(2).zip(v2.chunks_exact(2)) {
428         let sum = b.iter().sum::<i32>();
429         for v in a {
430             *v += sum;
431         }
432     }
433     assert_eq!(v1, [13, 14, 19, 20, 4]);
434 }
435
436 #[test]
437 fn test_rchunks_count() {
438     let v: &[i32] = &[0, 1, 2, 3, 4, 5];
439     let c = v.rchunks(3);
440     assert_eq!(c.count(), 2);
441
442     let v2: &[i32] = &[0, 1, 2, 3, 4];
443     let c2 = v2.rchunks(2);
444     assert_eq!(c2.count(), 3);
445
446     let v3: &[i32] = &[];
447     let c3 = v3.rchunks(2);
448     assert_eq!(c3.count(), 0);
449 }
450
451 #[test]
452 fn test_rchunks_nth() {
453     let v: &[i32] = &[0, 1, 2, 3, 4, 5];
454     let mut c = v.rchunks(2);
455     assert_eq!(c.nth(1).unwrap(), &[2, 3]);
456     assert_eq!(c.next().unwrap(), &[0, 1]);
457
458     let v2: &[i32] = &[0, 1, 2, 3, 4];
459     let mut c2 = v2.rchunks(3);
460     assert_eq!(c2.nth(1).unwrap(), &[0, 1]);
461     assert_eq!(c2.next(), None);
462 }
463
464 #[test]
465 fn test_rchunks_nth_back() {
466     let v: &[i32] = &[0, 1, 2, 3, 4, 5];
467     let mut c = v.rchunks(2);
468     assert_eq!(c.nth_back(1).unwrap(), &[2, 3]);
469     assert_eq!(c.next_back().unwrap(), &[4, 5]);
470
471     let v2: &[i32] = &[0, 1, 2, 3, 4];
472     let mut c2 = v2.rchunks(3);
473     assert_eq!(c2.nth_back(1).unwrap(), &[2, 3, 4]);
474     assert_eq!(c2.next_back(), None);
475 }
476
477 #[test]
478 fn test_rchunks_last() {
479     let v: &[i32] = &[0, 1, 2, 3, 4, 5];
480     let c = v.rchunks(2);
481     assert_eq!(c.last().unwrap()[1], 1);
482
483     let v2: &[i32] = &[0, 1, 2, 3, 4];
484     let c2 = v2.rchunks(2);
485     assert_eq!(c2.last().unwrap()[0], 0);
486 }
487
488 #[test]
489 fn test_rchunks_zip() {
490     let v1: &[i32] = &[0, 1, 2, 3, 4];
491     let v2: &[i32] = &[6, 7, 8, 9, 10];
492
493     let res = v1
494         .rchunks(2)
495         .zip(v2.rchunks(2))
496         .map(|(a, b)| a.iter().sum::<i32>() + b.iter().sum::<i32>())
497         .collect::<Vec<_>>();
498     assert_eq!(res, vec![26, 18, 6]);
499 }
500
501 #[test]
502 fn test_rchunks_mut_count() {
503     let v: &mut [i32] = &mut [0, 1, 2, 3, 4, 5];
504     let c = v.rchunks_mut(3);
505     assert_eq!(c.count(), 2);
506
507     let v2: &mut [i32] = &mut [0, 1, 2, 3, 4];
508     let c2 = v2.rchunks_mut(2);
509     assert_eq!(c2.count(), 3);
510
511     let v3: &mut [i32] = &mut [];
512     let c3 = v3.rchunks_mut(2);
513     assert_eq!(c3.count(), 0);
514 }
515
516 #[test]
517 fn test_rchunks_mut_nth() {
518     let v: &mut [i32] = &mut [0, 1, 2, 3, 4, 5];
519     let mut c = v.rchunks_mut(2);
520     assert_eq!(c.nth(1).unwrap(), &[2, 3]);
521     assert_eq!(c.next().unwrap(), &[0, 1]);
522
523     let v2: &mut [i32] = &mut [0, 1, 2, 3, 4];
524     let mut c2 = v2.rchunks_mut(3);
525     assert_eq!(c2.nth(1).unwrap(), &[0, 1]);
526     assert_eq!(c2.next(), None);
527 }
528
529 #[test]
530 fn test_rchunks_mut_nth_back() {
531     let v: &mut [i32] = &mut [0, 1, 2, 3, 4, 5];
532     let mut c = v.rchunks_mut(2);
533     assert_eq!(c.nth_back(1).unwrap(), &[2, 3]);
534     assert_eq!(c.next_back().unwrap(), &[4, 5]);
535
536     let v2: &mut [i32] = &mut [0, 1, 2, 3, 4];
537     let mut c2 = v2.rchunks_mut(3);
538     assert_eq!(c2.nth_back(1).unwrap(), &[2, 3, 4]);
539     assert_eq!(c2.next_back(), None);
540 }
541
542 #[test]
543 fn test_rchunks_mut_last() {
544     let v: &mut [i32] = &mut [0, 1, 2, 3, 4, 5];
545     let c = v.rchunks_mut(2);
546     assert_eq!(c.last().unwrap(), &[0, 1]);
547
548     let v2: &mut [i32] = &mut [0, 1, 2, 3, 4];
549     let c2 = v2.rchunks_mut(2);
550     assert_eq!(c2.last().unwrap(), &[0]);
551 }
552
553 #[test]
554 fn test_rchunks_mut_zip() {
555     let v1: &mut [i32] = &mut [0, 1, 2, 3, 4];
556     let v2: &[i32] = &[6, 7, 8, 9, 10];
557
558     for (a, b) in v1.rchunks_mut(2).zip(v2.rchunks(2)) {
559         let sum = b.iter().sum::<i32>();
560         for v in a {
561             *v += sum;
562         }
563     }
564     assert_eq!(v1, [6, 16, 17, 22, 23]);
565 }
566
567 #[test]
568 fn test_rchunks_exact_count() {
569     let v: &[i32] = &[0, 1, 2, 3, 4, 5];
570     let c = v.rchunks_exact(3);
571     assert_eq!(c.count(), 2);
572
573     let v2: &[i32] = &[0, 1, 2, 3, 4];
574     let c2 = v2.rchunks_exact(2);
575     assert_eq!(c2.count(), 2);
576
577     let v3: &[i32] = &[];
578     let c3 = v3.rchunks_exact(2);
579     assert_eq!(c3.count(), 0);
580 }
581
582 #[test]
583 fn test_rchunks_exact_nth() {
584     let v: &[i32] = &[0, 1, 2, 3, 4, 5];
585     let mut c = v.rchunks_exact(2);
586     assert_eq!(c.nth(1).unwrap(), &[2, 3]);
587     assert_eq!(c.next().unwrap(), &[0, 1]);
588
589     let v2: &[i32] = &[0, 1, 2, 3, 4, 5, 6];
590     let mut c2 = v2.rchunks_exact(3);
591     assert_eq!(c2.nth(1).unwrap(), &[1, 2, 3]);
592     assert_eq!(c2.next(), None);
593 }
594
595 #[test]
596 fn test_rchunks_exact_nth_back() {
597     let v: &[i32] = &[0, 1, 2, 3, 4, 5];
598     let mut c = v.rchunks_exact(2);
599     assert_eq!(c.nth_back(1).unwrap(), &[2, 3]);
600     assert_eq!(c.next_back().unwrap(), &[4, 5]);
601
602     let v2: &[i32] = &[0, 1, 2, 3, 4, 5, 6];
603     let mut c2 = v2.rchunks_exact(3);
604     assert_eq!(c2.nth_back(1).unwrap(), &[4, 5, 6]);
605     assert_eq!(c2.next(), None);
606 }
607
608 #[test]
609 fn test_rchunks_exact_last() {
610     let v: &[i32] = &[0, 1, 2, 3, 4, 5];
611     let c = v.rchunks_exact(2);
612     assert_eq!(c.last().unwrap(), &[0, 1]);
613
614     let v2: &[i32] = &[0, 1, 2, 3, 4];
615     let c2 = v2.rchunks_exact(2);
616     assert_eq!(c2.last().unwrap(), &[1, 2]);
617 }
618
619 #[test]
620 fn test_rchunks_exact_remainder() {
621     let v: &[i32] = &[0, 1, 2, 3, 4];
622     let c = v.rchunks_exact(2);
623     assert_eq!(c.remainder(), &[0]);
624 }
625
626 #[test]
627 fn test_rchunks_exact_zip() {
628     let v1: &[i32] = &[0, 1, 2, 3, 4];
629     let v2: &[i32] = &[6, 7, 8, 9, 10];
630
631     let res = v1
632         .rchunks_exact(2)
633         .zip(v2.rchunks_exact(2))
634         .map(|(a, b)| a.iter().sum::<i32>() + b.iter().sum::<i32>())
635         .collect::<Vec<_>>();
636     assert_eq!(res, vec![26, 18]);
637 }
638
639 #[test]
640 fn test_rchunks_exact_mut_count() {
641     let v: &mut [i32] = &mut [0, 1, 2, 3, 4, 5];
642     let c = v.rchunks_exact_mut(3);
643     assert_eq!(c.count(), 2);
644
645     let v2: &mut [i32] = &mut [0, 1, 2, 3, 4];
646     let c2 = v2.rchunks_exact_mut(2);
647     assert_eq!(c2.count(), 2);
648
649     let v3: &mut [i32] = &mut [];
650     let c3 = v3.rchunks_exact_mut(2);
651     assert_eq!(c3.count(), 0);
652 }
653
654 #[test]
655 fn test_rchunks_exact_mut_nth() {
656     let v: &mut [i32] = &mut [0, 1, 2, 3, 4, 5];
657     let mut c = v.rchunks_exact_mut(2);
658     assert_eq!(c.nth(1).unwrap(), &[2, 3]);
659     assert_eq!(c.next().unwrap(), &[0, 1]);
660
661     let v2: &mut [i32] = &mut [0, 1, 2, 3, 4, 5, 6];
662     let mut c2 = v2.rchunks_exact_mut(3);
663     assert_eq!(c2.nth(1).unwrap(), &[1, 2, 3]);
664     assert_eq!(c2.next(), None);
665 }
666
667 #[test]
668 fn test_rchunks_exact_mut_nth_back() {
669     let v: &mut [i32] = &mut [0, 1, 2, 3, 4, 5];
670     let mut c = v.rchunks_exact_mut(2);
671     assert_eq!(c.nth_back(1).unwrap(), &[2, 3]);
672     assert_eq!(c.next_back().unwrap(), &[4, 5]);
673
674     let v2: &mut [i32] = &mut [0, 1, 2, 3, 4, 5, 6];
675     let mut c2 = v2.rchunks_exact_mut(3);
676     assert_eq!(c2.nth_back(1).unwrap(), &[4, 5, 6]);
677     assert_eq!(c2.next(), None);
678 }
679
680 #[test]
681 fn test_rchunks_exact_mut_last() {
682     let v: &mut [i32] = &mut [0, 1, 2, 3, 4, 5];
683     let c = v.rchunks_exact_mut(2);
684     assert_eq!(c.last().unwrap(), &[0, 1]);
685
686     let v2: &mut [i32] = &mut [0, 1, 2, 3, 4];
687     let c2 = v2.rchunks_exact_mut(2);
688     assert_eq!(c2.last().unwrap(), &[1, 2]);
689 }
690
691 #[test]
692 fn test_rchunks_exact_mut_remainder() {
693     let v: &mut [i32] = &mut [0, 1, 2, 3, 4];
694     let c = v.rchunks_exact_mut(2);
695     assert_eq!(c.into_remainder(), &[0]);
696 }
697
698 #[test]
699 fn test_rchunks_exact_mut_zip() {
700     let v1: &mut [i32] = &mut [0, 1, 2, 3, 4];
701     let v2: &[i32] = &[6, 7, 8, 9, 10];
702
703     for (a, b) in v1.rchunks_exact_mut(2).zip(v2.rchunks_exact(2)) {
704         let sum = b.iter().sum::<i32>();
705         for v in a {
706             *v += sum;
707         }
708     }
709     assert_eq!(v1, [0, 16, 17, 22, 23]);
710 }
711
712 #[test]
713 fn test_windows_count() {
714     let v: &[i32] = &[0, 1, 2, 3, 4, 5];
715     let c = v.windows(3);
716     assert_eq!(c.count(), 4);
717
718     let v2: &[i32] = &[0, 1, 2, 3, 4];
719     let c2 = v2.windows(6);
720     assert_eq!(c2.count(), 0);
721
722     let v3: &[i32] = &[];
723     let c3 = v3.windows(2);
724     assert_eq!(c3.count(), 0);
725 }
726
727 #[test]
728 fn test_windows_nth() {
729     let v: &[i32] = &[0, 1, 2, 3, 4, 5];
730     let mut c = v.windows(2);
731     assert_eq!(c.nth(2).unwrap()[1], 3);
732     assert_eq!(c.next().unwrap()[0], 3);
733
734     let v2: &[i32] = &[0, 1, 2, 3, 4];
735     let mut c2 = v2.windows(4);
736     assert_eq!(c2.nth(1).unwrap()[1], 2);
737     assert_eq!(c2.next(), None);
738 }
739
740 #[test]
741 fn test_windows_nth_back() {
742     let v: &[i32] = &[0, 1, 2, 3, 4, 5];
743     let mut c = v.windows(2);
744     assert_eq!(c.nth_back(2).unwrap()[0], 2);
745     assert_eq!(c.next_back().unwrap()[1], 2);
746
747     let v2: &[i32] = &[0, 1, 2, 3, 4];
748     let mut c2 = v2.windows(4);
749     assert_eq!(c2.nth_back(1).unwrap()[1], 1);
750     assert_eq!(c2.next_back(), None);
751 }
752
753 #[test]
754 fn test_windows_last() {
755     let v: &[i32] = &[0, 1, 2, 3, 4, 5];
756     let c = v.windows(2);
757     assert_eq!(c.last().unwrap()[1], 5);
758
759     let v2: &[i32] = &[0, 1, 2, 3, 4];
760     let c2 = v2.windows(2);
761     assert_eq!(c2.last().unwrap()[0], 3);
762 }
763
764 #[test]
765 fn test_windows_zip() {
766     let v1: &[i32] = &[0, 1, 2, 3, 4];
767     let v2: &[i32] = &[6, 7, 8, 9, 10];
768
769     let res = v1
770         .windows(2)
771         .zip(v2.windows(2))
772         .map(|(a, b)| a.iter().sum::<i32>() + b.iter().sum::<i32>())
773         .collect::<Vec<_>>();
774
775     assert_eq!(res, [14, 18, 22, 26]);
776 }
777
778 #[test]
779 #[allow(const_err)]
780 fn test_iter_ref_consistency() {
781     use std::fmt::Debug;
782
783     fn test<T: Copy + Debug + PartialEq>(x: T) {
784         let v: &[T] = &[x, x, x];
785         let v_ptrs: [*const T; 3] = match v {
786             [ref v1, ref v2, ref v3] => [v1 as *const _, v2 as *const _, v3 as *const _],
787             _ => unreachable!(),
788         };
789         let len = v.len();
790
791         // nth(i)
792         for i in 0..len {
793             assert_eq!(&v[i] as *const _, v_ptrs[i]); // check the v_ptrs array, just to be sure
794             let nth = v.iter().nth(i).unwrap();
795             assert_eq!(nth as *const _, v_ptrs[i]);
796         }
797         assert_eq!(v.iter().nth(len), None, "nth(len) should return None");
798
799         // stepping through with nth(0)
800         {
801             let mut it = v.iter();
802             for i in 0..len {
803                 let next = it.nth(0).unwrap();
804                 assert_eq!(next as *const _, v_ptrs[i]);
805             }
806             assert_eq!(it.nth(0), None);
807         }
808
809         // next()
810         {
811             let mut it = v.iter();
812             for i in 0..len {
813                 let remaining = len - i;
814                 assert_eq!(it.size_hint(), (remaining, Some(remaining)));
815
816                 let next = it.next().unwrap();
817                 assert_eq!(next as *const _, v_ptrs[i]);
818             }
819             assert_eq!(it.size_hint(), (0, Some(0)));
820             assert_eq!(it.next(), None, "The final call to next() should return None");
821         }
822
823         // next_back()
824         {
825             let mut it = v.iter();
826             for i in 0..len {
827                 let remaining = len - i;
828                 assert_eq!(it.size_hint(), (remaining, Some(remaining)));
829
830                 let prev = it.next_back().unwrap();
831                 assert_eq!(prev as *const _, v_ptrs[remaining - 1]);
832             }
833             assert_eq!(it.size_hint(), (0, Some(0)));
834             assert_eq!(it.next_back(), None, "The final call to next_back() should return None");
835         }
836     }
837
838     fn test_mut<T: Copy + Debug + PartialEq>(x: T) {
839         let v: &mut [T] = &mut [x, x, x];
840         let v_ptrs: [*mut T; 3] = match v {
841             [ref v1, ref v2, ref v3] => {
842                 [v1 as *const _ as *mut _, v2 as *const _ as *mut _, v3 as *const _ as *mut _]
843             }
844             _ => unreachable!(),
845         };
846         let len = v.len();
847
848         // nth(i)
849         for i in 0..len {
850             assert_eq!(&mut v[i] as *mut _, v_ptrs[i]); // check the v_ptrs array, just to be sure
851             let nth = v.iter_mut().nth(i).unwrap();
852             assert_eq!(nth as *mut _, v_ptrs[i]);
853         }
854         assert_eq!(v.iter().nth(len), None, "nth(len) should return None");
855
856         // stepping through with nth(0)
857         {
858             let mut it = v.iter();
859             for i in 0..len {
860                 let next = it.nth(0).unwrap();
861                 assert_eq!(next as *const _, v_ptrs[i]);
862             }
863             assert_eq!(it.nth(0), None);
864         }
865
866         // next()
867         {
868             let mut it = v.iter_mut();
869             for i in 0..len {
870                 let remaining = len - i;
871                 assert_eq!(it.size_hint(), (remaining, Some(remaining)));
872
873                 let next = it.next().unwrap();
874                 assert_eq!(next as *mut _, v_ptrs[i]);
875             }
876             assert_eq!(it.size_hint(), (0, Some(0)));
877             assert_eq!(it.next(), None, "The final call to next() should return None");
878         }
879
880         // next_back()
881         {
882             let mut it = v.iter_mut();
883             for i in 0..len {
884                 let remaining = len - i;
885                 assert_eq!(it.size_hint(), (remaining, Some(remaining)));
886
887                 let prev = it.next_back().unwrap();
888                 assert_eq!(prev as *mut _, v_ptrs[remaining - 1]);
889             }
890             assert_eq!(it.size_hint(), (0, Some(0)));
891             assert_eq!(it.next_back(), None, "The final call to next_back() should return None");
892         }
893     }
894
895     // Make sure iterators and slice patterns yield consistent addresses for various types,
896     // including ZSTs.
897     test(0u32);
898     test(());
899     test([0u32; 0]); // ZST with alignment > 0
900     test_mut(0u32);
901     test_mut(());
902     test_mut([0u32; 0]); // ZST with alignment > 0
903 }
904
905 // The current implementation of SliceIndex fails to handle methods
906 // orthogonally from range types; therefore, it is worth testing
907 // all of the indexing operations on each input.
908 mod slice_index {
909     // This checks all six indexing methods, given an input range that
910     // should succeed. (it is NOT suitable for testing invalid inputs)
911     macro_rules! assert_range_eq {
912         ($arr:expr, $range:expr, $expected:expr) => {
913             let mut arr = $arr;
914             let mut expected = $expected;
915             {
916                 let s: &[_] = &arr;
917                 let expected: &[_] = &expected;
918
919                 assert_eq!(&s[$range], expected, "(in assertion for: index)");
920                 assert_eq!(s.get($range), Some(expected), "(in assertion for: get)");
921                 unsafe {
922                     assert_eq!(
923                         s.get_unchecked($range),
924                         expected,
925                         "(in assertion for: get_unchecked)",
926                     );
927                 }
928             }
929             {
930                 let s: &mut [_] = &mut arr;
931                 let expected: &mut [_] = &mut expected;
932
933                 assert_eq!(&mut s[$range], expected, "(in assertion for: index_mut)",);
934                 assert_eq!(
935                     s.get_mut($range),
936                     Some(&mut expected[..]),
937                     "(in assertion for: get_mut)",
938                 );
939                 unsafe {
940                     assert_eq!(
941                         s.get_unchecked_mut($range),
942                         expected,
943                         "(in assertion for: get_unchecked_mut)",
944                     );
945                 }
946             }
947         };
948     }
949
950     // Make sure the macro can actually detect bugs,
951     // because if it can't, then what are we even doing here?
952     //
953     // (Be aware this only demonstrates the ability to detect bugs
954     //  in the FIRST method that panics, as the macro is not designed
955     //  to be used in `should_panic`)
956     #[test]
957     #[should_panic(expected = "out of range")]
958     fn assert_range_eq_can_fail_by_panic() {
959         assert_range_eq!([0, 1, 2], 0..5, [0, 1, 2]);
960     }
961
962     // (Be aware this only demonstrates the ability to detect bugs
963     //  in the FIRST method it calls, as the macro is not designed
964     //  to be used in `should_panic`)
965     #[test]
966     #[should_panic(expected = "==")]
967     fn assert_range_eq_can_fail_by_inequality() {
968         assert_range_eq!([0, 1, 2], 0..2, [0, 1, 2]);
969     }
970
971     // Test cases for bad index operations.
972     //
973     // This generates `should_panic` test cases for Index/IndexMut
974     // and `None` test cases for get/get_mut.
975     macro_rules! panic_cases {
976         ($(
977             // each test case needs a unique name to namespace the tests
978             in mod $case_name:ident {
979                 data: $data:expr;
980
981                 // optional:
982                 //
983                 // one or more similar inputs for which data[input] succeeds,
984                 // and the corresponding output as an array.  This helps validate
985                 // "critical points" where an input range straddles the boundary
986                 // between valid and invalid.
987                 // (such as the input `len..len`, which is just barely valid)
988                 $(
989                     good: data[$good:expr] == $output:expr;
990                 )*
991
992                 bad: data[$bad:expr];
993                 message: $expect_msg:expr;
994             }
995         )*) => {$(
996             mod $case_name {
997                 #[test]
998                 fn pass() {
999                     let mut v = $data;
1000
1001                     $( assert_range_eq!($data, $good, $output); )*
1002
1003                     {
1004                         let v: &[_] = &v;
1005                         assert_eq!(v.get($bad), None, "(in None assertion for get)");
1006                     }
1007
1008                     {
1009                         let v: &mut [_] = &mut v;
1010                         assert_eq!(v.get_mut($bad), None, "(in None assertion for get_mut)");
1011                     }
1012                 }
1013
1014                 #[test]
1015                 #[should_panic(expected = $expect_msg)]
1016                 fn index_fail() {
1017                     let v = $data;
1018                     let v: &[_] = &v;
1019                     let _v = &v[$bad];
1020                 }
1021
1022                 #[test]
1023                 #[should_panic(expected = $expect_msg)]
1024                 fn index_mut_fail() {
1025                     let mut v = $data;
1026                     let v: &mut [_] = &mut v;
1027                     let _v = &mut v[$bad];
1028                 }
1029             }
1030         )*};
1031     }
1032
1033     #[test]
1034     fn simple() {
1035         let v = [0, 1, 2, 3, 4, 5];
1036
1037         assert_range_eq!(v, .., [0, 1, 2, 3, 4, 5]);
1038         assert_range_eq!(v, ..2, [0, 1]);
1039         assert_range_eq!(v, ..=1, [0, 1]);
1040         assert_range_eq!(v, 2.., [2, 3, 4, 5]);
1041         assert_range_eq!(v, 1..4, [1, 2, 3]);
1042         assert_range_eq!(v, 1..=3, [1, 2, 3]);
1043     }
1044
1045     panic_cases! {
1046         in mod rangefrom_len {
1047             data: [0, 1, 2, 3, 4, 5];
1048
1049             good: data[6..] == [];
1050             bad: data[7..];
1051             message: "but ends at"; // perhaps not ideal
1052         }
1053
1054         in mod rangeto_len {
1055             data: [0, 1, 2, 3, 4, 5];
1056
1057             good: data[..6] == [0, 1, 2, 3, 4, 5];
1058             bad: data[..7];
1059             message: "out of range";
1060         }
1061
1062         in mod rangetoinclusive_len {
1063             data: [0, 1, 2, 3, 4, 5];
1064
1065             good: data[..=5] == [0, 1, 2, 3, 4, 5];
1066             bad: data[..=6];
1067             message: "out of range";
1068         }
1069
1070         in mod range_len_len {
1071             data: [0, 1, 2, 3, 4, 5];
1072
1073             good: data[6..6] == [];
1074             bad: data[7..7];
1075             message: "out of range";
1076         }
1077
1078         in mod rangeinclusive_len_len {
1079             data: [0, 1, 2, 3, 4, 5];
1080
1081             good: data[6..=5] == [];
1082             bad: data[7..=6];
1083             message: "out of range";
1084         }
1085     }
1086
1087     panic_cases! {
1088         in mod range_neg_width {
1089             data: [0, 1, 2, 3, 4, 5];
1090
1091             good: data[4..4] == [];
1092             bad: data[4..3];
1093             message: "but ends at";
1094         }
1095
1096         in mod rangeinclusive_neg_width {
1097             data: [0, 1, 2, 3, 4, 5];
1098
1099             good: data[4..=3] == [];
1100             bad: data[4..=2];
1101             message: "but ends at";
1102         }
1103     }
1104
1105     panic_cases! {
1106         in mod rangeinclusive_overflow {
1107             data: [0, 1];
1108
1109             // note: using 0 specifically ensures that the result of overflowing is 0..0,
1110             //       so that `get` doesn't simply return None for the wrong reason.
1111             bad: data[0 ..= ::std::usize::MAX];
1112             message: "maximum usize";
1113         }
1114
1115         in mod rangetoinclusive_overflow {
1116             data: [0, 1];
1117
1118             bad: data[..= ::std::usize::MAX];
1119             message: "maximum usize";
1120         }
1121     } // panic_cases!
1122 }
1123
1124 #[test]
1125 fn test_find_rfind() {
1126     let v = [0, 1, 2, 3, 4, 5];
1127     let mut iter = v.iter();
1128     let mut i = v.len();
1129     while let Some(&elt) = iter.rfind(|_| true) {
1130         i -= 1;
1131         assert_eq!(elt, v[i]);
1132     }
1133     assert_eq!(i, 0);
1134     assert_eq!(v.iter().rfind(|&&x| x <= 3), Some(&3));
1135 }
1136
1137 #[test]
1138 fn test_iter_folds() {
1139     let a = [1, 2, 3, 4, 5]; // len>4 so the unroll is used
1140     assert_eq!(a.iter().fold(0, |acc, &x| 2 * acc + x), 57);
1141     assert_eq!(a.iter().rfold(0, |acc, &x| 2 * acc + x), 129);
1142     let fold = |acc: i32, &x| acc.checked_mul(2)?.checked_add(x);
1143     assert_eq!(a.iter().try_fold(0, &fold), Some(57));
1144     assert_eq!(a.iter().try_rfold(0, &fold), Some(129));
1145
1146     // short-circuiting try_fold, through other methods
1147     let a = [0, 1, 2, 3, 5, 5, 5, 7, 8, 9];
1148     let mut iter = a.iter();
1149     assert_eq!(iter.position(|&x| x == 3), Some(3));
1150     assert_eq!(iter.rfind(|&&x| x == 5), Some(&5));
1151     assert_eq!(iter.len(), 2);
1152 }
1153
1154 #[test]
1155 fn test_rotate_left() {
1156     const N: usize = 600;
1157     let a: &mut [_] = &mut [0; N];
1158     for i in 0..N {
1159         a[i] = i;
1160     }
1161
1162     a.rotate_left(42);
1163     let k = N - 42;
1164
1165     for i in 0..N {
1166         assert_eq!(a[(i + k) % N], i);
1167     }
1168 }
1169
1170 #[test]
1171 fn test_rotate_right() {
1172     const N: usize = 600;
1173     let a: &mut [_] = &mut [0; N];
1174     for i in 0..N {
1175         a[i] = i;
1176     }
1177
1178     a.rotate_right(42);
1179
1180     for i in 0..N {
1181         assert_eq!(a[(i + 42) % N], i);
1182     }
1183 }
1184
1185 #[test]
1186 #[cfg_attr(miri, ignore)] // Miri is too slow
1187 fn brute_force_rotate_test_0() {
1188     // In case of edge cases involving multiple algorithms
1189     let n = 300;
1190     for len in 0..n {
1191         for s in 0..len {
1192             let mut v = Vec::with_capacity(len);
1193             for i in 0..len {
1194                 v.push(i);
1195             }
1196             v[..].rotate_right(s);
1197             for i in 0..v.len() {
1198                 assert_eq!(v[i], v.len().wrapping_add(i.wrapping_sub(s)) % v.len());
1199             }
1200         }
1201     }
1202 }
1203
1204 #[test]
1205 fn brute_force_rotate_test_1() {
1206     // `ptr_rotate` covers so many kinds of pointer usage, that this is just a good test for
1207     // pointers in general. This uses a `[usize; 4]` to hit all algorithms without overwhelming miri
1208     let n = 30;
1209     for len in 0..n {
1210         for s in 0..len {
1211             let mut v: Vec<[usize; 4]> = Vec::with_capacity(len);
1212             for i in 0..len {
1213                 v.push([i, 0, 0, 0]);
1214             }
1215             v[..].rotate_right(s);
1216             for i in 0..v.len() {
1217                 assert_eq!(v[i][0], v.len().wrapping_add(i.wrapping_sub(s)) % v.len());
1218             }
1219         }
1220     }
1221 }
1222
1223 #[test]
1224 #[cfg(not(target_arch = "wasm32"))]
1225 fn sort_unstable() {
1226     use core::cmp::Ordering::{Equal, Greater, Less};
1227     use core::slice::heapsort;
1228     use rand::{rngs::StdRng, seq::SliceRandom, Rng, SeedableRng};
1229
1230     #[cfg(not(miri))] // Miri is too slow
1231     let large_range = 500..510;
1232     #[cfg(not(miri))] // Miri is too slow
1233     let rounds = 100;
1234
1235     #[cfg(miri)]
1236     let large_range = 0..0; // empty range
1237     #[cfg(miri)]
1238     let rounds = 1;
1239
1240     let mut v = [0; 600];
1241     let mut tmp = [0; 600];
1242     let mut rng = StdRng::from_entropy();
1243
1244     for len in (2..25).chain(large_range) {
1245         let v = &mut v[0..len];
1246         let tmp = &mut tmp[0..len];
1247
1248         for &modulus in &[5, 10, 100, 1000] {
1249             for _ in 0..rounds {
1250                 for i in 0..len {
1251                     v[i] = rng.gen::<i32>() % modulus;
1252                 }
1253
1254                 // Sort in default order.
1255                 tmp.copy_from_slice(v);
1256                 tmp.sort_unstable();
1257                 assert!(tmp.windows(2).all(|w| w[0] <= w[1]));
1258
1259                 // Sort in ascending order.
1260                 tmp.copy_from_slice(v);
1261                 tmp.sort_unstable_by(|a, b| a.cmp(b));
1262                 assert!(tmp.windows(2).all(|w| w[0] <= w[1]));
1263
1264                 // Sort in descending order.
1265                 tmp.copy_from_slice(v);
1266                 tmp.sort_unstable_by(|a, b| b.cmp(a));
1267                 assert!(tmp.windows(2).all(|w| w[0] >= w[1]));
1268
1269                 // Test heapsort using `<` operator.
1270                 tmp.copy_from_slice(v);
1271                 heapsort(tmp, |a, b| a < b);
1272                 assert!(tmp.windows(2).all(|w| w[0] <= w[1]));
1273
1274                 // Test heapsort using `>` operator.
1275                 tmp.copy_from_slice(v);
1276                 heapsort(tmp, |a, b| a > b);
1277                 assert!(tmp.windows(2).all(|w| w[0] >= w[1]));
1278             }
1279         }
1280     }
1281
1282     // Sort using a completely random comparison function.
1283     // This will reorder the elements *somehow*, but won't panic.
1284     for i in 0..v.len() {
1285         v[i] = i as i32;
1286     }
1287     v.sort_unstable_by(|_, _| *[Less, Equal, Greater].choose(&mut rng).unwrap());
1288     v.sort_unstable();
1289     for i in 0..v.len() {
1290         assert_eq!(v[i], i as i32);
1291     }
1292
1293     // Should not panic.
1294     [0i32; 0].sort_unstable();
1295     [(); 10].sort_unstable();
1296     [(); 100].sort_unstable();
1297
1298     let mut v = [0xDEADBEEFu64];
1299     v.sort_unstable();
1300     assert!(v == [0xDEADBEEF]);
1301 }
1302
1303 #[test]
1304 #[cfg(not(target_arch = "wasm32"))]
1305 #[cfg_attr(miri, ignore)] // Miri is too slow
1306 fn partition_at_index() {
1307     use core::cmp::Ordering::{Equal, Greater, Less};
1308     use rand::rngs::StdRng;
1309     use rand::seq::SliceRandom;
1310     use rand::{Rng, SeedableRng};
1311
1312     let mut rng = StdRng::from_entropy();
1313
1314     for len in (2..21).chain(500..501) {
1315         let mut orig = vec![0; len];
1316
1317         for &modulus in &[5, 10, 1000] {
1318             for _ in 0..10 {
1319                 for i in 0..len {
1320                     orig[i] = rng.gen::<i32>() % modulus;
1321                 }
1322
1323                 let v_sorted = {
1324                     let mut v = orig.clone();
1325                     v.sort();
1326                     v
1327                 };
1328
1329                 // Sort in default order.
1330                 for pivot in 0..len {
1331                     let mut v = orig.clone();
1332                     v.partition_at_index(pivot);
1333
1334                     assert_eq!(v_sorted[pivot], v[pivot]);
1335                     for i in 0..pivot {
1336                         for j in pivot..len {
1337                             assert!(v[i] <= v[j]);
1338                         }
1339                     }
1340                 }
1341
1342                 // Sort in ascending order.
1343                 for pivot in 0..len {
1344                     let mut v = orig.clone();
1345                     let (left, pivot, right) = v.partition_at_index_by(pivot, |a, b| a.cmp(b));
1346
1347                     assert_eq!(left.len() + right.len(), len - 1);
1348
1349                     for l in left {
1350                         assert!(l <= pivot);
1351                         for r in right.iter_mut() {
1352                             assert!(l <= r);
1353                             assert!(pivot <= r);
1354                         }
1355                     }
1356                 }
1357
1358                 // Sort in descending order.
1359                 let sort_descending_comparator = |a: &i32, b: &i32| b.cmp(a);
1360                 let v_sorted_descending = {
1361                     let mut v = orig.clone();
1362                     v.sort_by(sort_descending_comparator);
1363                     v
1364                 };
1365
1366                 for pivot in 0..len {
1367                     let mut v = orig.clone();
1368                     v.partition_at_index_by(pivot, sort_descending_comparator);
1369
1370                     assert_eq!(v_sorted_descending[pivot], v[pivot]);
1371                     for i in 0..pivot {
1372                         for j in pivot..len {
1373                             assert!(v[j] <= v[i]);
1374                         }
1375                     }
1376                 }
1377             }
1378         }
1379     }
1380
1381     // Sort at index using a completely random comparison function.
1382     // This will reorder the elements *somehow*, but won't panic.
1383     let mut v = [0; 500];
1384     for i in 0..v.len() {
1385         v[i] = i as i32;
1386     }
1387
1388     for pivot in 0..v.len() {
1389         v.partition_at_index_by(pivot, |_, _| *[Less, Equal, Greater].choose(&mut rng).unwrap());
1390         v.sort();
1391         for i in 0..v.len() {
1392             assert_eq!(v[i], i as i32);
1393         }
1394     }
1395
1396     // Should not panic.
1397     [(); 10].partition_at_index(0);
1398     [(); 10].partition_at_index(5);
1399     [(); 10].partition_at_index(9);
1400     [(); 100].partition_at_index(0);
1401     [(); 100].partition_at_index(50);
1402     [(); 100].partition_at_index(99);
1403
1404     let mut v = [0xDEADBEEFu64];
1405     v.partition_at_index(0);
1406     assert!(v == [0xDEADBEEF]);
1407 }
1408
1409 #[test]
1410 #[should_panic(expected = "index 0 greater than length of slice")]
1411 fn partition_at_index_zero_length() {
1412     [0i32; 0].partition_at_index(0);
1413 }
1414
1415 #[test]
1416 #[should_panic(expected = "index 20 greater than length of slice")]
1417 fn partition_at_index_past_length() {
1418     [0i32; 10].partition_at_index(20);
1419 }
1420
1421 pub mod memchr {
1422     use core::slice::memchr::{memchr, memrchr};
1423
1424     // test fallback implementations on all platforms
1425     #[test]
1426     fn matches_one() {
1427         assert_eq!(Some(0), memchr(b'a', b"a"));
1428     }
1429
1430     #[test]
1431     fn matches_begin() {
1432         assert_eq!(Some(0), memchr(b'a', b"aaaa"));
1433     }
1434
1435     #[test]
1436     fn matches_end() {
1437         assert_eq!(Some(4), memchr(b'z', b"aaaaz"));
1438     }
1439
1440     #[test]
1441     fn matches_nul() {
1442         assert_eq!(Some(4), memchr(b'\x00', b"aaaa\x00"));
1443     }
1444
1445     #[test]
1446     fn matches_past_nul() {
1447         assert_eq!(Some(5), memchr(b'z', b"aaaa\x00z"));
1448     }
1449
1450     #[test]
1451     fn no_match_empty() {
1452         assert_eq!(None, memchr(b'a', b""));
1453     }
1454
1455     #[test]
1456     fn no_match() {
1457         assert_eq!(None, memchr(b'a', b"xyz"));
1458     }
1459
1460     #[test]
1461     fn matches_one_reversed() {
1462         assert_eq!(Some(0), memrchr(b'a', b"a"));
1463     }
1464
1465     #[test]
1466     fn matches_begin_reversed() {
1467         assert_eq!(Some(3), memrchr(b'a', b"aaaa"));
1468     }
1469
1470     #[test]
1471     fn matches_end_reversed() {
1472         assert_eq!(Some(0), memrchr(b'z', b"zaaaa"));
1473     }
1474
1475     #[test]
1476     fn matches_nul_reversed() {
1477         assert_eq!(Some(4), memrchr(b'\x00', b"aaaa\x00"));
1478     }
1479
1480     #[test]
1481     fn matches_past_nul_reversed() {
1482         assert_eq!(Some(0), memrchr(b'z', b"z\x00aaaa"));
1483     }
1484
1485     #[test]
1486     fn no_match_empty_reversed() {
1487         assert_eq!(None, memrchr(b'a', b""));
1488     }
1489
1490     #[test]
1491     fn no_match_reversed() {
1492         assert_eq!(None, memrchr(b'a', b"xyz"));
1493     }
1494
1495     #[test]
1496     fn each_alignment_reversed() {
1497         let mut data = [1u8; 64];
1498         let needle = 2;
1499         let pos = 40;
1500         data[pos] = needle;
1501         for start in 0..16 {
1502             assert_eq!(Some(pos - start), memrchr(needle, &data[start..]));
1503         }
1504     }
1505 }
1506
1507 #[test]
1508 #[cfg_attr(miri, ignore)] // Miri does not compute a maximal `mid` for `align_offset`
1509 fn test_align_to_simple() {
1510     let bytes = [1u8, 2, 3, 4, 5, 6, 7];
1511     let (prefix, aligned, suffix) = unsafe { bytes.align_to::<u16>() };
1512     assert_eq!(aligned.len(), 3);
1513     assert!(prefix == [1] || suffix == [7]);
1514     let expect1 = [1 << 8 | 2, 3 << 8 | 4, 5 << 8 | 6];
1515     let expect2 = [1 | 2 << 8, 3 | 4 << 8, 5 | 6 << 8];
1516     let expect3 = [2 << 8 | 3, 4 << 8 | 5, 6 << 8 | 7];
1517     let expect4 = [2 | 3 << 8, 4 | 5 << 8, 6 | 7 << 8];
1518     assert!(
1519         aligned == expect1 || aligned == expect2 || aligned == expect3 || aligned == expect4,
1520         "aligned={:?} expected={:?} || {:?} || {:?} || {:?}",
1521         aligned,
1522         expect1,
1523         expect2,
1524         expect3,
1525         expect4
1526     );
1527 }
1528
1529 #[test]
1530 fn test_align_to_zst() {
1531     let bytes = [1, 2, 3, 4, 5, 6, 7];
1532     let (prefix, aligned, suffix) = unsafe { bytes.align_to::<()>() };
1533     assert_eq!(aligned.len(), 0);
1534     assert!(prefix == [1, 2, 3, 4, 5, 6, 7] || suffix == [1, 2, 3, 4, 5, 6, 7]);
1535 }
1536
1537 #[test]
1538 #[cfg_attr(miri, ignore)] // Miri does not compute a maximal `mid` for `align_offset`
1539 fn test_align_to_non_trivial() {
1540     #[repr(align(8))]
1541     struct U64(u64, u64);
1542     #[repr(align(8))]
1543     struct U64U64U32(u64, u64, u32);
1544     let data = [
1545         U64(1, 2),
1546         U64(3, 4),
1547         U64(5, 6),
1548         U64(7, 8),
1549         U64(9, 10),
1550         U64(11, 12),
1551         U64(13, 14),
1552         U64(15, 16),
1553     ];
1554     let (prefix, aligned, suffix) = unsafe { data.align_to::<U64U64U32>() };
1555     assert_eq!(aligned.len(), 4);
1556     assert_eq!(prefix.len() + suffix.len(), 2);
1557 }
1558
1559 #[test]
1560 fn test_align_to_empty_mid() {
1561     use core::mem;
1562
1563     // Make sure that we do not create empty unaligned slices for the mid part, even when the
1564     // overall slice is too short to contain an aligned address.
1565     let bytes = [1, 2, 3, 4, 5, 6, 7];
1566     type Chunk = u32;
1567     for offset in 0..4 {
1568         let (_, mid, _) = unsafe { bytes[offset..offset + 1].align_to::<Chunk>() };
1569         assert_eq!(mid.as_ptr() as usize % mem::align_of::<Chunk>(), 0);
1570     }
1571 }
1572
1573 #[test]
1574 fn test_slice_partition_dedup_by() {
1575     let mut slice: [i32; 9] = [1, -1, 2, 3, 1, -5, 5, -2, 2];
1576
1577     let (dedup, duplicates) = slice.partition_dedup_by(|a, b| a.abs() == b.abs());
1578
1579     assert_eq!(dedup, [1, 2, 3, 1, -5, -2]);
1580     assert_eq!(duplicates, [5, -1, 2]);
1581 }
1582
1583 #[test]
1584 fn test_slice_partition_dedup_empty() {
1585     let mut slice: [i32; 0] = [];
1586
1587     let (dedup, duplicates) = slice.partition_dedup();
1588
1589     assert_eq!(dedup, []);
1590     assert_eq!(duplicates, []);
1591 }
1592
1593 #[test]
1594 fn test_slice_partition_dedup_one() {
1595     let mut slice = [12];
1596
1597     let (dedup, duplicates) = slice.partition_dedup();
1598
1599     assert_eq!(dedup, [12]);
1600     assert_eq!(duplicates, []);
1601 }
1602
1603 #[test]
1604 fn test_slice_partition_dedup_multiple_ident() {
1605     let mut slice = [12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11];
1606
1607     let (dedup, duplicates) = slice.partition_dedup();
1608
1609     assert_eq!(dedup, [12, 11]);
1610     assert_eq!(duplicates, [12, 12, 12, 12, 11, 11, 11, 11, 11]);
1611 }
1612
1613 #[test]
1614 fn test_slice_partition_dedup_partialeq() {
1615     #[derive(Debug)]
1616     struct Foo(i32, i32);
1617
1618     impl PartialEq for Foo {
1619         fn eq(&self, other: &Foo) -> bool {
1620             self.0 == other.0
1621         }
1622     }
1623
1624     let mut slice = [Foo(0, 1), Foo(0, 5), Foo(1, 7), Foo(1, 9)];
1625
1626     let (dedup, duplicates) = slice.partition_dedup();
1627
1628     assert_eq!(dedup, [Foo(0, 1), Foo(1, 7)]);
1629     assert_eq!(duplicates, [Foo(0, 5), Foo(1, 9)]);
1630 }
1631
1632 #[test]
1633 fn test_copy_within() {
1634     // Start to end, with a RangeTo.
1635     let mut bytes = *b"Hello, World!";
1636     bytes.copy_within(..3, 10);
1637     assert_eq!(&bytes, b"Hello, WorHel");
1638
1639     // End to start, with a RangeFrom.
1640     let mut bytes = *b"Hello, World!";
1641     bytes.copy_within(10.., 0);
1642     assert_eq!(&bytes, b"ld!lo, World!");
1643
1644     // Overlapping, with a RangeInclusive.
1645     let mut bytes = *b"Hello, World!";
1646     bytes.copy_within(0..=11, 1);
1647     assert_eq!(&bytes, b"HHello, World");
1648
1649     // Whole slice, with a RangeFull.
1650     let mut bytes = *b"Hello, World!";
1651     bytes.copy_within(.., 0);
1652     assert_eq!(&bytes, b"Hello, World!");
1653
1654     // Ensure that copying at the end of slice won't cause UB.
1655     let mut bytes = *b"Hello, World!";
1656     bytes.copy_within(13..13, 5);
1657     assert_eq!(&bytes, b"Hello, World!");
1658     bytes.copy_within(5..5, 13);
1659     assert_eq!(&bytes, b"Hello, World!");
1660 }
1661
1662 #[test]
1663 #[should_panic(expected = "src is out of bounds")]
1664 fn test_copy_within_panics_src_too_long() {
1665     let mut bytes = *b"Hello, World!";
1666     // The length is only 13, so 14 is out of bounds.
1667     bytes.copy_within(10..14, 0);
1668 }
1669
1670 #[test]
1671 #[should_panic(expected = "dest is out of bounds")]
1672 fn test_copy_within_panics_dest_too_long() {
1673     let mut bytes = *b"Hello, World!";
1674     // The length is only 13, so a slice of length 4 starting at index 10 is out of bounds.
1675     bytes.copy_within(0..4, 10);
1676 }
1677 #[test]
1678 #[should_panic(expected = "src end is before src start")]
1679 fn test_copy_within_panics_src_inverted() {
1680     let mut bytes = *b"Hello, World!";
1681     // 2 is greater than 1, so this range is invalid.
1682     bytes.copy_within(2..1, 0);
1683 }
1684 #[test]
1685 #[should_panic(expected = "attempted to index slice up to maximum usize")]
1686 fn test_copy_within_panics_src_out_of_bounds() {
1687     let mut bytes = *b"Hello, World!";
1688     // an inclusive range ending at usize::max_value() would make src_end overflow
1689     bytes.copy_within(usize::max_value()..=usize::max_value(), 0);
1690 }
1691
1692 #[test]
1693 fn test_is_sorted() {
1694     let empty: [i32; 0] = [];
1695
1696     assert!([1, 2, 2, 9].is_sorted());
1697     assert!(![1, 3, 2].is_sorted());
1698     assert!([0].is_sorted());
1699     assert!(empty.is_sorted());
1700     assert!(![0.0, 1.0, std::f32::NAN].is_sorted());
1701     assert!([-2, -1, 0, 3].is_sorted());
1702     assert!(![-2i32, -1, 0, 3].is_sorted_by_key(|n| n.abs()));
1703     assert!(!["c", "bb", "aaa"].is_sorted());
1704     assert!(["c", "bb", "aaa"].is_sorted_by_key(|s| s.len()));
1705 }