]> git.lizzy.rs Git - rust.git/blob - src/liballoc/tests/vec.rs
Auto merge of #67303 - dtolnay:rls, r=Xanewok
[rust.git] / src / liballoc / tests / vec.rs
1 use std::borrow::Cow;
2 use std::collections::TryReserveError::*;
3 use std::mem::size_of;
4 use std::vec::{Drain, IntoIter};
5 use std::{isize, usize};
6
7 struct DropCounter<'a> {
8     count: &'a mut u32,
9 }
10
11 impl Drop for DropCounter<'_> {
12     fn drop(&mut self) {
13         *self.count += 1;
14     }
15 }
16
17 #[test]
18 fn test_small_vec_struct() {
19     assert!(size_of::<Vec<u8>>() == size_of::<usize>() * 3);
20 }
21
22 #[test]
23 fn test_double_drop() {
24     struct TwoVec<T> {
25         x: Vec<T>,
26         y: Vec<T>,
27     }
28
29     let (mut count_x, mut count_y) = (0, 0);
30     {
31         let mut tv = TwoVec { x: Vec::new(), y: Vec::new() };
32         tv.x.push(DropCounter { count: &mut count_x });
33         tv.y.push(DropCounter { count: &mut count_y });
34
35         // If Vec had a drop flag, here is where it would be zeroed.
36         // Instead, it should rely on its internal state to prevent
37         // doing anything significant when dropped multiple times.
38         drop(tv.x);
39
40         // Here tv goes out of scope, tv.y should be dropped, but not tv.x.
41     }
42
43     assert_eq!(count_x, 1);
44     assert_eq!(count_y, 1);
45 }
46
47 #[test]
48 fn test_reserve() {
49     let mut v = Vec::new();
50     assert_eq!(v.capacity(), 0);
51
52     v.reserve(2);
53     assert!(v.capacity() >= 2);
54
55     for i in 0..16 {
56         v.push(i);
57     }
58
59     assert!(v.capacity() >= 16);
60     v.reserve(16);
61     assert!(v.capacity() >= 32);
62
63     v.push(16);
64
65     v.reserve(16);
66     assert!(v.capacity() >= 33)
67 }
68
69 #[test]
70 fn test_zst_capacity() {
71     assert_eq!(Vec::<()>::new().capacity(), usize::max_value());
72 }
73
74 #[test]
75 fn test_extend() {
76     let mut v = Vec::new();
77     let mut w = Vec::new();
78
79     v.extend(w.clone());
80     assert_eq!(v, &[]);
81
82     v.extend(0..3);
83     for i in 0..3 {
84         w.push(i)
85     }
86
87     assert_eq!(v, w);
88
89     v.extend(3..10);
90     for i in 3..10 {
91         w.push(i)
92     }
93
94     assert_eq!(v, w);
95
96     v.extend(w.clone()); // specializes to `append`
97     assert!(v.iter().eq(w.iter().chain(w.iter())));
98
99     // Zero sized types
100     #[derive(PartialEq, Debug)]
101     struct Foo;
102
103     let mut a = Vec::new();
104     let b = vec![Foo, Foo];
105
106     a.extend(b);
107     assert_eq!(a, &[Foo, Foo]);
108
109     // Double drop
110     let mut count_x = 0;
111     {
112         let mut x = Vec::new();
113         let y = vec![DropCounter { count: &mut count_x }];
114         x.extend(y);
115     }
116     assert_eq!(count_x, 1);
117 }
118
119 #[test]
120 fn test_extend_ref() {
121     let mut v = vec![1, 2];
122     v.extend(&[3, 4, 5]);
123
124     assert_eq!(v.len(), 5);
125     assert_eq!(v, [1, 2, 3, 4, 5]);
126
127     let w = vec![6, 7];
128     v.extend(&w);
129
130     assert_eq!(v.len(), 7);
131     assert_eq!(v, [1, 2, 3, 4, 5, 6, 7]);
132 }
133
134 #[test]
135 fn test_slice_from_mut() {
136     let mut values = vec![1, 2, 3, 4, 5];
137     {
138         let slice = &mut values[2..];
139         assert!(slice == [3, 4, 5]);
140         for p in slice {
141             *p += 2;
142         }
143     }
144
145     assert!(values == [1, 2, 5, 6, 7]);
146 }
147
148 #[test]
149 fn test_slice_to_mut() {
150     let mut values = vec![1, 2, 3, 4, 5];
151     {
152         let slice = &mut values[..2];
153         assert!(slice == [1, 2]);
154         for p in slice {
155             *p += 1;
156         }
157     }
158
159     assert!(values == [2, 3, 3, 4, 5]);
160 }
161
162 #[test]
163 fn test_split_at_mut() {
164     let mut values = vec![1, 2, 3, 4, 5];
165     {
166         let (left, right) = values.split_at_mut(2);
167         {
168             let left: &[_] = left;
169             assert!(&left[..left.len()] == &[1, 2]);
170         }
171         for p in left {
172             *p += 1;
173         }
174
175         {
176             let right: &[_] = right;
177             assert!(&right[..right.len()] == &[3, 4, 5]);
178         }
179         for p in right {
180             *p += 2;
181         }
182     }
183
184     assert_eq!(values, [2, 3, 5, 6, 7]);
185 }
186
187 #[test]
188 fn test_clone() {
189     let v: Vec<i32> = vec![];
190     let w = vec![1, 2, 3];
191
192     assert_eq!(v, v.clone());
193
194     let z = w.clone();
195     assert_eq!(w, z);
196     // they should be disjoint in memory.
197     assert!(w.as_ptr() != z.as_ptr())
198 }
199
200 #[test]
201 fn test_clone_from() {
202     let mut v = vec![];
203     let three: Vec<Box<_>> = vec![box 1, box 2, box 3];
204     let two: Vec<Box<_>> = vec![box 4, box 5];
205     // zero, long
206     v.clone_from(&three);
207     assert_eq!(v, three);
208
209     // equal
210     v.clone_from(&three);
211     assert_eq!(v, three);
212
213     // long, short
214     v.clone_from(&two);
215     assert_eq!(v, two);
216
217     // short, long
218     v.clone_from(&three);
219     assert_eq!(v, three)
220 }
221
222 #[test]
223 fn test_retain() {
224     let mut vec = vec![1, 2, 3, 4];
225     vec.retain(|&x| x % 2 == 0);
226     assert_eq!(vec, [2, 4]);
227 }
228
229 #[test]
230 fn test_dedup() {
231     fn case(a: Vec<i32>, b: Vec<i32>) {
232         let mut v = a;
233         v.dedup();
234         assert_eq!(v, b);
235     }
236     case(vec![], vec![]);
237     case(vec![1], vec![1]);
238     case(vec![1, 1], vec![1]);
239     case(vec![1, 2, 3], vec![1, 2, 3]);
240     case(vec![1, 1, 2, 3], vec![1, 2, 3]);
241     case(vec![1, 2, 2, 3], vec![1, 2, 3]);
242     case(vec![1, 2, 3, 3], vec![1, 2, 3]);
243     case(vec![1, 1, 2, 2, 2, 3, 3], vec![1, 2, 3]);
244 }
245
246 #[test]
247 fn test_dedup_by_key() {
248     fn case(a: Vec<i32>, b: Vec<i32>) {
249         let mut v = a;
250         v.dedup_by_key(|i| *i / 10);
251         assert_eq!(v, b);
252     }
253     case(vec![], vec![]);
254     case(vec![10], vec![10]);
255     case(vec![10, 11], vec![10]);
256     case(vec![10, 20, 30], vec![10, 20, 30]);
257     case(vec![10, 11, 20, 30], vec![10, 20, 30]);
258     case(vec![10, 20, 21, 30], vec![10, 20, 30]);
259     case(vec![10, 20, 30, 31], vec![10, 20, 30]);
260     case(vec![10, 11, 20, 21, 22, 30, 31], vec![10, 20, 30]);
261 }
262
263 #[test]
264 fn test_dedup_by() {
265     let mut vec = vec!["foo", "bar", "Bar", "baz", "bar"];
266     vec.dedup_by(|a, b| a.eq_ignore_ascii_case(b));
267
268     assert_eq!(vec, ["foo", "bar", "baz", "bar"]);
269
270     let mut vec = vec![("foo", 1), ("foo", 2), ("bar", 3), ("bar", 4), ("bar", 5)];
271     vec.dedup_by(|a, b| {
272         a.0 == b.0 && {
273             b.1 += a.1;
274             true
275         }
276     });
277
278     assert_eq!(vec, [("foo", 3), ("bar", 12)]);
279 }
280
281 #[test]
282 fn test_dedup_unique() {
283     let mut v0: Vec<Box<_>> = vec![box 1, box 1, box 2, box 3];
284     v0.dedup();
285     let mut v1: Vec<Box<_>> = vec![box 1, box 2, box 2, box 3];
286     v1.dedup();
287     let mut v2: Vec<Box<_>> = vec![box 1, box 2, box 3, box 3];
288     v2.dedup();
289     // If the boxed pointers were leaked or otherwise misused, valgrind
290     // and/or rt should raise errors.
291 }
292
293 #[test]
294 fn zero_sized_values() {
295     let mut v = Vec::new();
296     assert_eq!(v.len(), 0);
297     v.push(());
298     assert_eq!(v.len(), 1);
299     v.push(());
300     assert_eq!(v.len(), 2);
301     assert_eq!(v.pop(), Some(()));
302     assert_eq!(v.pop(), Some(()));
303     assert_eq!(v.pop(), None);
304
305     assert_eq!(v.iter().count(), 0);
306     v.push(());
307     assert_eq!(v.iter().count(), 1);
308     v.push(());
309     assert_eq!(v.iter().count(), 2);
310
311     for &() in &v {}
312
313     assert_eq!(v.iter_mut().count(), 2);
314     v.push(());
315     assert_eq!(v.iter_mut().count(), 3);
316     v.push(());
317     assert_eq!(v.iter_mut().count(), 4);
318
319     for &mut () in &mut v {}
320     unsafe {
321         v.set_len(0);
322     }
323     assert_eq!(v.iter_mut().count(), 0);
324 }
325
326 #[test]
327 fn test_partition() {
328     assert_eq!(vec![].into_iter().partition(|x: &i32| *x < 3), (vec![], vec![]));
329     assert_eq!(vec![1, 2, 3].into_iter().partition(|x| *x < 4), (vec![1, 2, 3], vec![]));
330     assert_eq!(vec![1, 2, 3].into_iter().partition(|x| *x < 2), (vec![1], vec![2, 3]));
331     assert_eq!(vec![1, 2, 3].into_iter().partition(|x| *x < 0), (vec![], vec![1, 2, 3]));
332 }
333
334 #[test]
335 fn test_zip_unzip() {
336     let z1 = vec![(1, 4), (2, 5), (3, 6)];
337
338     let (left, right): (Vec<_>, Vec<_>) = z1.iter().cloned().unzip();
339
340     assert_eq!((1, 4), (left[0], right[0]));
341     assert_eq!((2, 5), (left[1], right[1]));
342     assert_eq!((3, 6), (left[2], right[2]));
343 }
344
345 #[test]
346 fn test_vec_truncate_drop() {
347     static mut DROPS: u32 = 0;
348     struct Elem(i32);
349     impl Drop for Elem {
350         fn drop(&mut self) {
351             unsafe {
352                 DROPS += 1;
353             }
354         }
355     }
356
357     let mut v = vec![Elem(1), Elem(2), Elem(3), Elem(4), Elem(5)];
358     assert_eq!(unsafe { DROPS }, 0);
359     v.truncate(3);
360     assert_eq!(unsafe { DROPS }, 2);
361     v.truncate(0);
362     assert_eq!(unsafe { DROPS }, 5);
363 }
364
365 #[test]
366 #[should_panic]
367 fn test_vec_truncate_fail() {
368     struct BadElem(i32);
369     impl Drop for BadElem {
370         fn drop(&mut self) {
371             let BadElem(ref mut x) = *self;
372             if *x == 0xbadbeef {
373                 panic!("BadElem panic: 0xbadbeef")
374             }
375         }
376     }
377
378     let mut v = vec![BadElem(1), BadElem(2), BadElem(0xbadbeef), BadElem(4)];
379     v.truncate(0);
380 }
381
382 #[test]
383 fn test_index() {
384     let vec = vec![1, 2, 3];
385     assert!(vec[1] == 2);
386 }
387
388 #[test]
389 #[should_panic]
390 fn test_index_out_of_bounds() {
391     let vec = vec![1, 2, 3];
392     let _ = vec[3];
393 }
394
395 #[test]
396 #[should_panic]
397 fn test_slice_out_of_bounds_1() {
398     let x = vec![1, 2, 3, 4, 5];
399     &x[!0..];
400 }
401
402 #[test]
403 #[should_panic]
404 fn test_slice_out_of_bounds_2() {
405     let x = vec![1, 2, 3, 4, 5];
406     &x[..6];
407 }
408
409 #[test]
410 #[should_panic]
411 fn test_slice_out_of_bounds_3() {
412     let x = vec![1, 2, 3, 4, 5];
413     &x[!0..4];
414 }
415
416 #[test]
417 #[should_panic]
418 fn test_slice_out_of_bounds_4() {
419     let x = vec![1, 2, 3, 4, 5];
420     &x[1..6];
421 }
422
423 #[test]
424 #[should_panic]
425 fn test_slice_out_of_bounds_5() {
426     let x = vec![1, 2, 3, 4, 5];
427     &x[3..2];
428 }
429
430 #[test]
431 #[should_panic]
432 fn test_swap_remove_empty() {
433     let mut vec = Vec::<i32>::new();
434     vec.swap_remove(0);
435 }
436
437 #[test]
438 fn test_move_items() {
439     let vec = vec![1, 2, 3];
440     let mut vec2 = vec![];
441     for i in vec {
442         vec2.push(i);
443     }
444     assert_eq!(vec2, [1, 2, 3]);
445 }
446
447 #[test]
448 fn test_move_items_reverse() {
449     let vec = vec![1, 2, 3];
450     let mut vec2 = vec![];
451     for i in vec.into_iter().rev() {
452         vec2.push(i);
453     }
454     assert_eq!(vec2, [3, 2, 1]);
455 }
456
457 #[test]
458 fn test_move_items_zero_sized() {
459     let vec = vec![(), (), ()];
460     let mut vec2 = vec![];
461     for i in vec {
462         vec2.push(i);
463     }
464     assert_eq!(vec2, [(), (), ()]);
465 }
466
467 #[test]
468 fn test_drain_items() {
469     let mut vec = vec![1, 2, 3];
470     let mut vec2 = vec![];
471     for i in vec.drain(..) {
472         vec2.push(i);
473     }
474     assert_eq!(vec, []);
475     assert_eq!(vec2, [1, 2, 3]);
476 }
477
478 #[test]
479 fn test_drain_items_reverse() {
480     let mut vec = vec![1, 2, 3];
481     let mut vec2 = vec![];
482     for i in vec.drain(..).rev() {
483         vec2.push(i);
484     }
485     assert_eq!(vec, []);
486     assert_eq!(vec2, [3, 2, 1]);
487 }
488
489 #[test]
490 fn test_drain_items_zero_sized() {
491     let mut vec = vec![(), (), ()];
492     let mut vec2 = vec![];
493     for i in vec.drain(..) {
494         vec2.push(i);
495     }
496     assert_eq!(vec, []);
497     assert_eq!(vec2, [(), (), ()]);
498 }
499
500 #[test]
501 #[should_panic]
502 fn test_drain_out_of_bounds() {
503     let mut v = vec![1, 2, 3, 4, 5];
504     v.drain(5..6);
505 }
506
507 #[test]
508 fn test_drain_range() {
509     let mut v = vec![1, 2, 3, 4, 5];
510     for _ in v.drain(4..) {}
511     assert_eq!(v, &[1, 2, 3, 4]);
512
513     let mut v: Vec<_> = (1..6).map(|x| x.to_string()).collect();
514     for _ in v.drain(1..4) {}
515     assert_eq!(v, &[1.to_string(), 5.to_string()]);
516
517     let mut v: Vec<_> = (1..6).map(|x| x.to_string()).collect();
518     for _ in v.drain(1..4).rev() {}
519     assert_eq!(v, &[1.to_string(), 5.to_string()]);
520
521     let mut v: Vec<_> = vec![(); 5];
522     for _ in v.drain(1..4).rev() {}
523     assert_eq!(v, &[(), ()]);
524 }
525
526 #[test]
527 fn test_drain_inclusive_range() {
528     let mut v = vec!['a', 'b', 'c', 'd', 'e'];
529     for _ in v.drain(1..=3) {}
530     assert_eq!(v, &['a', 'e']);
531
532     let mut v: Vec<_> = (0..=5).map(|x| x.to_string()).collect();
533     for _ in v.drain(1..=5) {}
534     assert_eq!(v, &["0".to_string()]);
535
536     let mut v: Vec<String> = (0..=5).map(|x| x.to_string()).collect();
537     for _ in v.drain(0..=5) {}
538     assert_eq!(v, Vec::<String>::new());
539
540     let mut v: Vec<_> = (0..=5).map(|x| x.to_string()).collect();
541     for _ in v.drain(0..=3) {}
542     assert_eq!(v, &["4".to_string(), "5".to_string()]);
543
544     let mut v: Vec<_> = (0..=1).map(|x| x.to_string()).collect();
545     for _ in v.drain(..=0) {}
546     assert_eq!(v, &["1".to_string()]);
547 }
548
549 #[test]
550 fn test_drain_max_vec_size() {
551     let mut v = Vec::<()>::with_capacity(usize::max_value());
552     unsafe {
553         v.set_len(usize::max_value());
554     }
555     for _ in v.drain(usize::max_value() - 1..) {}
556     assert_eq!(v.len(), usize::max_value() - 1);
557
558     let mut v = Vec::<()>::with_capacity(usize::max_value());
559     unsafe {
560         v.set_len(usize::max_value());
561     }
562     for _ in v.drain(usize::max_value() - 1..=usize::max_value() - 1) {}
563     assert_eq!(v.len(), usize::max_value() - 1);
564 }
565
566 #[test]
567 #[should_panic]
568 fn test_drain_inclusive_out_of_bounds() {
569     let mut v = vec![1, 2, 3, 4, 5];
570     v.drain(5..=5);
571 }
572
573 #[test]
574 fn test_splice() {
575     let mut v = vec![1, 2, 3, 4, 5];
576     let a = [10, 11, 12];
577     v.splice(2..4, a.iter().cloned());
578     assert_eq!(v, &[1, 2, 10, 11, 12, 5]);
579     v.splice(1..3, Some(20));
580     assert_eq!(v, &[1, 20, 11, 12, 5]);
581 }
582
583 #[test]
584 fn test_splice_inclusive_range() {
585     let mut v = vec![1, 2, 3, 4, 5];
586     let a = [10, 11, 12];
587     let t1: Vec<_> = v.splice(2..=3, a.iter().cloned()).collect();
588     assert_eq!(v, &[1, 2, 10, 11, 12, 5]);
589     assert_eq!(t1, &[3, 4]);
590     let t2: Vec<_> = v.splice(1..=2, Some(20)).collect();
591     assert_eq!(v, &[1, 20, 11, 12, 5]);
592     assert_eq!(t2, &[2, 10]);
593 }
594
595 #[test]
596 #[should_panic]
597 fn test_splice_out_of_bounds() {
598     let mut v = vec![1, 2, 3, 4, 5];
599     let a = [10, 11, 12];
600     v.splice(5..6, a.iter().cloned());
601 }
602
603 #[test]
604 #[should_panic]
605 fn test_splice_inclusive_out_of_bounds() {
606     let mut v = vec![1, 2, 3, 4, 5];
607     let a = [10, 11, 12];
608     v.splice(5..=5, a.iter().cloned());
609 }
610
611 #[test]
612 fn test_splice_items_zero_sized() {
613     let mut vec = vec![(), (), ()];
614     let vec2 = vec![];
615     let t: Vec<_> = vec.splice(1..2, vec2.iter().cloned()).collect();
616     assert_eq!(vec, &[(), ()]);
617     assert_eq!(t, &[()]);
618 }
619
620 #[test]
621 fn test_splice_unbounded() {
622     let mut vec = vec![1, 2, 3, 4, 5];
623     let t: Vec<_> = vec.splice(.., None).collect();
624     assert_eq!(vec, &[]);
625     assert_eq!(t, &[1, 2, 3, 4, 5]);
626 }
627
628 #[test]
629 fn test_splice_forget() {
630     let mut v = vec![1, 2, 3, 4, 5];
631     let a = [10, 11, 12];
632     std::mem::forget(v.splice(2..4, a.iter().cloned()));
633     assert_eq!(v, &[1, 2]);
634 }
635
636 #[test]
637 fn test_into_boxed_slice() {
638     let xs = vec![1, 2, 3];
639     let ys = xs.into_boxed_slice();
640     assert_eq!(&*ys, [1, 2, 3]);
641 }
642
643 #[test]
644 fn test_append() {
645     let mut vec = vec![1, 2, 3];
646     let mut vec2 = vec![4, 5, 6];
647     vec.append(&mut vec2);
648     assert_eq!(vec, [1, 2, 3, 4, 5, 6]);
649     assert_eq!(vec2, []);
650 }
651
652 #[test]
653 fn test_split_off() {
654     let mut vec = vec![1, 2, 3, 4, 5, 6];
655     let vec2 = vec.split_off(4);
656     assert_eq!(vec, [1, 2, 3, 4]);
657     assert_eq!(vec2, [5, 6]);
658 }
659
660 #[test]
661 fn test_into_iter_as_slice() {
662     let vec = vec!['a', 'b', 'c'];
663     let mut into_iter = vec.into_iter();
664     assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
665     let _ = into_iter.next().unwrap();
666     assert_eq!(into_iter.as_slice(), &['b', 'c']);
667     let _ = into_iter.next().unwrap();
668     let _ = into_iter.next().unwrap();
669     assert_eq!(into_iter.as_slice(), &[]);
670 }
671
672 #[test]
673 fn test_into_iter_as_mut_slice() {
674     let vec = vec!['a', 'b', 'c'];
675     let mut into_iter = vec.into_iter();
676     assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
677     into_iter.as_mut_slice()[0] = 'x';
678     into_iter.as_mut_slice()[1] = 'y';
679     assert_eq!(into_iter.next().unwrap(), 'x');
680     assert_eq!(into_iter.as_slice(), &['y', 'c']);
681 }
682
683 #[test]
684 fn test_into_iter_debug() {
685     let vec = vec!['a', 'b', 'c'];
686     let into_iter = vec.into_iter();
687     let debug = format!("{:?}", into_iter);
688     assert_eq!(debug, "IntoIter(['a', 'b', 'c'])");
689 }
690
691 #[test]
692 fn test_into_iter_count() {
693     assert_eq!(vec![1, 2, 3].into_iter().count(), 3);
694 }
695
696 #[test]
697 fn test_into_iter_clone() {
698     fn iter_equal<I: Iterator<Item = i32>>(it: I, slice: &[i32]) {
699         let v: Vec<i32> = it.collect();
700         assert_eq!(&v[..], slice);
701     }
702     let mut it = vec![1, 2, 3].into_iter();
703     iter_equal(it.clone(), &[1, 2, 3]);
704     assert_eq!(it.next(), Some(1));
705     let mut it = it.rev();
706     iter_equal(it.clone(), &[3, 2]);
707     assert_eq!(it.next(), Some(3));
708     iter_equal(it.clone(), &[2]);
709     assert_eq!(it.next(), Some(2));
710     iter_equal(it.clone(), &[]);
711     assert_eq!(it.next(), None);
712 }
713
714 #[test]
715 fn test_cow_from() {
716     let borrowed: &[_] = &["borrowed", "(slice)"];
717     let owned = vec!["owned", "(vec)"];
718     match (Cow::from(owned.clone()), Cow::from(borrowed)) {
719         (Cow::Owned(o), Cow::Borrowed(b)) => assert!(o == owned && b == borrowed),
720         _ => panic!("invalid `Cow::from`"),
721     }
722 }
723
724 #[test]
725 fn test_from_cow() {
726     let borrowed: &[_] = &["borrowed", "(slice)"];
727     let owned = vec!["owned", "(vec)"];
728     assert_eq!(Vec::from(Cow::Borrowed(borrowed)), vec!["borrowed", "(slice)"]);
729     assert_eq!(Vec::from(Cow::Owned(owned)), vec!["owned", "(vec)"]);
730 }
731
732 #[allow(dead_code)]
733 fn assert_covariance() {
734     fn drain<'new>(d: Drain<'static, &'static str>) -> Drain<'new, &'new str> {
735         d
736     }
737     fn into_iter<'new>(i: IntoIter<&'static str>) -> IntoIter<&'new str> {
738         i
739     }
740 }
741
742 #[test]
743 fn from_into_inner() {
744     let vec = vec![1, 2, 3];
745     let ptr = vec.as_ptr();
746     let vec = vec.into_iter().collect::<Vec<_>>();
747     assert_eq!(vec, [1, 2, 3]);
748     assert_eq!(vec.as_ptr(), ptr);
749
750     let ptr = &vec[1] as *const _;
751     let mut it = vec.into_iter();
752     it.next().unwrap();
753     let vec = it.collect::<Vec<_>>();
754     assert_eq!(vec, [2, 3]);
755     assert!(ptr != vec.as_ptr());
756 }
757
758 #[test]
759 fn overaligned_allocations() {
760     #[repr(align(256))]
761     struct Foo(usize);
762     let mut v = vec![Foo(273)];
763     for i in 0..0x1000 {
764         v.reserve_exact(i);
765         assert!(v[0].0 == 273);
766         assert!(v.as_ptr() as usize & 0xff == 0);
767         v.shrink_to_fit();
768         assert!(v[0].0 == 273);
769         assert!(v.as_ptr() as usize & 0xff == 0);
770     }
771 }
772
773 #[test]
774 fn drain_filter_empty() {
775     let mut vec: Vec<i32> = vec![];
776
777     {
778         let mut iter = vec.drain_filter(|_| true);
779         assert_eq!(iter.size_hint(), (0, Some(0)));
780         assert_eq!(iter.next(), None);
781         assert_eq!(iter.size_hint(), (0, Some(0)));
782         assert_eq!(iter.next(), None);
783         assert_eq!(iter.size_hint(), (0, Some(0)));
784     }
785     assert_eq!(vec.len(), 0);
786     assert_eq!(vec, vec![]);
787 }
788
789 #[test]
790 fn drain_filter_zst() {
791     let mut vec = vec![(), (), (), (), ()];
792     let initial_len = vec.len();
793     let mut count = 0;
794     {
795         let mut iter = vec.drain_filter(|_| true);
796         assert_eq!(iter.size_hint(), (0, Some(initial_len)));
797         while let Some(_) = iter.next() {
798             count += 1;
799             assert_eq!(iter.size_hint(), (0, Some(initial_len - count)));
800         }
801         assert_eq!(iter.size_hint(), (0, Some(0)));
802         assert_eq!(iter.next(), None);
803         assert_eq!(iter.size_hint(), (0, Some(0)));
804     }
805
806     assert_eq!(count, initial_len);
807     assert_eq!(vec.len(), 0);
808     assert_eq!(vec, vec![]);
809 }
810
811 #[test]
812 fn drain_filter_false() {
813     let mut vec = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
814
815     let initial_len = vec.len();
816     let mut count = 0;
817     {
818         let mut iter = vec.drain_filter(|_| false);
819         assert_eq!(iter.size_hint(), (0, Some(initial_len)));
820         for _ in iter.by_ref() {
821             count += 1;
822         }
823         assert_eq!(iter.size_hint(), (0, Some(0)));
824         assert_eq!(iter.next(), None);
825         assert_eq!(iter.size_hint(), (0, Some(0)));
826     }
827
828     assert_eq!(count, 0);
829     assert_eq!(vec.len(), initial_len);
830     assert_eq!(vec, vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
831 }
832
833 #[test]
834 fn drain_filter_true() {
835     let mut vec = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
836
837     let initial_len = vec.len();
838     let mut count = 0;
839     {
840         let mut iter = vec.drain_filter(|_| true);
841         assert_eq!(iter.size_hint(), (0, Some(initial_len)));
842         while let Some(_) = iter.next() {
843             count += 1;
844             assert_eq!(iter.size_hint(), (0, Some(initial_len - count)));
845         }
846         assert_eq!(iter.size_hint(), (0, Some(0)));
847         assert_eq!(iter.next(), None);
848         assert_eq!(iter.size_hint(), (0, Some(0)));
849     }
850
851     assert_eq!(count, initial_len);
852     assert_eq!(vec.len(), 0);
853     assert_eq!(vec, vec![]);
854 }
855
856 #[test]
857 fn drain_filter_complex() {
858     {
859         //                [+xxx++++++xxxxx++++x+x++]
860         let mut vec = vec![
861             1, 2, 4, 6, 7, 9, 11, 13, 15, 17, 18, 20, 22, 24, 26, 27, 29, 31, 33, 34, 35, 36, 37,
862             39,
863         ];
864
865         let removed = vec.drain_filter(|x| *x % 2 == 0).collect::<Vec<_>>();
866         assert_eq!(removed.len(), 10);
867         assert_eq!(removed, vec![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
868
869         assert_eq!(vec.len(), 14);
870         assert_eq!(vec, vec![1, 7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35, 37, 39]);
871     }
872
873     {
874         //                [xxx++++++xxxxx++++x+x++]
875         let mut vec = vec![
876             2, 4, 6, 7, 9, 11, 13, 15, 17, 18, 20, 22, 24, 26, 27, 29, 31, 33, 34, 35, 36, 37, 39,
877         ];
878
879         let removed = vec.drain_filter(|x| *x % 2 == 0).collect::<Vec<_>>();
880         assert_eq!(removed.len(), 10);
881         assert_eq!(removed, vec![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
882
883         assert_eq!(vec.len(), 13);
884         assert_eq!(vec, vec![7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35, 37, 39]);
885     }
886
887     {
888         //                [xxx++++++xxxxx++++x+x]
889         let mut vec =
890             vec![2, 4, 6, 7, 9, 11, 13, 15, 17, 18, 20, 22, 24, 26, 27, 29, 31, 33, 34, 35, 36];
891
892         let removed = vec.drain_filter(|x| *x % 2 == 0).collect::<Vec<_>>();
893         assert_eq!(removed.len(), 10);
894         assert_eq!(removed, vec![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
895
896         assert_eq!(vec.len(), 11);
897         assert_eq!(vec, vec![7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35]);
898     }
899
900     {
901         //                [xxxxxxxxxx+++++++++++]
902         let mut vec = vec![2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19];
903
904         let removed = vec.drain_filter(|x| *x % 2 == 0).collect::<Vec<_>>();
905         assert_eq!(removed.len(), 10);
906         assert_eq!(removed, vec![2, 4, 6, 8, 10, 12, 14, 16, 18, 20]);
907
908         assert_eq!(vec.len(), 10);
909         assert_eq!(vec, vec![1, 3, 5, 7, 9, 11, 13, 15, 17, 19]);
910     }
911
912     {
913         //                [+++++++++++xxxxxxxxxx]
914         let mut vec = vec![1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20];
915
916         let removed = vec.drain_filter(|x| *x % 2 == 0).collect::<Vec<_>>();
917         assert_eq!(removed.len(), 10);
918         assert_eq!(removed, vec![2, 4, 6, 8, 10, 12, 14, 16, 18, 20]);
919
920         assert_eq!(vec.len(), 10);
921         assert_eq!(vec, vec![1, 3, 5, 7, 9, 11, 13, 15, 17, 19]);
922     }
923 }
924
925 // FIXME: re-enable emscripten once it can unwind again
926 #[test]
927 #[cfg(not(target_os = "emscripten"))]
928 fn drain_filter_consumed_panic() {
929     use std::rc::Rc;
930     use std::sync::Mutex;
931
932     struct Check {
933         index: usize,
934         drop_counts: Rc<Mutex<Vec<usize>>>,
935     };
936
937     impl Drop for Check {
938         fn drop(&mut self) {
939             self.drop_counts.lock().unwrap()[self.index] += 1;
940             println!("drop: {}", self.index);
941         }
942     }
943
944     let check_count = 10;
945     let drop_counts = Rc::new(Mutex::new(vec![0_usize; check_count]));
946     let mut data: Vec<Check> = (0..check_count)
947         .map(|index| Check { index, drop_counts: Rc::clone(&drop_counts) })
948         .collect();
949
950     let _ = std::panic::catch_unwind(move || {
951         let filter = |c: &mut Check| {
952             if c.index == 2 {
953                 panic!("panic at index: {}", c.index);
954             }
955             // Verify that if the filter could panic again on another element
956             // that it would not cause a double panic and all elements of the
957             // vec would still be dropped exactly once.
958             if c.index == 4 {
959                 panic!("panic at index: {}", c.index);
960             }
961             c.index < 6
962         };
963         let drain = data.drain_filter(filter);
964
965         // NOTE: The DrainFilter is explicitly consumed
966         drain.for_each(drop);
967     });
968
969     let drop_counts = drop_counts.lock().unwrap();
970     assert_eq!(check_count, drop_counts.len());
971
972     for (index, count) in drop_counts.iter().cloned().enumerate() {
973         assert_eq!(1, count, "unexpected drop count at index: {} (count: {})", index, count);
974     }
975 }
976
977 // FIXME: Re-enable emscripten once it can catch panics
978 #[test]
979 #[cfg(not(target_os = "emscripten"))]
980 fn drain_filter_unconsumed_panic() {
981     use std::rc::Rc;
982     use std::sync::Mutex;
983
984     struct Check {
985         index: usize,
986         drop_counts: Rc<Mutex<Vec<usize>>>,
987     };
988
989     impl Drop for Check {
990         fn drop(&mut self) {
991             self.drop_counts.lock().unwrap()[self.index] += 1;
992             println!("drop: {}", self.index);
993         }
994     }
995
996     let check_count = 10;
997     let drop_counts = Rc::new(Mutex::new(vec![0_usize; check_count]));
998     let mut data: Vec<Check> = (0..check_count)
999         .map(|index| Check { index, drop_counts: Rc::clone(&drop_counts) })
1000         .collect();
1001
1002     let _ = std::panic::catch_unwind(move || {
1003         let filter = |c: &mut Check| {
1004             if c.index == 2 {
1005                 panic!("panic at index: {}", c.index);
1006             }
1007             // Verify that if the filter could panic again on another element
1008             // that it would not cause a double panic and all elements of the
1009             // vec would still be dropped exactly once.
1010             if c.index == 4 {
1011                 panic!("panic at index: {}", c.index);
1012             }
1013             c.index < 6
1014         };
1015         let _drain = data.drain_filter(filter);
1016
1017         // NOTE: The DrainFilter is dropped without being consumed
1018     });
1019
1020     let drop_counts = drop_counts.lock().unwrap();
1021     assert_eq!(check_count, drop_counts.len());
1022
1023     for (index, count) in drop_counts.iter().cloned().enumerate() {
1024         assert_eq!(1, count, "unexpected drop count at index: {} (count: {})", index, count);
1025     }
1026 }
1027
1028 #[test]
1029 fn drain_filter_unconsumed() {
1030     let mut vec = vec![1, 2, 3, 4];
1031     let drain = vec.drain_filter(|&mut x| x % 2 != 0);
1032     drop(drain);
1033     assert_eq!(vec, [2, 4]);
1034 }
1035
1036 #[test]
1037 fn test_reserve_exact() {
1038     // This is all the same as test_reserve
1039
1040     let mut v = Vec::new();
1041     assert_eq!(v.capacity(), 0);
1042
1043     v.reserve_exact(2);
1044     assert!(v.capacity() >= 2);
1045
1046     for i in 0..16 {
1047         v.push(i);
1048     }
1049
1050     assert!(v.capacity() >= 16);
1051     v.reserve_exact(16);
1052     assert!(v.capacity() >= 32);
1053
1054     v.push(16);
1055
1056     v.reserve_exact(16);
1057     assert!(v.capacity() >= 33)
1058 }
1059
1060 #[test]
1061 #[cfg_attr(miri, ignore)] // Miri does not support signalling OOM
1062 fn test_try_reserve() {
1063     // These are the interesting cases:
1064     // * exactly isize::MAX should never trigger a CapacityOverflow (can be OOM)
1065     // * > isize::MAX should always fail
1066     //    * On 16/32-bit should CapacityOverflow
1067     //    * On 64-bit should OOM
1068     // * overflow may trigger when adding `len` to `cap` (in number of elements)
1069     // * overflow may trigger when multiplying `new_cap` by size_of::<T> (to get bytes)
1070
1071     const MAX_CAP: usize = isize::MAX as usize;
1072     const MAX_USIZE: usize = usize::MAX;
1073
1074     // On 16/32-bit, we check that allocations don't exceed isize::MAX,
1075     // on 64-bit, we assume the OS will give an OOM for such a ridiculous size.
1076     // Any platform that succeeds for these requests is technically broken with
1077     // ptr::offset because LLVM is the worst.
1078     let guards_against_isize = size_of::<usize>() < 8;
1079
1080     {
1081         // Note: basic stuff is checked by test_reserve
1082         let mut empty_bytes: Vec<u8> = Vec::new();
1083
1084         // Check isize::MAX doesn't count as an overflow
1085         if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_CAP) {
1086             panic!("isize::MAX shouldn't trigger an overflow!");
1087         }
1088         // Play it again, frank! (just to be sure)
1089         if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_CAP) {
1090             panic!("isize::MAX shouldn't trigger an overflow!");
1091         }
1092
1093         if guards_against_isize {
1094             // Check isize::MAX + 1 does count as overflow
1095             if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_CAP + 1) {
1096             } else {
1097                 panic!("isize::MAX + 1 should trigger an overflow!")
1098             }
1099
1100             // Check usize::MAX does count as overflow
1101             if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_USIZE) {
1102             } else {
1103                 panic!("usize::MAX should trigger an overflow!")
1104             }
1105         } else {
1106             // Check isize::MAX + 1 is an OOM
1107             if let Err(AllocError { .. }) = empty_bytes.try_reserve(MAX_CAP + 1) {
1108             } else {
1109                 panic!("isize::MAX + 1 should trigger an OOM!")
1110             }
1111
1112             // Check usize::MAX is an OOM
1113             if let Err(AllocError { .. }) = empty_bytes.try_reserve(MAX_USIZE) {
1114             } else {
1115                 panic!("usize::MAX should trigger an OOM!")
1116             }
1117         }
1118     }
1119
1120     {
1121         // Same basic idea, but with non-zero len
1122         let mut ten_bytes: Vec<u8> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
1123
1124         if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_CAP - 10) {
1125             panic!("isize::MAX shouldn't trigger an overflow!");
1126         }
1127         if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_CAP - 10) {
1128             panic!("isize::MAX shouldn't trigger an overflow!");
1129         }
1130         if guards_against_isize {
1131             if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_CAP - 9) {
1132             } else {
1133                 panic!("isize::MAX + 1 should trigger an overflow!");
1134             }
1135         } else {
1136             if let Err(AllocError { .. }) = ten_bytes.try_reserve(MAX_CAP - 9) {
1137             } else {
1138                 panic!("isize::MAX + 1 should trigger an OOM!")
1139             }
1140         }
1141         // Should always overflow in the add-to-len
1142         if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_USIZE) {
1143         } else {
1144             panic!("usize::MAX should trigger an overflow!")
1145         }
1146     }
1147
1148     {
1149         // Same basic idea, but with interesting type size
1150         let mut ten_u32s: Vec<u32> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
1151
1152         if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_CAP / 4 - 10) {
1153             panic!("isize::MAX shouldn't trigger an overflow!");
1154         }
1155         if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_CAP / 4 - 10) {
1156             panic!("isize::MAX shouldn't trigger an overflow!");
1157         }
1158         if guards_against_isize {
1159             if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_CAP / 4 - 9) {
1160             } else {
1161                 panic!("isize::MAX + 1 should trigger an overflow!");
1162             }
1163         } else {
1164             if let Err(AllocError { .. }) = ten_u32s.try_reserve(MAX_CAP / 4 - 9) {
1165             } else {
1166                 panic!("isize::MAX + 1 should trigger an OOM!")
1167             }
1168         }
1169         // Should fail in the mul-by-size
1170         if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_USIZE - 20) {
1171         } else {
1172             panic!("usize::MAX should trigger an overflow!");
1173         }
1174     }
1175 }
1176
1177 #[test]
1178 #[cfg_attr(miri, ignore)] // Miri does not support signalling OOM
1179 fn test_try_reserve_exact() {
1180     // This is exactly the same as test_try_reserve with the method changed.
1181     // See that test for comments.
1182
1183     const MAX_CAP: usize = isize::MAX as usize;
1184     const MAX_USIZE: usize = usize::MAX;
1185
1186     let guards_against_isize = size_of::<usize>() < 8;
1187
1188     {
1189         let mut empty_bytes: Vec<u8> = Vec::new();
1190
1191         if let Err(CapacityOverflow) = empty_bytes.try_reserve_exact(MAX_CAP) {
1192             panic!("isize::MAX shouldn't trigger an overflow!");
1193         }
1194         if let Err(CapacityOverflow) = empty_bytes.try_reserve_exact(MAX_CAP) {
1195             panic!("isize::MAX shouldn't trigger an overflow!");
1196         }
1197
1198         if guards_against_isize {
1199             if let Err(CapacityOverflow) = empty_bytes.try_reserve_exact(MAX_CAP + 1) {
1200             } else {
1201                 panic!("isize::MAX + 1 should trigger an overflow!")
1202             }
1203
1204             if let Err(CapacityOverflow) = empty_bytes.try_reserve_exact(MAX_USIZE) {
1205             } else {
1206                 panic!("usize::MAX should trigger an overflow!")
1207             }
1208         } else {
1209             if let Err(AllocError { .. }) = empty_bytes.try_reserve_exact(MAX_CAP + 1) {
1210             } else {
1211                 panic!("isize::MAX + 1 should trigger an OOM!")
1212             }
1213
1214             if let Err(AllocError { .. }) = empty_bytes.try_reserve_exact(MAX_USIZE) {
1215             } else {
1216                 panic!("usize::MAX should trigger an OOM!")
1217             }
1218         }
1219     }
1220
1221     {
1222         let mut ten_bytes: Vec<u8> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
1223
1224         if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_CAP - 10) {
1225             panic!("isize::MAX shouldn't trigger an overflow!");
1226         }
1227         if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_CAP - 10) {
1228             panic!("isize::MAX shouldn't trigger an overflow!");
1229         }
1230         if guards_against_isize {
1231             if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_CAP - 9) {
1232             } else {
1233                 panic!("isize::MAX + 1 should trigger an overflow!");
1234             }
1235         } else {
1236             if let Err(AllocError { .. }) = ten_bytes.try_reserve_exact(MAX_CAP - 9) {
1237             } else {
1238                 panic!("isize::MAX + 1 should trigger an OOM!")
1239             }
1240         }
1241         if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_USIZE) {
1242         } else {
1243             panic!("usize::MAX should trigger an overflow!")
1244         }
1245     }
1246
1247     {
1248         let mut ten_u32s: Vec<u32> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
1249
1250         if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_CAP / 4 - 10) {
1251             panic!("isize::MAX shouldn't trigger an overflow!");
1252         }
1253         if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_CAP / 4 - 10) {
1254             panic!("isize::MAX shouldn't trigger an overflow!");
1255         }
1256         if guards_against_isize {
1257             if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_CAP / 4 - 9) {
1258             } else {
1259                 panic!("isize::MAX + 1 should trigger an overflow!");
1260             }
1261         } else {
1262             if let Err(AllocError { .. }) = ten_u32s.try_reserve_exact(MAX_CAP / 4 - 9) {
1263             } else {
1264                 panic!("isize::MAX + 1 should trigger an OOM!")
1265             }
1266         }
1267         if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_USIZE - 20) {
1268         } else {
1269             panic!("usize::MAX should trigger an overflow!")
1270         }
1271     }
1272 }
1273
1274 #[test]
1275 fn test_stable_push_pop() {
1276     // Test that, if we reserved enough space, adding and removing elements does not
1277     // invalidate references into the vector (such as `v0`).  This test also
1278     // runs in Miri, which would detect such problems.
1279     let mut v = Vec::with_capacity(10);
1280     v.push(13);
1281
1282     // laundering the lifetime -- we take care that `v` does not reallocate, so that's okay.
1283     let v0 = unsafe { &*(&v[0] as *const _) };
1284
1285     // Now do a bunch of things and occasionally use `v0` again to assert it is still valid.
1286     v.push(1);
1287     v.push(2);
1288     v.insert(1, 1);
1289     assert_eq!(*v0, 13);
1290     v.remove(1);
1291     v.pop().unwrap();
1292     assert_eq!(*v0, 13);
1293 }
1294
1295 // https://github.com/rust-lang/rust/pull/49496 introduced specialization based on:
1296 //
1297 // ```
1298 // unsafe impl<T: ?Sized> IsZero for *mut T {
1299 //     fn is_zero(&self) -> bool {
1300 //         (*self).is_null()
1301 //     }
1302 // }
1303 // ```
1304 //
1305 // … to call `RawVec::with_capacity_zeroed` for creating `Vec<*mut T>`,
1306 // which is incorrect for fat pointers since `<*mut T>::is_null` only looks at the data component.
1307 // That is, a fat pointer can be “null” without being made entirely of zero bits.
1308 #[test]
1309 fn vec_macro_repeating_null_raw_fat_pointer() {
1310     let raw_dyn = &mut (|| ()) as &mut dyn Fn() as *mut dyn Fn();
1311     let vtable = dbg!(ptr_metadata(raw_dyn));
1312     let null_raw_dyn = ptr_from_raw_parts(std::ptr::null_mut(), vtable);
1313     assert!(null_raw_dyn.is_null());
1314
1315     let vec = vec![null_raw_dyn; 1];
1316     dbg!(ptr_metadata(vec[0]));
1317     assert!(vec[0] == null_raw_dyn);
1318
1319     // Polyfill for https://github.com/rust-lang/rfcs/pull/2580
1320
1321     fn ptr_metadata(ptr: *mut dyn Fn()) -> *mut () {
1322         unsafe { std::mem::transmute::<*mut dyn Fn(), DynRepr>(ptr).vtable }
1323     }
1324
1325     fn ptr_from_raw_parts(data: *mut (), vtable: *mut ()) -> *mut dyn Fn() {
1326         unsafe { std::mem::transmute::<DynRepr, *mut dyn Fn()>(DynRepr { data, vtable }) }
1327     }
1328
1329     #[repr(C)]
1330     struct DynRepr {
1331         data: *mut (),
1332         vtable: *mut (),
1333     }
1334 }