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;
13 use std::collections::vec_deque::{Drain};
16 use self::Taggypar::*;
20 let mut d = VecDeque::new();
21 assert_eq!(d.len(), 0);
25 assert_eq!(d.len(), 3);
27 assert_eq!(d.len(), 4);
28 assert_eq!(*d.front().unwrap(), 42);
29 assert_eq!(*d.back().unwrap(), 137);
30 let mut i = d.pop_front();
31 assert_eq!(i, Some(42));
33 assert_eq!(i, Some(137));
35 assert_eq!(i, Some(137));
37 assert_eq!(i, Some(17));
38 assert_eq!(d.len(), 0);
40 assert_eq!(d.len(), 1);
42 assert_eq!(d.len(), 2);
44 assert_eq!(d.len(), 3);
46 assert_eq!(d.len(), 4);
54 fn test_parameterized<T: Clone + PartialEq + Debug>(a: T, b: T, c: T, d: T) {
55 let mut deq = VecDeque::new();
56 assert_eq!(deq.len(), 0);
57 deq.push_front(a.clone());
58 deq.push_front(b.clone());
59 deq.push_back(c.clone());
60 assert_eq!(deq.len(), 3);
61 deq.push_back(d.clone());
62 assert_eq!(deq.len(), 4);
63 assert_eq!((*deq.front().unwrap()).clone(), b.clone());
64 assert_eq!((*deq.back().unwrap()).clone(), d.clone());
65 assert_eq!(deq.pop_front().unwrap(), b.clone());
66 assert_eq!(deq.pop_back().unwrap(), d.clone());
67 assert_eq!(deq.pop_back().unwrap(), c.clone());
68 assert_eq!(deq.pop_back().unwrap(), a.clone());
69 assert_eq!(deq.len(), 0);
70 deq.push_back(c.clone());
71 assert_eq!(deq.len(), 1);
72 deq.push_front(b.clone());
73 assert_eq!(deq.len(), 2);
74 deq.push_back(d.clone());
75 assert_eq!(deq.len(), 3);
76 deq.push_front(a.clone());
77 assert_eq!(deq.len(), 4);
78 assert_eq!(deq[0].clone(), a.clone());
79 assert_eq!(deq[1].clone(), b.clone());
80 assert_eq!(deq[2].clone(), c.clone());
81 assert_eq!(deq[3].clone(), d.clone());
85 fn test_push_front_grow() {
86 let mut deq = VecDeque::new();
90 assert_eq!(deq.len(), 66);
93 assert_eq!(deq[i], 65 - i);
96 let mut deq = VecDeque::new();
102 assert_eq!(deq[i], i);
108 let mut deq = VecDeque::new();
112 assert_eq!(deq[1], 2);
117 fn test_index_out_of_bounds() {
118 let mut deq = VecDeque::new();
125 #[derive(Clone, PartialEq, Debug)]
129 Three(i32, i32, i32),
132 #[derive(Clone, PartialEq, Debug)]
139 #[derive(Clone, PartialEq, Debug)]
147 fn test_param_int() {
148 test_parameterized::<i32>(5, 72, 64, 175);
152 fn test_param_taggy() {
153 test_parameterized::<Taggy>(One(1), Two(1, 2), Three(1, 2, 3), Two(17, 42));
157 fn test_param_taggypar() {
158 test_parameterized::<Taggypar<i32>>(Onepar::<i32>(1),
160 Threepar::<i32>(1, 2, 3),
161 Twopar::<i32>(17, 42));
165 fn test_param_reccy() {
186 test_parameterized::<RecCy>(reccy1, reccy2, reccy3, reccy4);
190 fn test_with_capacity() {
191 let mut d = VecDeque::with_capacity(0);
193 assert_eq!(d.len(), 1);
194 let mut d = VecDeque::with_capacity(50);
196 assert_eq!(d.len(), 1);
200 fn test_with_capacity_non_power_two() {
201 let mut d3 = VecDeque::with_capacity(3);
206 assert_eq!(d3.pop_front(), Some(1));
208 assert_eq!(d3.front(), None);
215 assert_eq!(d3.pop_front(), Some(3));
217 // Pushing the lo past half way point to trigger
218 // the 'B' scenario for growth
225 // There used to be a bug here about how the
226 // VecDeque made growth assumptions about the
227 // underlying Vec which didn't hold and lead
229 // (Vec grows to next power of two)
230 // good- [9, 12, 15, X, X, X, X, |6]
231 // bug- [15, 12, X, X, X, |6, X, X]
232 assert_eq!(d3.pop_front(), Some(6));
234 // Which leads us to the following state which
235 // would be a failure case.
236 // bug- [15, 12, X, X, X, X, |X, X]
237 assert_eq!(d3.front(), Some(&9));
241 fn test_reserve_exact() {
242 let mut d = VecDeque::new();
245 assert!(d.capacity() >= 51);
250 let mut d = VecDeque::new();
253 assert!(d.capacity() >= 51);
258 let mut d: VecDeque<_> = (0..5).collect();
261 assert_eq!(d.iter().cloned().collect::<Vec<_>>(), [4, 2, 3, 1]);
266 let mut d = VecDeque::new();
267 assert_eq!(d.iter().next(), None);
268 assert_eq!(d.iter().size_hint(), (0, Some(0)));
274 let b: &[_] = &[&0, &1, &2, &3, &4];
275 assert_eq!(d.iter().collect::<Vec<_>>(), b);
282 let b: &[_] = &[&8, &7, &6, &0, &1, &2, &3, &4];
283 assert_eq!(d.iter().collect::<Vec<_>>(), b);
286 let mut it = d.iter();
287 let mut len = d.len();
293 assert_eq!(it.size_hint(), (len, Some(len)))
301 let mut d = VecDeque::new();
302 assert_eq!(d.iter().rev().next(), None);
308 let b: &[_] = &[&4, &3, &2, &1, &0];
309 assert_eq!(d.iter().rev().collect::<Vec<_>>(), b);
315 let b: &[_] = &[&4, &3, &2, &1, &0, &6, &7, &8];
316 assert_eq!(d.iter().rev().collect::<Vec<_>>(), b);
320 fn test_mut_rev_iter_wrap() {
321 let mut d = VecDeque::with_capacity(3);
322 assert!(d.iter_mut().rev().next().is_none());
327 assert_eq!(d.pop_front(), Some(1));
330 assert_eq!(d.iter_mut().rev().map(|x| *x).collect::<Vec<_>>(),
336 let mut d = VecDeque::new();
337 assert!(d.iter_mut().next().is_none());
343 for (i, elt) in d.iter_mut().enumerate() {
344 assert_eq!(*elt, 2 - i);
349 let mut it = d.iter_mut();
350 assert_eq!(*it.next().unwrap(), 0);
351 assert_eq!(*it.next().unwrap(), 1);
352 assert_eq!(*it.next().unwrap(), 2);
353 assert!(it.next().is_none());
358 fn test_mut_rev_iter() {
359 let mut d = VecDeque::new();
360 assert!(d.iter_mut().rev().next().is_none());
366 for (i, elt) in d.iter_mut().rev().enumerate() {
372 let mut it = d.iter_mut().rev();
373 assert_eq!(*it.next().unwrap(), 0);
374 assert_eq!(*it.next().unwrap(), 1);
375 assert_eq!(*it.next().unwrap(), 2);
376 assert!(it.next().is_none());
381 fn test_into_iter() {
385 let d: VecDeque<i32> = VecDeque::new();
386 let mut iter = d.into_iter();
388 assert_eq!(iter.size_hint(), (0, Some(0)));
389 assert_eq!(iter.next(), None);
390 assert_eq!(iter.size_hint(), (0, Some(0)));
395 let mut d = VecDeque::new();
400 let b = vec![0, 1, 2, 3, 4];
401 assert_eq!(d.into_iter().collect::<Vec<_>>(), b);
406 let mut d = VecDeque::new();
414 let b = vec![8, 7, 6, 0, 1, 2, 3, 4];
415 assert_eq!(d.into_iter().collect::<Vec<_>>(), b);
420 let mut d = VecDeque::new();
428 let mut it = d.into_iter();
429 assert_eq!(it.size_hint(), (8, Some(8)));
430 assert_eq!(it.next(), Some(8));
431 assert_eq!(it.size_hint(), (7, Some(7)));
432 assert_eq!(it.next_back(), Some(4));
433 assert_eq!(it.size_hint(), (6, Some(6)));
434 assert_eq!(it.next(), Some(7));
435 assert_eq!(it.size_hint(), (5, Some(5)));
444 let mut d: VecDeque<i32> = VecDeque::new();
447 let mut iter = d.drain(..);
449 assert_eq!(iter.size_hint(), (0, Some(0)));
450 assert_eq!(iter.next(), None);
451 assert_eq!(iter.size_hint(), (0, Some(0)));
454 assert!(d.is_empty());
459 let mut d = VecDeque::new();
464 assert_eq!(d.drain(..).collect::<Vec<_>>(), [0, 1, 2, 3, 4]);
465 assert!(d.is_empty());
470 let mut d = VecDeque::new();
478 assert_eq!(d.drain(..).collect::<Vec<_>>(), [8, 7, 6, 0, 1, 2, 3, 4]);
479 assert!(d.is_empty());
484 let mut d: VecDeque<_> = VecDeque::new();
493 let mut it = d.drain(..);
494 assert_eq!(it.size_hint(), (8, Some(8)));
495 assert_eq!(it.next(), Some(8));
496 assert_eq!(it.size_hint(), (7, Some(7)));
497 assert_eq!(it.next_back(), Some(4));
498 assert_eq!(it.size_hint(), (6, Some(6)));
499 assert_eq!(it.next(), Some(7));
500 assert_eq!(it.size_hint(), (5, Some(5)));
502 assert!(d.is_empty());
507 fn test_from_iter() {
508 let v = vec![1, 2, 3, 4, 5, 6, 7];
509 let deq: VecDeque<_> = v.iter().cloned().collect();
510 let u: Vec<_> = deq.iter().cloned().collect();
513 let seq = (0..).step_by(2).take(256);
514 let deq: VecDeque<_> = seq.collect();
515 for (i, &x) in deq.iter().enumerate() {
516 assert_eq!(2 * i, x);
518 assert_eq!(deq.len(), 256);
523 let mut d = VecDeque::new();
528 assert_eq!(d.len(), 4);
529 let mut e = d.clone();
530 assert_eq!(e.len(), 4);
531 while !d.is_empty() {
532 assert_eq!(d.pop_back(), e.pop_back());
534 assert_eq!(d.len(), 0);
535 assert_eq!(e.len(), 0);
540 let mut d = VecDeque::new();
541 assert!(d == VecDeque::with_capacity(0));
546 let mut e = VecDeque::with_capacity(0);
556 assert!(e == VecDeque::new());
560 fn test_partial_eq_array() {
561 let d = VecDeque::<char>::new();
564 let mut d = VecDeque::new();
568 let mut d = VecDeque::new();
572 let mut d = VecDeque::new();
575 assert!(d == ['a', 'b']);
580 let mut x = VecDeque::new();
581 let mut y = VecDeque::new();
593 assert!(::hash(&x) == ::hash(&y));
597 fn test_hash_after_rotation() {
598 // test that two deques hash equal even if elements are laid out differently
600 let mut ring: VecDeque<i32> = (0..len as i32).collect();
601 let orig = ring.clone();
602 for _ in 0..ring.capacity() {
603 // shift values 1 step to the right by pop, sub one, push
605 for elt in &mut ring {
608 ring.push_back(len - 1);
609 assert_eq!(::hash(&orig), ::hash(&ring));
610 assert_eq!(orig, ring);
611 assert_eq!(ring, orig);
616 fn test_eq_after_rotation() {
617 // test that two deques are equal even if elements are laid out differently
619 let mut ring: VecDeque<i32> = (0..len as i32).collect();
620 let mut shifted = ring.clone();
622 // shift values 1 step to the right by pop, sub one, push
624 for elt in &mut ring {
627 ring.push_back(len - 1);
631 for _ in 0..shifted.capacity() {
633 for elt in &mut shifted {
636 shifted.push_back(len - 1);
637 assert_eq!(shifted, ring);
638 assert_eq!(ring, shifted);
644 let x = VecDeque::new();
645 let mut y = VecDeque::new();
657 let ringbuf: VecDeque<_> = (0..10).collect();
658 assert_eq!(format!("{:?}", ringbuf), "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]");
660 let ringbuf: VecDeque<_> = vec!["just", "one", "test", "more"]
664 assert_eq!(format!("{:?}", ringbuf),
665 "[\"just\", \"one\", \"test\", \"more\"]");
670 static mut DROPS: i32 = 0;
680 let mut ring = VecDeque::new();
681 ring.push_back(Elem);
682 ring.push_front(Elem);
683 ring.push_back(Elem);
684 ring.push_front(Elem);
687 assert_eq!(unsafe { DROPS }, 4);
691 fn test_drop_with_pop() {
692 static mut DROPS: i32 = 0;
702 let mut ring = VecDeque::new();
703 ring.push_back(Elem);
704 ring.push_front(Elem);
705 ring.push_back(Elem);
706 ring.push_front(Elem);
708 drop(ring.pop_back());
709 drop(ring.pop_front());
710 assert_eq!(unsafe { DROPS }, 2);
713 assert_eq!(unsafe { DROPS }, 4);
717 fn test_drop_clear() {
718 static mut DROPS: i32 = 0;
728 let mut ring = VecDeque::new();
729 ring.push_back(Elem);
730 ring.push_front(Elem);
731 ring.push_back(Elem);
732 ring.push_front(Elem);
734 assert_eq!(unsafe { DROPS }, 4);
737 assert_eq!(unsafe { DROPS }, 4);
741 fn test_reserve_grow() {
742 // test growth path A
743 // [T o o H] -> [T o o H . . . . ]
744 let mut ring = VecDeque::with_capacity(4);
750 assert_eq!(ring.pop_front(), Some(i));
753 // test growth path B
754 // [H T o o] -> [. T o o H . . . ]
755 let mut ring = VecDeque::with_capacity(4);
758 assert_eq!(ring.pop_front(), Some(i));
765 assert_eq!(ring.pop_front(), Some(i));
768 // test growth path C
769 // [o o H T] -> [o o H . . . . T ]
770 let mut ring = VecDeque::with_capacity(4);
773 assert_eq!(ring.pop_front(), Some(i));
780 assert_eq!(ring.pop_front(), Some(i));
786 let mut ring = VecDeque::new();
788 assert_eq!(ring.get(0), Some(&0));
789 assert_eq!(ring.get(1), None);
792 assert_eq!(ring.get(0), Some(&0));
793 assert_eq!(ring.get(1), Some(&1));
794 assert_eq!(ring.get(2), None);
797 assert_eq!(ring.get(0), Some(&0));
798 assert_eq!(ring.get(1), Some(&1));
799 assert_eq!(ring.get(2), Some(&2));
800 assert_eq!(ring.get(3), None);
802 assert_eq!(ring.pop_front(), Some(0));
803 assert_eq!(ring.get(0), Some(&1));
804 assert_eq!(ring.get(1), Some(&2));
805 assert_eq!(ring.get(2), None);
807 assert_eq!(ring.pop_front(), Some(1));
808 assert_eq!(ring.get(0), Some(&2));
809 assert_eq!(ring.get(1), None);
811 assert_eq!(ring.pop_front(), Some(2));
812 assert_eq!(ring.get(0), None);
813 assert_eq!(ring.get(1), None);
818 let mut ring = VecDeque::new();
823 match ring.get_mut(1) {
828 assert_eq!(ring.get_mut(0), Some(&mut 0));
829 assert_eq!(ring.get_mut(1), Some(&mut -1));
830 assert_eq!(ring.get_mut(2), Some(&mut 2));
831 assert_eq!(ring.get_mut(3), None);
833 assert_eq!(ring.pop_front(), Some(0));
834 assert_eq!(ring.get_mut(0), Some(&mut -1));
835 assert_eq!(ring.get_mut(1), Some(&mut 2));
836 assert_eq!(ring.get_mut(2), None);
841 let mut ring = VecDeque::new();
844 assert_eq!(ring.front(), Some(&10));
846 assert_eq!(ring.front(), Some(&20));
848 assert_eq!(ring.front(), None);
852 fn test_as_slices() {
853 let mut ring: VecDeque<i32> = VecDeque::with_capacity(127);
854 let cap = ring.capacity() as i32;
856 let last = cap - first;
860 let (left, right) = ring.as_slices();
861 let expected: Vec<_> = (0..i + 1).collect();
862 assert_eq!(left, &expected[..]);
863 assert_eq!(right, []);
868 let (left, right) = ring.as_slices();
869 let expected_left: Vec<_> = (-last..j + 1).rev().collect();
870 let expected_right: Vec<_> = (0..first).collect();
871 assert_eq!(left, &expected_left[..]);
872 assert_eq!(right, &expected_right[..]);
875 assert_eq!(ring.len() as i32, cap);
876 assert_eq!(ring.capacity() as i32, cap);
880 fn test_as_mut_slices() {
881 let mut ring: VecDeque<i32> = VecDeque::with_capacity(127);
882 let cap = ring.capacity() as i32;
884 let last = cap - first;
888 let (left, right) = ring.as_mut_slices();
889 let expected: Vec<_> = (0..i + 1).collect();
890 assert_eq!(left, &expected[..]);
891 assert_eq!(right, []);
896 let (left, right) = ring.as_mut_slices();
897 let expected_left: Vec<_> = (-last..j + 1).rev().collect();
898 let expected_right: Vec<_> = (0..first).collect();
899 assert_eq!(left, &expected_left[..]);
900 assert_eq!(right, &expected_right[..]);
903 assert_eq!(ring.len() as i32, cap);
904 assert_eq!(ring.capacity() as i32, cap);
909 let mut a: VecDeque<_> = vec![1, 2, 3].into_iter().collect();
910 let mut b: VecDeque<_> = vec![4, 5, 6].into_iter().collect();
914 assert_eq!(a.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
915 assert_eq!(b.iter().cloned().collect::<Vec<_>>(), []);
917 // append nothing to something
919 assert_eq!(a.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
920 assert_eq!(b.iter().cloned().collect::<Vec<_>>(), []);
922 // append something to nothing
924 assert_eq!(b.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
925 assert_eq!(a.iter().cloned().collect::<Vec<_>>(), []);
930 let mut buf = VecDeque::new();
932 buf.retain(|&x| x % 2 == 0);
933 let v: Vec<_> = buf.into_iter().collect();
934 assert_eq!(&v[..], &[2, 4]);
938 fn test_extend_ref() {
939 let mut v = VecDeque::new();
941 v.extend(&[2, 3, 4]);
943 assert_eq!(v.len(), 4);
949 let mut w = VecDeque::new();
954 assert_eq!(v.len(), 6);
965 let mut v = VecDeque::new();
966 v.extend(&[2, 3, 4]);
968 assert!(v.contains(&3));
969 assert!(!v.contains(&1));
973 assert!(!v.contains(&3));
977 fn assert_covariance() {
978 fn drain<'new>(d: Drain<'static, &'static str>) -> Drain<'new, &'new str> {
985 let mut v = VecDeque::<i32>::new();
986 assert!(v.is_empty());
987 assert!(v.iter().is_empty());
988 assert!(v.iter_mut().is_empty());
989 v.extend(&[2, 3, 4]);
990 assert!(!v.is_empty());
991 assert!(!v.iter().is_empty());
992 assert!(!v.iter_mut().is_empty());
993 while let Some(_) = v.pop_front() {
994 assert_eq!(v.is_empty(), v.len() == 0);
995 assert_eq!(v.iter().is_empty(), v.iter().len() == 0);
996 assert_eq!(v.iter_mut().is_empty(), v.iter_mut().len() == 0);
998 assert!(v.is_empty());
999 assert!(v.iter().is_empty());
1000 assert!(v.iter_mut().is_empty());
1001 assert!(v.into_iter().is_empty());
1005 fn test_placement_in() {
1006 let mut buf: VecDeque<isize> = VecDeque::new();
1007 buf.place_back() <- 1;
1008 buf.place_back() <- 2;
1009 assert_eq!(buf, [1,2]);
1011 buf.place_front() <- 3;
1012 buf.place_front() <- 4;
1013 assert_eq!(buf, [4,3,1,2]);
1016 let ptr_head = buf.place_front() <- 5;
1017 assert_eq!(*ptr_head, 5);
1020 let ptr_tail = buf.place_back() <- 6;
1021 assert_eq!(*ptr_tail, 6);
1023 assert_eq!(buf, [5,4,3,1,2,6]);