]> git.lizzy.rs Git - rust.git/blob - src/libcollections/tests/vec.rs
Auto merge of #40996 - alexcrichton:update-cargo, r=alexcrichton
[rust.git] / src / libcollections / tests / vec.rs
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
11 use std::ascii::AsciiExt;
12 use std::borrow::Cow;
13 use std::mem::size_of;
14 use std::panic;
15 use std::vec::{Drain, IntoIter};
16
17 struct DropCounter<'a> {
18     count: &'a mut u32,
19 }
20
21 impl<'a> Drop for DropCounter<'a> {
22     fn drop(&mut self) {
23         *self.count += 1;
24     }
25 }
26
27 #[test]
28 fn test_small_vec_struct() {
29     assert!(size_of::<Vec<u8>>() == size_of::<usize>() * 3);
30 }
31
32 #[test]
33 fn test_double_drop() {
34     struct TwoVec<T> {
35         x: Vec<T>,
36         y: Vec<T>,
37     }
38
39     let (mut count_x, mut count_y) = (0, 0);
40     {
41         let mut tv = TwoVec {
42             x: Vec::new(),
43             y: Vec::new(),
44         };
45         tv.x.push(DropCounter { count: &mut count_x });
46         tv.y.push(DropCounter { count: &mut count_y });
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]
61 fn 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]
83 fn test_extend() {
84     let mut v = Vec::new();
85     let mut w = Vec::new();
86
87     v.extend(0..3);
88     for i in 0..3 {
89         w.push(i)
90     }
91
92     assert_eq!(v, w);
93
94     v.extend(3..10);
95     for i in 3..10 {
96         w.push(i)
97     }
98
99     assert_eq!(v, w);
100
101     v.extend(w.clone()); // specializes to `append`
102     assert!(v.iter().eq(w.iter().chain(w.iter())));
103 }
104
105 #[test]
106 fn test_extend_ref() {
107     let mut v = vec![1, 2];
108     v.extend(&[3, 4, 5]);
109
110     assert_eq!(v.len(), 5);
111     assert_eq!(v, [1, 2, 3, 4, 5]);
112
113     let w = vec![6, 7];
114     v.extend(&w);
115
116     assert_eq!(v.len(), 7);
117     assert_eq!(v, [1, 2, 3, 4, 5, 6, 7]);
118 }
119
120 #[test]
121 fn test_slice_from_mut() {
122     let mut values = vec![1, 2, 3, 4, 5];
123     {
124         let slice = &mut values[2..];
125         assert!(slice == [3, 4, 5]);
126         for p in slice {
127             *p += 2;
128         }
129     }
130
131     assert!(values == [1, 2, 5, 6, 7]);
132 }
133
134 #[test]
135 fn test_slice_to_mut() {
136     let mut values = vec![1, 2, 3, 4, 5];
137     {
138         let slice = &mut values[..2];
139         assert!(slice == [1, 2]);
140         for p in slice {
141             *p += 1;
142         }
143     }
144
145     assert!(values == [2, 3, 3, 4, 5]);
146 }
147
148 #[test]
149 fn test_split_at_mut() {
150     let mut values = vec![1, 2, 3, 4, 5];
151     {
152         let (left, right) = values.split_at_mut(2);
153         {
154             let left: &[_] = left;
155             assert!(&left[..left.len()] == &[1, 2]);
156         }
157         for p in left {
158             *p += 1;
159         }
160
161         {
162             let right: &[_] = right;
163             assert!(&right[..right.len()] == &[3, 4, 5]);
164         }
165         for p in right {
166             *p += 2;
167         }
168     }
169
170     assert_eq!(values, [2, 3, 5, 6, 7]);
171 }
172
173 #[test]
174 fn test_clone() {
175     let v: Vec<i32> = vec![];
176     let w = vec![1, 2, 3];
177
178     assert_eq!(v, v.clone());
179
180     let z = w.clone();
181     assert_eq!(w, z);
182     // they should be disjoint in memory.
183     assert!(w.as_ptr() != z.as_ptr())
184 }
185
186 #[test]
187 fn test_clone_from() {
188     let mut v = vec![];
189     let three: Vec<Box<_>> = vec![box 1, box 2, box 3];
190     let two: Vec<Box<_>> = vec![box 4, box 5];
191     // zero, long
192     v.clone_from(&three);
193     assert_eq!(v, three);
194
195     // equal
196     v.clone_from(&three);
197     assert_eq!(v, three);
198
199     // long, short
200     v.clone_from(&two);
201     assert_eq!(v, two);
202
203     // short, long
204     v.clone_from(&three);
205     assert_eq!(v, three)
206 }
207
208 #[test]
209 fn test_retain() {
210     let mut vec = vec![1, 2, 3, 4];
211     vec.retain(|&x| x % 2 == 0);
212     assert_eq!(vec, [2, 4]);
213 }
214
215 #[test]
216 fn test_dedup() {
217     fn case(a: Vec<i32>, b: Vec<i32>) {
218         let mut v = a;
219         v.dedup();
220         assert_eq!(v, b);
221     }
222     case(vec![], vec![]);
223     case(vec![1], vec![1]);
224     case(vec![1, 1], vec![1]);
225     case(vec![1, 2, 3], vec![1, 2, 3]);
226     case(vec![1, 1, 2, 3], vec![1, 2, 3]);
227     case(vec![1, 2, 2, 3], vec![1, 2, 3]);
228     case(vec![1, 2, 3, 3], vec![1, 2, 3]);
229     case(vec![1, 1, 2, 2, 2, 3, 3], vec![1, 2, 3]);
230 }
231
232 #[test]
233 fn test_dedup_by_key() {
234     fn case(a: Vec<i32>, b: Vec<i32>) {
235         let mut v = a;
236         v.dedup_by_key(|i| *i / 10);
237         assert_eq!(v, b);
238     }
239     case(vec![], vec![]);
240     case(vec![10], vec![10]);
241     case(vec![10, 11], vec![10]);
242     case(vec![10, 20, 30], vec![10, 20, 30]);
243     case(vec![10, 11, 20, 30], vec![10, 20, 30]);
244     case(vec![10, 20, 21, 30], vec![10, 20, 30]);
245     case(vec![10, 20, 30, 31], vec![10, 20, 30]);
246     case(vec![10, 11, 20, 21, 22, 30, 31], vec![10, 20, 30]);
247 }
248
249 #[test]
250 fn test_dedup_by() {
251     let mut vec = vec!["foo", "bar", "Bar", "baz", "bar"];
252     vec.dedup_by(|a, b| a.eq_ignore_ascii_case(b));
253
254     assert_eq!(vec, ["foo", "bar", "baz", "bar"]);
255 }
256
257 #[test]
258 fn test_dedup_unique() {
259     let mut v0: Vec<Box<_>> = vec![box 1, box 1, box 2, box 3];
260     v0.dedup();
261     let mut v1: Vec<Box<_>> = vec![box 1, box 2, box 2, box 3];
262     v1.dedup();
263     let mut v2: Vec<Box<_>> = vec![box 1, box 2, box 3, box 3];
264     v2.dedup();
265     // If the boxed pointers were leaked or otherwise misused, valgrind
266     // and/or rt should raise errors.
267 }
268
269 #[test]
270 fn zero_sized_values() {
271     let mut v = Vec::new();
272     assert_eq!(v.len(), 0);
273     v.push(());
274     assert_eq!(v.len(), 1);
275     v.push(());
276     assert_eq!(v.len(), 2);
277     assert_eq!(v.pop(), Some(()));
278     assert_eq!(v.pop(), Some(()));
279     assert_eq!(v.pop(), None);
280
281     assert_eq!(v.iter().count(), 0);
282     v.push(());
283     assert_eq!(v.iter().count(), 1);
284     v.push(());
285     assert_eq!(v.iter().count(), 2);
286
287     for &() in &v {}
288
289     assert_eq!(v.iter_mut().count(), 2);
290     v.push(());
291     assert_eq!(v.iter_mut().count(), 3);
292     v.push(());
293     assert_eq!(v.iter_mut().count(), 4);
294
295     for &mut () in &mut v {}
296     unsafe {
297         v.set_len(0);
298     }
299     assert_eq!(v.iter_mut().count(), 0);
300 }
301
302 #[test]
303 fn test_partition() {
304     assert_eq!(vec![].into_iter().partition(|x: &i32| *x < 3),
305                (vec![], vec![]));
306     assert_eq!(vec![1, 2, 3].into_iter().partition(|x| *x < 4),
307                (vec![1, 2, 3], vec![]));
308     assert_eq!(vec![1, 2, 3].into_iter().partition(|x| *x < 2),
309                (vec![1], vec![2, 3]));
310     assert_eq!(vec![1, 2, 3].into_iter().partition(|x| *x < 0),
311                (vec![], vec![1, 2, 3]));
312 }
313
314 #[test]
315 fn test_zip_unzip() {
316     let z1 = vec![(1, 4), (2, 5), (3, 6)];
317
318     let (left, right): (Vec<_>, Vec<_>) = z1.iter().cloned().unzip();
319
320     assert_eq!((1, 4), (left[0], right[0]));
321     assert_eq!((2, 5), (left[1], right[1]));
322     assert_eq!((3, 6), (left[2], right[2]));
323 }
324
325 #[test]
326 fn test_vec_truncate_drop() {
327     static mut DROPS: u32 = 0;
328     struct Elem(i32);
329     impl Drop for Elem {
330         fn drop(&mut self) {
331             unsafe {
332                 DROPS += 1;
333             }
334         }
335     }
336
337     let mut v = vec![Elem(1), Elem(2), Elem(3), Elem(4), Elem(5)];
338     assert_eq!(unsafe { DROPS }, 0);
339     v.truncate(3);
340     assert_eq!(unsafe { DROPS }, 2);
341     v.truncate(0);
342     assert_eq!(unsafe { DROPS }, 5);
343 }
344
345 #[test]
346 #[should_panic]
347 fn test_vec_truncate_fail() {
348     struct BadElem(i32);
349     impl Drop for BadElem {
350         fn drop(&mut self) {
351             let BadElem(ref mut x) = *self;
352             if *x == 0xbadbeef {
353                 panic!("BadElem panic: 0xbadbeef")
354             }
355         }
356     }
357
358     let mut v = vec![BadElem(1), BadElem(2), BadElem(0xbadbeef), BadElem(4)];
359     v.truncate(0);
360 }
361
362 #[test]
363 fn test_index() {
364     let vec = vec![1, 2, 3];
365     assert!(vec[1] == 2);
366 }
367
368 #[test]
369 #[should_panic]
370 fn test_index_out_of_bounds() {
371     let vec = vec![1, 2, 3];
372     let _ = vec[3];
373 }
374
375 #[test]
376 #[should_panic]
377 fn test_slice_out_of_bounds_1() {
378     let x = vec![1, 2, 3, 4, 5];
379     &x[!0..];
380 }
381
382 #[test]
383 #[should_panic]
384 fn test_slice_out_of_bounds_2() {
385     let x = vec![1, 2, 3, 4, 5];
386     &x[..6];
387 }
388
389 #[test]
390 #[should_panic]
391 fn test_slice_out_of_bounds_3() {
392     let x = vec![1, 2, 3, 4, 5];
393     &x[!0..4];
394 }
395
396 #[test]
397 #[should_panic]
398 fn test_slice_out_of_bounds_4() {
399     let x = vec![1, 2, 3, 4, 5];
400     &x[1..6];
401 }
402
403 #[test]
404 #[should_panic]
405 fn test_slice_out_of_bounds_5() {
406     let x = vec![1, 2, 3, 4, 5];
407     &x[3..2];
408 }
409
410 #[test]
411 #[should_panic]
412 fn test_swap_remove_empty() {
413     let mut vec = Vec::<i32>::new();
414     vec.swap_remove(0);
415 }
416
417 #[test]
418 fn test_move_items() {
419     let vec = vec![1, 2, 3];
420     let mut vec2 = vec![];
421     for i in vec {
422         vec2.push(i);
423     }
424     assert_eq!(vec2, [1, 2, 3]);
425 }
426
427 #[test]
428 fn test_move_items_reverse() {
429     let vec = vec![1, 2, 3];
430     let mut vec2 = vec![];
431     for i in vec.into_iter().rev() {
432         vec2.push(i);
433     }
434     assert_eq!(vec2, [3, 2, 1]);
435 }
436
437 #[test]
438 fn test_move_items_zero_sized() {
439     let vec = vec![(), (), ()];
440     let mut vec2 = vec![];
441     for i in vec {
442         vec2.push(i);
443     }
444     assert_eq!(vec2, [(), (), ()]);
445 }
446
447 #[test]
448 fn test_drain_items() {
449     let mut vec = vec![1, 2, 3];
450     let mut vec2 = vec![];
451     for i in vec.drain(..) {
452         vec2.push(i);
453     }
454     assert_eq!(vec, []);
455     assert_eq!(vec2, [1, 2, 3]);
456 }
457
458 #[test]
459 fn test_drain_items_reverse() {
460     let mut vec = vec![1, 2, 3];
461     let mut vec2 = vec![];
462     for i in vec.drain(..).rev() {
463         vec2.push(i);
464     }
465     assert_eq!(vec, []);
466     assert_eq!(vec2, [3, 2, 1]);
467 }
468
469 #[test]
470 fn test_drain_items_zero_sized() {
471     let mut vec = vec![(), (), ()];
472     let mut vec2 = vec![];
473     for i in vec.drain(..) {
474         vec2.push(i);
475     }
476     assert_eq!(vec, []);
477     assert_eq!(vec2, [(), (), ()]);
478 }
479
480 #[test]
481 #[should_panic]
482 fn test_drain_out_of_bounds() {
483     let mut v = vec![1, 2, 3, 4, 5];
484     v.drain(5..6);
485 }
486
487 #[test]
488 fn test_drain_range() {
489     let mut v = vec![1, 2, 3, 4, 5];
490     for _ in v.drain(4..) {
491     }
492     assert_eq!(v, &[1, 2, 3, 4]);
493
494     let mut v: Vec<_> = (1..6).map(|x| x.to_string()).collect();
495     for _ in v.drain(1..4) {
496     }
497     assert_eq!(v, &[1.to_string(), 5.to_string()]);
498
499     let mut v: Vec<_> = (1..6).map(|x| x.to_string()).collect();
500     for _ in v.drain(1..4).rev() {
501     }
502     assert_eq!(v, &[1.to_string(), 5.to_string()]);
503
504     let mut v: Vec<_> = vec![(); 5];
505     for _ in v.drain(1..4).rev() {
506     }
507     assert_eq!(v, &[(), ()]);
508 }
509
510 #[test]
511 fn test_drain_inclusive_range() {
512     let mut v = vec!['a', 'b', 'c', 'd', 'e'];
513     for _ in v.drain(1...3) {
514     }
515     assert_eq!(v, &['a', 'e']);
516
517     let mut v: Vec<_> = (0...5).map(|x| x.to_string()).collect();
518     for _ in v.drain(1...5) {
519     }
520     assert_eq!(v, &["0".to_string()]);
521
522     let mut v: Vec<String> = (0...5).map(|x| x.to_string()).collect();
523     for _ in v.drain(0...5) {
524     }
525     assert_eq!(v, Vec::<String>::new());
526
527     let mut v: Vec<_> = (0...5).map(|x| x.to_string()).collect();
528     for _ in v.drain(0...3) {
529     }
530     assert_eq!(v, &["4".to_string(), "5".to_string()]);
531
532     let mut v: Vec<_> = (0...1).map(|x| x.to_string()).collect();
533     for _ in v.drain(...0) {
534     }
535     assert_eq!(v, &["1".to_string()]);
536 }
537
538 #[test]
539 fn test_drain_max_vec_size() {
540     let mut v = Vec::<()>::with_capacity(usize::max_value());
541     unsafe { v.set_len(usize::max_value()); }
542     for _ in v.drain(usize::max_value() - 1..) {
543     }
544     assert_eq!(v.len(), usize::max_value() - 1);
545
546     let mut v = Vec::<()>::with_capacity(usize::max_value());
547     unsafe { v.set_len(usize::max_value()); }
548     for _ in v.drain(usize::max_value() - 1...usize::max_value() - 1) {
549     }
550     assert_eq!(v.len(), usize::max_value() - 1);
551 }
552
553 #[test]
554 #[should_panic]
555 fn test_drain_inclusive_out_of_bounds() {
556     let mut v = vec![1, 2, 3, 4, 5];
557     v.drain(5...5);
558 }
559
560 #[test]
561 fn test_into_boxed_slice() {
562     let xs = vec![1, 2, 3];
563     let ys = xs.into_boxed_slice();
564     assert_eq!(&*ys, [1, 2, 3]);
565 }
566
567 #[test]
568 fn test_append() {
569     let mut vec = vec![1, 2, 3];
570     let mut vec2 = vec![4, 5, 6];
571     vec.append(&mut vec2);
572     assert_eq!(vec, [1, 2, 3, 4, 5, 6]);
573     assert_eq!(vec2, []);
574 }
575
576 #[test]
577 fn test_split_off() {
578     let mut vec = vec![1, 2, 3, 4, 5, 6];
579     let vec2 = vec.split_off(4);
580     assert_eq!(vec, [1, 2, 3, 4]);
581     assert_eq!(vec2, [5, 6]);
582 }
583
584 #[test]
585 fn test_into_iter_as_slice() {
586     let vec = vec!['a', 'b', 'c'];
587     let mut into_iter = vec.into_iter();
588     assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
589     let _ = into_iter.next().unwrap();
590     assert_eq!(into_iter.as_slice(), &['b', 'c']);
591     let _ = into_iter.next().unwrap();
592     let _ = into_iter.next().unwrap();
593     assert_eq!(into_iter.as_slice(), &[]);
594 }
595
596 #[test]
597 fn test_into_iter_as_mut_slice() {
598     let vec = vec!['a', 'b', 'c'];
599     let mut into_iter = vec.into_iter();
600     assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
601     into_iter.as_mut_slice()[0] = 'x';
602     into_iter.as_mut_slice()[1] = 'y';
603     assert_eq!(into_iter.next().unwrap(), 'x');
604     assert_eq!(into_iter.as_slice(), &['y', 'c']);
605 }
606
607 #[test]
608 fn test_into_iter_debug() {
609     let vec = vec!['a', 'b', 'c'];
610     let into_iter = vec.into_iter();
611     let debug = format!("{:?}", into_iter);
612     assert_eq!(debug, "IntoIter(['a', 'b', 'c'])");
613 }
614
615 #[test]
616 fn test_into_iter_count() {
617     assert_eq!(vec![1, 2, 3].into_iter().count(), 3);
618 }
619
620 #[test]
621 fn test_into_iter_clone() {
622     fn iter_equal<I: Iterator<Item = i32>>(it: I, slice: &[i32]) {
623         let v: Vec<i32> = it.collect();
624         assert_eq!(&v[..], slice);
625     }
626     let mut it = vec![1, 2, 3].into_iter();
627     iter_equal(it.clone(), &[1, 2, 3]);
628     assert_eq!(it.next(), Some(1));
629     let mut it = it.rev();
630     iter_equal(it.clone(), &[3, 2]);
631     assert_eq!(it.next(), Some(3));
632     iter_equal(it.clone(), &[2]);
633     assert_eq!(it.next(), Some(2));
634     iter_equal(it.clone(), &[]);
635     assert_eq!(it.next(), None);
636 }
637
638 #[test]
639 fn test_cow_from() {
640     let borrowed: &[_] = &["borrowed", "(slice)"];
641     let owned = vec!["owned", "(vec)"];
642     match (Cow::from(owned.clone()), Cow::from(borrowed)) {
643         (Cow::Owned(o), Cow::Borrowed(b)) => assert!(o == owned && b == borrowed),
644         _ => panic!("invalid `Cow::from`"),
645     }
646 }
647
648 #[test]
649 fn test_from_cow() {
650     let borrowed: &[_] = &["borrowed", "(slice)"];
651     let owned = vec!["owned", "(vec)"];
652     assert_eq!(Vec::from(Cow::Borrowed(borrowed)), vec!["borrowed", "(slice)"]);
653     assert_eq!(Vec::from(Cow::Owned(owned)), vec!["owned", "(vec)"]);
654 }
655
656 #[allow(dead_code)]
657 fn assert_covariance() {
658     fn drain<'new>(d: Drain<'static, &'static str>) -> Drain<'new, &'new str> {
659         d
660     }
661     fn into_iter<'new>(i: IntoIter<&'static str>) -> IntoIter<&'new str> {
662         i
663     }
664 }
665
666 #[test]
667 fn test_placement() {
668     let mut vec = vec![1];
669     assert_eq!(vec.place_back() <- 2, &2);
670     assert_eq!(vec.len(), 2);
671     assert_eq!(vec.place_back() <- 3, &3);
672     assert_eq!(vec.len(), 3);
673     assert_eq!(&vec, &[1, 2, 3]);
674 }
675
676 #[test]
677 fn test_placement_panic() {
678     let mut vec = vec![1, 2, 3];
679     fn mkpanic() -> usize { panic!() }
680     let _ = panic::catch_unwind(panic::AssertUnwindSafe(|| { vec.place_back() <- mkpanic(); }));
681     assert_eq!(vec.len(), 3);
682 }
683
684 #[test]
685 fn from_into_inner() {
686     let vec = vec![1, 2, 3];
687     let ptr = vec.as_ptr();
688     let vec = vec.into_iter().collect::<Vec<_>>();
689     assert_eq!(vec, [1, 2, 3]);
690     assert_eq!(vec.as_ptr(), ptr);
691
692     let ptr = &vec[1] as *const _;
693     let mut it = vec.into_iter();
694     it.next().unwrap();
695     let vec = it.collect::<Vec<_>>();
696     assert_eq!(vec, [2, 3]);
697     assert!(ptr != vec.as_ptr());
698 }