about summary refs log tree commit diff
path: root/src/liballoc/tests
diff options
context:
space:
mode:
authorPazzaz <pazzaz.sundqvist@gmail.com>2018-07-19 19:58:06 +0200
committerPazzaz <pazzaz.sundqvist@gmail.com>2018-07-19 23:32:22 +0200
commit24bc854b8c95ccf8e229d3982466b71ae778d04e (patch)
treebb59456f01ac9453580a7dfb1925d2692e7be879 /src/liballoc/tests
parent9d6f4e5eea0ca537e0e03ef369eeff85774cce2c (diff)
Non-naive implementation for `VecDeque.append`
Diffstat (limited to 'src/liballoc/tests')
-rw-r--r--src/liballoc/tests/vec_deque.rs54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/liballoc/tests/vec_deque.rs b/src/liballoc/tests/vec_deque.rs
index 4d55584e2f4..0c8c1f2c65b 100644
--- a/src/liballoc/tests/vec_deque.rs
+++ b/src/liballoc/tests/vec_deque.rs
@@ -929,6 +929,60 @@ fn test_append() {
 }
 
 #[test]
+fn test_append_advanced() {
+    fn check(
+        a_push_back: usize,
+        a_pop_back: usize,
+        b_push_back: usize,
+        b_pop_back: usize,
+        a_push_front: usize,
+        a_pop_front: usize,
+        b_push_front: usize,
+        b_pop_front: usize
+    ) {
+        let mut taken = 0;
+        let mut a = VecDeque::new();
+        let mut b = VecDeque::new();
+        for n in (taken..).take(a_push_back) {
+            a.push_back(n);
+        }
+        taken += a_push_back;
+        for n in (taken..).take(a_push_front) {
+            a.push_front(n);
+        }
+        taken += a_push_front;
+        for n in (taken..).take(b_push_back) {
+            b.push_back(n);
+        }
+        taken += b_push_back;
+        for n in (taken..).take(b_push_front) {
+            b.push_front(n);
+        }
+
+        a.drain(..a_pop_back);
+        a.drain(a_pop_front..);
+        b.drain(..b_pop_back);
+        b.drain(b_pop_front..);
+        let checked = a.iter().chain(b.iter()).map(|&x| x).collect::<Vec<usize>>();
+        a.append(&mut b);
+        assert_eq!(a, checked);
+        assert!(b.is_empty());
+    }
+    for a_push in 0..17 {
+        for a_pop in 0..a_push {
+            for b_push in 0..17 {
+                for b_pop in 0..b_push {
+                    check(a_push, a_pop, b_push, b_pop, 0, 0, 0, 0);
+                    check(a_push, a_pop, b_push, b_pop, a_push, 0, 0, 0);
+                    check(a_push, a_pop, b_push, b_pop, 0, 0, b_push, 0);
+                    check(0, 0, 0, 0, a_push, a_pop, b_push, b_pop);
+                }
+            }
+        }
+    }
+}
+
+#[test]
 fn test_retain() {
     let mut buf = VecDeque::new();
     buf.extend(1..5);