]> git.lizzy.rs Git - rust.git/blob - src/libcollections/tests/slice.rs
Auto merge of #42394 - ollie27:rustdoc_deref_box, r=QuietMisdreavus
[rust.git] / src / libcollections / tests / slice.rs
1 // Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 use std::cmp::Ordering::{Equal, Greater, Less};
12 use std::mem;
13 use std::__rand::{Rng, thread_rng};
14 use std::rc::Rc;
15
16 fn square(n: usize) -> usize {
17     n * n
18 }
19
20 fn is_odd(n: &usize) -> bool {
21     *n % 2 == 1
22 }
23
24 #[test]
25 fn test_from_fn() {
26     // Test on-stack from_fn.
27     let mut v: Vec<_> = (0..3).map(square).collect();
28     {
29         let v = v;
30         assert_eq!(v.len(), 3);
31         assert_eq!(v[0], 0);
32         assert_eq!(v[1], 1);
33         assert_eq!(v[2], 4);
34     }
35
36     // Test on-heap from_fn.
37     v = (0..5).map(square).collect();
38     {
39         let v = v;
40         assert_eq!(v.len(), 5);
41         assert_eq!(v[0], 0);
42         assert_eq!(v[1], 1);
43         assert_eq!(v[2], 4);
44         assert_eq!(v[3], 9);
45         assert_eq!(v[4], 16);
46     }
47 }
48
49 #[test]
50 fn test_from_elem() {
51     // Test on-stack from_elem.
52     let mut v = vec![10, 10];
53     {
54         let v = v;
55         assert_eq!(v.len(), 2);
56         assert_eq!(v[0], 10);
57         assert_eq!(v[1], 10);
58     }
59
60     // Test on-heap from_elem.
61     v = vec![20; 6];
62     {
63         let v = &v[..];
64         assert_eq!(v[0], 20);
65         assert_eq!(v[1], 20);
66         assert_eq!(v[2], 20);
67         assert_eq!(v[3], 20);
68         assert_eq!(v[4], 20);
69         assert_eq!(v[5], 20);
70     }
71 }
72
73 #[test]
74 fn test_is_empty() {
75     let xs: [i32; 0] = [];
76     assert!(xs.is_empty());
77     assert!(![0].is_empty());
78 }
79
80 #[test]
81 fn test_len_divzero() {
82     type Z = [i8; 0];
83     let v0: &[Z] = &[];
84     let v1: &[Z] = &[[]];
85     let v2: &[Z] = &[[], []];
86     assert_eq!(mem::size_of::<Z>(), 0);
87     assert_eq!(v0.len(), 0);
88     assert_eq!(v1.len(), 1);
89     assert_eq!(v2.len(), 2);
90 }
91
92 #[test]
93 fn test_get() {
94     let mut a = vec![11];
95     assert_eq!(a.get(1), None);
96     a = vec![11, 12];
97     assert_eq!(a.get(1).unwrap(), &12);
98     a = vec![11, 12, 13];
99     assert_eq!(a.get(1).unwrap(), &12);
100 }
101
102 #[test]
103 fn test_first() {
104     let mut a = vec![];
105     assert_eq!(a.first(), None);
106     a = vec![11];
107     assert_eq!(a.first().unwrap(), &11);
108     a = vec![11, 12];
109     assert_eq!(a.first().unwrap(), &11);
110 }
111
112 #[test]
113 fn test_first_mut() {
114     let mut a = vec![];
115     assert_eq!(a.first_mut(), None);
116     a = vec![11];
117     assert_eq!(*a.first_mut().unwrap(), 11);
118     a = vec![11, 12];
119     assert_eq!(*a.first_mut().unwrap(), 11);
120 }
121
122 #[test]
123 fn test_split_first() {
124     let mut a = vec![11];
125     let b: &[i32] = &[];
126     assert!(b.split_first().is_none());
127     assert_eq!(a.split_first(), Some((&11, b)));
128     a = vec![11, 12];
129     let b: &[i32] = &[12];
130     assert_eq!(a.split_first(), Some((&11, b)));
131 }
132
133 #[test]
134 fn test_split_first_mut() {
135     let mut a = vec![11];
136     let b: &mut [i32] = &mut [];
137     assert!(b.split_first_mut().is_none());
138     assert!(a.split_first_mut() == Some((&mut 11, b)));
139     a = vec![11, 12];
140     let b: &mut [_] = &mut [12];
141     assert!(a.split_first_mut() == Some((&mut 11, b)));
142 }
143
144 #[test]
145 fn test_split_last() {
146     let mut a = vec![11];
147     let b: &[i32] = &[];
148     assert!(b.split_last().is_none());
149     assert_eq!(a.split_last(), Some((&11, b)));
150     a = vec![11, 12];
151     let b: &[_] = &[11];
152     assert_eq!(a.split_last(), Some((&12, b)));
153 }
154
155 #[test]
156 fn test_split_last_mut() {
157     let mut a = vec![11];
158     let b: &mut [i32] = &mut [];
159     assert!(b.split_last_mut().is_none());
160     assert!(a.split_last_mut() == Some((&mut 11, b)));
161
162     a = vec![11, 12];
163     let b: &mut [_] = &mut [11];
164     assert!(a.split_last_mut() == Some((&mut 12, b)));
165 }
166
167 #[test]
168 fn test_last() {
169     let mut a = vec![];
170     assert_eq!(a.last(), None);
171     a = vec![11];
172     assert_eq!(a.last().unwrap(), &11);
173     a = vec![11, 12];
174     assert_eq!(a.last().unwrap(), &12);
175 }
176
177 #[test]
178 fn test_last_mut() {
179     let mut a = vec![];
180     assert_eq!(a.last_mut(), None);
181     a = vec![11];
182     assert_eq!(*a.last_mut().unwrap(), 11);
183     a = vec![11, 12];
184     assert_eq!(*a.last_mut().unwrap(), 12);
185 }
186
187 #[test]
188 fn test_slice() {
189     // Test fixed length vector.
190     let vec_fixed = [1, 2, 3, 4];
191     let v_a = vec_fixed[1..vec_fixed.len()].to_vec();
192     assert_eq!(v_a.len(), 3);
193
194     assert_eq!(v_a[0], 2);
195     assert_eq!(v_a[1], 3);
196     assert_eq!(v_a[2], 4);
197
198     // Test on stack.
199     let vec_stack: &[_] = &[1, 2, 3];
200     let v_b = vec_stack[1..3].to_vec();
201     assert_eq!(v_b.len(), 2);
202
203     assert_eq!(v_b[0], 2);
204     assert_eq!(v_b[1], 3);
205
206     // Test `Box<[T]>`
207     let vec_unique = vec![1, 2, 3, 4, 5, 6];
208     let v_d = vec_unique[1..6].to_vec();
209     assert_eq!(v_d.len(), 5);
210
211     assert_eq!(v_d[0], 2);
212     assert_eq!(v_d[1], 3);
213     assert_eq!(v_d[2], 4);
214     assert_eq!(v_d[3], 5);
215     assert_eq!(v_d[4], 6);
216 }
217
218 #[test]
219 fn test_slice_from() {
220     let vec: &[_] = &[1, 2, 3, 4];
221     assert_eq!(&vec[..], vec);
222     let b: &[_] = &[3, 4];
223     assert_eq!(&vec[2..], b);
224     let b: &[_] = &[];
225     assert_eq!(&vec[4..], b);
226 }
227
228 #[test]
229 fn test_slice_to() {
230     let vec: &[_] = &[1, 2, 3, 4];
231     assert_eq!(&vec[..4], vec);
232     let b: &[_] = &[1, 2];
233     assert_eq!(&vec[..2], b);
234     let b: &[_] = &[];
235     assert_eq!(&vec[..0], b);
236 }
237
238
239 #[test]
240 fn test_pop() {
241     let mut v = vec![5];
242     let e = v.pop();
243     assert_eq!(v.len(), 0);
244     assert_eq!(e, Some(5));
245     let f = v.pop();
246     assert_eq!(f, None);
247     let g = v.pop();
248     assert_eq!(g, None);
249 }
250
251 #[test]
252 fn test_swap_remove() {
253     let mut v = vec![1, 2, 3, 4, 5];
254     let mut e = v.swap_remove(0);
255     assert_eq!(e, 1);
256     assert_eq!(v, [5, 2, 3, 4]);
257     e = v.swap_remove(3);
258     assert_eq!(e, 4);
259     assert_eq!(v, [5, 2, 3]);
260 }
261
262 #[test]
263 #[should_panic]
264 fn test_swap_remove_fail() {
265     let mut v = vec![1];
266     let _ = v.swap_remove(0);
267     let _ = v.swap_remove(0);
268 }
269
270 #[test]
271 fn test_swap_remove_noncopyable() {
272     // Tests that we don't accidentally run destructors twice.
273     let mut v: Vec<Box<_>> = Vec::new();
274     v.push(box 0);
275     v.push(box 0);
276     v.push(box 0);
277     let mut _e = v.swap_remove(0);
278     assert_eq!(v.len(), 2);
279     _e = v.swap_remove(1);
280     assert_eq!(v.len(), 1);
281     _e = v.swap_remove(0);
282     assert_eq!(v.len(), 0);
283 }
284
285 #[test]
286 fn test_push() {
287     // Test on-stack push().
288     let mut v = vec![];
289     v.push(1);
290     assert_eq!(v.len(), 1);
291     assert_eq!(v[0], 1);
292
293     // Test on-heap push().
294     v.push(2);
295     assert_eq!(v.len(), 2);
296     assert_eq!(v[0], 1);
297     assert_eq!(v[1], 2);
298 }
299
300 #[test]
301 fn test_truncate() {
302     let mut v: Vec<Box<_>> = vec![box 6, box 5, box 4];
303     v.truncate(1);
304     let v = v;
305     assert_eq!(v.len(), 1);
306     assert_eq!(*(v[0]), 6);
307     // If the unsafe block didn't drop things properly, we blow up here.
308 }
309
310 #[test]
311 fn test_clear() {
312     let mut v: Vec<Box<_>> = vec![box 6, box 5, box 4];
313     v.clear();
314     assert_eq!(v.len(), 0);
315     // If the unsafe block didn't drop things properly, we blow up here.
316 }
317
318 #[test]
319 fn test_retain() {
320     let mut v = vec![1, 2, 3, 4, 5];
321     v.retain(is_odd);
322     assert_eq!(v, [1, 3, 5]);
323 }
324
325 #[test]
326 fn test_binary_search() {
327     assert_eq!([1, 2, 3, 4, 5].binary_search(&5).ok(), Some(4));
328     assert_eq!([1, 2, 3, 4, 5].binary_search(&4).ok(), Some(3));
329     assert_eq!([1, 2, 3, 4, 5].binary_search(&3).ok(), Some(2));
330     assert_eq!([1, 2, 3, 4, 5].binary_search(&2).ok(), Some(1));
331     assert_eq!([1, 2, 3, 4, 5].binary_search(&1).ok(), Some(0));
332
333     assert_eq!([2, 4, 6, 8, 10].binary_search(&1).ok(), None);
334     assert_eq!([2, 4, 6, 8, 10].binary_search(&5).ok(), None);
335     assert_eq!([2, 4, 6, 8, 10].binary_search(&4).ok(), Some(1));
336     assert_eq!([2, 4, 6, 8, 10].binary_search(&10).ok(), Some(4));
337
338     assert_eq!([2, 4, 6, 8].binary_search(&1).ok(), None);
339     assert_eq!([2, 4, 6, 8].binary_search(&5).ok(), None);
340     assert_eq!([2, 4, 6, 8].binary_search(&4).ok(), Some(1));
341     assert_eq!([2, 4, 6, 8].binary_search(&8).ok(), Some(3));
342
343     assert_eq!([2, 4, 6].binary_search(&1).ok(), None);
344     assert_eq!([2, 4, 6].binary_search(&5).ok(), None);
345     assert_eq!([2, 4, 6].binary_search(&4).ok(), Some(1));
346     assert_eq!([2, 4, 6].binary_search(&6).ok(), Some(2));
347
348     assert_eq!([2, 4].binary_search(&1).ok(), None);
349     assert_eq!([2, 4].binary_search(&5).ok(), None);
350     assert_eq!([2, 4].binary_search(&2).ok(), Some(0));
351     assert_eq!([2, 4].binary_search(&4).ok(), Some(1));
352
353     assert_eq!([2].binary_search(&1).ok(), None);
354     assert_eq!([2].binary_search(&5).ok(), None);
355     assert_eq!([2].binary_search(&2).ok(), Some(0));
356
357     assert_eq!([].binary_search(&1).ok(), None);
358     assert_eq!([].binary_search(&5).ok(), None);
359
360     assert!([1, 1, 1, 1, 1].binary_search(&1).ok() != None);
361     assert!([1, 1, 1, 1, 2].binary_search(&1).ok() != None);
362     assert!([1, 1, 1, 2, 2].binary_search(&1).ok() != None);
363     assert!([1, 1, 2, 2, 2].binary_search(&1).ok() != None);
364     assert_eq!([1, 2, 2, 2, 2].binary_search(&1).ok(), Some(0));
365
366     assert_eq!([1, 2, 3, 4, 5].binary_search(&6).ok(), None);
367     assert_eq!([1, 2, 3, 4, 5].binary_search(&0).ok(), None);
368 }
369
370 #[test]
371 fn test_reverse() {
372     let mut v = vec![10, 20];
373     assert_eq!(v[0], 10);
374     assert_eq!(v[1], 20);
375     v.reverse();
376     assert_eq!(v[0], 20);
377     assert_eq!(v[1], 10);
378
379     let mut v3 = Vec::<i32>::new();
380     v3.reverse();
381     assert!(v3.is_empty());
382
383     // check the 1-byte-types path
384     let mut v = (-50..51i8).collect::<Vec<_>>();
385     v.reverse();
386     assert_eq!(v, (-50..51i8).rev().collect::<Vec<_>>());
387
388     // check the 2-byte-types path
389     let mut v = (-50..51i16).collect::<Vec<_>>();
390     v.reverse();
391     assert_eq!(v, (-50..51i16).rev().collect::<Vec<_>>());
392 }
393
394 #[test]
395 fn test_sort() {
396     let mut rng = thread_rng();
397
398     for len in (2..25).chain(500..510) {
399         for _ in 0..100 {
400             let mut v: Vec<_> = rng.gen_iter::<i32>().take(len).collect();
401             let mut v1 = v.clone();
402
403             v.sort();
404             assert!(v.windows(2).all(|w| w[0] <= w[1]));
405
406             v1.sort_by(|a, b| a.cmp(b));
407             assert!(v1.windows(2).all(|w| w[0] <= w[1]));
408
409             v1.sort_by(|a, b| b.cmp(a));
410             assert!(v1.windows(2).all(|w| w[0] >= w[1]));
411         }
412     }
413
414     // Sort using a completely random comparison function.
415     // This will reorder the elements *somehow*, but won't panic.
416     let mut v = [0; 500];
417     for i in 0..v.len() {
418         v[i] = i as i32;
419     }
420     v.sort_by(|_, _| *rng.choose(&[Less, Equal, Greater]).unwrap());
421     v.sort();
422     for i in 0..v.len() {
423         assert_eq!(v[i], i as i32);
424     }
425
426     // Should not panic.
427     [0i32; 0].sort();
428     [(); 10].sort();
429     [(); 100].sort();
430
431     let mut v = [0xDEADBEEFu64];
432     v.sort();
433     assert!(v == [0xDEADBEEF]);
434 }
435
436 #[test]
437 fn test_sort_stability() {
438     for len in (2..25).chain(500..510) {
439         for _ in 0..10 {
440             let mut counts = [0; 10];
441
442             // create a vector like [(6, 1), (5, 1), (6, 2), ...],
443             // where the first item of each tuple is random, but
444             // the second item represents which occurrence of that
445             // number this element is, i.e. the second elements
446             // will occur in sorted order.
447             let mut v: Vec<_> = (0..len)
448                 .map(|_| {
449                     let n = thread_rng().gen::<usize>() % 10;
450                     counts[n] += 1;
451                     (n, counts[n])
452                 })
453                 .collect();
454
455             // only sort on the first element, so an unstable sort
456             // may mix up the counts.
457             v.sort_by(|&(a, _), &(b, _)| a.cmp(&b));
458
459             // this comparison includes the count (the second item
460             // of the tuple), so elements with equal first items
461             // will need to be ordered with increasing
462             // counts... i.e. exactly asserting that this sort is
463             // stable.
464             assert!(v.windows(2).all(|w| w[0] <= w[1]));
465         }
466     }
467 }
468
469 #[test]
470 fn test_rotate() {
471     let expected: Vec<_> = (0..13).collect();
472     let mut v = Vec::new();
473
474     // no-ops
475     v.clone_from(&expected);
476     v.rotate(0);
477     assert_eq!(v, expected);
478     v.rotate(expected.len());
479     assert_eq!(v, expected);
480     let mut zst_array = [(), (), ()];
481     zst_array.rotate(2);
482
483     // happy path
484     v = (5..13).chain(0..5).collect();
485     v.rotate(8);
486     assert_eq!(v, expected);
487
488     let expected: Vec<_> = (0..1000).collect();
489
490     // small rotations in large slice, uses ptr::copy
491     v = (2..1000).chain(0..2).collect();
492     v.rotate(998);
493     assert_eq!(v, expected);
494     v = (998..1000).chain(0..998).collect();
495     v.rotate(2);
496     assert_eq!(v, expected);
497
498     // non-small prime rotation, has a few rounds of swapping
499     v = (389..1000).chain(0..389).collect();
500     v.rotate(1000-389);
501     assert_eq!(v, expected);
502 }
503
504 #[test]
505 fn test_concat() {
506     let v: [Vec<i32>; 0] = [];
507     let c = v.concat();
508     assert_eq!(c, []);
509     let d = [vec![1], vec![2, 3]].concat();
510     assert_eq!(d, [1, 2, 3]);
511
512     let v: &[&[_]] = &[&[1], &[2, 3]];
513     assert_eq!(v.join(&0), [1, 0, 2, 3]);
514     let v: &[&[_]] = &[&[1], &[2], &[3]];
515     assert_eq!(v.join(&0), [1, 0, 2, 0, 3]);
516 }
517
518 #[test]
519 fn test_join() {
520     let v: [Vec<i32>; 0] = [];
521     assert_eq!(v.join(&0), []);
522     assert_eq!([vec![1], vec![2, 3]].join(&0), [1, 0, 2, 3]);
523     assert_eq!([vec![1], vec![2], vec![3]].join(&0), [1, 0, 2, 0, 3]);
524
525     let v: [&[_]; 2] = [&[1], &[2, 3]];
526     assert_eq!(v.join(&0), [1, 0, 2, 3]);
527     let v: [&[_]; 3] = [&[1], &[2], &[3]];
528     assert_eq!(v.join(&0), [1, 0, 2, 0, 3]);
529 }
530
531 #[test]
532 fn test_insert() {
533     let mut a = vec![1, 2, 4];
534     a.insert(2, 3);
535     assert_eq!(a, [1, 2, 3, 4]);
536
537     let mut a = vec![1, 2, 3];
538     a.insert(0, 0);
539     assert_eq!(a, [0, 1, 2, 3]);
540
541     let mut a = vec![1, 2, 3];
542     a.insert(3, 4);
543     assert_eq!(a, [1, 2, 3, 4]);
544
545     let mut a = vec![];
546     a.insert(0, 1);
547     assert_eq!(a, [1]);
548 }
549
550 #[test]
551 #[should_panic]
552 fn test_insert_oob() {
553     let mut a = vec![1, 2, 3];
554     a.insert(4, 5);
555 }
556
557 #[test]
558 fn test_remove() {
559     let mut a = vec![1, 2, 3, 4];
560
561     assert_eq!(a.remove(2), 3);
562     assert_eq!(a, [1, 2, 4]);
563
564     assert_eq!(a.remove(2), 4);
565     assert_eq!(a, [1, 2]);
566
567     assert_eq!(a.remove(0), 1);
568     assert_eq!(a, [2]);
569
570     assert_eq!(a.remove(0), 2);
571     assert_eq!(a, []);
572 }
573
574 #[test]
575 #[should_panic]
576 fn test_remove_fail() {
577     let mut a = vec![1];
578     let _ = a.remove(0);
579     let _ = a.remove(0);
580 }
581
582 #[test]
583 fn test_capacity() {
584     let mut v = vec![0];
585     v.reserve_exact(10);
586     assert!(v.capacity() >= 11);
587 }
588
589 #[test]
590 fn test_slice_2() {
591     let v = vec![1, 2, 3, 4, 5];
592     let v = &v[1..3];
593     assert_eq!(v.len(), 2);
594     assert_eq!(v[0], 2);
595     assert_eq!(v[1], 3);
596 }
597
598 macro_rules! assert_order {
599     (Greater, $a:expr, $b:expr) => {
600         assert_eq!($a.cmp($b), Greater);
601         assert!($a > $b);
602     };
603     (Less, $a:expr, $b:expr) => {
604         assert_eq!($a.cmp($b), Less);
605         assert!($a < $b);
606     };
607     (Equal, $a:expr, $b:expr) => {
608         assert_eq!($a.cmp($b), Equal);
609         assert_eq!($a, $b);
610     }
611 }
612
613 #[test]
614 fn test_total_ord_u8() {
615     let c = &[1u8, 2, 3];
616     assert_order!(Greater, &[1u8, 2, 3, 4][..], &c[..]);
617     let c = &[1u8, 2, 3, 4];
618     assert_order!(Less, &[1u8, 2, 3][..], &c[..]);
619     let c = &[1u8, 2, 3, 6];
620     assert_order!(Equal, &[1u8, 2, 3, 6][..], &c[..]);
621     let c = &[1u8, 2, 3, 4, 5, 6];
622     assert_order!(Less, &[1u8, 2, 3, 4, 5, 5, 5, 5][..], &c[..]);
623     let c = &[1u8, 2, 3, 4];
624     assert_order!(Greater, &[2u8, 2][..], &c[..]);
625 }
626
627
628 #[test]
629 fn test_total_ord_i32() {
630     let c = &[1, 2, 3];
631     assert_order!(Greater, &[1, 2, 3, 4][..], &c[..]);
632     let c = &[1, 2, 3, 4];
633     assert_order!(Less, &[1, 2, 3][..], &c[..]);
634     let c = &[1, 2, 3, 6];
635     assert_order!(Equal, &[1, 2, 3, 6][..], &c[..]);
636     let c = &[1, 2, 3, 4, 5, 6];
637     assert_order!(Less, &[1, 2, 3, 4, 5, 5, 5, 5][..], &c[..]);
638     let c = &[1, 2, 3, 4];
639     assert_order!(Greater, &[2, 2][..], &c[..]);
640 }
641
642 #[test]
643 fn test_iterator() {
644     let xs = [1, 2, 5, 10, 11];
645     let mut it = xs.iter();
646     assert_eq!(it.size_hint(), (5, Some(5)));
647     assert_eq!(it.next().unwrap(), &1);
648     assert_eq!(it.size_hint(), (4, Some(4)));
649     assert_eq!(it.next().unwrap(), &2);
650     assert_eq!(it.size_hint(), (3, Some(3)));
651     assert_eq!(it.next().unwrap(), &5);
652     assert_eq!(it.size_hint(), (2, Some(2)));
653     assert_eq!(it.next().unwrap(), &10);
654     assert_eq!(it.size_hint(), (1, Some(1)));
655     assert_eq!(it.next().unwrap(), &11);
656     assert_eq!(it.size_hint(), (0, Some(0)));
657     assert!(it.next().is_none());
658 }
659
660 #[test]
661 fn test_iter_size_hints() {
662     let mut xs = [1, 2, 5, 10, 11];
663     assert_eq!(xs.iter().size_hint(), (5, Some(5)));
664     assert_eq!(xs.iter_mut().size_hint(), (5, Some(5)));
665 }
666
667 #[test]
668 fn test_iter_as_slice() {
669     let xs = [1, 2, 5, 10, 11];
670     let mut iter = xs.iter();
671     assert_eq!(iter.as_slice(), &[1, 2, 5, 10, 11]);
672     iter.next();
673     assert_eq!(iter.as_slice(), &[2, 5, 10, 11]);
674 }
675
676 #[test]
677 fn test_iter_as_ref() {
678     let xs = [1, 2, 5, 10, 11];
679     let mut iter = xs.iter();
680     assert_eq!(iter.as_ref(), &[1, 2, 5, 10, 11]);
681     iter.next();
682     assert_eq!(iter.as_ref(), &[2, 5, 10, 11]);
683 }
684
685 #[test]
686 fn test_iter_clone() {
687     let xs = [1, 2, 5];
688     let mut it = xs.iter();
689     it.next();
690     let mut jt = it.clone();
691     assert_eq!(it.next(), jt.next());
692     assert_eq!(it.next(), jt.next());
693     assert_eq!(it.next(), jt.next());
694 }
695
696 #[test]
697 fn test_iter_is_empty() {
698     let xs = [1, 2, 5, 10, 11];
699     for i in 0..xs.len() {
700         for j in i..xs.len() {
701             assert_eq!(xs[i..j].iter().is_empty(), xs[i..j].is_empty());
702         }
703     }
704 }
705
706 #[test]
707 fn test_mut_iterator() {
708     let mut xs = [1, 2, 3, 4, 5];
709     for x in &mut xs {
710         *x += 1;
711     }
712     assert!(xs == [2, 3, 4, 5, 6])
713 }
714
715 #[test]
716 fn test_rev_iterator() {
717
718     let xs = [1, 2, 5, 10, 11];
719     let ys = [11, 10, 5, 2, 1];
720     let mut i = 0;
721     for &x in xs.iter().rev() {
722         assert_eq!(x, ys[i]);
723         i += 1;
724     }
725     assert_eq!(i, 5);
726 }
727
728 #[test]
729 fn test_mut_rev_iterator() {
730     let mut xs = [1, 2, 3, 4, 5];
731     for (i, x) in xs.iter_mut().rev().enumerate() {
732         *x += i;
733     }
734     assert!(xs == [5, 5, 5, 5, 5])
735 }
736
737 #[test]
738 fn test_move_iterator() {
739     let xs = vec![1, 2, 3, 4, 5];
740     assert_eq!(xs.into_iter().fold(0, |a: usize, b: usize| 10 * a + b),
741                12345);
742 }
743
744 #[test]
745 fn test_move_rev_iterator() {
746     let xs = vec![1, 2, 3, 4, 5];
747     assert_eq!(xs.into_iter().rev().fold(0, |a: usize, b: usize| 10 * a + b),
748                54321);
749 }
750
751 #[test]
752 fn test_splitator() {
753     let xs = &[1, 2, 3, 4, 5];
754
755     let splits: &[&[_]] = &[&[1], &[3], &[5]];
756     assert_eq!(xs.split(|x| *x % 2 == 0).collect::<Vec<_>>(), splits);
757     let splits: &[&[_]] = &[&[], &[2, 3, 4, 5]];
758     assert_eq!(xs.split(|x| *x == 1).collect::<Vec<_>>(), splits);
759     let splits: &[&[_]] = &[&[1, 2, 3, 4], &[]];
760     assert_eq!(xs.split(|x| *x == 5).collect::<Vec<_>>(), splits);
761     let splits: &[&[_]] = &[&[1, 2, 3, 4, 5]];
762     assert_eq!(xs.split(|x| *x == 10).collect::<Vec<_>>(), splits);
763     let splits: &[&[_]] = &[&[], &[], &[], &[], &[], &[]];
764     assert_eq!(xs.split(|_| true).collect::<Vec<&[i32]>>(), splits);
765
766     let xs: &[i32] = &[];
767     let splits: &[&[i32]] = &[&[]];
768     assert_eq!(xs.split(|x| *x == 5).collect::<Vec<&[i32]>>(), splits);
769 }
770
771 #[test]
772 fn test_splitnator() {
773     let xs = &[1, 2, 3, 4, 5];
774
775     let splits: &[&[_]] = &[&[1, 2, 3, 4, 5]];
776     assert_eq!(xs.splitn(1, |x| *x % 2 == 0).collect::<Vec<_>>(), splits);
777     let splits: &[&[_]] = &[&[1], &[3, 4, 5]];
778     assert_eq!(xs.splitn(2, |x| *x % 2 == 0).collect::<Vec<_>>(), splits);
779     let splits: &[&[_]] = &[&[], &[], &[], &[4, 5]];
780     assert_eq!(xs.splitn(4, |_| true).collect::<Vec<_>>(), splits);
781
782     let xs: &[i32] = &[];
783     let splits: &[&[i32]] = &[&[]];
784     assert_eq!(xs.splitn(2, |x| *x == 5).collect::<Vec<_>>(), splits);
785 }
786
787 #[test]
788 fn test_splitnator_mut() {
789     let xs = &mut [1, 2, 3, 4, 5];
790
791     let splits: &[&mut [_]] = &[&mut [1, 2, 3, 4, 5]];
792     assert_eq!(xs.splitn_mut(1, |x| *x % 2 == 0).collect::<Vec<_>>(),
793                splits);
794     let splits: &[&mut [_]] = &[&mut [1], &mut [3, 4, 5]];
795     assert_eq!(xs.splitn_mut(2, |x| *x % 2 == 0).collect::<Vec<_>>(),
796                splits);
797     let splits: &[&mut [_]] = &[&mut [], &mut [], &mut [], &mut [4, 5]];
798     assert_eq!(xs.splitn_mut(4, |_| true).collect::<Vec<_>>(), splits);
799
800     let xs: &mut [i32] = &mut [];
801     let splits: &[&mut [i32]] = &[&mut []];
802     assert_eq!(xs.splitn_mut(2, |x| *x == 5).collect::<Vec<_>>(), splits);
803 }
804
805 #[test]
806 fn test_rsplitator() {
807     let xs = &[1, 2, 3, 4, 5];
808
809     let splits: &[&[_]] = &[&[5], &[3], &[1]];
810     assert_eq!(xs.split(|x| *x % 2 == 0).rev().collect::<Vec<_>>(), splits);
811     let splits: &[&[_]] = &[&[2, 3, 4, 5], &[]];
812     assert_eq!(xs.split(|x| *x == 1).rev().collect::<Vec<_>>(), splits);
813     let splits: &[&[_]] = &[&[], &[1, 2, 3, 4]];
814     assert_eq!(xs.split(|x| *x == 5).rev().collect::<Vec<_>>(), splits);
815     let splits: &[&[_]] = &[&[1, 2, 3, 4, 5]];
816     assert_eq!(xs.split(|x| *x == 10).rev().collect::<Vec<_>>(), splits);
817
818     let xs: &[i32] = &[];
819     let splits: &[&[i32]] = &[&[]];
820     assert_eq!(xs.split(|x| *x == 5).rev().collect::<Vec<&[i32]>>(), splits);
821 }
822
823 #[test]
824 fn test_rsplitnator() {
825     let xs = &[1, 2, 3, 4, 5];
826
827     let splits: &[&[_]] = &[&[1, 2, 3, 4, 5]];
828     assert_eq!(xs.rsplitn(1, |x| *x % 2 == 0).collect::<Vec<_>>(), splits);
829     let splits: &[&[_]] = &[&[5], &[1, 2, 3]];
830     assert_eq!(xs.rsplitn(2, |x| *x % 2 == 0).collect::<Vec<_>>(), splits);
831     let splits: &[&[_]] = &[&[], &[], &[], &[1, 2]];
832     assert_eq!(xs.rsplitn(4, |_| true).collect::<Vec<_>>(), splits);
833
834     let xs: &[i32] = &[];
835     let splits: &[&[i32]] = &[&[]];
836     assert_eq!(xs.rsplitn(2, |x| *x == 5).collect::<Vec<&[i32]>>(), splits);
837     assert!(xs.rsplitn(0, |x| *x % 2 == 0).next().is_none());
838 }
839
840 #[test]
841 fn test_windowsator() {
842     let v = &[1, 2, 3, 4];
843
844     let wins: &[&[_]] = &[&[1, 2], &[2, 3], &[3, 4]];
845     assert_eq!(v.windows(2).collect::<Vec<_>>(), wins);
846
847     let wins: &[&[_]] = &[&[1, 2, 3], &[2, 3, 4]];
848     assert_eq!(v.windows(3).collect::<Vec<_>>(), wins);
849     assert!(v.windows(6).next().is_none());
850
851     let wins: &[&[_]] = &[&[3, 4], &[2, 3], &[1, 2]];
852     assert_eq!(v.windows(2).rev().collect::<Vec<&[_]>>(), wins);
853 }
854
855 #[test]
856 #[should_panic]
857 fn test_windowsator_0() {
858     let v = &[1, 2, 3, 4];
859     let _it = v.windows(0);
860 }
861
862 #[test]
863 fn test_chunksator() {
864     let v = &[1, 2, 3, 4, 5];
865
866     assert_eq!(v.chunks(2).len(), 3);
867
868     let chunks: &[&[_]] = &[&[1, 2], &[3, 4], &[5]];
869     assert_eq!(v.chunks(2).collect::<Vec<_>>(), chunks);
870     let chunks: &[&[_]] = &[&[1, 2, 3], &[4, 5]];
871     assert_eq!(v.chunks(3).collect::<Vec<_>>(), chunks);
872     let chunks: &[&[_]] = &[&[1, 2, 3, 4, 5]];
873     assert_eq!(v.chunks(6).collect::<Vec<_>>(), chunks);
874
875     let chunks: &[&[_]] = &[&[5], &[3, 4], &[1, 2]];
876     assert_eq!(v.chunks(2).rev().collect::<Vec<_>>(), chunks);
877 }
878
879 #[test]
880 #[should_panic]
881 fn test_chunksator_0() {
882     let v = &[1, 2, 3, 4];
883     let _it = v.chunks(0);
884 }
885
886 #[test]
887 fn test_reverse_part() {
888     let mut values = [1, 2, 3, 4, 5];
889     values[1..4].reverse();
890     assert!(values == [1, 4, 3, 2, 5]);
891 }
892
893 #[test]
894 fn test_show() {
895     macro_rules! test_show_vec {
896         ($x:expr, $x_str:expr) => ({
897             let (x, x_str) = ($x, $x_str);
898             assert_eq!(format!("{:?}", x), x_str);
899             assert_eq!(format!("{:?}", x), x_str);
900         })
901     }
902     let empty = Vec::<i32>::new();
903     test_show_vec!(empty, "[]");
904     test_show_vec!(vec![1], "[1]");
905     test_show_vec!(vec![1, 2, 3], "[1, 2, 3]");
906     test_show_vec!(vec![vec![], vec![1], vec![1, 1]], "[[], [1], [1, 1]]");
907
908     let empty_mut: &mut [i32] = &mut [];
909     test_show_vec!(empty_mut, "[]");
910     let v = &mut [1];
911     test_show_vec!(v, "[1]");
912     let v = &mut [1, 2, 3];
913     test_show_vec!(v, "[1, 2, 3]");
914     let v: &mut [&mut [_]] = &mut [&mut [], &mut [1], &mut [1, 1]];
915     test_show_vec!(v, "[[], [1], [1, 1]]");
916 }
917
918 #[test]
919 fn test_vec_default() {
920     macro_rules! t {
921         ($ty:ty) => {{
922             let v: $ty = Default::default();
923             assert!(v.is_empty());
924         }}
925     }
926
927     t!(&[i32]);
928     t!(Vec<i32>);
929 }
930
931 #[test]
932 #[should_panic]
933 fn test_overflow_does_not_cause_segfault() {
934     let mut v = vec![];
935     v.reserve_exact(!0);
936     v.push(1);
937     v.push(2);
938 }
939
940 #[test]
941 #[should_panic]
942 fn test_overflow_does_not_cause_segfault_managed() {
943     let mut v = vec![Rc::new(1)];
944     v.reserve_exact(!0);
945     v.push(Rc::new(2));
946 }
947
948 #[test]
949 fn test_mut_split_at() {
950     let mut values = [1, 2, 3, 4, 5];
951     {
952         let (left, right) = values.split_at_mut(2);
953         {
954             let left: &[_] = left;
955             assert!(left[..left.len()] == [1, 2]);
956         }
957         for p in left {
958             *p += 1;
959         }
960
961         {
962             let right: &[_] = right;
963             assert!(right[..right.len()] == [3, 4, 5]);
964         }
965         for p in right {
966             *p += 2;
967         }
968     }
969
970     assert!(values == [2, 3, 5, 6, 7]);
971 }
972
973 #[derive(Clone, PartialEq)]
974 struct Foo;
975
976 #[test]
977 fn test_iter_zero_sized() {
978     let mut v = vec![Foo, Foo, Foo];
979     assert_eq!(v.len(), 3);
980     let mut cnt = 0;
981
982     for f in &v {
983         assert!(*f == Foo);
984         cnt += 1;
985     }
986     assert_eq!(cnt, 3);
987
988     for f in &v[1..3] {
989         assert!(*f == Foo);
990         cnt += 1;
991     }
992     assert_eq!(cnt, 5);
993
994     for f in &mut v {
995         assert!(*f == Foo);
996         cnt += 1;
997     }
998     assert_eq!(cnt, 8);
999
1000     for f in v {
1001         assert!(f == Foo);
1002         cnt += 1;
1003     }
1004     assert_eq!(cnt, 11);
1005
1006     let xs: [Foo; 3] = [Foo, Foo, Foo];
1007     cnt = 0;
1008     for f in &xs {
1009         assert!(*f == Foo);
1010         cnt += 1;
1011     }
1012     assert!(cnt == 3);
1013 }
1014
1015 #[test]
1016 fn test_shrink_to_fit() {
1017     let mut xs = vec![0, 1, 2, 3];
1018     for i in 4..100 {
1019         xs.push(i)
1020     }
1021     assert_eq!(xs.capacity(), 128);
1022     xs.shrink_to_fit();
1023     assert_eq!(xs.capacity(), 100);
1024     assert_eq!(xs, (0..100).collect::<Vec<_>>());
1025 }
1026
1027 #[test]
1028 fn test_starts_with() {
1029     assert!(b"foobar".starts_with(b"foo"));
1030     assert!(!b"foobar".starts_with(b"oob"));
1031     assert!(!b"foobar".starts_with(b"bar"));
1032     assert!(!b"foo".starts_with(b"foobar"));
1033     assert!(!b"bar".starts_with(b"foobar"));
1034     assert!(b"foobar".starts_with(b"foobar"));
1035     let empty: &[u8] = &[];
1036     assert!(empty.starts_with(empty));
1037     assert!(!empty.starts_with(b"foo"));
1038     assert!(b"foobar".starts_with(empty));
1039 }
1040
1041 #[test]
1042 fn test_ends_with() {
1043     assert!(b"foobar".ends_with(b"bar"));
1044     assert!(!b"foobar".ends_with(b"oba"));
1045     assert!(!b"foobar".ends_with(b"foo"));
1046     assert!(!b"foo".ends_with(b"foobar"));
1047     assert!(!b"bar".ends_with(b"foobar"));
1048     assert!(b"foobar".ends_with(b"foobar"));
1049     let empty: &[u8] = &[];
1050     assert!(empty.ends_with(empty));
1051     assert!(!empty.ends_with(b"foo"));
1052     assert!(b"foobar".ends_with(empty));
1053 }
1054
1055 #[test]
1056 fn test_mut_splitator() {
1057     let mut xs = [0, 1, 0, 2, 3, 0, 0, 4, 5, 0];
1058     assert_eq!(xs.split_mut(|x| *x == 0).count(), 6);
1059     for slice in xs.split_mut(|x| *x == 0) {
1060         slice.reverse();
1061     }
1062     assert!(xs == [0, 1, 0, 3, 2, 0, 0, 5, 4, 0]);
1063
1064     let mut xs = [0, 1, 0, 2, 3, 0, 0, 4, 5, 0, 6, 7];
1065     for slice in xs.split_mut(|x| *x == 0).take(5) {
1066         slice.reverse();
1067     }
1068     assert!(xs == [0, 1, 0, 3, 2, 0, 0, 5, 4, 0, 6, 7]);
1069 }
1070
1071 #[test]
1072 fn test_mut_splitator_rev() {
1073     let mut xs = [1, 2, 0, 3, 4, 0, 0, 5, 6, 0];
1074     for slice in xs.split_mut(|x| *x == 0).rev().take(4) {
1075         slice.reverse();
1076     }
1077     assert!(xs == [1, 2, 0, 4, 3, 0, 0, 6, 5, 0]);
1078 }
1079
1080 #[test]
1081 fn test_get_mut() {
1082     let mut v = [0, 1, 2];
1083     assert_eq!(v.get_mut(3), None);
1084     v.get_mut(1).map(|e| *e = 7);
1085     assert_eq!(v[1], 7);
1086     let mut x = 2;
1087     assert_eq!(v.get_mut(2), Some(&mut x));
1088 }
1089
1090 #[test]
1091 fn test_mut_chunks() {
1092     let mut v = [0, 1, 2, 3, 4, 5, 6];
1093     assert_eq!(v.chunks_mut(2).len(), 4);
1094     for (i, chunk) in v.chunks_mut(3).enumerate() {
1095         for x in chunk {
1096             *x = i as u8;
1097         }
1098     }
1099     let result = [0, 0, 0, 1, 1, 1, 2];
1100     assert!(v == result);
1101 }
1102
1103 #[test]
1104 fn test_mut_chunks_rev() {
1105     let mut v = [0, 1, 2, 3, 4, 5, 6];
1106     for (i, chunk) in v.chunks_mut(3).rev().enumerate() {
1107         for x in chunk {
1108             *x = i as u8;
1109         }
1110     }
1111     let result = [2, 2, 2, 1, 1, 1, 0];
1112     assert!(v == result);
1113 }
1114
1115 #[test]
1116 #[should_panic]
1117 fn test_mut_chunks_0() {
1118     let mut v = [1, 2, 3, 4];
1119     let _it = v.chunks_mut(0);
1120 }
1121
1122 #[test]
1123 fn test_mut_last() {
1124     let mut x = [1, 2, 3, 4, 5];
1125     let h = x.last_mut();
1126     assert_eq!(*h.unwrap(), 5);
1127
1128     let y: &mut [i32] = &mut [];
1129     assert!(y.last_mut().is_none());
1130 }
1131
1132 #[test]
1133 fn test_to_vec() {
1134     let xs: Box<_> = box [1, 2, 3];
1135     let ys = xs.to_vec();
1136     assert_eq!(ys, [1, 2, 3]);
1137 }
1138
1139 #[test]
1140 fn test_box_slice_clone() {
1141     let data = vec![vec![0, 1], vec![0], vec![1]];
1142     let data2 = data.clone().into_boxed_slice().clone().to_vec();
1143
1144     assert_eq!(data, data2);
1145 }
1146
1147 #[test]
1148 #[cfg_attr(target_os = "emscripten", ignore)]
1149 fn test_box_slice_clone_panics() {
1150     use std::sync::Arc;
1151     use std::sync::atomic::{AtomicUsize, Ordering};
1152     use std::thread::spawn;
1153
1154     struct Canary {
1155         count: Arc<AtomicUsize>,
1156         panics: bool,
1157     }
1158
1159     impl Drop for Canary {
1160         fn drop(&mut self) {
1161             self.count.fetch_add(1, Ordering::SeqCst);
1162         }
1163     }
1164
1165     impl Clone for Canary {
1166         fn clone(&self) -> Self {
1167             if self.panics {
1168                 panic!()
1169             }
1170
1171             Canary {
1172                 count: self.count.clone(),
1173                 panics: self.panics,
1174             }
1175         }
1176     }
1177
1178     let drop_count = Arc::new(AtomicUsize::new(0));
1179     let canary = Canary {
1180         count: drop_count.clone(),
1181         panics: false,
1182     };
1183     let panic = Canary {
1184         count: drop_count.clone(),
1185         panics: true,
1186     };
1187
1188     spawn(move || {
1189             // When xs is dropped, +5.
1190             let xs = vec![canary.clone(), canary.clone(), canary.clone(), panic, canary]
1191                 .into_boxed_slice();
1192
1193             // When panic is cloned, +3.
1194             xs.clone();
1195         })
1196         .join()
1197         .unwrap_err();
1198
1199     // Total = 8
1200     assert_eq!(drop_count.load(Ordering::SeqCst), 8);
1201 }
1202
1203 #[test]
1204 fn test_copy_from_slice() {
1205     let src = [0, 1, 2, 3, 4, 5];
1206     let mut dst = [0; 6];
1207     dst.copy_from_slice(&src);
1208     assert_eq!(src, dst)
1209 }
1210
1211 #[test]
1212 #[should_panic(expected = "destination and source slices have different lengths")]
1213 fn test_copy_from_slice_dst_longer() {
1214     let src = [0, 1, 2, 3];
1215     let mut dst = [0; 5];
1216     dst.copy_from_slice(&src);
1217 }
1218
1219 #[test]
1220 #[should_panic(expected = "destination and source slices have different lengths")]
1221 fn test_copy_from_slice_dst_shorter() {
1222     let src = [0, 1, 2, 3];
1223     let mut dst = [0; 3];
1224     dst.copy_from_slice(&src);
1225 }