]> git.lizzy.rs Git - rust.git/blob - src/libcollectionstest/vec.rs
Rollup merge of #39604 - est31:i128_tests, r=alexcrichton
[rust.git] / src / libcollectionstest / 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_into_boxed_slice() {
512     let xs = vec![1, 2, 3];
513     let ys = xs.into_boxed_slice();
514     assert_eq!(&*ys, [1, 2, 3]);
515 }
516
517 #[test]
518 fn test_append() {
519     let mut vec = vec![1, 2, 3];
520     let mut vec2 = vec![4, 5, 6];
521     vec.append(&mut vec2);
522     assert_eq!(vec, [1, 2, 3, 4, 5, 6]);
523     assert_eq!(vec2, []);
524 }
525
526 #[test]
527 fn test_split_off() {
528     let mut vec = vec![1, 2, 3, 4, 5, 6];
529     let vec2 = vec.split_off(4);
530     assert_eq!(vec, [1, 2, 3, 4]);
531     assert_eq!(vec2, [5, 6]);
532 }
533
534 #[test]
535 fn test_into_iter_as_slice() {
536     let vec = vec!['a', 'b', 'c'];
537     let mut into_iter = vec.into_iter();
538     assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
539     let _ = into_iter.next().unwrap();
540     assert_eq!(into_iter.as_slice(), &['b', 'c']);
541     let _ = into_iter.next().unwrap();
542     let _ = into_iter.next().unwrap();
543     assert_eq!(into_iter.as_slice(), &[]);
544 }
545
546 #[test]
547 fn test_into_iter_as_mut_slice() {
548     let vec = vec!['a', 'b', 'c'];
549     let mut into_iter = vec.into_iter();
550     assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
551     into_iter.as_mut_slice()[0] = 'x';
552     into_iter.as_mut_slice()[1] = 'y';
553     assert_eq!(into_iter.next().unwrap(), 'x');
554     assert_eq!(into_iter.as_slice(), &['y', 'c']);
555 }
556
557 #[test]
558 fn test_into_iter_debug() {
559     let vec = vec!['a', 'b', 'c'];
560     let into_iter = vec.into_iter();
561     let debug = format!("{:?}", into_iter);
562     assert_eq!(debug, "IntoIter(['a', 'b', 'c'])");
563 }
564
565 #[test]
566 fn test_into_iter_count() {
567     assert_eq!(vec![1, 2, 3].into_iter().count(), 3);
568 }
569
570 #[test]
571 fn test_into_iter_clone() {
572     fn iter_equal<I: Iterator<Item = i32>>(it: I, slice: &[i32]) {
573         let v: Vec<i32> = it.collect();
574         assert_eq!(&v[..], slice);
575     }
576     let mut it = vec![1, 2, 3].into_iter();
577     iter_equal(it.clone(), &[1, 2, 3]);
578     assert_eq!(it.next(), Some(1));
579     let mut it = it.rev();
580     iter_equal(it.clone(), &[3, 2]);
581     assert_eq!(it.next(), Some(3));
582     iter_equal(it.clone(), &[2]);
583     assert_eq!(it.next(), Some(2));
584     iter_equal(it.clone(), &[]);
585     assert_eq!(it.next(), None);
586 }
587
588 #[test]
589 fn test_cow_from() {
590     let borrowed: &[_] = &["borrowed", "(slice)"];
591     let owned = vec!["owned", "(vec)"];
592     match (Cow::from(owned.clone()), Cow::from(borrowed)) {
593         (Cow::Owned(o), Cow::Borrowed(b)) => assert!(o == owned && b == borrowed),
594         _ => panic!("invalid `Cow::from`"),
595     }
596 }
597
598 #[test]
599 fn test_from_cow() {
600     let borrowed: &[_] = &["borrowed", "(slice)"];
601     let owned = vec!["owned", "(vec)"];
602     assert_eq!(Vec::from(Cow::Borrowed(borrowed)), vec!["borrowed", "(slice)"]);
603     assert_eq!(Vec::from(Cow::Owned(owned)), vec!["owned", "(vec)"]);
604 }
605
606 #[allow(dead_code)]
607 fn assert_covariance() {
608     fn drain<'new>(d: Drain<'static, &'static str>) -> Drain<'new, &'new str> {
609         d
610     }
611     fn into_iter<'new>(i: IntoIter<&'static str>) -> IntoIter<&'new str> {
612         i
613     }
614 }
615
616 #[test]
617 fn test_placement() {
618     let mut vec = vec![1];
619     assert_eq!(vec.place_back() <- 2, &2);
620     assert_eq!(vec.len(), 2);
621     assert_eq!(vec.place_back() <- 3, &3);
622     assert_eq!(vec.len(), 3);
623     assert_eq!(&vec, &[1, 2, 3]);
624 }
625
626 #[test]
627 fn test_placement_panic() {
628     let mut vec = vec![1, 2, 3];
629     fn mkpanic() -> usize { panic!() }
630     let _ = panic::catch_unwind(panic::AssertUnwindSafe(|| { vec.place_back() <- mkpanic(); }));
631     assert_eq!(vec.len(), 3);
632 }