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