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