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