]> git.lizzy.rs Git - rust.git/blob - src/libcollections/tests/slice.rs
6feaf91d6da064fa1d0103875e2d82936f394eee
[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     let k = v.rotate(8);
486     assert_eq!(v, expected);
487     assert_eq!(k, 5);
488
489     let expected: Vec<_> = (0..1000).collect();
490
491     // small rotations in large slice, uses ptr::copy
492     v = (2..1000).chain(0..2).collect();
493     v.rotate(998);
494     assert_eq!(v, expected);
495     v = (998..1000).chain(0..998).collect();
496     v.rotate(2);
497     assert_eq!(v, expected);
498
499     // non-small prime rotation, has a few rounds of swapping
500     v = (389..1000).chain(0..389).collect();
501     v.rotate(1000-389);
502     assert_eq!(v, expected);
503 }
504
505 #[test]
506 fn test_concat() {
507     let v: [Vec<i32>; 0] = [];
508     let c = v.concat();
509     assert_eq!(c, []);
510     let d = [vec![1], vec![2, 3]].concat();
511     assert_eq!(d, [1, 2, 3]);
512
513     let v: &[&[_]] = &[&[1], &[2, 3]];
514     assert_eq!(v.join(&0), [1, 0, 2, 3]);
515     let v: &[&[_]] = &[&[1], &[2], &[3]];
516     assert_eq!(v.join(&0), [1, 0, 2, 0, 3]);
517 }
518
519 #[test]
520 fn test_join() {
521     let v: [Vec<i32>; 0] = [];
522     assert_eq!(v.join(&0), []);
523     assert_eq!([vec![1], vec![2, 3]].join(&0), [1, 0, 2, 3]);
524     assert_eq!([vec![1], vec![2], vec![3]].join(&0), [1, 0, 2, 0, 3]);
525
526     let v: [&[_]; 2] = [&[1], &[2, 3]];
527     assert_eq!(v.join(&0), [1, 0, 2, 3]);
528     let v: [&[_]; 3] = [&[1], &[2], &[3]];
529     assert_eq!(v.join(&0), [1, 0, 2, 0, 3]);
530 }
531
532 #[test]
533 fn test_insert() {
534     let mut a = vec![1, 2, 4];
535     a.insert(2, 3);
536     assert_eq!(a, [1, 2, 3, 4]);
537
538     let mut a = vec![1, 2, 3];
539     a.insert(0, 0);
540     assert_eq!(a, [0, 1, 2, 3]);
541
542     let mut a = vec![1, 2, 3];
543     a.insert(3, 4);
544     assert_eq!(a, [1, 2, 3, 4]);
545
546     let mut a = vec![];
547     a.insert(0, 1);
548     assert_eq!(a, [1]);
549 }
550
551 #[test]
552 #[should_panic]
553 fn test_insert_oob() {
554     let mut a = vec![1, 2, 3];
555     a.insert(4, 5);
556 }
557
558 #[test]
559 fn test_remove() {
560     let mut a = vec![1, 2, 3, 4];
561
562     assert_eq!(a.remove(2), 3);
563     assert_eq!(a, [1, 2, 4]);
564
565     assert_eq!(a.remove(2), 4);
566     assert_eq!(a, [1, 2]);
567
568     assert_eq!(a.remove(0), 1);
569     assert_eq!(a, [2]);
570
571     assert_eq!(a.remove(0), 2);
572     assert_eq!(a, []);
573 }
574
575 #[test]
576 #[should_panic]
577 fn test_remove_fail() {
578     let mut a = vec![1];
579     let _ = a.remove(0);
580     let _ = a.remove(0);
581 }
582
583 #[test]
584 fn test_capacity() {
585     let mut v = vec![0];
586     v.reserve_exact(10);
587     assert!(v.capacity() >= 11);
588 }
589
590 #[test]
591 fn test_slice_2() {
592     let v = vec![1, 2, 3, 4, 5];
593     let v = &v[1..3];
594     assert_eq!(v.len(), 2);
595     assert_eq!(v[0], 2);
596     assert_eq!(v[1], 3);
597 }
598
599 macro_rules! assert_order {
600     (Greater, $a:expr, $b:expr) => {
601         assert_eq!($a.cmp($b), Greater);
602         assert!($a > $b);
603     };
604     (Less, $a:expr, $b:expr) => {
605         assert_eq!($a.cmp($b), Less);
606         assert!($a < $b);
607     };
608     (Equal, $a:expr, $b:expr) => {
609         assert_eq!($a.cmp($b), Equal);
610         assert_eq!($a, $b);
611     }
612 }
613
614 #[test]
615 fn test_total_ord_u8() {
616     let c = &[1u8, 2, 3];
617     assert_order!(Greater, &[1u8, 2, 3, 4][..], &c[..]);
618     let c = &[1u8, 2, 3, 4];
619     assert_order!(Less, &[1u8, 2, 3][..], &c[..]);
620     let c = &[1u8, 2, 3, 6];
621     assert_order!(Equal, &[1u8, 2, 3, 6][..], &c[..]);
622     let c = &[1u8, 2, 3, 4, 5, 6];
623     assert_order!(Less, &[1u8, 2, 3, 4, 5, 5, 5, 5][..], &c[..]);
624     let c = &[1u8, 2, 3, 4];
625     assert_order!(Greater, &[2u8, 2][..], &c[..]);
626 }
627
628
629 #[test]
630 fn test_total_ord_i32() {
631     let c = &[1, 2, 3];
632     assert_order!(Greater, &[1, 2, 3, 4][..], &c[..]);
633     let c = &[1, 2, 3, 4];
634     assert_order!(Less, &[1, 2, 3][..], &c[..]);
635     let c = &[1, 2, 3, 6];
636     assert_order!(Equal, &[1, 2, 3, 6][..], &c[..]);
637     let c = &[1, 2, 3, 4, 5, 6];
638     assert_order!(Less, &[1, 2, 3, 4, 5, 5, 5, 5][..], &c[..]);
639     let c = &[1, 2, 3, 4];
640     assert_order!(Greater, &[2, 2][..], &c[..]);
641 }
642
643 #[test]
644 fn test_iterator() {
645     let xs = [1, 2, 5, 10, 11];
646     let mut it = xs.iter();
647     assert_eq!(it.size_hint(), (5, Some(5)));
648     assert_eq!(it.next().unwrap(), &1);
649     assert_eq!(it.size_hint(), (4, Some(4)));
650     assert_eq!(it.next().unwrap(), &2);
651     assert_eq!(it.size_hint(), (3, Some(3)));
652     assert_eq!(it.next().unwrap(), &5);
653     assert_eq!(it.size_hint(), (2, Some(2)));
654     assert_eq!(it.next().unwrap(), &10);
655     assert_eq!(it.size_hint(), (1, Some(1)));
656     assert_eq!(it.next().unwrap(), &11);
657     assert_eq!(it.size_hint(), (0, Some(0)));
658     assert!(it.next().is_none());
659 }
660
661 #[test]
662 fn test_iter_size_hints() {
663     let mut xs = [1, 2, 5, 10, 11];
664     assert_eq!(xs.iter().size_hint(), (5, Some(5)));
665     assert_eq!(xs.iter_mut().size_hint(), (5, Some(5)));
666 }
667
668 #[test]
669 fn test_iter_as_slice() {
670     let xs = [1, 2, 5, 10, 11];
671     let mut iter = xs.iter();
672     assert_eq!(iter.as_slice(), &[1, 2, 5, 10, 11]);
673     iter.next();
674     assert_eq!(iter.as_slice(), &[2, 5, 10, 11]);
675 }
676
677 #[test]
678 fn test_iter_as_ref() {
679     let xs = [1, 2, 5, 10, 11];
680     let mut iter = xs.iter();
681     assert_eq!(iter.as_ref(), &[1, 2, 5, 10, 11]);
682     iter.next();
683     assert_eq!(iter.as_ref(), &[2, 5, 10, 11]);
684 }
685
686 #[test]
687 fn test_iter_clone() {
688     let xs = [1, 2, 5];
689     let mut it = xs.iter();
690     it.next();
691     let mut jt = it.clone();
692     assert_eq!(it.next(), jt.next());
693     assert_eq!(it.next(), jt.next());
694     assert_eq!(it.next(), jt.next());
695 }
696
697 #[test]
698 fn test_iter_is_empty() {
699     let xs = [1, 2, 5, 10, 11];
700     for i in 0..xs.len() {
701         for j in i..xs.len() {
702             assert_eq!(xs[i..j].iter().is_empty(), xs[i..j].is_empty());
703         }
704     }
705 }
706
707 #[test]
708 fn test_mut_iterator() {
709     let mut xs = [1, 2, 3, 4, 5];
710     for x in &mut xs {
711         *x += 1;
712     }
713     assert!(xs == [2, 3, 4, 5, 6])
714 }
715
716 #[test]
717 fn test_rev_iterator() {
718
719     let xs = [1, 2, 5, 10, 11];
720     let ys = [11, 10, 5, 2, 1];
721     let mut i = 0;
722     for &x in xs.iter().rev() {
723         assert_eq!(x, ys[i]);
724         i += 1;
725     }
726     assert_eq!(i, 5);
727 }
728
729 #[test]
730 fn test_mut_rev_iterator() {
731     let mut xs = [1, 2, 3, 4, 5];
732     for (i, x) in xs.iter_mut().rev().enumerate() {
733         *x += i;
734     }
735     assert!(xs == [5, 5, 5, 5, 5])
736 }
737
738 #[test]
739 fn test_move_iterator() {
740     let xs = vec![1, 2, 3, 4, 5];
741     assert_eq!(xs.into_iter().fold(0, |a: usize, b: usize| 10 * a + b),
742                12345);
743 }
744
745 #[test]
746 fn test_move_rev_iterator() {
747     let xs = vec![1, 2, 3, 4, 5];
748     assert_eq!(xs.into_iter().rev().fold(0, |a: usize, b: usize| 10 * a + b),
749                54321);
750 }
751
752 #[test]
753 fn test_splitator() {
754     let xs = &[1, 2, 3, 4, 5];
755
756     let splits: &[&[_]] = &[&[1], &[3], &[5]];
757     assert_eq!(xs.split(|x| *x % 2 == 0).collect::<Vec<_>>(), splits);
758     let splits: &[&[_]] = &[&[], &[2, 3, 4, 5]];
759     assert_eq!(xs.split(|x| *x == 1).collect::<Vec<_>>(), splits);
760     let splits: &[&[_]] = &[&[1, 2, 3, 4], &[]];
761     assert_eq!(xs.split(|x| *x == 5).collect::<Vec<_>>(), splits);
762     let splits: &[&[_]] = &[&[1, 2, 3, 4, 5]];
763     assert_eq!(xs.split(|x| *x == 10).collect::<Vec<_>>(), splits);
764     let splits: &[&[_]] = &[&[], &[], &[], &[], &[], &[]];
765     assert_eq!(xs.split(|_| true).collect::<Vec<&[i32]>>(), splits);
766
767     let xs: &[i32] = &[];
768     let splits: &[&[i32]] = &[&[]];
769     assert_eq!(xs.split(|x| *x == 5).collect::<Vec<&[i32]>>(), splits);
770 }
771
772 #[test]
773 fn test_splitnator() {
774     let xs = &[1, 2, 3, 4, 5];
775
776     let splits: &[&[_]] = &[&[1, 2, 3, 4, 5]];
777     assert_eq!(xs.splitn(1, |x| *x % 2 == 0).collect::<Vec<_>>(), splits);
778     let splits: &[&[_]] = &[&[1], &[3, 4, 5]];
779     assert_eq!(xs.splitn(2, |x| *x % 2 == 0).collect::<Vec<_>>(), splits);
780     let splits: &[&[_]] = &[&[], &[], &[], &[4, 5]];
781     assert_eq!(xs.splitn(4, |_| true).collect::<Vec<_>>(), splits);
782
783     let xs: &[i32] = &[];
784     let splits: &[&[i32]] = &[&[]];
785     assert_eq!(xs.splitn(2, |x| *x == 5).collect::<Vec<_>>(), splits);
786 }
787
788 #[test]
789 fn test_splitnator_mut() {
790     let xs = &mut [1, 2, 3, 4, 5];
791
792     let splits: &[&mut [_]] = &[&mut [1, 2, 3, 4, 5]];
793     assert_eq!(xs.splitn_mut(1, |x| *x % 2 == 0).collect::<Vec<_>>(),
794                splits);
795     let splits: &[&mut [_]] = &[&mut [1], &mut [3, 4, 5]];
796     assert_eq!(xs.splitn_mut(2, |x| *x % 2 == 0).collect::<Vec<_>>(),
797                splits);
798     let splits: &[&mut [_]] = &[&mut [], &mut [], &mut [], &mut [4, 5]];
799     assert_eq!(xs.splitn_mut(4, |_| true).collect::<Vec<_>>(), splits);
800
801     let xs: &mut [i32] = &mut [];
802     let splits: &[&mut [i32]] = &[&mut []];
803     assert_eq!(xs.splitn_mut(2, |x| *x == 5).collect::<Vec<_>>(), splits);
804 }
805
806 #[test]
807 fn test_rsplitator() {
808     let xs = &[1, 2, 3, 4, 5];
809
810     let splits: &[&[_]] = &[&[5], &[3], &[1]];
811     assert_eq!(xs.split(|x| *x % 2 == 0).rev().collect::<Vec<_>>(), splits);
812     let splits: &[&[_]] = &[&[2, 3, 4, 5], &[]];
813     assert_eq!(xs.split(|x| *x == 1).rev().collect::<Vec<_>>(), splits);
814     let splits: &[&[_]] = &[&[], &[1, 2, 3, 4]];
815     assert_eq!(xs.split(|x| *x == 5).rev().collect::<Vec<_>>(), splits);
816     let splits: &[&[_]] = &[&[1, 2, 3, 4, 5]];
817     assert_eq!(xs.split(|x| *x == 10).rev().collect::<Vec<_>>(), splits);
818
819     let xs: &[i32] = &[];
820     let splits: &[&[i32]] = &[&[]];
821     assert_eq!(xs.split(|x| *x == 5).rev().collect::<Vec<&[i32]>>(), splits);
822 }
823
824 #[test]
825 fn test_rsplitnator() {
826     let xs = &[1, 2, 3, 4, 5];
827
828     let splits: &[&[_]] = &[&[1, 2, 3, 4, 5]];
829     assert_eq!(xs.rsplitn(1, |x| *x % 2 == 0).collect::<Vec<_>>(), splits);
830     let splits: &[&[_]] = &[&[5], &[1, 2, 3]];
831     assert_eq!(xs.rsplitn(2, |x| *x % 2 == 0).collect::<Vec<_>>(), splits);
832     let splits: &[&[_]] = &[&[], &[], &[], &[1, 2]];
833     assert_eq!(xs.rsplitn(4, |_| true).collect::<Vec<_>>(), splits);
834
835     let xs: &[i32] = &[];
836     let splits: &[&[i32]] = &[&[]];
837     assert_eq!(xs.rsplitn(2, |x| *x == 5).collect::<Vec<&[i32]>>(), splits);
838     assert!(xs.rsplitn(0, |x| *x % 2 == 0).next().is_none());
839 }
840
841 #[test]
842 fn test_windowsator() {
843     let v = &[1, 2, 3, 4];
844
845     let wins: &[&[_]] = &[&[1, 2], &[2, 3], &[3, 4]];
846     assert_eq!(v.windows(2).collect::<Vec<_>>(), wins);
847
848     let wins: &[&[_]] = &[&[1, 2, 3], &[2, 3, 4]];
849     assert_eq!(v.windows(3).collect::<Vec<_>>(), wins);
850     assert!(v.windows(6).next().is_none());
851
852     let wins: &[&[_]] = &[&[3, 4], &[2, 3], &[1, 2]];
853     assert_eq!(v.windows(2).rev().collect::<Vec<&[_]>>(), wins);
854 }
855
856 #[test]
857 #[should_panic]
858 fn test_windowsator_0() {
859     let v = &[1, 2, 3, 4];
860     let _it = v.windows(0);
861 }
862
863 #[test]
864 fn test_chunksator() {
865     let v = &[1, 2, 3, 4, 5];
866
867     assert_eq!(v.chunks(2).len(), 3);
868
869     let chunks: &[&[_]] = &[&[1, 2], &[3, 4], &[5]];
870     assert_eq!(v.chunks(2).collect::<Vec<_>>(), chunks);
871     let chunks: &[&[_]] = &[&[1, 2, 3], &[4, 5]];
872     assert_eq!(v.chunks(3).collect::<Vec<_>>(), chunks);
873     let chunks: &[&[_]] = &[&[1, 2, 3, 4, 5]];
874     assert_eq!(v.chunks(6).collect::<Vec<_>>(), chunks);
875
876     let chunks: &[&[_]] = &[&[5], &[3, 4], &[1, 2]];
877     assert_eq!(v.chunks(2).rev().collect::<Vec<_>>(), chunks);
878 }
879
880 #[test]
881 #[should_panic]
882 fn test_chunksator_0() {
883     let v = &[1, 2, 3, 4];
884     let _it = v.chunks(0);
885 }
886
887 #[test]
888 fn test_reverse_part() {
889     let mut values = [1, 2, 3, 4, 5];
890     values[1..4].reverse();
891     assert!(values == [1, 4, 3, 2, 5]);
892 }
893
894 #[test]
895 fn test_show() {
896     macro_rules! test_show_vec {
897         ($x:expr, $x_str:expr) => ({
898             let (x, x_str) = ($x, $x_str);
899             assert_eq!(format!("{:?}", x), x_str);
900             assert_eq!(format!("{:?}", x), x_str);
901         })
902     }
903     let empty = Vec::<i32>::new();
904     test_show_vec!(empty, "[]");
905     test_show_vec!(vec![1], "[1]");
906     test_show_vec!(vec![1, 2, 3], "[1, 2, 3]");
907     test_show_vec!(vec![vec![], vec![1], vec![1, 1]], "[[], [1], [1, 1]]");
908
909     let empty_mut: &mut [i32] = &mut [];
910     test_show_vec!(empty_mut, "[]");
911     let v = &mut [1];
912     test_show_vec!(v, "[1]");
913     let v = &mut [1, 2, 3];
914     test_show_vec!(v, "[1, 2, 3]");
915     let v: &mut [&mut [_]] = &mut [&mut [], &mut [1], &mut [1, 1]];
916     test_show_vec!(v, "[[], [1], [1, 1]]");
917 }
918
919 #[test]
920 fn test_vec_default() {
921     macro_rules! t {
922         ($ty:ty) => {{
923             let v: $ty = Default::default();
924             assert!(v.is_empty());
925         }}
926     }
927
928     t!(&[i32]);
929     t!(Vec<i32>);
930 }
931
932 #[test]
933 #[should_panic]
934 fn test_overflow_does_not_cause_segfault() {
935     let mut v = vec![];
936     v.reserve_exact(!0);
937     v.push(1);
938     v.push(2);
939 }
940
941 #[test]
942 #[should_panic]
943 fn test_overflow_does_not_cause_segfault_managed() {
944     let mut v = vec![Rc::new(1)];
945     v.reserve_exact(!0);
946     v.push(Rc::new(2));
947 }
948
949 #[test]
950 fn test_mut_split_at() {
951     let mut values = [1, 2, 3, 4, 5];
952     {
953         let (left, right) = values.split_at_mut(2);
954         {
955             let left: &[_] = left;
956             assert!(left[..left.len()] == [1, 2]);
957         }
958         for p in left {
959             *p += 1;
960         }
961
962         {
963             let right: &[_] = right;
964             assert!(right[..right.len()] == [3, 4, 5]);
965         }
966         for p in right {
967             *p += 2;
968         }
969     }
970
971     assert!(values == [2, 3, 5, 6, 7]);
972 }
973
974 #[derive(Clone, PartialEq)]
975 struct Foo;
976
977 #[test]
978 fn test_iter_zero_sized() {
979     let mut v = vec![Foo, Foo, Foo];
980     assert_eq!(v.len(), 3);
981     let mut cnt = 0;
982
983     for f in &v {
984         assert!(*f == Foo);
985         cnt += 1;
986     }
987     assert_eq!(cnt, 3);
988
989     for f in &v[1..3] {
990         assert!(*f == Foo);
991         cnt += 1;
992     }
993     assert_eq!(cnt, 5);
994
995     for f in &mut v {
996         assert!(*f == Foo);
997         cnt += 1;
998     }
999     assert_eq!(cnt, 8);
1000
1001     for f in v {
1002         assert!(f == Foo);
1003         cnt += 1;
1004     }
1005     assert_eq!(cnt, 11);
1006
1007     let xs: [Foo; 3] = [Foo, Foo, Foo];
1008     cnt = 0;
1009     for f in &xs {
1010         assert!(*f == Foo);
1011         cnt += 1;
1012     }
1013     assert!(cnt == 3);
1014 }
1015
1016 #[test]
1017 fn test_shrink_to_fit() {
1018     let mut xs = vec![0, 1, 2, 3];
1019     for i in 4..100 {
1020         xs.push(i)
1021     }
1022     assert_eq!(xs.capacity(), 128);
1023     xs.shrink_to_fit();
1024     assert_eq!(xs.capacity(), 100);
1025     assert_eq!(xs, (0..100).collect::<Vec<_>>());
1026 }
1027
1028 #[test]
1029 fn test_starts_with() {
1030     assert!(b"foobar".starts_with(b"foo"));
1031     assert!(!b"foobar".starts_with(b"oob"));
1032     assert!(!b"foobar".starts_with(b"bar"));
1033     assert!(!b"foo".starts_with(b"foobar"));
1034     assert!(!b"bar".starts_with(b"foobar"));
1035     assert!(b"foobar".starts_with(b"foobar"));
1036     let empty: &[u8] = &[];
1037     assert!(empty.starts_with(empty));
1038     assert!(!empty.starts_with(b"foo"));
1039     assert!(b"foobar".starts_with(empty));
1040 }
1041
1042 #[test]
1043 fn test_ends_with() {
1044     assert!(b"foobar".ends_with(b"bar"));
1045     assert!(!b"foobar".ends_with(b"oba"));
1046     assert!(!b"foobar".ends_with(b"foo"));
1047     assert!(!b"foo".ends_with(b"foobar"));
1048     assert!(!b"bar".ends_with(b"foobar"));
1049     assert!(b"foobar".ends_with(b"foobar"));
1050     let empty: &[u8] = &[];
1051     assert!(empty.ends_with(empty));
1052     assert!(!empty.ends_with(b"foo"));
1053     assert!(b"foobar".ends_with(empty));
1054 }
1055
1056 #[test]
1057 fn test_mut_splitator() {
1058     let mut xs = [0, 1, 0, 2, 3, 0, 0, 4, 5, 0];
1059     assert_eq!(xs.split_mut(|x| *x == 0).count(), 6);
1060     for slice in xs.split_mut(|x| *x == 0) {
1061         slice.reverse();
1062     }
1063     assert!(xs == [0, 1, 0, 3, 2, 0, 0, 5, 4, 0]);
1064
1065     let mut xs = [0, 1, 0, 2, 3, 0, 0, 4, 5, 0, 6, 7];
1066     for slice in xs.split_mut(|x| *x == 0).take(5) {
1067         slice.reverse();
1068     }
1069     assert!(xs == [0, 1, 0, 3, 2, 0, 0, 5, 4, 0, 6, 7]);
1070 }
1071
1072 #[test]
1073 fn test_mut_splitator_rev() {
1074     let mut xs = [1, 2, 0, 3, 4, 0, 0, 5, 6, 0];
1075     for slice in xs.split_mut(|x| *x == 0).rev().take(4) {
1076         slice.reverse();
1077     }
1078     assert!(xs == [1, 2, 0, 4, 3, 0, 0, 6, 5, 0]);
1079 }
1080
1081 #[test]
1082 fn test_get_mut() {
1083     let mut v = [0, 1, 2];
1084     assert_eq!(v.get_mut(3), None);
1085     v.get_mut(1).map(|e| *e = 7);
1086     assert_eq!(v[1], 7);
1087     let mut x = 2;
1088     assert_eq!(v.get_mut(2), Some(&mut x));
1089 }
1090
1091 #[test]
1092 fn test_mut_chunks() {
1093     let mut v = [0, 1, 2, 3, 4, 5, 6];
1094     assert_eq!(v.chunks_mut(2).len(), 4);
1095     for (i, chunk) in v.chunks_mut(3).enumerate() {
1096         for x in chunk {
1097             *x = i as u8;
1098         }
1099     }
1100     let result = [0, 0, 0, 1, 1, 1, 2];
1101     assert!(v == result);
1102 }
1103
1104 #[test]
1105 fn test_mut_chunks_rev() {
1106     let mut v = [0, 1, 2, 3, 4, 5, 6];
1107     for (i, chunk) in v.chunks_mut(3).rev().enumerate() {
1108         for x in chunk {
1109             *x = i as u8;
1110         }
1111     }
1112     let result = [2, 2, 2, 1, 1, 1, 0];
1113     assert!(v == result);
1114 }
1115
1116 #[test]
1117 #[should_panic]
1118 fn test_mut_chunks_0() {
1119     let mut v = [1, 2, 3, 4];
1120     let _it = v.chunks_mut(0);
1121 }
1122
1123 #[test]
1124 fn test_mut_last() {
1125     let mut x = [1, 2, 3, 4, 5];
1126     let h = x.last_mut();
1127     assert_eq!(*h.unwrap(), 5);
1128
1129     let y: &mut [i32] = &mut [];
1130     assert!(y.last_mut().is_none());
1131 }
1132
1133 #[test]
1134 fn test_to_vec() {
1135     let xs: Box<_> = box [1, 2, 3];
1136     let ys = xs.to_vec();
1137     assert_eq!(ys, [1, 2, 3]);
1138 }
1139
1140 #[test]
1141 fn test_box_slice_clone() {
1142     let data = vec![vec![0, 1], vec![0], vec![1]];
1143     let data2 = data.clone().into_boxed_slice().clone().to_vec();
1144
1145     assert_eq!(data, data2);
1146 }
1147
1148 #[test]
1149 #[cfg_attr(target_os = "emscripten", ignore)]
1150 fn test_box_slice_clone_panics() {
1151     use std::sync::Arc;
1152     use std::sync::atomic::{AtomicUsize, Ordering};
1153     use std::thread::spawn;
1154
1155     struct Canary {
1156         count: Arc<AtomicUsize>,
1157         panics: bool,
1158     }
1159
1160     impl Drop for Canary {
1161         fn drop(&mut self) {
1162             self.count.fetch_add(1, Ordering::SeqCst);
1163         }
1164     }
1165
1166     impl Clone for Canary {
1167         fn clone(&self) -> Self {
1168             if self.panics {
1169                 panic!()
1170             }
1171
1172             Canary {
1173                 count: self.count.clone(),
1174                 panics: self.panics,
1175             }
1176         }
1177     }
1178
1179     let drop_count = Arc::new(AtomicUsize::new(0));
1180     let canary = Canary {
1181         count: drop_count.clone(),
1182         panics: false,
1183     };
1184     let panic = Canary {
1185         count: drop_count.clone(),
1186         panics: true,
1187     };
1188
1189     spawn(move || {
1190             // When xs is dropped, +5.
1191             let xs = vec![canary.clone(), canary.clone(), canary.clone(), panic, canary]
1192                 .into_boxed_slice();
1193
1194             // When panic is cloned, +3.
1195             xs.clone();
1196         })
1197         .join()
1198         .unwrap_err();
1199
1200     // Total = 8
1201     assert_eq!(drop_count.load(Ordering::SeqCst), 8);
1202 }
1203
1204 #[test]
1205 fn test_copy_from_slice() {
1206     let src = [0, 1, 2, 3, 4, 5];
1207     let mut dst = [0; 6];
1208     dst.copy_from_slice(&src);
1209     assert_eq!(src, dst)
1210 }
1211
1212 #[test]
1213 #[should_panic(expected = "destination and source slices have different lengths")]
1214 fn test_copy_from_slice_dst_longer() {
1215     let src = [0, 1, 2, 3];
1216     let mut dst = [0; 5];
1217     dst.copy_from_slice(&src);
1218 }
1219
1220 #[test]
1221 #[should_panic(expected = "destination and source slices have different lengths")]
1222 fn test_copy_from_slice_dst_shorter() {
1223     let src = [0, 1, 2, 3];
1224     let mut dst = [0; 3];
1225     dst.copy_from_slice(&src);
1226 }