1 // Copyright 2012-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.
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.
11 use std::collections::VecDeque;
17 use self::Taggypar::*;
21 let mut d = VecDeque::new();
22 assert_eq!(d.len(), 0);
26 assert_eq!(d.len(), 3);
28 assert_eq!(d.len(), 4);
29 assert_eq!(*d.front().unwrap(), 42);
30 assert_eq!(*d.back().unwrap(), 137);
31 let mut i = d.pop_front();
32 assert_eq!(i, Some(42));
34 assert_eq!(i, Some(137));
36 assert_eq!(i, Some(137));
38 assert_eq!(i, Some(17));
39 assert_eq!(d.len(), 0);
41 assert_eq!(d.len(), 1);
43 assert_eq!(d.len(), 2);
45 assert_eq!(d.len(), 3);
47 assert_eq!(d.len(), 4);
59 fn test_parameterized<T:Clone + PartialEq + Debug>(a: T, b: T, c: T, d: T) {
60 let mut deq = VecDeque::new();
61 assert_eq!(deq.len(), 0);
62 deq.push_front(a.clone());
63 deq.push_front(b.clone());
64 deq.push_back(c.clone());
65 assert_eq!(deq.len(), 3);
66 deq.push_back(d.clone());
67 assert_eq!(deq.len(), 4);
68 assert_eq!((*deq.front().unwrap()).clone(), b.clone());
69 assert_eq!((*deq.back().unwrap()).clone(), d.clone());
70 assert_eq!(deq.pop_front().unwrap(), b.clone());
71 assert_eq!(deq.pop_back().unwrap(), d.clone());
72 assert_eq!(deq.pop_back().unwrap(), c.clone());
73 assert_eq!(deq.pop_back().unwrap(), a.clone());
74 assert_eq!(deq.len(), 0);
75 deq.push_back(c.clone());
76 assert_eq!(deq.len(), 1);
77 deq.push_front(b.clone());
78 assert_eq!(deq.len(), 2);
79 deq.push_back(d.clone());
80 assert_eq!(deq.len(), 3);
81 deq.push_front(a.clone());
82 assert_eq!(deq.len(), 4);
83 assert_eq!(deq[0].clone(), a.clone());
84 assert_eq!(deq[1].clone(), b.clone());
85 assert_eq!(deq[2].clone(), c.clone());
86 assert_eq!(deq[3].clone(), d.clone());
90 fn test_push_front_grow() {
91 let mut deq = VecDeque::new();
95 assert_eq!(deq.len(), 66);
98 assert_eq!(deq[i], 65 - i);
101 let mut deq = VecDeque::new();
107 assert_eq!(deq[i], i);
113 let mut deq = VecDeque::new();
117 assert_eq!(deq[1], 2);
122 fn test_index_out_of_bounds() {
123 let mut deq = VecDeque::new();
131 fn bench_new(b: &mut test::Bencher) {
133 let ring: VecDeque<i32> = VecDeque::new();
134 test::black_box(ring);
139 fn bench_grow_1025(b: &mut test::Bencher) {
141 let mut deq = VecDeque::new();
145 test::black_box(deq);
150 fn bench_iter_1000(b: &mut test::Bencher) {
151 let ring: VecDeque<_> = (0..1000).collect();
158 test::black_box(sum);
163 fn bench_mut_iter_1000(b: &mut test::Bencher) {
164 let mut ring: VecDeque<_> = (0..1000).collect();
171 test::black_box(sum);
175 #[derive(Clone, PartialEq, Debug)]
179 Three(i32, i32, i32),
182 #[derive(Clone, PartialEq, Debug)]
189 #[derive(Clone, PartialEq, Debug)]
197 fn test_param_int() {
198 test_parameterized::<i32>(5, 72, 64, 175);
202 fn test_param_taggy() {
203 test_parameterized::<Taggy>(One(1), Two(1, 2), Three(1, 2, 3), Two(17, 42));
207 fn test_param_taggypar() {
208 test_parameterized::<Taggypar<i32>>(Onepar::<i32>(1),
210 Threepar::<i32>(1, 2, 3),
211 Twopar::<i32>(17, 42));
215 fn test_param_reccy() {
216 let reccy1 = RecCy { x: 1, y: 2, t: One(1) };
217 let reccy2 = RecCy { x: 345, y: 2, t: Two(1, 2) };
218 let reccy3 = RecCy { x: 1, y: 777, t: Three(1, 2, 3) };
219 let reccy4 = RecCy { x: 19, y: 252, t: Two(17, 42) };
220 test_parameterized::<RecCy>(reccy1, reccy2, reccy3, reccy4);
224 fn test_with_capacity() {
225 let mut d = VecDeque::with_capacity(0);
227 assert_eq!(d.len(), 1);
228 let mut d = VecDeque::with_capacity(50);
230 assert_eq!(d.len(), 1);
234 fn test_with_capacity_non_power_two() {
235 let mut d3 = VecDeque::with_capacity(3);
240 assert_eq!(d3.pop_front(), Some(1));
242 assert_eq!(d3.front(), None);
249 assert_eq!(d3.pop_front(), Some(3));
251 // Pushing the lo past half way point to trigger
252 // the 'B' scenario for growth
259 // There used to be a bug here about how the
260 // VecDeque made growth assumptions about the
261 // underlying Vec which didn't hold and lead
263 // (Vec grows to next power of two)
264 //good- [9, 12, 15, X, X, X, X, |6]
265 //bug- [15, 12, X, X, X, |6, X, X]
266 assert_eq!(d3.pop_front(), Some(6));
268 // Which leads us to the following state which
269 // would be a failure case.
270 //bug- [15, 12, X, X, X, X, |X, X]
271 assert_eq!(d3.front(), Some(&9));
275 fn test_reserve_exact() {
276 let mut d = VecDeque::new();
279 assert!(d.capacity() >= 51);
284 let mut d = VecDeque::new();
287 assert!(d.capacity() >= 51);
292 let mut d: VecDeque<_> = (0..5).collect();
295 assert_eq!(d.iter().cloned().collect::<Vec<_>>(), [4, 2, 3, 1]);
300 let mut d = VecDeque::new();
301 assert_eq!(d.iter().next(), None);
302 assert_eq!(d.iter().size_hint(), (0, Some(0)));
308 let b: &[_] = &[&0,&1,&2,&3,&4];
309 assert_eq!(d.iter().collect::<Vec<_>>(), b);
316 let b: &[_] = &[&8,&7,&6,&0,&1,&2,&3,&4];
317 assert_eq!(d.iter().collect::<Vec<_>>(), b);
320 let mut it = d.iter();
321 let mut len = d.len();
325 _ => { len -= 1; assert_eq!(it.size_hint(), (len, Some(len))) }
332 let mut d = VecDeque::new();
333 assert_eq!(d.iter().rev().next(), None);
339 let b: &[_] = &[&4,&3,&2,&1,&0];
340 assert_eq!(d.iter().rev().collect::<Vec<_>>(), b);
346 let b: &[_] = &[&4,&3,&2,&1,&0,&6,&7,&8];
347 assert_eq!(d.iter().rev().collect::<Vec<_>>(), b);
351 fn test_mut_rev_iter_wrap() {
352 let mut d = VecDeque::with_capacity(3);
353 assert!(d.iter_mut().rev().next().is_none());
358 assert_eq!(d.pop_front(), Some(1));
361 assert_eq!(d.iter_mut().rev().map(|x| *x).collect::<Vec<_>>(),
367 let mut d = VecDeque::new();
368 assert!(d.iter_mut().next().is_none());
374 for (i, elt) in d.iter_mut().enumerate() {
375 assert_eq!(*elt, 2 - i);
380 let mut it = d.iter_mut();
381 assert_eq!(*it.next().unwrap(), 0);
382 assert_eq!(*it.next().unwrap(), 1);
383 assert_eq!(*it.next().unwrap(), 2);
384 assert!(it.next().is_none());
389 fn test_mut_rev_iter() {
390 let mut d = VecDeque::new();
391 assert!(d.iter_mut().rev().next().is_none());
397 for (i, elt) in d.iter_mut().rev().enumerate() {
403 let mut it = d.iter_mut().rev();
404 assert_eq!(*it.next().unwrap(), 0);
405 assert_eq!(*it.next().unwrap(), 1);
406 assert_eq!(*it.next().unwrap(), 2);
407 assert!(it.next().is_none());
412 fn test_into_iter() {
416 let d: VecDeque<i32> = VecDeque::new();
417 let mut iter = d.into_iter();
419 assert_eq!(iter.size_hint(), (0, Some(0)));
420 assert_eq!(iter.next(), None);
421 assert_eq!(iter.size_hint(), (0, Some(0)));
426 let mut d = VecDeque::new();
431 let b = vec![0,1,2,3,4];
432 assert_eq!(d.into_iter().collect::<Vec<_>>(), b);
437 let mut d = VecDeque::new();
445 let b = vec![8,7,6,0,1,2,3,4];
446 assert_eq!(d.into_iter().collect::<Vec<_>>(), b);
451 let mut d = VecDeque::new();
459 let mut it = d.into_iter();
460 assert_eq!(it.size_hint(), (8, Some(8)));
461 assert_eq!(it.next(), Some(8));
462 assert_eq!(it.size_hint(), (7, Some(7)));
463 assert_eq!(it.next_back(), Some(4));
464 assert_eq!(it.size_hint(), (6, Some(6)));
465 assert_eq!(it.next(), Some(7));
466 assert_eq!(it.size_hint(), (5, Some(5)));
475 let mut d: VecDeque<i32> = VecDeque::new();
478 let mut iter = d.drain(..);
480 assert_eq!(iter.size_hint(), (0, Some(0)));
481 assert_eq!(iter.next(), None);
482 assert_eq!(iter.size_hint(), (0, Some(0)));
485 assert!(d.is_empty());
490 let mut d = VecDeque::new();
495 assert_eq!(d.drain(..).collect::<Vec<_>>(), [0, 1, 2, 3, 4]);
496 assert!(d.is_empty());
501 let mut d = VecDeque::new();
509 assert_eq!(d.drain(..).collect::<Vec<_>>(), [8,7,6,0,1,2,3,4]);
510 assert!(d.is_empty());
515 let mut d: VecDeque<_> = VecDeque::new();
524 let mut it = d.drain(..);
525 assert_eq!(it.size_hint(), (8, Some(8)));
526 assert_eq!(it.next(), Some(8));
527 assert_eq!(it.size_hint(), (7, Some(7)));
528 assert_eq!(it.next_back(), Some(4));
529 assert_eq!(it.size_hint(), (6, Some(6)));
530 assert_eq!(it.next(), Some(7));
531 assert_eq!(it.size_hint(), (5, Some(5)));
533 assert!(d.is_empty());
538 fn test_from_iter() {
539 let v = vec!(1,2,3,4,5,6,7);
540 let deq: VecDeque<_> = v.iter().cloned().collect();
541 let u: Vec<_> = deq.iter().cloned().collect();
544 let seq = (0..).step_by(2).take(256);
545 let deq: VecDeque<_> = seq.collect();
546 for (i, &x) in deq.iter().enumerate() {
549 assert_eq!(deq.len(), 256);
554 let mut d = VecDeque::new();
559 assert_eq!(d.len(), 4);
560 let mut e = d.clone();
561 assert_eq!(e.len(), 4);
562 while !d.is_empty() {
563 assert_eq!(d.pop_back(), e.pop_back());
565 assert_eq!(d.len(), 0);
566 assert_eq!(e.len(), 0);
571 let mut d = VecDeque::new();
572 assert!(d == VecDeque::with_capacity(0));
577 let mut e = VecDeque::with_capacity(0);
587 assert!(e == VecDeque::new());
592 let mut x = VecDeque::new();
593 let mut y = VecDeque::new();
605 assert!(::hash(&x) == ::hash(&y));
610 let x = VecDeque::new();
611 let mut y = VecDeque::new();
623 let ringbuf: VecDeque<_> = (0..10).collect();
624 assert_eq!(format!("{:?}", ringbuf), "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]");
626 let ringbuf: VecDeque<_> = vec!["just", "one", "test", "more"].iter()
629 assert_eq!(format!("{:?}", ringbuf), "[\"just\", \"one\", \"test\", \"more\"]");
634 static mut drops: i32 = 0;
638 unsafe { drops += 1; }
642 let mut ring = VecDeque::new();
643 ring.push_back(Elem);
644 ring.push_front(Elem);
645 ring.push_back(Elem);
646 ring.push_front(Elem);
649 assert_eq!(unsafe {drops}, 4);
653 fn test_drop_with_pop() {
654 static mut drops: i32 = 0;
658 unsafe { drops += 1; }
662 let mut ring = VecDeque::new();
663 ring.push_back(Elem);
664 ring.push_front(Elem);
665 ring.push_back(Elem);
666 ring.push_front(Elem);
668 drop(ring.pop_back());
669 drop(ring.pop_front());
670 assert_eq!(unsafe {drops}, 2);
673 assert_eq!(unsafe {drops}, 4);
677 fn test_drop_clear() {
678 static mut drops: i32 = 0;
682 unsafe { drops += 1; }
686 let mut ring = VecDeque::new();
687 ring.push_back(Elem);
688 ring.push_front(Elem);
689 ring.push_back(Elem);
690 ring.push_front(Elem);
692 assert_eq!(unsafe {drops}, 4);
695 assert_eq!(unsafe {drops}, 4);
699 fn test_reserve_grow() {
700 // test growth path A
701 // [T o o H] -> [T o o H . . . . ]
702 let mut ring = VecDeque::with_capacity(4);
708 assert_eq!(ring.pop_front(), Some(i));
711 // test growth path B
712 // [H T o o] -> [. T o o H . . . ]
713 let mut ring = VecDeque::with_capacity(4);
716 assert_eq!(ring.pop_front(), Some(i));
723 assert_eq!(ring.pop_front(), Some(i));
726 // test growth path C
727 // [o o H T] -> [o o H . . . . T ]
728 let mut ring = VecDeque::with_capacity(4);
731 assert_eq!(ring.pop_front(), Some(i));
738 assert_eq!(ring.pop_front(), Some(i));
744 let mut ring = VecDeque::new();
746 assert_eq!(ring.get(0), Some(&0));
747 assert_eq!(ring.get(1), None);
750 assert_eq!(ring.get(0), Some(&0));
751 assert_eq!(ring.get(1), Some(&1));
752 assert_eq!(ring.get(2), None);
755 assert_eq!(ring.get(0), Some(&0));
756 assert_eq!(ring.get(1), Some(&1));
757 assert_eq!(ring.get(2), Some(&2));
758 assert_eq!(ring.get(3), None);
760 assert_eq!(ring.pop_front(), Some(0));
761 assert_eq!(ring.get(0), Some(&1));
762 assert_eq!(ring.get(1), Some(&2));
763 assert_eq!(ring.get(2), None);
765 assert_eq!(ring.pop_front(), Some(1));
766 assert_eq!(ring.get(0), Some(&2));
767 assert_eq!(ring.get(1), None);
769 assert_eq!(ring.pop_front(), Some(2));
770 assert_eq!(ring.get(0), None);
771 assert_eq!(ring.get(1), None);
776 let mut ring = VecDeque::new();
781 match ring.get_mut(1) {
786 assert_eq!(ring.get_mut(0), Some(&mut 0));
787 assert_eq!(ring.get_mut(1), Some(&mut -1));
788 assert_eq!(ring.get_mut(2), Some(&mut 2));
789 assert_eq!(ring.get_mut(3), None);
791 assert_eq!(ring.pop_front(), Some(0));
792 assert_eq!(ring.get_mut(0), Some(&mut -1));
793 assert_eq!(ring.get_mut(1), Some(&mut 2));
794 assert_eq!(ring.get_mut(2), None);
799 let mut ring = VecDeque::new();
802 assert_eq!(ring.front(), Some(&10));
804 assert_eq!(ring.front(), Some(&20));
806 assert_eq!(ring.front(), None);
810 fn test_as_slices() {
811 let mut ring: VecDeque<i32> = VecDeque::with_capacity(127);
812 let cap = ring.capacity() as i32;
814 let last = cap - first;
818 let (left, right) = ring.as_slices();
819 let expected: Vec<_> = (0..i+1).collect();
820 assert_eq!(left, &expected[..]);
821 assert_eq!(right, []);
826 let (left, right) = ring.as_slices();
827 let expected_left: Vec<_> = (-last..j+1).rev().collect();
828 let expected_right: Vec<_> = (0..first).collect();
829 assert_eq!(left, &expected_left[..]);
830 assert_eq!(right, &expected_right[..]);
833 assert_eq!(ring.len() as i32, cap);
834 assert_eq!(ring.capacity() as i32, cap);
838 fn test_as_mut_slices() {
839 let mut ring: VecDeque<i32> = VecDeque::with_capacity(127);
840 let cap = ring.capacity() as i32;
842 let last = cap - first;
846 let (left, right) = ring.as_mut_slices();
847 let expected: Vec<_> = (0..i+1).collect();
848 assert_eq!(left, &expected[..]);
849 assert_eq!(right, []);
854 let (left, right) = ring.as_mut_slices();
855 let expected_left: Vec<_> = (-last..j+1).rev().collect();
856 let expected_right: Vec<_> = (0..first).collect();
857 assert_eq!(left, &expected_left[..]);
858 assert_eq!(right, &expected_right[..]);
861 assert_eq!(ring.len() as i32, cap);
862 assert_eq!(ring.capacity() as i32, cap);
867 let mut a: VecDeque<_> = vec![1, 2, 3].into_iter().collect();
868 let mut b: VecDeque<_> = vec![4, 5, 6].into_iter().collect();
872 assert_eq!(a.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
873 assert_eq!(b.iter().cloned().collect::<Vec<_>>(), []);
875 // append nothing to something
877 assert_eq!(a.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
878 assert_eq!(b.iter().cloned().collect::<Vec<_>>(), []);
880 // append something to nothing
882 assert_eq!(b.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
883 assert_eq!(a.iter().cloned().collect::<Vec<_>>(), []);
888 let mut buf = VecDeque::new();
890 buf.retain(|&x| x % 2 == 0);
891 let v: Vec<_> = buf.into_iter().collect();
892 assert_eq!(&v[..], &[2, 4]);
896 fn test_extend_ref() {
897 let mut v = VecDeque::new();
899 v.extend(&[2, 3, 4]);
901 assert_eq!(v.len(), 4);
907 let mut w = VecDeque::new();
912 assert_eq!(v.len(), 6);