]> git.lizzy.rs Git - rust.git/commitdiff
extract libcollections tests into libcollectionstest
authorJorge Aparicio <japaricious@gmail.com>
Wed, 11 Mar 2015 04:58:16 +0000 (23:58 -0500)
committerJorge Aparicio <japaricious@gmail.com>
Tue, 17 Mar 2015 02:57:42 +0000 (21:57 -0500)
35 files changed:
mk/dist.mk
mk/tests.mk
src/libcollections/bench.rs [deleted file]
src/libcollections/binary_heap.rs
src/libcollections/bit.rs
src/libcollections/btree/map.rs
src/libcollections/btree/set.rs
src/libcollections/enum_set.rs
src/libcollections/fmt.rs
src/libcollections/lib.rs
src/libcollections/linked_list.rs
src/libcollections/slice.rs
src/libcollections/str.rs
src/libcollections/string.rs
src/libcollections/vec.rs
src/libcollections/vec_deque.rs
src/libcollections/vec_map.rs
src/libcollectionstest/bench.rs [new file with mode: 0644]
src/libcollectionstest/binary_heap.rs [new file with mode: 0644]
src/libcollectionstest/bit/mod.rs [new file with mode: 0644]
src/libcollectionstest/bit/set.rs [new file with mode: 0644]
src/libcollectionstest/bit/vec.rs [new file with mode: 0644]
src/libcollectionstest/btree/map.rs [new file with mode: 0644]
src/libcollectionstest/btree/mod.rs [new file with mode: 0644]
src/libcollectionstest/btree/set.rs [new file with mode: 0644]
src/libcollectionstest/enum_set.rs [new file with mode: 0644]
src/libcollectionstest/fmt.rs [new file with mode: 0644]
src/libcollectionstest/lib.rs [new file with mode: 0644]
src/libcollectionstest/linked_list.rs [new file with mode: 0644]
src/libcollectionstest/slice.rs [new file with mode: 0644]
src/libcollectionstest/str.rs [new file with mode: 0644]
src/libcollectionstest/string.rs [new file with mode: 0644]
src/libcollectionstest/vec.rs [new file with mode: 0644]
src/libcollectionstest/vec_deque.rs [new file with mode: 0644]
src/libcollectionstest/vec_map.rs [new file with mode: 0644]

index 831225556f3fc8d4beade567fe09f69afff9e6a7..57adaee51980be5c8bf14e35c06ac61fa6bfbf45 100644 (file)
@@ -53,6 +53,7 @@ PKG_FILES := \
       driver                                   \
       etc                                      \
       $(foreach crate,$(CRATES),lib$(crate))   \
+      libcollectionstest                       \
       libcoretest                              \
       libbacktrace                             \
       rt                                       \
index 48e50e47d4d1a7d487651e72374082176953e66d..0851909a776e797d2e54b47ca6d0496cfd33d7df 100644 (file)
 DEPS_coretest :=
 $(eval $(call RUST_CRATE,coretest))
 
-TEST_TARGET_CRATES = $(filter-out core unicode,$(TARGET_CRATES)) coretest
+DEPS_collectionstest :=
+$(eval $(call RUST_CRATE,collectionstest))
+
+TEST_TARGET_CRATES = $(filter-out collections core unicode,$(TARGET_CRATES)) \
+                                                                                collectionstest coretest
 TEST_DOC_CRATES = $(DOC_CRATES)
 TEST_HOST_CRATES = $(filter-out rustc_typeck rustc_borrowck rustc_resolve rustc_trans rustc_lint,\
                      $(HOST_CRATES))
diff --git a/src/libcollections/bench.rs b/src/libcollections/bench.rs
deleted file mode 100644 (file)
index 107f603..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright 2013-2014 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-macro_rules! map_insert_rand_bench {
-    ($name: ident, $n: expr, $map: ident) => (
-        #[bench]
-        pub fn $name(b: &mut ::test::Bencher) {
-            use std::rand;
-            use std::rand::Rng;
-            use test::black_box;
-
-            let n: usize = $n;
-            let mut map = $map::new();
-            // setup
-            let mut rng = rand::weak_rng();
-
-            for _ in 0..n {
-                let i = rng.gen() % n;
-                map.insert(i, i);
-            }
-
-            // measure
-            b.iter(|| {
-                let k = rng.gen() % n;
-                map.insert(k, k);
-                map.remove(&k);
-            });
-            black_box(map);
-        }
-    )
-}
-
-macro_rules! map_insert_seq_bench {
-    ($name: ident, $n: expr, $map: ident) => (
-        #[bench]
-        pub fn $name(b: &mut ::test::Bencher) {
-            use test::black_box;
-
-            let mut map = $map::new();
-            let n: usize = $n;
-            // setup
-            for i in 0..n {
-                map.insert(i * 2, i * 2);
-            }
-
-            // measure
-            let mut i = 1;
-            b.iter(|| {
-                map.insert(i, i);
-                map.remove(&i);
-                i = (i + 2) % n;
-            });
-            black_box(map);
-        }
-    )
-}
-
-macro_rules! map_find_rand_bench {
-    ($name: ident, $n: expr, $map: ident) => (
-        #[bench]
-        pub fn $name(b: &mut ::test::Bencher) {
-            use std::rand;
-            use std::iter::IteratorExt;
-            use std::rand::Rng;
-            use test::black_box;
-            use vec::Vec;
-
-            let mut map = $map::new();
-            let n: usize = $n;
-
-            // setup
-            let mut rng = rand::weak_rng();
-            let mut keys: Vec<_> = (0..n).map(|_| rng.gen() % n).collect();
-
-            for &k in &keys {
-                map.insert(k, k);
-            }
-
-            rng.shuffle(&mut keys);
-
-            // measure
-            let mut i = 0;
-            b.iter(|| {
-                let t = map.get(&keys[i]);
-                i = (i + 1) % n;
-                black_box(t);
-            })
-        }
-    )
-}
-
-macro_rules! map_find_seq_bench {
-    ($name: ident, $n: expr, $map: ident) => (
-        #[bench]
-        pub fn $name(b: &mut ::test::Bencher) {
-            use test::black_box;
-
-            let mut map = $map::new();
-            let n: usize = $n;
-
-            // setup
-            for i in 0..n {
-                map.insert(i, i);
-            }
-
-            // measure
-            let mut i = 0;
-            b.iter(|| {
-                let x = map.get(&i);
-                i = (i + 1) % n;
-                black_box(x);
-            })
-        }
-    )
-}
index 4c57fdc46681b75666afa56278fc41cc2ad06ab9..11c8656c994b29da5771ed3bf58e3f445aa82314 100644 (file)
@@ -693,218 +693,3 @@ fn extend<I: IntoIterator<Item=T>>(&mut self, iterable: I) {
         }
     }
 }
-
-#[cfg(test)]
-mod tests {
-    use prelude::*;
-
-    use super::BinaryHeap;
-
-    #[test]
-    fn test_iterator() {
-        let data = vec![5, 9, 3];
-        let iterout = [9, 5, 3];
-        let heap = BinaryHeap::from_vec(data);
-        let mut i = 0;
-        for el in &heap {
-            assert_eq!(*el, iterout[i]);
-            i += 1;
-        }
-    }
-
-    #[test]
-    fn test_iterator_reverse() {
-        let data = vec![5, 9, 3];
-        let iterout = vec![3, 5, 9];
-        let pq = BinaryHeap::from_vec(data);
-
-        let v: Vec<_> = pq.iter().rev().cloned().collect();
-        assert_eq!(v, iterout);
-    }
-
-    #[test]
-    fn test_move_iter() {
-        let data = vec![5, 9, 3];
-        let iterout = vec![9, 5, 3];
-        let pq = BinaryHeap::from_vec(data);
-
-        let v: Vec<_> = pq.into_iter().collect();
-        assert_eq!(v, iterout);
-    }
-
-    #[test]
-    fn test_move_iter_size_hint() {
-        let data = vec![5, 9];
-        let pq = BinaryHeap::from_vec(data);
-
-        let mut it = pq.into_iter();
-
-        assert_eq!(it.size_hint(), (2, Some(2)));
-        assert_eq!(it.next(), Some(9));
-
-        assert_eq!(it.size_hint(), (1, Some(1)));
-        assert_eq!(it.next(), Some(5));
-
-        assert_eq!(it.size_hint(), (0, Some(0)));
-        assert_eq!(it.next(), None);
-    }
-
-    #[test]
-    fn test_move_iter_reverse() {
-        let data = vec![5, 9, 3];
-        let iterout = vec![3, 5, 9];
-        let pq = BinaryHeap::from_vec(data);
-
-        let v: Vec<_> = pq.into_iter().rev().collect();
-        assert_eq!(v, iterout);
-    }
-
-    #[test]
-    fn test_peek_and_pop() {
-        let data = vec![2, 4, 6, 2, 1, 8, 10, 3, 5, 7, 0, 9, 1];
-        let mut sorted = data.clone();
-        sorted.sort();
-        let mut heap = BinaryHeap::from_vec(data);
-        while !heap.is_empty() {
-            assert_eq!(heap.peek().unwrap(), sorted.last().unwrap());
-            assert_eq!(heap.pop().unwrap(), sorted.pop().unwrap());
-        }
-    }
-
-    #[test]
-    fn test_push() {
-        let mut heap = BinaryHeap::from_vec(vec![2, 4, 9]);
-        assert_eq!(heap.len(), 3);
-        assert!(*heap.peek().unwrap() == 9);
-        heap.push(11);
-        assert_eq!(heap.len(), 4);
-        assert!(*heap.peek().unwrap() == 11);
-        heap.push(5);
-        assert_eq!(heap.len(), 5);
-        assert!(*heap.peek().unwrap() == 11);
-        heap.push(27);
-        assert_eq!(heap.len(), 6);
-        assert!(*heap.peek().unwrap() == 27);
-        heap.push(3);
-        assert_eq!(heap.len(), 7);
-        assert!(*heap.peek().unwrap() == 27);
-        heap.push(103);
-        assert_eq!(heap.len(), 8);
-        assert!(*heap.peek().unwrap() == 103);
-    }
-
-    #[test]
-    fn test_push_unique() {
-        let mut heap = BinaryHeap::<Box<_>>::from_vec(vec![box 2, box 4, box 9]);
-        assert_eq!(heap.len(), 3);
-        assert!(*heap.peek().unwrap() == box 9);
-        heap.push(box 11);
-        assert_eq!(heap.len(), 4);
-        assert!(*heap.peek().unwrap() == box 11);
-        heap.push(box 5);
-        assert_eq!(heap.len(), 5);
-        assert!(*heap.peek().unwrap() == box 11);
-        heap.push(box 27);
-        assert_eq!(heap.len(), 6);
-        assert!(*heap.peek().unwrap() == box 27);
-        heap.push(box 3);
-        assert_eq!(heap.len(), 7);
-        assert!(*heap.peek().unwrap() == box 27);
-        heap.push(box 103);
-        assert_eq!(heap.len(), 8);
-        assert!(*heap.peek().unwrap() == box 103);
-    }
-
-    #[test]
-    fn test_push_pop() {
-        let mut heap = BinaryHeap::from_vec(vec![5, 5, 2, 1, 3]);
-        assert_eq!(heap.len(), 5);
-        assert_eq!(heap.push_pop(6), 6);
-        assert_eq!(heap.len(), 5);
-        assert_eq!(heap.push_pop(0), 5);
-        assert_eq!(heap.len(), 5);
-        assert_eq!(heap.push_pop(4), 5);
-        assert_eq!(heap.len(), 5);
-        assert_eq!(heap.push_pop(1), 4);
-        assert_eq!(heap.len(), 5);
-    }
-
-    #[test]
-    fn test_replace() {
-        let mut heap = BinaryHeap::from_vec(vec![5, 5, 2, 1, 3]);
-        assert_eq!(heap.len(), 5);
-        assert_eq!(heap.replace(6).unwrap(), 5);
-        assert_eq!(heap.len(), 5);
-        assert_eq!(heap.replace(0).unwrap(), 6);
-        assert_eq!(heap.len(), 5);
-        assert_eq!(heap.replace(4).unwrap(), 5);
-        assert_eq!(heap.len(), 5);
-        assert_eq!(heap.replace(1).unwrap(), 4);
-        assert_eq!(heap.len(), 5);
-    }
-
-    fn check_to_vec(mut data: Vec<i32>) {
-        let heap = BinaryHeap::from_vec(data.clone());
-        let mut v = heap.clone().into_vec();
-        v.sort();
-        data.sort();
-
-        assert_eq!(v, data);
-        assert_eq!(heap.into_sorted_vec(), data);
-    }
-
-    #[test]
-    fn test_to_vec() {
-        check_to_vec(vec![]);
-        check_to_vec(vec![5]);
-        check_to_vec(vec![3, 2]);
-        check_to_vec(vec![2, 3]);
-        check_to_vec(vec![5, 1, 2]);
-        check_to_vec(vec![1, 100, 2, 3]);
-        check_to_vec(vec![1, 3, 5, 7, 9, 2, 4, 6, 8, 0]);
-        check_to_vec(vec![2, 4, 6, 2, 1, 8, 10, 3, 5, 7, 0, 9, 1]);
-        check_to_vec(vec![9, 11, 9, 9, 9, 9, 11, 2, 3, 4, 11, 9, 0, 0, 0, 0]);
-        check_to_vec(vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
-        check_to_vec(vec![10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]);
-        check_to_vec(vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 1, 2]);
-        check_to_vec(vec![5, 4, 3, 2, 1, 5, 4, 3, 2, 1, 5, 4, 3, 2, 1]);
-    }
-
-    #[test]
-    fn test_empty_pop() {
-        let mut heap = BinaryHeap::<i32>::new();
-        assert!(heap.pop().is_none());
-    }
-
-    #[test]
-    fn test_empty_peek() {
-        let empty = BinaryHeap::<i32>::new();
-        assert!(empty.peek().is_none());
-    }
-
-    #[test]
-    fn test_empty_replace() {
-        let mut heap = BinaryHeap::new();
-        assert!(heap.replace(5).is_none());
-    }
-
-    #[test]
-    fn test_from_iter() {
-        let xs = vec![9, 8, 7, 6, 5, 4, 3, 2, 1];
-
-        let mut q: BinaryHeap<_> = xs.iter().rev().cloned().collect();
-
-        for &x in &xs {
-            assert_eq!(q.pop().unwrap(), x);
-        }
-    }
-
-    #[test]
-    fn test_drain() {
-        let mut q: BinaryHeap<_> = [9, 8, 7, 6, 5, 4, 3, 2, 1].iter().cloned().collect();
-
-        assert_eq!(q.drain().take(5).count(), 5);
-
-        assert!(q.is_empty());
-    }
-}
index 7524fb6cf18a65b4effbc2f0585afbab13ab7ecc..1dd463e0405ff57db41fcf9c3a64538522b469ca 100644 (file)
@@ -1903,1183 +1903,3 @@ fn into_iter(self) -> SetIter<'a> {
         self.iter()
     }
 }
-
-#[cfg(test)]
-mod tests {
-    use prelude::*;
-    use core::u32;
-
-    use super::BitVec;
-
-    #[test]
-    fn test_to_str() {
-        let zerolen = BitVec::new();
-        assert_eq!(format!("{:?}", zerolen), "");
-
-        let eightbits = BitVec::from_elem(8, false);
-        assert_eq!(format!("{:?}", eightbits), "00000000")
-    }
-
-    #[test]
-    fn test_0_elements() {
-        let act = BitVec::new();
-        let exp = Vec::new();
-        assert!(act.eq_vec(&exp));
-        assert!(act.none() && act.all());
-    }
-
-    #[test]
-    fn test_1_element() {
-        let mut act = BitVec::from_elem(1, false);
-        assert!(act.eq_vec(&[false]));
-        assert!(act.none() && !act.all());
-        act = BitVec::from_elem(1, true);
-        assert!(act.eq_vec(&[true]));
-        assert!(!act.none() && act.all());
-    }
-
-    #[test]
-    fn test_2_elements() {
-        let mut b = BitVec::from_elem(2, false);
-        b.set(0, true);
-        b.set(1, false);
-        assert_eq!(format!("{:?}", b), "10");
-        assert!(!b.none() && !b.all());
-    }
-
-    #[test]
-    fn test_10_elements() {
-        let mut act;
-        // all 0
-
-        act = BitVec::from_elem(10, false);
-        assert!((act.eq_vec(
-                    &[false, false, false, false, false, false, false, false, false, false])));
-        assert!(act.none() && !act.all());
-        // all 1
-
-        act = BitVec::from_elem(10, true);
-        assert!((act.eq_vec(&[true, true, true, true, true, true, true, true, true, true])));
-        assert!(!act.none() && act.all());
-        // mixed
-
-        act = BitVec::from_elem(10, false);
-        act.set(0, true);
-        act.set(1, true);
-        act.set(2, true);
-        act.set(3, true);
-        act.set(4, true);
-        assert!((act.eq_vec(&[true, true, true, true, true, false, false, false, false, false])));
-        assert!(!act.none() && !act.all());
-        // mixed
-
-        act = BitVec::from_elem(10, false);
-        act.set(5, true);
-        act.set(6, true);
-        act.set(7, true);
-        act.set(8, true);
-        act.set(9, true);
-        assert!((act.eq_vec(&[false, false, false, false, false, true, true, true, true, true])));
-        assert!(!act.none() && !act.all());
-        // mixed
-
-        act = BitVec::from_elem(10, false);
-        act.set(0, true);
-        act.set(3, true);
-        act.set(6, true);
-        act.set(9, true);
-        assert!((act.eq_vec(&[true, false, false, true, false, false, true, false, false, true])));
-        assert!(!act.none() && !act.all());
-    }
-
-    #[test]
-    fn test_31_elements() {
-        let mut act;
-        // all 0
-
-        act = BitVec::from_elem(31, false);
-        assert!(act.eq_vec(
-                &[false, false, false, false, false, false, false, false, false, false, false,
-                  false, false, false, false, false, false, false, false, false, false, false,
-                  false, false, false, false, false, false, false, false, false]));
-        assert!(act.none() && !act.all());
-        // all 1
-
-        act = BitVec::from_elem(31, true);
-        assert!(act.eq_vec(
-                &[true, true, true, true, true, true, true, true, true, true, true, true, true,
-                  true, true, true, true, true, true, true, true, true, true, true, true, true,
-                  true, true, true, true, true]));
-        assert!(!act.none() && act.all());
-        // mixed
-
-        act = BitVec::from_elem(31, false);
-        act.set(0, true);
-        act.set(1, true);
-        act.set(2, true);
-        act.set(3, true);
-        act.set(4, true);
-        act.set(5, true);
-        act.set(6, true);
-        act.set(7, true);
-        assert!(act.eq_vec(
-                &[true, true, true, true, true, true, true, true, false, false, false, false, false,
-                  false, false, false, false, false, false, false, false, false, false, false,
-                  false, false, false, false, false, false, false]));
-        assert!(!act.none() && !act.all());
-        // mixed
-
-        act = BitVec::from_elem(31, false);
-        act.set(16, true);
-        act.set(17, true);
-        act.set(18, true);
-        act.set(19, true);
-        act.set(20, true);
-        act.set(21, true);
-        act.set(22, true);
-        act.set(23, true);
-        assert!(act.eq_vec(
-                &[false, false, false, false, false, false, false, false, false, false, false,
-                  false, false, false, false, false, true, true, true, true, true, true, true, true,
-                  false, false, false, false, false, false, false]));
-        assert!(!act.none() && !act.all());
-        // mixed
-
-        act = BitVec::from_elem(31, false);
-        act.set(24, true);
-        act.set(25, true);
-        act.set(26, true);
-        act.set(27, true);
-        act.set(28, true);
-        act.set(29, true);
-        act.set(30, true);
-        assert!(act.eq_vec(
-                &[false, false, false, false, false, false, false, false, false, false, false,
-                  false, false, false, false, false, false, false, false, false, false, false,
-                  false, false, true, true, true, true, true, true, true]));
-        assert!(!act.none() && !act.all());
-        // mixed
-
-        act = BitVec::from_elem(31, false);
-        act.set(3, true);
-        act.set(17, true);
-        act.set(30, true);
-        assert!(act.eq_vec(
-                &[false, false, false, true, false, false, false, false, false, false, false, false,
-                  false, false, false, false, false, true, false, false, false, false, false, false,
-                  false, false, false, false, false, false, true]));
-        assert!(!act.none() && !act.all());
-    }
-
-    #[test]
-    fn test_32_elements() {
-        let mut act;
-        // all 0
-
-        act = BitVec::from_elem(32, false);
-        assert!(act.eq_vec(
-                &[false, false, false, false, false, false, false, false, false, false, false,
-                  false, false, false, false, false, false, false, false, false, false, false,
-                  false, false, false, false, false, false, false, false, false, false]));
-        assert!(act.none() && !act.all());
-        // all 1
-
-        act = BitVec::from_elem(32, true);
-        assert!(act.eq_vec(
-                &[true, true, true, true, true, true, true, true, true, true, true, true, true,
-                  true, true, true, true, true, true, true, true, true, true, true, true, true,
-                  true, true, true, true, true, true]));
-        assert!(!act.none() && act.all());
-        // mixed
-
-        act = BitVec::from_elem(32, false);
-        act.set(0, true);
-        act.set(1, true);
-        act.set(2, true);
-        act.set(3, true);
-        act.set(4, true);
-        act.set(5, true);
-        act.set(6, true);
-        act.set(7, true);
-        assert!(act.eq_vec(
-                &[true, true, true, true, true, true, true, true, false, false, false, false, false,
-                  false, false, false, false, false, false, false, false, false, false, false,
-                  false, false, false, false, false, false, false, false]));
-        assert!(!act.none() && !act.all());
-        // mixed
-
-        act = BitVec::from_elem(32, false);
-        act.set(16, true);
-        act.set(17, true);
-        act.set(18, true);
-        act.set(19, true);
-        act.set(20, true);
-        act.set(21, true);
-        act.set(22, true);
-        act.set(23, true);
-        assert!(act.eq_vec(
-                &[false, false, false, false, false, false, false, false, false, false, false,
-                  false, false, false, false, false, true, true, true, true, true, true, true, true,
-                  false, false, false, false, false, false, false, false]));
-        assert!(!act.none() && !act.all());
-        // mixed
-
-        act = BitVec::from_elem(32, false);
-        act.set(24, true);
-        act.set(25, true);
-        act.set(26, true);
-        act.set(27, true);
-        act.set(28, true);
-        act.set(29, true);
-        act.set(30, true);
-        act.set(31, true);
-        assert!(act.eq_vec(
-                &[false, false, false, false, false, false, false, false, false, false, false,
-                  false, false, false, false, false, false, false, false, false, false, false,
-                  false, false, true, true, true, true, true, true, true, true]));
-        assert!(!act.none() && !act.all());
-        // mixed
-
-        act = BitVec::from_elem(32, false);
-        act.set(3, true);
-        act.set(17, true);
-        act.set(30, true);
-        act.set(31, true);
-        assert!(act.eq_vec(
-                &[false, false, false, true, false, false, false, false, false, false, false, false,
-                  false, false, false, false, false, true, false, false, false, false, false, false,
-                  false, false, false, false, false, false, true, true]));
-        assert!(!act.none() && !act.all());
-    }
-
-    #[test]
-    fn test_33_elements() {
-        let mut act;
-        // all 0
-
-        act = BitVec::from_elem(33, false);
-        assert!(act.eq_vec(
-                &[false, false, false, false, false, false, false, false, false, false, false,
-                  false, false, false, false, false, false, false, false, false, false, false,
-                  false, false, false, false, false, false, false, false, false, false, false]));
-        assert!(act.none() && !act.all());
-        // all 1
-
-        act = BitVec::from_elem(33, true);
-        assert!(act.eq_vec(
-                &[true, true, true, true, true, true, true, true, true, true, true, true, true,
-                  true, true, true, true, true, true, true, true, true, true, true, true, true,
-                  true, true, true, true, true, true, true]));
-        assert!(!act.none() && act.all());
-        // mixed
-
-        act = BitVec::from_elem(33, false);
-        act.set(0, true);
-        act.set(1, true);
-        act.set(2, true);
-        act.set(3, true);
-        act.set(4, true);
-        act.set(5, true);
-        act.set(6, true);
-        act.set(7, true);
-        assert!(act.eq_vec(
-                &[true, true, true, true, true, true, true, true, false, false, false, false, false,
-                  false, false, false, false, false, false, false, false, false, false, false,
-                  false, false, false, false, false, false, false, false, false]));
-        assert!(!act.none() && !act.all());
-        // mixed
-
-        act = BitVec::from_elem(33, false);
-        act.set(16, true);
-        act.set(17, true);
-        act.set(18, true);
-        act.set(19, true);
-        act.set(20, true);
-        act.set(21, true);
-        act.set(22, true);
-        act.set(23, true);
-        assert!(act.eq_vec(
-                &[false, false, false, false, false, false, false, false, false, false, false,
-                  false, false, false, false, false, true, true, true, true, true, true, true, true,
-                  false, false, false, false, false, false, false, false, false]));
-        assert!(!act.none() && !act.all());
-        // mixed
-
-        act = BitVec::from_elem(33, false);
-        act.set(24, true);
-        act.set(25, true);
-        act.set(26, true);
-        act.set(27, true);
-        act.set(28, true);
-        act.set(29, true);
-        act.set(30, true);
-        act.set(31, true);
-        assert!(act.eq_vec(
-                &[false, false, false, false, false, false, false, false, false, false, false,
-                  false, false, false, false, false, false, false, false, false, false, false,
-                  false, false, true, true, true, true, true, true, true, true, false]));
-        assert!(!act.none() && !act.all());
-        // mixed
-
-        act = BitVec::from_elem(33, false);
-        act.set(3, true);
-        act.set(17, true);
-        act.set(30, true);
-        act.set(31, true);
-        act.set(32, true);
-        assert!(act.eq_vec(
-                &[false, false, false, true, false, false, false, false, false, false, false, false,
-                  false, false, false, false, false, true, false, false, false, false, false, false,
-                  false, false, false, false, false, false, true, true, true]));
-        assert!(!act.none() && !act.all());
-    }
-
-    #[test]
-    fn test_equal_differing_sizes() {
-        let v0 = BitVec::from_elem(10, false);
-        let v1 = BitVec::from_elem(11, false);
-        assert!(v0 != v1);
-    }
-
-    #[test]
-    fn test_equal_greatly_differing_sizes() {
-        let v0 = BitVec::from_elem(10, false);
-        let v1 = BitVec::from_elem(110, false);
-        assert!(v0 != v1);
-    }
-
-    #[test]
-    fn test_equal_sneaky_small() {
-        let mut a = BitVec::from_elem(1, false);
-        a.set(0, true);
-
-        let mut b = BitVec::from_elem(1, true);
-        b.set(0, true);
-
-        assert_eq!(a, b);
-    }
-
-    #[test]
-    fn test_equal_sneaky_big() {
-        let mut a = BitVec::from_elem(100, false);
-        for i in 0..100 {
-            a.set(i, true);
-        }
-
-        let mut b = BitVec::from_elem(100, true);
-        for i in 0..100 {
-            b.set(i, true);
-        }
-
-        assert_eq!(a, b);
-    }
-
-    #[test]
-    fn test_from_bytes() {
-        let bit_vec = BitVec::from_bytes(&[0b10110110, 0b00000000, 0b11111111]);
-        let str = concat!("10110110", "00000000", "11111111");
-        assert_eq!(format!("{:?}", bit_vec), str);
-    }
-
-    #[test]
-    fn test_to_bytes() {
-        let mut bv = BitVec::from_elem(3, true);
-        bv.set(1, false);
-        assert_eq!(bv.to_bytes(), [0b10100000]);
-
-        let mut bv = BitVec::from_elem(9, false);
-        bv.set(2, true);
-        bv.set(8, true);
-        assert_eq!(bv.to_bytes(), [0b00100000, 0b10000000]);
-    }
-
-    #[test]
-    fn test_from_bools() {
-        let bools = vec![true, false, true, true];
-        let bit_vec: BitVec = bools.iter().map(|n| *n).collect();
-        assert_eq!(format!("{:?}", bit_vec), "1011");
-    }
-
-    #[test]
-    fn test_to_bools() {
-        let bools = vec![false, false, true, false, false, true, true, false];
-        assert_eq!(BitVec::from_bytes(&[0b00100110]).iter().collect::<Vec<bool>>(), bools);
-    }
-
-    #[test]
-    fn test_bit_vec_iterator() {
-        let bools = vec![true, false, true, true];
-        let bit_vec: BitVec = bools.iter().map(|n| *n).collect();
-
-        assert_eq!(bit_vec.iter().collect::<Vec<bool>>(), bools);
-
-        let long: Vec<_> = (0..10000).map(|i| i % 2 == 0).collect();
-        let bit_vec: BitVec = long.iter().map(|n| *n).collect();
-        assert_eq!(bit_vec.iter().collect::<Vec<bool>>(), long)
-    }
-
-    #[test]
-    fn test_small_difference() {
-        let mut b1 = BitVec::from_elem(3, false);
-        let mut b2 = BitVec::from_elem(3, false);
-        b1.set(0, true);
-        b1.set(1, true);
-        b2.set(1, true);
-        b2.set(2, true);
-        assert!(b1.difference(&b2));
-        assert!(b1[0]);
-        assert!(!b1[1]);
-        assert!(!b1[2]);
-    }
-
-    #[test]
-    fn test_big_difference() {
-        let mut b1 = BitVec::from_elem(100, false);
-        let mut b2 = BitVec::from_elem(100, false);
-        b1.set(0, true);
-        b1.set(40, true);
-        b2.set(40, true);
-        b2.set(80, true);
-        assert!(b1.difference(&b2));
-        assert!(b1[0]);
-        assert!(!b1[40]);
-        assert!(!b1[80]);
-    }
-
-    #[test]
-    fn test_small_clear() {
-        let mut b = BitVec::from_elem(14, true);
-        assert!(!b.none() && b.all());
-        b.clear();
-        assert!(b.none() && !b.all());
-    }
-
-    #[test]
-    fn test_big_clear() {
-        let mut b = BitVec::from_elem(140, true);
-        assert!(!b.none() && b.all());
-        b.clear();
-        assert!(b.none() && !b.all());
-    }
-
-    #[test]
-    fn test_bit_vec_lt() {
-        let mut a = BitVec::from_elem(5, false);
-        let mut b = BitVec::from_elem(5, false);
-
-        assert!(!(a < b) && !(b < a));
-        b.set(2, true);
-        assert!(a < b);
-        a.set(3, true);
-        assert!(a < b);
-        a.set(2, true);
-        assert!(!(a < b) && b < a);
-        b.set(0, true);
-        assert!(a < b);
-    }
-
-    #[test]
-    fn test_ord() {
-        let mut a = BitVec::from_elem(5, false);
-        let mut b = BitVec::from_elem(5, false);
-
-        assert!(a <= b && a >= b);
-        a.set(1, true);
-        assert!(a > b && a >= b);
-        assert!(b < a && b <= a);
-        b.set(1, true);
-        b.set(2, true);
-        assert!(b > a && b >= a);
-        assert!(a < b && a <= b);
-    }
-
-
-    #[test]
-    fn test_small_bit_vec_tests() {
-        let v = BitVec::from_bytes(&[0]);
-        assert!(!v.all());
-        assert!(!v.any());
-        assert!(v.none());
-
-        let v = BitVec::from_bytes(&[0b00010100]);
-        assert!(!v.all());
-        assert!(v.any());
-        assert!(!v.none());
-
-        let v = BitVec::from_bytes(&[0xFF]);
-        assert!(v.all());
-        assert!(v.any());
-        assert!(!v.none());
-    }
-
-    #[test]
-    fn test_big_bit_vec_tests() {
-        let v = BitVec::from_bytes(&[ // 88 bits
-            0, 0, 0, 0,
-            0, 0, 0, 0,
-            0, 0, 0]);
-        assert!(!v.all());
-        assert!(!v.any());
-        assert!(v.none());
-
-        let v = BitVec::from_bytes(&[ // 88 bits
-            0, 0, 0b00010100, 0,
-            0, 0, 0, 0b00110100,
-            0, 0, 0]);
-        assert!(!v.all());
-        assert!(v.any());
-        assert!(!v.none());
-
-        let v = BitVec::from_bytes(&[ // 88 bits
-            0xFF, 0xFF, 0xFF, 0xFF,
-            0xFF, 0xFF, 0xFF, 0xFF,
-            0xFF, 0xFF, 0xFF]);
-        assert!(v.all());
-        assert!(v.any());
-        assert!(!v.none());
-    }
-
-    #[test]
-    fn test_bit_vec_push_pop() {
-        let mut s = BitVec::from_elem(5 * u32::BITS as usize - 2, false);
-        assert_eq!(s.len(), 5 * u32::BITS as usize - 2);
-        assert_eq!(s[5 * u32::BITS as usize - 3], false);
-        s.push(true);
-        s.push(true);
-        assert_eq!(s[5 * u32::BITS as usize - 2], true);
-        assert_eq!(s[5 * u32::BITS as usize - 1], true);
-        // Here the internal vector will need to be extended
-        s.push(false);
-        assert_eq!(s[5 * u32::BITS as usize], false);
-        s.push(false);
-        assert_eq!(s[5 * u32::BITS as usize + 1], false);
-        assert_eq!(s.len(), 5 * u32::BITS as usize + 2);
-        // Pop it all off
-        assert_eq!(s.pop(), Some(false));
-        assert_eq!(s.pop(), Some(false));
-        assert_eq!(s.pop(), Some(true));
-        assert_eq!(s.pop(), Some(true));
-        assert_eq!(s.len(), 5 * u32::BITS as usize - 2);
-    }
-
-    #[test]
-    fn test_bit_vec_truncate() {
-        let mut s = BitVec::from_elem(5 * u32::BITS as usize, true);
-
-        assert_eq!(s, BitVec::from_elem(5 * u32::BITS as usize, true));
-        assert_eq!(s.len(), 5 * u32::BITS as usize);
-        s.truncate(4 * u32::BITS as usize);
-        assert_eq!(s, BitVec::from_elem(4 * u32::BITS as usize, true));
-        assert_eq!(s.len(), 4 * u32::BITS as usize);
-        // Truncating to a size > s.len() should be a noop
-        s.truncate(5 * u32::BITS as usize);
-        assert_eq!(s, BitVec::from_elem(4 * u32::BITS as usize, true));
-        assert_eq!(s.len(), 4 * u32::BITS as usize);
-        s.truncate(3 * u32::BITS as usize - 10);
-        assert_eq!(s, BitVec::from_elem(3 * u32::BITS as usize - 10, true));
-        assert_eq!(s.len(), 3 * u32::BITS as usize - 10);
-        s.truncate(0);
-        assert_eq!(s, BitVec::from_elem(0, true));
-        assert_eq!(s.len(), 0);
-    }
-
-    #[test]
-    fn test_bit_vec_reserve() {
-        let mut s = BitVec::from_elem(5 * u32::BITS as usize, true);
-        // Check capacity
-        assert!(s.capacity() >= 5 * u32::BITS as usize);
-        s.reserve(2 * u32::BITS as usize);
-        assert!(s.capacity() >= 7 * u32::BITS as usize);
-        s.reserve(7 * u32::BITS as usize);
-        assert!(s.capacity() >= 12 * u32::BITS as usize);
-        s.reserve_exact(7 * u32::BITS as usize);
-        assert!(s.capacity() >= 12 * u32::BITS as usize);
-        s.reserve(7 * u32::BITS as usize + 1);
-        assert!(s.capacity() >= 12 * u32::BITS as usize + 1);
-        // Check that length hasn't changed
-        assert_eq!(s.len(), 5 * u32::BITS as usize);
-        s.push(true);
-        s.push(false);
-        s.push(true);
-        assert_eq!(s[5 * u32::BITS as usize - 1], true);
-        assert_eq!(s[5 * u32::BITS as usize - 0], true);
-        assert_eq!(s[5 * u32::BITS as usize + 1], false);
-        assert_eq!(s[5 * u32::BITS as usize + 2], true);
-    }
-
-    #[test]
-    fn test_bit_vec_grow() {
-        let mut bit_vec = BitVec::from_bytes(&[0b10110110, 0b00000000, 0b10101010]);
-        bit_vec.grow(32, true);
-        assert_eq!(bit_vec, BitVec::from_bytes(&[0b10110110, 0b00000000, 0b10101010,
-                                     0xFF, 0xFF, 0xFF, 0xFF]));
-        bit_vec.grow(64, false);
-        assert_eq!(bit_vec, BitVec::from_bytes(&[0b10110110, 0b00000000, 0b10101010,
-                                     0xFF, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0]));
-        bit_vec.grow(16, true);
-        assert_eq!(bit_vec, BitVec::from_bytes(&[0b10110110, 0b00000000, 0b10101010,
-                                     0xFF, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF]));
-    }
-
-    #[test]
-    fn test_bit_vec_extend() {
-        let mut bit_vec = BitVec::from_bytes(&[0b10110110, 0b00000000, 0b11111111]);
-        let ext = BitVec::from_bytes(&[0b01001001, 0b10010010, 0b10111101]);
-        bit_vec.extend(ext.iter());
-        assert_eq!(bit_vec, BitVec::from_bytes(&[0b10110110, 0b00000000, 0b11111111,
-                                     0b01001001, 0b10010010, 0b10111101]));
-    }
-}
-
-
-
-
-#[cfg(test)]
-mod bit_vec_bench {
-    use std::prelude::v1::*;
-    use std::rand;
-    use std::rand::Rng;
-    use std::u32;
-    use test::{Bencher, black_box};
-
-    use super::BitVec;
-
-    const BENCH_BITS : usize = 1 << 14;
-
-    fn rng() -> rand::IsaacRng {
-        let seed: &[_] = &[1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
-        rand::SeedableRng::from_seed(seed)
-    }
-
-    #[bench]
-    fn bench_usize_small(b: &mut Bencher) {
-        let mut r = rng();
-        let mut bit_vec = 0 as usize;
-        b.iter(|| {
-            for _ in 0..100 {
-                bit_vec |= 1 << ((r.next_u32() as usize) % u32::BITS as usize);
-            }
-            black_box(&bit_vec);
-        });
-    }
-
-    #[bench]
-    fn bench_bit_set_big_fixed(b: &mut Bencher) {
-        let mut r = rng();
-        let mut bit_vec = BitVec::from_elem(BENCH_BITS, false);
-        b.iter(|| {
-            for _ in 0..100 {
-                bit_vec.set((r.next_u32() as usize) % BENCH_BITS, true);
-            }
-            black_box(&bit_vec);
-        });
-    }
-
-    #[bench]
-    fn bench_bit_set_big_variable(b: &mut Bencher) {
-        let mut r = rng();
-        let mut bit_vec = BitVec::from_elem(BENCH_BITS, false);
-        b.iter(|| {
-            for _ in 0..100 {
-                bit_vec.set((r.next_u32() as usize) % BENCH_BITS, r.gen());
-            }
-            black_box(&bit_vec);
-        });
-    }
-
-    #[bench]
-    fn bench_bit_set_small(b: &mut Bencher) {
-        let mut r = rng();
-        let mut bit_vec = BitVec::from_elem(u32::BITS as usize, false);
-        b.iter(|| {
-            for _ in 0..100 {
-                bit_vec.set((r.next_u32() as usize) % u32::BITS as usize, true);
-            }
-            black_box(&bit_vec);
-        });
-    }
-
-    #[bench]
-    fn bench_bit_vec_big_union(b: &mut Bencher) {
-        let mut b1 = BitVec::from_elem(BENCH_BITS, false);
-        let b2 = BitVec::from_elem(BENCH_BITS, false);
-        b.iter(|| {
-            b1.union(&b2)
-        })
-    }
-
-    #[bench]
-    fn bench_bit_vec_small_iter(b: &mut Bencher) {
-        let bit_vec = BitVec::from_elem(u32::BITS as usize, false);
-        b.iter(|| {
-            let mut sum = 0;
-            for _ in 0..10 {
-                for pres in &bit_vec {
-                    sum += pres as usize;
-                }
-            }
-            sum
-        })
-    }
-
-    #[bench]
-    fn bench_bit_vec_big_iter(b: &mut Bencher) {
-        let bit_vec = BitVec::from_elem(BENCH_BITS, false);
-        b.iter(|| {
-            let mut sum = 0;
-            for pres in &bit_vec {
-                sum += pres as usize;
-            }
-            sum
-        })
-    }
-}
-
-
-
-
-
-
-
-#[cfg(test)]
-mod bit_set_test {
-    use prelude::*;
-    use std::iter::range_step;
-
-    use super::{BitVec, BitSet};
-
-    #[test]
-    fn test_bit_set_show() {
-        let mut s = BitSet::new();
-        s.insert(1);
-        s.insert(10);
-        s.insert(50);
-        s.insert(2);
-        assert_eq!("{1, 2, 10, 50}", format!("{:?}", s));
-    }
-
-    #[test]
-    fn test_bit_set_from_usizes() {
-        let usizes = vec![0, 2, 2, 3];
-        let a: BitSet = usizes.into_iter().collect();
-        let mut b = BitSet::new();
-        b.insert(0);
-        b.insert(2);
-        b.insert(3);
-        assert_eq!(a, b);
-    }
-
-    #[test]
-    fn test_bit_set_iterator() {
-        let usizes = vec![0, 2, 2, 3];
-        let bit_vec: BitSet = usizes.into_iter().collect();
-
-        let idxs: Vec<_> = bit_vec.iter().collect();
-        assert_eq!(idxs, [0, 2, 3]);
-
-        let long: BitSet = (0..10000).filter(|&n| n % 2 == 0).collect();
-        let real: Vec<_> = range_step(0, 10000, 2).collect();
-
-        let idxs: Vec<_> = long.iter().collect();
-        assert_eq!(idxs, real);
-    }
-
-    #[test]
-    fn test_bit_set_frombit_vec_init() {
-        let bools = [true, false];
-        let lengths = [10, 64, 100];
-        for &b in &bools {
-            for &l in &lengths {
-                let bitset = BitSet::from_bit_vec(BitVec::from_elem(l, b));
-                assert_eq!(bitset.contains(&1), b);
-                assert_eq!(bitset.contains(&(l-1)), b);
-                assert!(!bitset.contains(&l));
-            }
-        }
-    }
-
-    #[test]
-    fn test_bit_vec_masking() {
-        let b = BitVec::from_elem(140, true);
-        let mut bs = BitSet::from_bit_vec(b);
-        assert!(bs.contains(&139));
-        assert!(!bs.contains(&140));
-        assert!(bs.insert(150));
-        assert!(!bs.contains(&140));
-        assert!(!bs.contains(&149));
-        assert!(bs.contains(&150));
-        assert!(!bs.contains(&151));
-    }
-
-    #[test]
-    fn test_bit_set_basic() {
-        let mut b = BitSet::new();
-        assert!(b.insert(3));
-        assert!(!b.insert(3));
-        assert!(b.contains(&3));
-        assert!(b.insert(4));
-        assert!(!b.insert(4));
-        assert!(b.contains(&3));
-        assert!(b.insert(400));
-        assert!(!b.insert(400));
-        assert!(b.contains(&400));
-        assert_eq!(b.len(), 3);
-    }
-
-    #[test]
-    fn test_bit_set_intersection() {
-        let mut a = BitSet::new();
-        let mut b = BitSet::new();
-
-        assert!(a.insert(11));
-        assert!(a.insert(1));
-        assert!(a.insert(3));
-        assert!(a.insert(77));
-        assert!(a.insert(103));
-        assert!(a.insert(5));
-
-        assert!(b.insert(2));
-        assert!(b.insert(11));
-        assert!(b.insert(77));
-        assert!(b.insert(5));
-        assert!(b.insert(3));
-
-        let expected = [3, 5, 11, 77];
-        let actual: Vec<_> = a.intersection(&b).collect();
-        assert_eq!(actual, expected);
-    }
-
-    #[test]
-    fn test_bit_set_difference() {
-        let mut a = BitSet::new();
-        let mut b = BitSet::new();
-
-        assert!(a.insert(1));
-        assert!(a.insert(3));
-        assert!(a.insert(5));
-        assert!(a.insert(200));
-        assert!(a.insert(500));
-
-        assert!(b.insert(3));
-        assert!(b.insert(200));
-
-        let expected = [1, 5, 500];
-        let actual: Vec<_> = a.difference(&b).collect();
-        assert_eq!(actual, expected);
-    }
-
-    #[test]
-    fn test_bit_set_symmetric_difference() {
-        let mut a = BitSet::new();
-        let mut b = BitSet::new();
-
-        assert!(a.insert(1));
-        assert!(a.insert(3));
-        assert!(a.insert(5));
-        assert!(a.insert(9));
-        assert!(a.insert(11));
-
-        assert!(b.insert(3));
-        assert!(b.insert(9));
-        assert!(b.insert(14));
-        assert!(b.insert(220));
-
-        let expected = [1, 5, 11, 14, 220];
-        let actual: Vec<_> = a.symmetric_difference(&b).collect();
-        assert_eq!(actual, expected);
-    }
-
-    #[test]
-    fn test_bit_set_union() {
-        let mut a = BitSet::new();
-        let mut b = BitSet::new();
-        assert!(a.insert(1));
-        assert!(a.insert(3));
-        assert!(a.insert(5));
-        assert!(a.insert(9));
-        assert!(a.insert(11));
-        assert!(a.insert(160));
-        assert!(a.insert(19));
-        assert!(a.insert(24));
-        assert!(a.insert(200));
-
-        assert!(b.insert(1));
-        assert!(b.insert(5));
-        assert!(b.insert(9));
-        assert!(b.insert(13));
-        assert!(b.insert(19));
-
-        let expected = [1, 3, 5, 9, 11, 13, 19, 24, 160, 200];
-        let actual: Vec<_> = a.union(&b).collect();
-        assert_eq!(actual, expected);
-    }
-
-    #[test]
-    fn test_bit_set_subset() {
-        let mut set1 = BitSet::new();
-        let mut set2 = BitSet::new();
-
-        assert!(set1.is_subset(&set2)); //  {}  {}
-        set2.insert(100);
-        assert!(set1.is_subset(&set2)); //  {}  { 1 }
-        set2.insert(200);
-        assert!(set1.is_subset(&set2)); //  {}  { 1, 2 }
-        set1.insert(200);
-        assert!(set1.is_subset(&set2)); //  { 2 }  { 1, 2 }
-        set1.insert(300);
-        assert!(!set1.is_subset(&set2)); // { 2, 3 }  { 1, 2 }
-        set2.insert(300);
-        assert!(set1.is_subset(&set2)); // { 2, 3 }  { 1, 2, 3 }
-        set2.insert(400);
-        assert!(set1.is_subset(&set2)); // { 2, 3 }  { 1, 2, 3, 4 }
-        set2.remove(&100);
-        assert!(set1.is_subset(&set2)); // { 2, 3 }  { 2, 3, 4 }
-        set2.remove(&300);
-        assert!(!set1.is_subset(&set2)); // { 2, 3 }  { 2, 4 }
-        set1.remove(&300);
-        assert!(set1.is_subset(&set2)); // { 2 }  { 2, 4 }
-    }
-
-    #[test]
-    fn test_bit_set_is_disjoint() {
-        let a = BitSet::from_bit_vec(BitVec::from_bytes(&[0b10100010]));
-        let b = BitSet::from_bit_vec(BitVec::from_bytes(&[0b01000000]));
-        let c = BitSet::new();
-        let d = BitSet::from_bit_vec(BitVec::from_bytes(&[0b00110000]));
-
-        assert!(!a.is_disjoint(&d));
-        assert!(!d.is_disjoint(&a));
-
-        assert!(a.is_disjoint(&b));
-        assert!(a.is_disjoint(&c));
-        assert!(b.is_disjoint(&a));
-        assert!(b.is_disjoint(&c));
-        assert!(c.is_disjoint(&a));
-        assert!(c.is_disjoint(&b));
-    }
-
-    #[test]
-    fn test_bit_set_union_with() {
-        //a should grow to include larger elements
-        let mut a = BitSet::new();
-        a.insert(0);
-        let mut b = BitSet::new();
-        b.insert(5);
-        let expected = BitSet::from_bit_vec(BitVec::from_bytes(&[0b10000100]));
-        a.union_with(&b);
-        assert_eq!(a, expected);
-
-        // Standard
-        let mut a = BitSet::from_bit_vec(BitVec::from_bytes(&[0b10100010]));
-        let mut b = BitSet::from_bit_vec(BitVec::from_bytes(&[0b01100010]));
-        let c = a.clone();
-        a.union_with(&b);
-        b.union_with(&c);
-        assert_eq!(a.len(), 4);
-        assert_eq!(b.len(), 4);
-    }
-
-    #[test]
-    fn test_bit_set_intersect_with() {
-        // Explicitly 0'ed bits
-        let mut a = BitSet::from_bit_vec(BitVec::from_bytes(&[0b10100010]));
-        let mut b = BitSet::from_bit_vec(BitVec::from_bytes(&[0b00000000]));
-        let c = a.clone();
-        a.intersect_with(&b);
-        b.intersect_with(&c);
-        assert!(a.is_empty());
-        assert!(b.is_empty());
-
-        // Uninitialized bits should behave like 0's
-        let mut a = BitSet::from_bit_vec(BitVec::from_bytes(&[0b10100010]));
-        let mut b = BitSet::new();
-        let c = a.clone();
-        a.intersect_with(&b);
-        b.intersect_with(&c);
-        assert!(a.is_empty());
-        assert!(b.is_empty());
-
-        // Standard
-        let mut a = BitSet::from_bit_vec(BitVec::from_bytes(&[0b10100010]));
-        let mut b = BitSet::from_bit_vec(BitVec::from_bytes(&[0b01100010]));
-        let c = a.clone();
-        a.intersect_with(&b);
-        b.intersect_with(&c);
-        assert_eq!(a.len(), 2);
-        assert_eq!(b.len(), 2);
-    }
-
-    #[test]
-    fn test_bit_set_difference_with() {
-        // Explicitly 0'ed bits
-        let mut a = BitSet::from_bit_vec(BitVec::from_bytes(&[0b00000000]));
-        let b = BitSet::from_bit_vec(BitVec::from_bytes(&[0b10100010]));
-        a.difference_with(&b);
-        assert!(a.is_empty());
-
-        // Uninitialized bits should behave like 0's
-        let mut a = BitSet::new();
-        let b = BitSet::from_bit_vec(BitVec::from_bytes(&[0b11111111]));
-        a.difference_with(&b);
-        assert!(a.is_empty());
-
-        // Standard
-        let mut a = BitSet::from_bit_vec(BitVec::from_bytes(&[0b10100010]));
-        let mut b = BitSet::from_bit_vec(BitVec::from_bytes(&[0b01100010]));
-        let c = a.clone();
-        a.difference_with(&b);
-        b.difference_with(&c);
-        assert_eq!(a.len(), 1);
-        assert_eq!(b.len(), 1);
-    }
-
-    #[test]
-    fn test_bit_set_symmetric_difference_with() {
-        //a should grow to include larger elements
-        let mut a = BitSet::new();
-        a.insert(0);
-        a.insert(1);
-        let mut b = BitSet::new();
-        b.insert(1);
-        b.insert(5);
-        let expected = BitSet::from_bit_vec(BitVec::from_bytes(&[0b10000100]));
-        a.symmetric_difference_with(&b);
-        assert_eq!(a, expected);
-
-        let mut a = BitSet::from_bit_vec(BitVec::from_bytes(&[0b10100010]));
-        let b = BitSet::new();
-        let c = a.clone();
-        a.symmetric_difference_with(&b);
-        assert_eq!(a, c);
-
-        // Standard
-        let mut a = BitSet::from_bit_vec(BitVec::from_bytes(&[0b11100010]));
-        let mut b = BitSet::from_bit_vec(BitVec::from_bytes(&[0b01101010]));
-        let c = a.clone();
-        a.symmetric_difference_with(&b);
-        b.symmetric_difference_with(&c);
-        assert_eq!(a.len(), 2);
-        assert_eq!(b.len(), 2);
-    }
-
-    #[test]
-    fn test_bit_set_eq() {
-        let a = BitSet::from_bit_vec(BitVec::from_bytes(&[0b10100010]));
-        let b = BitSet::from_bit_vec(BitVec::from_bytes(&[0b00000000]));
-        let c = BitSet::new();
-
-        assert!(a == a);
-        assert!(a != b);
-        assert!(a != c);
-        assert!(b == b);
-        assert!(b == c);
-        assert!(c == c);
-    }
-
-    #[test]
-    fn test_bit_set_cmp() {
-        let a = BitSet::from_bit_vec(BitVec::from_bytes(&[0b10100010]));
-        let b = BitSet::from_bit_vec(BitVec::from_bytes(&[0b00000000]));
-        let c = BitSet::new();
-
-        assert_eq!(a.cmp(&b), Greater);
-        assert_eq!(a.cmp(&c), Greater);
-        assert_eq!(b.cmp(&a), Less);
-        assert_eq!(b.cmp(&c), Equal);
-        assert_eq!(c.cmp(&a), Less);
-        assert_eq!(c.cmp(&b), Equal);
-    }
-
-    #[test]
-    fn test_bit_vec_remove() {
-        let mut a = BitSet::new();
-
-        assert!(a.insert(1));
-        assert!(a.remove(&1));
-
-        assert!(a.insert(100));
-        assert!(a.remove(&100));
-
-        assert!(a.insert(1000));
-        assert!(a.remove(&1000));
-        a.shrink_to_fit();
-    }
-
-    #[test]
-    fn test_bit_vec_clone() {
-        let mut a = BitSet::new();
-
-        assert!(a.insert(1));
-        assert!(a.insert(100));
-        assert!(a.insert(1000));
-
-        let mut b = a.clone();
-
-        assert!(a == b);
-
-        assert!(b.remove(&1));
-        assert!(a.contains(&1));
-
-        assert!(a.remove(&1000));
-        assert!(b.contains(&1000));
-    }
-}
-
-
-
-
-
-#[cfg(test)]
-mod bit_set_bench {
-    use std::prelude::v1::*;
-    use std::rand;
-    use std::rand::Rng;
-    use std::u32;
-    use test::{Bencher, black_box};
-
-    use super::{BitVec, BitSet};
-
-    const BENCH_BITS : usize = 1 << 14;
-
-    fn rng() -> rand::IsaacRng {
-        let seed: &[_] = &[1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
-        rand::SeedableRng::from_seed(seed)
-    }
-
-    #[bench]
-    fn bench_bit_vecset_small(b: &mut Bencher) {
-        let mut r = rng();
-        let mut bit_vec = BitSet::new();
-        b.iter(|| {
-            for _ in 0..100 {
-                bit_vec.insert((r.next_u32() as usize) % u32::BITS as usize);
-            }
-            black_box(&bit_vec);
-        });
-    }
-
-    #[bench]
-    fn bench_bit_vecset_big(b: &mut Bencher) {
-        let mut r = rng();
-        let mut bit_vec = BitSet::new();
-        b.iter(|| {
-            for _ in 0..100 {
-                bit_vec.insert((r.next_u32() as usize) % BENCH_BITS);
-            }
-            black_box(&bit_vec);
-        });
-    }
-
-    #[bench]
-    fn bench_bit_vecset_iter(b: &mut Bencher) {
-        let bit_vec = BitSet::from_bit_vec(BitVec::from_fn(BENCH_BITS,
-                                              |idx| {idx % 3 == 0}));
-        b.iter(|| {
-            let mut sum = 0;
-            for idx in &bit_vec {
-                sum += idx as usize;
-            }
-            sum
-        })
-    }
-}
index f2d94709c9a3272fd81b2a91c53abc7c7d52db1e..c7e1e3c91766ef297d71fbad17905910d2530c61 100644 (file)
@@ -1599,309 +1599,3 @@ pub fn entry(&mut self, mut key: K) -> Entry<K, V> {
         }
     }
 }
-
-
-
-
-
-#[cfg(test)]
-mod test {
-    use prelude::*;
-    use std::iter::range_inclusive;
-
-    use super::BTreeMap;
-    use super::Entry::{Occupied, Vacant};
-    use Bound::{self, Included, Excluded, Unbounded};
-
-    #[test]
-    fn test_basic_large() {
-        let mut map = BTreeMap::new();
-        let size = 10000;
-        assert_eq!(map.len(), 0);
-
-        for i in 0..size {
-            assert_eq!(map.insert(i, 10*i), None);
-            assert_eq!(map.len(), i + 1);
-        }
-
-        for i in 0..size {
-            assert_eq!(map.get(&i).unwrap(), &(i*10));
-        }
-
-        for i in size..size*2 {
-            assert_eq!(map.get(&i), None);
-        }
-
-        for i in 0..size {
-            assert_eq!(map.insert(i, 100*i), Some(10*i));
-            assert_eq!(map.len(), size);
-        }
-
-        for i in 0..size {
-            assert_eq!(map.get(&i).unwrap(), &(i*100));
-        }
-
-        for i in 0..size/2 {
-            assert_eq!(map.remove(&(i*2)), Some(i*200));
-            assert_eq!(map.len(), size - i - 1);
-        }
-
-        for i in 0..size/2 {
-            assert_eq!(map.get(&(2*i)), None);
-            assert_eq!(map.get(&(2*i+1)).unwrap(), &(i*200 + 100));
-        }
-
-        for i in 0..size/2 {
-            assert_eq!(map.remove(&(2*i)), None);
-            assert_eq!(map.remove(&(2*i+1)), Some(i*200 + 100));
-            assert_eq!(map.len(), size/2 - i - 1);
-        }
-    }
-
-    #[test]
-    fn test_basic_small() {
-        let mut map = BTreeMap::new();
-        assert_eq!(map.remove(&1), None);
-        assert_eq!(map.get(&1), None);
-        assert_eq!(map.insert(1, 1), None);
-        assert_eq!(map.get(&1), Some(&1));
-        assert_eq!(map.insert(1, 2), Some(1));
-        assert_eq!(map.get(&1), Some(&2));
-        assert_eq!(map.insert(2, 4), None);
-        assert_eq!(map.get(&2), Some(&4));
-        assert_eq!(map.remove(&1), Some(2));
-        assert_eq!(map.remove(&2), Some(4));
-        assert_eq!(map.remove(&1), None);
-    }
-
-    #[test]
-    fn test_iter() {
-        let size = 10000;
-
-        // Forwards
-        let mut map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
-
-        fn test<T>(size: usize, mut iter: T) where T: Iterator<Item=(usize, usize)> {
-            for i in 0..size {
-                assert_eq!(iter.size_hint(), (size - i, Some(size - i)));
-                assert_eq!(iter.next().unwrap(), (i, i));
-            }
-            assert_eq!(iter.size_hint(), (0, Some(0)));
-            assert_eq!(iter.next(), None);
-        }
-        test(size, map.iter().map(|(&k, &v)| (k, v)));
-        test(size, map.iter_mut().map(|(&k, &mut v)| (k, v)));
-        test(size, map.into_iter());
-    }
-
-    #[test]
-    fn test_iter_rev() {
-        let size = 10000;
-
-        // Forwards
-        let mut map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
-
-        fn test<T>(size: usize, mut iter: T) where T: Iterator<Item=(usize, usize)> {
-            for i in 0..size {
-                assert_eq!(iter.size_hint(), (size - i, Some(size - i)));
-                assert_eq!(iter.next().unwrap(), (size - i - 1, size - i - 1));
-            }
-            assert_eq!(iter.size_hint(), (0, Some(0)));
-            assert_eq!(iter.next(), None);
-        }
-        test(size, map.iter().rev().map(|(&k, &v)| (k, v)));
-        test(size, map.iter_mut().rev().map(|(&k, &mut v)| (k, v)));
-        test(size, map.into_iter().rev());
-    }
-
-    #[test]
-    fn test_iter_mixed() {
-        let size = 10000;
-
-        // Forwards
-        let mut map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
-
-        fn test<T>(size: usize, mut iter: T)
-                where T: Iterator<Item=(usize, usize)> + DoubleEndedIterator {
-            for i in 0..size / 4 {
-                assert_eq!(iter.size_hint(), (size - i * 2, Some(size - i * 2)));
-                assert_eq!(iter.next().unwrap(), (i, i));
-                assert_eq!(iter.next_back().unwrap(), (size - i - 1, size - i - 1));
-            }
-            for i in size / 4..size * 3 / 4 {
-                assert_eq!(iter.size_hint(), (size * 3 / 4 - i, Some(size * 3 / 4 - i)));
-                assert_eq!(iter.next().unwrap(), (i, i));
-            }
-            assert_eq!(iter.size_hint(), (0, Some(0)));
-            assert_eq!(iter.next(), None);
-        }
-        test(size, map.iter().map(|(&k, &v)| (k, v)));
-        test(size, map.iter_mut().map(|(&k, &mut v)| (k, v)));
-        test(size, map.into_iter());
-    }
-
-    #[test]
-    fn test_range_small() {
-        let size = 5;
-
-        // Forwards
-        let map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
-
-        let mut j = 0;
-        for ((&k, &v), i) in map.range(Included(&2), Unbounded).zip(2..size) {
-            assert_eq!(k, i);
-            assert_eq!(v, i);
-            j += 1;
-        }
-        assert_eq!(j, size - 2);
-    }
-
-    #[test]
-    fn test_range_1000() {
-        let size = 1000;
-        let map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
-
-        fn test(map: &BTreeMap<u32, u32>, size: u32, min: Bound<&u32>, max: Bound<&u32>) {
-            let mut kvs = map.range(min, max).map(|(&k, &v)| (k, v));
-            let mut pairs = (0..size).map(|i| (i, i));
-
-            for (kv, pair) in kvs.by_ref().zip(pairs.by_ref()) {
-                assert_eq!(kv, pair);
-            }
-            assert_eq!(kvs.next(), None);
-            assert_eq!(pairs.next(), None);
-        }
-        test(&map, size, Included(&0), Excluded(&size));
-        test(&map, size, Unbounded, Excluded(&size));
-        test(&map, size, Included(&0), Included(&(size - 1)));
-        test(&map, size, Unbounded, Included(&(size - 1)));
-        test(&map, size, Included(&0), Unbounded);
-        test(&map, size, Unbounded, Unbounded);
-    }
-
-    #[test]
-    fn test_range() {
-        let size = 200;
-        let map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
-
-        for i in 0..size {
-            for j in i..size {
-                let mut kvs = map.range(Included(&i), Included(&j)).map(|(&k, &v)| (k, v));
-                let mut pairs = range_inclusive(i, j).map(|i| (i, i));
-
-                for (kv, pair) in kvs.by_ref().zip(pairs.by_ref()) {
-                    assert_eq!(kv, pair);
-                }
-                assert_eq!(kvs.next(), None);
-                assert_eq!(pairs.next(), None);
-            }
-        }
-    }
-
-    #[test]
-    fn test_entry(){
-        let xs = [(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)];
-
-        let mut map: BTreeMap<_, _> = xs.iter().cloned().collect();
-
-        // Existing key (insert)
-        match map.entry(1) {
-            Vacant(_) => unreachable!(),
-            Occupied(mut view) => {
-                assert_eq!(view.get(), &10);
-                assert_eq!(view.insert(100), 10);
-            }
-        }
-        assert_eq!(map.get(&1).unwrap(), &100);
-        assert_eq!(map.len(), 6);
-
-
-        // Existing key (update)
-        match map.entry(2) {
-            Vacant(_) => unreachable!(),
-            Occupied(mut view) => {
-                let v = view.get_mut();
-                *v *= 10;
-            }
-        }
-        assert_eq!(map.get(&2).unwrap(), &200);
-        assert_eq!(map.len(), 6);
-
-        // Existing key (take)
-        match map.entry(3) {
-            Vacant(_) => unreachable!(),
-            Occupied(view) => {
-                assert_eq!(view.remove(), 30);
-            }
-        }
-        assert_eq!(map.get(&3), None);
-        assert_eq!(map.len(), 5);
-
-
-        // Inexistent key (insert)
-        match map.entry(10) {
-            Occupied(_) => unreachable!(),
-            Vacant(view) => {
-                assert_eq!(*view.insert(1000), 1000);
-            }
-        }
-        assert_eq!(map.get(&10).unwrap(), &1000);
-        assert_eq!(map.len(), 6);
-    }
-}
-
-
-
-
-
-
-#[cfg(test)]
-mod bench {
-    use prelude::*;
-    use std::rand::{weak_rng, Rng};
-    use test::{Bencher, black_box};
-
-    use super::BTreeMap;
-
-    map_insert_rand_bench!{insert_rand_100,    100,    BTreeMap}
-    map_insert_rand_bench!{insert_rand_10_000, 10_000, BTreeMap}
-
-    map_insert_seq_bench!{insert_seq_100,    100,    BTreeMap}
-    map_insert_seq_bench!{insert_seq_10_000, 10_000, BTreeMap}
-
-    map_find_rand_bench!{find_rand_100,    100,    BTreeMap}
-    map_find_rand_bench!{find_rand_10_000, 10_000, BTreeMap}
-
-    map_find_seq_bench!{find_seq_100,    100,    BTreeMap}
-    map_find_seq_bench!{find_seq_10_000, 10_000, BTreeMap}
-
-    fn bench_iter(b: &mut Bencher, size: i32) {
-        let mut map = BTreeMap::<i32, i32>::new();
-        let mut rng = weak_rng();
-
-        for _ in 0..size {
-            map.insert(rng.gen(), rng.gen());
-        }
-
-        b.iter(|| {
-            for entry in &map {
-                black_box(entry);
-            }
-        });
-    }
-
-    #[bench]
-    pub fn iter_20(b: &mut Bencher) {
-        bench_iter(b, 20);
-    }
-
-    #[bench]
-    pub fn iter_1000(b: &mut Bencher) {
-        bench_iter(b, 1000);
-    }
-
-    #[bench]
-    pub fn iter_100000(b: &mut Bencher) {
-        bench_iter(b, 100000);
-    }
-}
index a5ef36bcdab7adb059ba83bcdde6d0f7fda1fe03..5616d36ce0ba9ffadb9a1619b0616218a0fab4c7 100644 (file)
@@ -742,180 +742,3 @@ fn next(&mut self) -> Option<&'a T> {
         }
     }
 }
-
-
-#[cfg(test)]
-mod test {
-    use prelude::*;
-
-    use super::BTreeSet;
-    use std::hash::{self, SipHasher};
-
-    #[test]
-    fn test_clone_eq() {
-      let mut m = BTreeSet::new();
-
-      m.insert(1);
-      m.insert(2);
-
-      assert!(m.clone() == m);
-    }
-
-    #[test]
-    fn test_hash() {
-      let mut x = BTreeSet::new();
-      let mut y = BTreeSet::new();
-
-      x.insert(1);
-      x.insert(2);
-      x.insert(3);
-
-      y.insert(3);
-      y.insert(2);
-      y.insert(1);
-
-      assert!(hash::hash::<_, SipHasher>(&x) == hash::hash::<_, SipHasher>(&y));
-    }
-
-    struct Counter<'a, 'b> {
-        i: &'a mut usize,
-        expected: &'b [i32],
-    }
-
-    impl<'a, 'b, 'c> FnMut<(&'c i32,)> for Counter<'a, 'b> {
-        type Output = bool;
-
-        extern "rust-call" fn call_mut(&mut self, (&x,): (&'c i32,)) -> bool {
-            assert_eq!(x, self.expected[*self.i]);
-            *self.i += 1;
-            true
-        }
-    }
-
-    fn check<F>(a: &[i32], b: &[i32], expected: &[i32], f: F) where
-        // FIXME Replace Counter with `Box<FnMut(_) -> _>`
-        F: FnOnce(&BTreeSet<i32>, &BTreeSet<i32>, Counter) -> bool,
-    {
-        let mut set_a = BTreeSet::new();
-        let mut set_b = BTreeSet::new();
-
-        for x in a { assert!(set_a.insert(*x)) }
-        for y in b { assert!(set_b.insert(*y)) }
-
-        let mut i = 0;
-        f(&set_a, &set_b, Counter { i: &mut i, expected: expected });
-        assert_eq!(i, expected.len());
-    }
-
-    #[test]
-    fn test_intersection() {
-        fn check_intersection(a: &[i32], b: &[i32], expected: &[i32]) {
-            check(a, b, expected, |x, y, f| x.intersection(y).all(f))
-        }
-
-        check_intersection(&[], &[], &[]);
-        check_intersection(&[1, 2, 3], &[], &[]);
-        check_intersection(&[], &[1, 2, 3], &[]);
-        check_intersection(&[2], &[1, 2, 3], &[2]);
-        check_intersection(&[1, 2, 3], &[2], &[2]);
-        check_intersection(&[11, 1, 3, 77, 103, 5, -5],
-                           &[2, 11, 77, -9, -42, 5, 3],
-                           &[3, 5, 11, 77]);
-    }
-
-    #[test]
-    fn test_difference() {
-        fn check_difference(a: &[i32], b: &[i32], expected: &[i32]) {
-            check(a, b, expected, |x, y, f| x.difference(y).all(f))
-        }
-
-        check_difference(&[], &[], &[]);
-        check_difference(&[1, 12], &[], &[1, 12]);
-        check_difference(&[], &[1, 2, 3, 9], &[]);
-        check_difference(&[1, 3, 5, 9, 11],
-                         &[3, 9],
-                         &[1, 5, 11]);
-        check_difference(&[-5, 11, 22, 33, 40, 42],
-                         &[-12, -5, 14, 23, 34, 38, 39, 50],
-                         &[11, 22, 33, 40, 42]);
-    }
-
-    #[test]
-    fn test_symmetric_difference() {
-        fn check_symmetric_difference(a: &[i32], b: &[i32], expected: &[i32]) {
-            check(a, b, expected, |x, y, f| x.symmetric_difference(y).all(f))
-        }
-
-        check_symmetric_difference(&[], &[], &[]);
-        check_symmetric_difference(&[1, 2, 3], &[2], &[1, 3]);
-        check_symmetric_difference(&[2], &[1, 2, 3], &[1, 3]);
-        check_symmetric_difference(&[1, 3, 5, 9, 11],
-                                   &[-2, 3, 9, 14, 22],
-                                   &[-2, 1, 5, 11, 14, 22]);
-    }
-
-    #[test]
-    fn test_union() {
-        fn check_union(a: &[i32], b: &[i32], expected: &[i32]) {
-            check(a, b, expected, |x, y, f| x.union(y).all(f))
-        }
-
-        check_union(&[], &[], &[]);
-        check_union(&[1, 2, 3], &[2], &[1, 2, 3]);
-        check_union(&[2], &[1, 2, 3], &[1, 2, 3]);
-        check_union(&[1, 3, 5, 9, 11, 16, 19, 24],
-                    &[-2, 1, 5, 9, 13, 19],
-                    &[-2, 1, 3, 5, 9, 11, 13, 16, 19, 24]);
-    }
-
-    #[test]
-    fn test_zip() {
-        let mut x = BTreeSet::new();
-        x.insert(5);
-        x.insert(12);
-        x.insert(11);
-
-        let mut y = BTreeSet::new();
-        y.insert("foo");
-        y.insert("bar");
-
-        let x = x;
-        let y = y;
-        let mut z = x.iter().zip(y.iter());
-
-        // FIXME: #5801: this needs a type hint to compile...
-        let result: Option<(&usize, & &'static str)> = z.next();
-        assert_eq!(result.unwrap(), (&5, &("bar")));
-
-        let result: Option<(&usize, & &'static str)> = z.next();
-        assert_eq!(result.unwrap(), (&11, &("foo")));
-
-        let result: Option<(&usize, & &'static str)> = z.next();
-        assert!(result.is_none());
-    }
-
-    #[test]
-    fn test_from_iter() {
-        let xs = [1, 2, 3, 4, 5, 6, 7, 8, 9];
-
-        let set: BTreeSet<_> = xs.iter().cloned().collect();
-
-        for x in &xs {
-            assert!(set.contains(x));
-        }
-    }
-
-    #[test]
-    fn test_show() {
-        let mut set = BTreeSet::new();
-        let empty = BTreeSet::<i32>::new();
-
-        set.insert(1);
-        set.insert(2);
-
-        let set_str = format!("{:?}", set);
-
-        assert_eq!(set_str, "{1, 2}");
-        assert_eq!(format!("{:?}", empty), "{}");
-    }
-}
index eec61cfcd56242964a5a1df22c3b3b378b92d3df..fe2efc7164d0cae0c8d69b3f75e6010def7e512b 100644 (file)
@@ -285,241 +285,3 @@ fn extend<I: IntoIterator<Item=E>>(&mut self, iter: I) {
         }
     }
 }
-
-#[cfg(test)]
-mod test {
-    use self::Foo::*;
-    use prelude::*;
-    use core::mem;
-
-    use super::{EnumSet, CLike};
-
-    #[derive(Copy, PartialEq, Debug)]
-    #[repr(usize)]
-    enum Foo {
-        A, B, C
-    }
-
-    impl CLike for Foo {
-        fn to_usize(&self) -> usize {
-            *self as usize
-        }
-
-        fn from_usize(v: usize) -> Foo {
-            unsafe { mem::transmute(v) }
-        }
-    }
-
-    #[test]
-    fn test_new() {
-        let e: EnumSet<Foo> = EnumSet::new();
-        assert!(e.is_empty());
-    }
-
-    #[test]
-    fn test_show() {
-        let mut e = EnumSet::new();
-        assert!(format!("{:?}", e) == "{}");
-        e.insert(A);
-        assert!(format!("{:?}", e) == "{A}");
-        e.insert(C);
-        assert!(format!("{:?}", e) == "{A, C}");
-    }
-
-    #[test]
-    fn test_len() {
-        let mut e = EnumSet::new();
-        assert_eq!(e.len(), 0);
-        e.insert(A);
-        e.insert(B);
-        e.insert(C);
-        assert_eq!(e.len(), 3);
-        e.remove(&A);
-        assert_eq!(e.len(), 2);
-        e.clear();
-        assert_eq!(e.len(), 0);
-    }
-
-    ///////////////////////////////////////////////////////////////////////////
-    // intersect
-
-    #[test]
-    fn test_two_empties_do_not_intersect() {
-        let e1: EnumSet<Foo> = EnumSet::new();
-        let e2: EnumSet<Foo> = EnumSet::new();
-        assert!(e1.is_disjoint(&e2));
-    }
-
-    #[test]
-    fn test_empty_does_not_intersect_with_full() {
-        let e1: EnumSet<Foo> = EnumSet::new();
-
-        let mut e2: EnumSet<Foo> = EnumSet::new();
-        e2.insert(A);
-        e2.insert(B);
-        e2.insert(C);
-
-        assert!(e1.is_disjoint(&e2));
-    }
-
-    #[test]
-    fn test_disjoint_intersects() {
-        let mut e1: EnumSet<Foo> = EnumSet::new();
-        e1.insert(A);
-
-        let mut e2: EnumSet<Foo> = EnumSet::new();
-        e2.insert(B);
-
-        assert!(e1.is_disjoint(&e2));
-    }
-
-    #[test]
-    fn test_overlapping_intersects() {
-        let mut e1: EnumSet<Foo> = EnumSet::new();
-        e1.insert(A);
-
-        let mut e2: EnumSet<Foo> = EnumSet::new();
-        e2.insert(A);
-        e2.insert(B);
-
-        assert!(!e1.is_disjoint(&e2));
-    }
-
-    ///////////////////////////////////////////////////////////////////////////
-    // contains and contains_elem
-
-    #[test]
-    fn test_superset() {
-        let mut e1: EnumSet<Foo> = EnumSet::new();
-        e1.insert(A);
-
-        let mut e2: EnumSet<Foo> = EnumSet::new();
-        e2.insert(A);
-        e2.insert(B);
-
-        let mut e3: EnumSet<Foo> = EnumSet::new();
-        e3.insert(C);
-
-        assert!(e1.is_subset(&e2));
-        assert!(e2.is_superset(&e1));
-        assert!(!e3.is_superset(&e2));
-        assert!(!e2.is_superset(&e3))
-    }
-
-    #[test]
-    fn test_contains() {
-        let mut e1: EnumSet<Foo> = EnumSet::new();
-        e1.insert(A);
-        assert!(e1.contains(&A));
-        assert!(!e1.contains(&B));
-        assert!(!e1.contains(&C));
-
-        e1.insert(A);
-        e1.insert(B);
-        assert!(e1.contains(&A));
-        assert!(e1.contains(&B));
-        assert!(!e1.contains(&C));
-    }
-
-    ///////////////////////////////////////////////////////////////////////////
-    // iter
-
-    #[test]
-    fn test_iterator() {
-        let mut e1: EnumSet<Foo> = EnumSet::new();
-
-        let elems: ::vec::Vec<Foo> = e1.iter().collect();
-        assert!(elems.is_empty());
-
-        e1.insert(A);
-        let elems: ::vec::Vec<_> = e1.iter().collect();
-        assert_eq!([A], elems);
-
-        e1.insert(C);
-        let elems: ::vec::Vec<_> = e1.iter().collect();
-        assert_eq!([A,C], elems);
-
-        e1.insert(C);
-        let elems: ::vec::Vec<_> = e1.iter().collect();
-        assert_eq!([A,C], elems);
-
-        e1.insert(B);
-        let elems: ::vec::Vec<_> = e1.iter().collect();
-        assert_eq!([A,B,C], elems);
-    }
-
-    ///////////////////////////////////////////////////////////////////////////
-    // operators
-
-    #[test]
-    fn test_operators() {
-        let mut e1: EnumSet<Foo> = EnumSet::new();
-        e1.insert(A);
-        e1.insert(C);
-
-        let mut e2: EnumSet<Foo> = EnumSet::new();
-        e2.insert(B);
-        e2.insert(C);
-
-        let e_union = e1 | e2;
-        let elems: ::vec::Vec<_> = e_union.iter().collect();
-        assert_eq!([A,B,C], elems);
-
-        let e_intersection = e1 & e2;
-        let elems: ::vec::Vec<_> = e_intersection.iter().collect();
-        assert_eq!([C], elems);
-
-        // Another way to express intersection
-        let e_intersection = e1 - (e1 - e2);
-        let elems: ::vec::Vec<_> = e_intersection.iter().collect();
-        assert_eq!([C], elems);
-
-        let e_subtract = e1 - e2;
-        let elems: ::vec::Vec<_> = e_subtract.iter().collect();
-        assert_eq!([A], elems);
-
-        // Bitwise XOR of two sets, aka symmetric difference
-        let e_symmetric_diff = e1 ^ e2;
-        let elems: ::vec::Vec<_> = e_symmetric_diff.iter().collect();
-        assert_eq!([A,B], elems);
-
-        // Another way to express symmetric difference
-        let e_symmetric_diff = (e1 - e2) | (e2 - e1);
-        let elems: ::vec::Vec<_> = e_symmetric_diff.iter().collect();
-        assert_eq!([A,B], elems);
-
-        // Yet another way to express symmetric difference
-        let e_symmetric_diff = (e1 | e2) - (e1 & e2);
-        let elems: ::vec::Vec<_> = e_symmetric_diff.iter().collect();
-        assert_eq!([A,B], elems);
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_overflow() {
-        #[allow(dead_code)]
-        #[derive(Copy)]
-        #[repr(usize)]
-        enum Bar {
-            V00, V01, V02, V03, V04, V05, V06, V07, V08, V09,
-            V10, V11, V12, V13, V14, V15, V16, V17, V18, V19,
-            V20, V21, V22, V23, V24, V25, V26, V27, V28, V29,
-            V30, V31, V32, V33, V34, V35, V36, V37, V38, V39,
-            V40, V41, V42, V43, V44, V45, V46, V47, V48, V49,
-            V50, V51, V52, V53, V54, V55, V56, V57, V58, V59,
-            V60, V61, V62, V63, V64, V65, V66, V67, V68, V69,
-        }
-
-        impl CLike for Bar {
-            fn to_usize(&self) -> usize {
-                *self as usize
-            }
-
-            fn from_usize(v: usize) -> Bar {
-                unsafe { mem::transmute(v) }
-            }
-        }
-        let mut set = EnumSet::new();
-        set.insert(Bar::V64);
-    }
-}
index 5d35c3902a31a6816865bfd8cdce808ba3283c61..bb7db1151e83380217f02eba632deee685fe71e0 100644 (file)
@@ -434,15 +434,3 @@ pub fn format(args: Arguments) -> string::String {
     let _ = write!(&mut output, "{}", args);
     output
 }
-
-#[cfg(test)]
-mod tests {
-    use prelude::*;
-    use fmt;
-
-    #[test]
-    fn test_format() {
-        let s = fmt::format(format_args!("Hello, {}!", "world"));
-        assert_eq!(s.as_slice(), "Hello, world!");
-    }
-}
index 3a2fc17e1e985e4e86a79de92d95d1e096998013..0d53215a5965985e6e5c0e3a3a377f7d17afdd0b 100644 (file)
 extern crate unicode;
 extern crate alloc;
 
-#[cfg(test)] extern crate test;
-#[cfg(test)] #[macro_use] extern crate std;
-#[cfg(test)] #[macro_use] extern crate log;
-
 pub use binary_heap::BinaryHeap;
 pub use bit_vec::BitVec;
 pub use bit_set::BitSet;
@@ -85,8 +81,6 @@
 #[macro_use]
 mod macros;
 
-#[cfg(test)] #[macro_use] mod bench;
-
 pub mod binary_heap;
 mod bit;
 mod btree;
@@ -137,47 +131,10 @@ pub mod btree_set {
 #[doc(hidden)]
 pub fn fixme_14344_be_sure_to_link_to_collections() {}
 
-#[cfg(not(test))]
 mod std {
     pub use core::ops;      // RangeFull
 }
 
-#[cfg(test)]
-mod prelude {
-    // from core.
-    pub use core::clone::Clone;
-    pub use core::cmp::{PartialEq, Eq, PartialOrd, Ord};
-    pub use core::cmp::Ordering::{Less, Equal, Greater};
-    pub use core::iter::range;
-    pub use core::iter::{FromIterator, Extend, IteratorExt};
-    pub use core::iter::{Iterator, DoubleEndedIterator, RandomAccessIterator};
-    pub use core::iter::{ExactSizeIterator};
-    pub use core::marker::{Copy, Send, Sized, Sync};
-    pub use core::mem::drop;
-    pub use core::ops::{Drop, Fn, FnMut, FnOnce};
-    pub use core::option::Option;
-    pub use core::option::Option::{Some, None};
-    pub use core::ptr::PtrExt;
-    pub use core::result::Result;
-    pub use core::result::Result::{Ok, Err};
-
-    // in core and collections (may differ).
-    pub use slice::{AsSlice, SliceExt};
-    #[cfg(stage0)]
-    pub use str::{Str, StrExt};
-    #[cfg(not(stage0))]
-    pub use str::Str;
-
-    // from other crates.
-    pub use alloc::boxed::Box;
-
-    // from collections.
-    pub use borrow::IntoCow;
-    pub use slice::SliceConcatExt;
-    pub use string::{String, ToString};
-    pub use vec::Vec;
-}
-
 /// An endpoint of a range of keys.
 #[derive(Clone, Copy, Debug, Hash, PartialEq, Eq)]
 pub enum Bound<T> {
index 5ca3cb380583bc3e5580048b779d9a9ac42e8ccc..0799e14e6574db992bc139827d0a120adfb7f2b0 100644 (file)
@@ -938,572 +938,3 @@ fn hash<H: Hasher>(&self, state: &mut H) {
         }
     }
 }
-
-#[cfg(test)]
-mod tests {
-    use prelude::*;
-    use std::rand;
-    use std::hash::{self, SipHasher};
-    use std::thread;
-    use test::Bencher;
-    use test;
-
-    use super::{LinkedList, Node};
-
-    pub fn check_links<T>(list: &LinkedList<T>) {
-        let mut len = 0;
-        let mut last_ptr: Option<&Node<T>> = None;
-        let mut node_ptr: &Node<T>;
-        match list.list_head {
-            None => { assert_eq!(0, list.length); return }
-            Some(ref node) => node_ptr = &**node,
-        }
-        loop {
-            match (last_ptr, node_ptr.prev.resolve_immut()) {
-                (None   , None      ) => {}
-                (None   , _         ) => panic!("prev link for list_head"),
-                (Some(p), Some(pptr)) => {
-                    assert_eq!(p as *const Node<T>, pptr as *const Node<T>);
-                }
-                _ => panic!("prev link is none, not good"),
-            }
-            match node_ptr.next {
-                Some(ref next) => {
-                    last_ptr = Some(node_ptr);
-                    node_ptr = &**next;
-                    len += 1;
-                }
-                None => {
-                    len += 1;
-                    break;
-                }
-            }
-        }
-        assert_eq!(len, list.length);
-    }
-
-    #[test]
-    fn test_basic() {
-        let mut m = LinkedList::<Box<_>>::new();
-        assert_eq!(m.pop_front(), None);
-        assert_eq!(m.pop_back(), None);
-        assert_eq!(m.pop_front(), None);
-        m.push_front(box 1);
-        assert_eq!(m.pop_front(), Some(box 1));
-        m.push_back(box 2);
-        m.push_back(box 3);
-        assert_eq!(m.len(), 2);
-        assert_eq!(m.pop_front(), Some(box 2));
-        assert_eq!(m.pop_front(), Some(box 3));
-        assert_eq!(m.len(), 0);
-        assert_eq!(m.pop_front(), None);
-        m.push_back(box 1);
-        m.push_back(box 3);
-        m.push_back(box 5);
-        m.push_back(box 7);
-        assert_eq!(m.pop_front(), Some(box 1));
-
-        let mut n = LinkedList::new();
-        n.push_front(2);
-        n.push_front(3);
-        {
-            assert_eq!(n.front().unwrap(), &3);
-            let x = n.front_mut().unwrap();
-            assert_eq!(*x, 3);
-            *x = 0;
-        }
-        {
-            assert_eq!(n.back().unwrap(), &2);
-            let y = n.back_mut().unwrap();
-            assert_eq!(*y, 2);
-            *y = 1;
-        }
-        assert_eq!(n.pop_front(), Some(0));
-        assert_eq!(n.pop_front(), Some(1));
-    }
-
-    #[cfg(test)]
-    fn generate_test() -> LinkedList<i32> {
-        list_from(&[0,1,2,3,4,5,6])
-    }
-
-    #[cfg(test)]
-    fn list_from<T: Clone>(v: &[T]) -> LinkedList<T> {
-        v.iter().cloned().collect()
-    }
-
-    #[test]
-    fn test_append() {
-        // Empty to empty
-        {
-            let mut m = LinkedList::<i32>::new();
-            let mut n = LinkedList::new();
-            m.append(&mut n);
-            check_links(&m);
-            assert_eq!(m.len(), 0);
-            assert_eq!(n.len(), 0);
-        }
-        // Non-empty to empty
-        {
-            let mut m = LinkedList::new();
-            let mut n = LinkedList::new();
-            n.push_back(2);
-            m.append(&mut n);
-            check_links(&m);
-            assert_eq!(m.len(), 1);
-            assert_eq!(m.pop_back(), Some(2));
-            assert_eq!(n.len(), 0);
-            check_links(&m);
-        }
-        // Empty to non-empty
-        {
-            let mut m = LinkedList::new();
-            let mut n = LinkedList::new();
-            m.push_back(2);
-            m.append(&mut n);
-            check_links(&m);
-            assert_eq!(m.len(), 1);
-            assert_eq!(m.pop_back(), Some(2));
-            check_links(&m);
-        }
-
-        // Non-empty to non-empty
-        let v = vec![1,2,3,4,5];
-        let u = vec![9,8,1,2,3,4,5];
-        let mut m = list_from(&v);
-        let mut n = list_from(&u);
-        m.append(&mut n);
-        check_links(&m);
-        let mut sum = v;
-        sum.push_all(&u);
-        assert_eq!(sum.len(), m.len());
-        for elt in sum {
-            assert_eq!(m.pop_front(), Some(elt))
-        }
-        assert_eq!(n.len(), 0);
-        // let's make sure it's working properly, since we
-        // did some direct changes to private members
-        n.push_back(3);
-        assert_eq!(n.len(), 1);
-        assert_eq!(n.pop_front(), Some(3));
-        check_links(&n);
-    }
-
-    #[test]
-    fn test_split_off() {
-        // singleton
-        {
-            let mut m = LinkedList::new();
-            m.push_back(1);
-
-            let p = m.split_off(0);
-            assert_eq!(m.len(), 0);
-            assert_eq!(p.len(), 1);
-            assert_eq!(p.back(), Some(&1));
-            assert_eq!(p.front(), Some(&1));
-        }
-
-        // not singleton, forwards
-        {
-            let u = vec![1,2,3,4,5];
-            let mut m = list_from(&u);
-            let mut n = m.split_off(2);
-            assert_eq!(m.len(), 2);
-            assert_eq!(n.len(), 3);
-            for elt in 1..3 {
-                assert_eq!(m.pop_front(), Some(elt));
-            }
-            for elt in 3..6 {
-                assert_eq!(n.pop_front(), Some(elt));
-            }
-        }
-        // not singleton, backwards
-        {
-            let u = vec![1,2,3,4,5];
-            let mut m = list_from(&u);
-            let mut n = m.split_off(4);
-            assert_eq!(m.len(), 4);
-            assert_eq!(n.len(), 1);
-            for elt in 1..5 {
-                assert_eq!(m.pop_front(), Some(elt));
-            }
-            for elt in 5..6 {
-                assert_eq!(n.pop_front(), Some(elt));
-            }
-        }
-
-        // no-op on the last index
-        {
-            let mut m = LinkedList::new();
-            m.push_back(1);
-
-            let p = m.split_off(1);
-            assert_eq!(m.len(), 1);
-            assert_eq!(p.len(), 0);
-            assert_eq!(m.back(), Some(&1));
-            assert_eq!(m.front(), Some(&1));
-        }
-
-    }
-
-    #[test]
-    fn test_iterator() {
-        let m = generate_test();
-        for (i, elt) in m.iter().enumerate() {
-            assert_eq!(i as i32, *elt);
-        }
-        let mut n = LinkedList::new();
-        assert_eq!(n.iter().next(), None);
-        n.push_front(4);
-        let mut it = n.iter();
-        assert_eq!(it.size_hint(), (1, Some(1)));
-        assert_eq!(it.next().unwrap(), &4);
-        assert_eq!(it.size_hint(), (0, Some(0)));
-        assert_eq!(it.next(), None);
-    }
-
-    #[test]
-    fn test_iterator_clone() {
-        let mut n = LinkedList::new();
-        n.push_back(2);
-        n.push_back(3);
-        n.push_back(4);
-        let mut it = n.iter();
-        it.next();
-        let mut jt = it.clone();
-        assert_eq!(it.next(), jt.next());
-        assert_eq!(it.next_back(), jt.next_back());
-        assert_eq!(it.next(), jt.next());
-    }
-
-    #[test]
-    fn test_iterator_double_end() {
-        let mut n = LinkedList::new();
-        assert_eq!(n.iter().next(), None);
-        n.push_front(4);
-        n.push_front(5);
-        n.push_front(6);
-        let mut it = n.iter();
-        assert_eq!(it.size_hint(), (3, Some(3)));
-        assert_eq!(it.next().unwrap(), &6);
-        assert_eq!(it.size_hint(), (2, Some(2)));
-        assert_eq!(it.next_back().unwrap(), &4);
-        assert_eq!(it.size_hint(), (1, Some(1)));
-        assert_eq!(it.next_back().unwrap(), &5);
-        assert_eq!(it.next_back(), None);
-        assert_eq!(it.next(), None);
-    }
-
-    #[test]
-    fn test_rev_iter() {
-        let m = generate_test();
-        for (i, elt) in m.iter().rev().enumerate() {
-            assert_eq!((6 - i) as i32, *elt);
-        }
-        let mut n = LinkedList::new();
-        assert_eq!(n.iter().rev().next(), None);
-        n.push_front(4);
-        let mut it = n.iter().rev();
-        assert_eq!(it.size_hint(), (1, Some(1)));
-        assert_eq!(it.next().unwrap(), &4);
-        assert_eq!(it.size_hint(), (0, Some(0)));
-        assert_eq!(it.next(), None);
-    }
-
-    #[test]
-    fn test_mut_iter() {
-        let mut m = generate_test();
-        let mut len = m.len();
-        for (i, elt) in m.iter_mut().enumerate() {
-            assert_eq!(i as i32, *elt);
-            len -= 1;
-        }
-        assert_eq!(len, 0);
-        let mut n = LinkedList::new();
-        assert!(n.iter_mut().next().is_none());
-        n.push_front(4);
-        n.push_back(5);
-        let mut it = n.iter_mut();
-        assert_eq!(it.size_hint(), (2, Some(2)));
-        assert!(it.next().is_some());
-        assert!(it.next().is_some());
-        assert_eq!(it.size_hint(), (0, Some(0)));
-        assert!(it.next().is_none());
-    }
-
-    #[test]
-    fn test_iterator_mut_double_end() {
-        let mut n = LinkedList::new();
-        assert!(n.iter_mut().next_back().is_none());
-        n.push_front(4);
-        n.push_front(5);
-        n.push_front(6);
-        let mut it = n.iter_mut();
-        assert_eq!(it.size_hint(), (3, Some(3)));
-        assert_eq!(*it.next().unwrap(), 6);
-        assert_eq!(it.size_hint(), (2, Some(2)));
-        assert_eq!(*it.next_back().unwrap(), 4);
-        assert_eq!(it.size_hint(), (1, Some(1)));
-        assert_eq!(*it.next_back().unwrap(), 5);
-        assert!(it.next_back().is_none());
-        assert!(it.next().is_none());
-    }
-
-    #[test]
-    fn test_insert_prev() {
-        let mut m = list_from(&[0,2,4,6,8]);
-        let len = m.len();
-        {
-            let mut it = m.iter_mut();
-            it.insert_next(-2);
-            loop {
-                match it.next() {
-                    None => break,
-                    Some(elt) => {
-                        it.insert_next(*elt + 1);
-                        match it.peek_next() {
-                            Some(x) => assert_eq!(*x, *elt + 2),
-                            None => assert_eq!(8, *elt),
-                        }
-                    }
-                }
-            }
-            it.insert_next(0);
-            it.insert_next(1);
-        }
-        check_links(&m);
-        assert_eq!(m.len(), 3 + len * 2);
-        assert_eq!(m.into_iter().collect::<Vec<_>>(), [-2,0,1,2,3,4,5,6,7,8,9,0,1]);
-    }
-
-    #[test]
-    fn test_mut_rev_iter() {
-        let mut m = generate_test();
-        for (i, elt) in m.iter_mut().rev().enumerate() {
-            assert_eq!((6 - i) as i32, *elt);
-        }
-        let mut n = LinkedList::new();
-        assert!(n.iter_mut().rev().next().is_none());
-        n.push_front(4);
-        let mut it = n.iter_mut().rev();
-        assert!(it.next().is_some());
-        assert!(it.next().is_none());
-    }
-
-    #[test]
-    fn test_send() {
-        let n = list_from(&[1,2,3]);
-        thread::spawn(move || {
-            check_links(&n);
-            let a: &[_] = &[&1,&2,&3];
-            assert_eq!(a, n.iter().collect::<Vec<_>>());
-        }).join().ok().unwrap();
-    }
-
-    #[test]
-    fn test_eq() {
-        let mut n = list_from(&[]);
-        let mut m = list_from(&[]);
-        assert!(n == m);
-        n.push_front(1);
-        assert!(n != m);
-        m.push_back(1);
-        assert!(n == m);
-
-        let n = list_from(&[2,3,4]);
-        let m = list_from(&[1,2,3]);
-        assert!(n != m);
-    }
-
-    #[test]
-    fn test_hash() {
-      let mut x = LinkedList::new();
-      let mut y = LinkedList::new();
-
-      assert!(hash::hash::<_, SipHasher>(&x) == hash::hash::<_, SipHasher>(&y));
-
-      x.push_back(1);
-      x.push_back(2);
-      x.push_back(3);
-
-      y.push_front(3);
-      y.push_front(2);
-      y.push_front(1);
-
-      assert!(hash::hash::<_, SipHasher>(&x) == hash::hash::<_, SipHasher>(&y));
-    }
-
-    #[test]
-    fn test_ord() {
-        let n = list_from(&[]);
-        let m = list_from(&[1,2,3]);
-        assert!(n < m);
-        assert!(m > n);
-        assert!(n <= n);
-        assert!(n >= n);
-    }
-
-    #[test]
-    fn test_ord_nan() {
-        let nan = 0.0f64/0.0;
-        let n = list_from(&[nan]);
-        let m = list_from(&[nan]);
-        assert!(!(n < m));
-        assert!(!(n > m));
-        assert!(!(n <= m));
-        assert!(!(n >= m));
-
-        let n = list_from(&[nan]);
-        let one = list_from(&[1.0f64]);
-        assert!(!(n < one));
-        assert!(!(n > one));
-        assert!(!(n <= one));
-        assert!(!(n >= one));
-
-        let u = list_from(&[1.0f64,2.0,nan]);
-        let v = list_from(&[1.0f64,2.0,3.0]);
-        assert!(!(u < v));
-        assert!(!(u > v));
-        assert!(!(u <= v));
-        assert!(!(u >= v));
-
-        let s = list_from(&[1.0f64,2.0,4.0,2.0]);
-        let t = list_from(&[1.0f64,2.0,3.0,2.0]);
-        assert!(!(s < t));
-        assert!(s > one);
-        assert!(!(s <= one));
-        assert!(s >= one);
-    }
-
-    #[test]
-    fn test_fuzz() {
-        for _ in 0..25 {
-            fuzz_test(3);
-            fuzz_test(16);
-            fuzz_test(189);
-        }
-    }
-
-    #[test]
-    fn test_show() {
-        let list: LinkedList<_> = (0..10).collect();
-        assert_eq!(format!("{:?}", list), "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]");
-
-        let list: LinkedList<_> = vec!["just", "one", "test", "more"].iter().cloned().collect();
-        assert_eq!(format!("{:?}", list), "[\"just\", \"one\", \"test\", \"more\"]");
-    }
-
-    #[cfg(test)]
-    fn fuzz_test(sz: i32) {
-        let mut m: LinkedList<_> = LinkedList::new();
-        let mut v = vec![];
-        for i in 0..sz {
-            check_links(&m);
-            let r: u8 = rand::random();
-            match r % 6 {
-                0 => {
-                    m.pop_back();
-                    v.pop();
-                }
-                1 => {
-                    if !v.is_empty() {
-                        m.pop_front();
-                        v.remove(0);
-                    }
-                }
-                2 | 4 =>  {
-                    m.push_front(-i);
-                    v.insert(0, -i);
-                }
-                3 | 5 | _ => {
-                    m.push_back(i);
-                    v.push(i);
-                }
-            }
-        }
-
-        check_links(&m);
-
-        let mut i = 0;
-        for (a, &b) in m.into_iter().zip(v.iter()) {
-            i += 1;
-            assert_eq!(a, b);
-        }
-        assert_eq!(i, v.len());
-    }
-
-    #[bench]
-    fn bench_collect_into(b: &mut test::Bencher) {
-        let v = &[0; 64];
-        b.iter(|| {
-            let _: LinkedList<_> = v.iter().cloned().collect();
-        })
-    }
-
-    #[bench]
-    fn bench_push_front(b: &mut test::Bencher) {
-        let mut m: LinkedList<_> = LinkedList::new();
-        b.iter(|| {
-            m.push_front(0);
-        })
-    }
-
-    #[bench]
-    fn bench_push_back(b: &mut test::Bencher) {
-        let mut m: LinkedList<_> = LinkedList::new();
-        b.iter(|| {
-            m.push_back(0);
-        })
-    }
-
-    #[bench]
-    fn bench_push_back_pop_back(b: &mut test::Bencher) {
-        let mut m: LinkedList<_> = LinkedList::new();
-        b.iter(|| {
-            m.push_back(0);
-            m.pop_back();
-        })
-    }
-
-    #[bench]
-    fn bench_push_front_pop_front(b: &mut test::Bencher) {
-        let mut m: LinkedList<_> = LinkedList::new();
-        b.iter(|| {
-            m.push_front(0);
-            m.pop_front();
-        })
-    }
-
-    #[bench]
-    fn bench_iter(b: &mut test::Bencher) {
-        let v = &[0; 128];
-        let m: LinkedList<_> = v.iter().cloned().collect();
-        b.iter(|| {
-            assert!(m.iter().count() == 128);
-        })
-    }
-    #[bench]
-    fn bench_iter_mut(b: &mut test::Bencher) {
-        let v = &[0; 128];
-        let mut m: LinkedList<_> = v.iter().cloned().collect();
-        b.iter(|| {
-            assert!(m.iter_mut().count() == 128);
-        })
-    }
-    #[bench]
-    fn bench_iter_rev(b: &mut test::Bencher) {
-        let v = &[0; 128];
-        let m: LinkedList<_> = v.iter().cloned().collect();
-        b.iter(|| {
-            assert!(m.iter().rev().count() == 128);
-        })
-    }
-    #[bench]
-    fn bench_iter_mut_rev(b: &mut test::Bencher) {
-        let v = &[0; 128];
-        let mut m: LinkedList<_> = v.iter().cloned().collect();
-        b.iter(|| {
-            assert!(m.iter_mut().rev().count() == 128);
-        })
-    }
-}
index 0fe513d3118c5a1623a9778fc2142acd07e39bd7..15b67376887c2073eee6fd51a2cb4649541efc07 100644 (file)
@@ -2339,1633 +2339,3 @@ unsafe fn step<T>(ptr: &mut *mut T) -> *mut T {
         old
     }
 }
-
-#[cfg(test)]
-mod tests {
-    use alloc::boxed::Box;
-    use core::cmp::Ordering::{Greater, Less, Equal};
-    use core::prelude::{Some, None, Clone};
-    use core::prelude::{Iterator, IteratorExt};
-    use core::prelude::{AsSlice};
-    use core::prelude::Ord;
-    use core::default::Default;
-    use core::mem;
-    use std::iter::RandomAccessIterator;
-    use std::rand::{Rng, thread_rng};
-    use std::rc::Rc;
-    use string::ToString;
-    use vec::Vec;
-    use super::{ElementSwaps, SliceConcatExt, SliceExt};
-
-    fn square(n: usize) -> usize { n * n }
-
-    fn is_odd(n: &usize) -> bool { *n % 2 == 1 }
-
-    #[test]
-    fn test_from_fn() {
-        // Test on-stack from_fn.
-        let mut v: Vec<_> = (0..3).map(square).collect();
-        {
-            let v = v;
-            assert_eq!(v.len(), 3);
-            assert_eq!(v[0], 0);
-            assert_eq!(v[1], 1);
-            assert_eq!(v[2], 4);
-        }
-
-        // Test on-heap from_fn.
-        v = (0..5).map(square).collect();
-        {
-            let v = v;
-            assert_eq!(v.len(), 5);
-            assert_eq!(v[0], 0);
-            assert_eq!(v[1], 1);
-            assert_eq!(v[2], 4);
-            assert_eq!(v[3], 9);
-            assert_eq!(v[4], 16);
-        }
-    }
-
-    #[test]
-    fn test_from_elem() {
-        // Test on-stack from_elem.
-        let mut v = vec![10, 10];
-        {
-            let v = v;
-            assert_eq!(v.len(), 2);
-            assert_eq!(v[0], 10);
-            assert_eq!(v[1], 10);
-        }
-
-        // Test on-heap from_elem.
-        v = vec![20; 6];
-        {
-            let v = v.as_slice();
-            assert_eq!(v[0], 20);
-            assert_eq!(v[1], 20);
-            assert_eq!(v[2], 20);
-            assert_eq!(v[3], 20);
-            assert_eq!(v[4], 20);
-            assert_eq!(v[5], 20);
-        }
-    }
-
-    #[test]
-    fn test_is_empty() {
-        let xs: [i32; 0] = [];
-        assert!(xs.is_empty());
-        assert!(![0].is_empty());
-    }
-
-    #[test]
-    fn test_len_divzero() {
-        type Z = [i8; 0];
-        let v0 : &[Z] = &[];
-        let v1 : &[Z] = &[[]];
-        let v2 : &[Z] = &[[], []];
-        assert_eq!(mem::size_of::<Z>(), 0);
-        assert_eq!(v0.len(), 0);
-        assert_eq!(v1.len(), 1);
-        assert_eq!(v2.len(), 2);
-    }
-
-    #[test]
-    fn test_get() {
-        let mut a = vec![11];
-        assert_eq!(a.get(1), None);
-        a = vec![11, 12];
-        assert_eq!(a.get(1).unwrap(), &12);
-        a = vec![11, 12, 13];
-        assert_eq!(a.get(1).unwrap(), &12);
-    }
-
-    #[test]
-    fn test_first() {
-        let mut a = vec![];
-        assert_eq!(a.first(), None);
-        a = vec![11];
-        assert_eq!(a.first().unwrap(), &11);
-        a = vec![11, 12];
-        assert_eq!(a.first().unwrap(), &11);
-    }
-
-    #[test]
-    fn test_first_mut() {
-        let mut a = vec![];
-        assert_eq!(a.first_mut(), None);
-        a = vec![11];
-        assert_eq!(*a.first_mut().unwrap(), 11);
-        a = vec![11, 12];
-        assert_eq!(*a.first_mut().unwrap(), 11);
-    }
-
-    #[test]
-    fn test_tail() {
-        let mut a = vec![11];
-        let b: &[i32] = &[];
-        assert_eq!(a.tail(), b);
-        a = vec![11, 12];
-        let b: &[i32] = &[12];
-        assert_eq!(a.tail(), b);
-    }
-
-    #[test]
-    fn test_tail_mut() {
-        let mut a = vec![11];
-        let b: &mut [i32] = &mut [];
-        assert!(a.tail_mut() == b);
-        a = vec![11, 12];
-        let b: &mut [_] = &mut [12];
-        assert!(a.tail_mut() == b);
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_tail_empty() {
-        let a = Vec::<i32>::new();
-        a.tail();
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_tail_mut_empty() {
-        let mut a = Vec::<i32>::new();
-        a.tail_mut();
-    }
-
-    #[test]
-    fn test_init() {
-        let mut a = vec![11];
-        let b: &[i32] = &[];
-        assert_eq!(a.init(), b);
-        a = vec![11, 12];
-        let b: &[_] = &[11];
-        assert_eq!(a.init(), b);
-    }
-
-    #[test]
-    fn test_init_mut() {
-        let mut a = vec![11];
-        let b: &mut [i32] = &mut [];
-        assert!(a.init_mut() == b);
-        a = vec![11, 12];
-        let b: &mut [_] = &mut [11];
-        assert!(a.init_mut() == b);
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_init_empty() {
-        let a = Vec::<i32>::new();
-        a.init();
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_init_mut_empty() {
-        let mut a = Vec::<i32>::new();
-        a.init_mut();
-    }
-
-    #[test]
-    fn test_last() {
-        let mut a = vec![];
-        assert_eq!(a.last(), None);
-        a = vec![11];
-        assert_eq!(a.last().unwrap(), &11);
-        a = vec![11, 12];
-        assert_eq!(a.last().unwrap(), &12);
-    }
-
-    #[test]
-    fn test_last_mut() {
-        let mut a = vec![];
-        assert_eq!(a.last_mut(), None);
-        a = vec![11];
-        assert_eq!(*a.last_mut().unwrap(), 11);
-        a = vec![11, 12];
-        assert_eq!(*a.last_mut().unwrap(), 12);
-    }
-
-    #[test]
-    fn test_slice() {
-        // Test fixed length vector.
-        let vec_fixed = [1, 2, 3, 4];
-        let v_a = vec_fixed[1..vec_fixed.len()].to_vec();
-        assert_eq!(v_a.len(), 3);
-
-        assert_eq!(v_a[0], 2);
-        assert_eq!(v_a[1], 3);
-        assert_eq!(v_a[2], 4);
-
-        // Test on stack.
-        let vec_stack: &[_] = &[1, 2, 3];
-        let v_b = vec_stack[1..3].to_vec();
-        assert_eq!(v_b.len(), 2);
-
-        assert_eq!(v_b[0], 2);
-        assert_eq!(v_b[1], 3);
-
-        // Test `Box<[T]>`
-        let vec_unique = vec![1, 2, 3, 4, 5, 6];
-        let v_d = vec_unique[1..6].to_vec();
-        assert_eq!(v_d.len(), 5);
-
-        assert_eq!(v_d[0], 2);
-        assert_eq!(v_d[1], 3);
-        assert_eq!(v_d[2], 4);
-        assert_eq!(v_d[3], 5);
-        assert_eq!(v_d[4], 6);
-    }
-
-    #[test]
-    fn test_slice_from() {
-        let vec: &[_] = &[1, 2, 3, 4];
-        assert_eq!(&vec[..], vec);
-        let b: &[_] = &[3, 4];
-        assert_eq!(&vec[2..], b);
-        let b: &[_] = &[];
-        assert_eq!(&vec[4..], b);
-    }
-
-    #[test]
-    fn test_slice_to() {
-        let vec: &[_] = &[1, 2, 3, 4];
-        assert_eq!(&vec[..4], vec);
-        let b: &[_] = &[1, 2];
-        assert_eq!(&vec[..2], b);
-        let b: &[_] = &[];
-        assert_eq!(&vec[..0], b);
-    }
-
-
-    #[test]
-    fn test_pop() {
-        let mut v = vec![5];
-        let e = v.pop();
-        assert_eq!(v.len(), 0);
-        assert_eq!(e, Some(5));
-        let f = v.pop();
-        assert_eq!(f, None);
-        let g = v.pop();
-        assert_eq!(g, None);
-    }
-
-    #[test]
-    fn test_swap_remove() {
-        let mut v = vec![1, 2, 3, 4, 5];
-        let mut e = v.swap_remove(0);
-        assert_eq!(e, 1);
-        assert_eq!(v, [5, 2, 3, 4]);
-        e = v.swap_remove(3);
-        assert_eq!(e, 4);
-        assert_eq!(v, [5, 2, 3]);
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_swap_remove_fail() {
-        let mut v = vec![1];
-        let _ = v.swap_remove(0);
-        let _ = v.swap_remove(0);
-    }
-
-    #[test]
-    fn test_swap_remove_noncopyable() {
-        // Tests that we don't accidentally run destructors twice.
-        let mut v: Vec<Box<_>> = Vec::new();
-        v.push(box 0u8);
-        v.push(box 0u8);
-        v.push(box 0u8);
-        let mut _e = v.swap_remove(0);
-        assert_eq!(v.len(), 2);
-        _e = v.swap_remove(1);
-        assert_eq!(v.len(), 1);
-        _e = v.swap_remove(0);
-        assert_eq!(v.len(), 0);
-    }
-
-    #[test]
-    fn test_push() {
-        // Test on-stack push().
-        let mut v = vec![];
-        v.push(1);
-        assert_eq!(v.len(), 1);
-        assert_eq!(v[0], 1);
-
-        // Test on-heap push().
-        v.push(2);
-        assert_eq!(v.len(), 2);
-        assert_eq!(v[0], 1);
-        assert_eq!(v[1], 2);
-    }
-
-    #[test]
-    fn test_truncate() {
-        let mut v: Vec<Box<_>> = vec![box 6,box 5,box 4];
-        v.truncate(1);
-        let v = v;
-        assert_eq!(v.len(), 1);
-        assert_eq!(*(v[0]), 6);
-        // If the unsafe block didn't drop things properly, we blow up here.
-    }
-
-    #[test]
-    fn test_clear() {
-        let mut v: Vec<Box<_>> = vec![box 6,box 5,box 4];
-        v.clear();
-        assert_eq!(v.len(), 0);
-        // If the unsafe block didn't drop things properly, we blow up here.
-    }
-
-    #[test]
-    fn test_dedup() {
-        fn case(a: Vec<i32>, b: Vec<i32>) {
-            let mut v = a;
-            v.dedup();
-            assert_eq!(v, b);
-        }
-        case(vec![], vec![]);
-        case(vec![1], vec![1]);
-        case(vec![1,1], vec![1]);
-        case(vec![1,2,3], vec![1,2,3]);
-        case(vec![1,1,2,3], vec![1,2,3]);
-        case(vec![1,2,2,3], vec![1,2,3]);
-        case(vec![1,2,3,3], vec![1,2,3]);
-        case(vec![1,1,2,2,2,3,3], vec![1,2,3]);
-    }
-
-    #[test]
-    fn test_dedup_unique() {
-        let mut v0: Vec<Box<_>> = vec![box 1, box 1, box 2, box 3];
-        v0.dedup();
-        let mut v1: Vec<Box<_>> = vec![box 1, box 2, box 2, box 3];
-        v1.dedup();
-        let mut v2: Vec<Box<_>> = vec![box 1, box 2, box 3, box 3];
-        v2.dedup();
-        /*
-         * If the boxed pointers were leaked or otherwise misused, valgrind
-         * and/or rt should raise errors.
-         */
-    }
-
-    #[test]
-    fn test_dedup_shared() {
-        let mut v0: Vec<Box<_>> = vec![box 1, box 1, box 2, box 3];
-        v0.dedup();
-        let mut v1: Vec<Box<_>> = vec![box 1, box 2, box 2, box 3];
-        v1.dedup();
-        let mut v2: Vec<Box<_>> = vec![box 1, box 2, box 3, box 3];
-        v2.dedup();
-        /*
-         * If the pointers were leaked or otherwise misused, valgrind and/or
-         * rt should raise errors.
-         */
-    }
-
-    #[test]
-    fn test_retain() {
-        let mut v = vec![1, 2, 3, 4, 5];
-        v.retain(is_odd);
-        assert_eq!(v, [1, 3, 5]);
-    }
-
-    #[test]
-    fn test_element_swaps() {
-        let mut v = [1, 2, 3];
-        for (i, (a, b)) in ElementSwaps::new(v.len()).enumerate() {
-            v.swap(a, b);
-            match i {
-                0 => assert!(v == [1, 3, 2]),
-                1 => assert!(v == [3, 1, 2]),
-                2 => assert!(v == [3, 2, 1]),
-                3 => assert!(v == [2, 3, 1]),
-                4 => assert!(v == [2, 1, 3]),
-                5 => assert!(v == [1, 2, 3]),
-                _ => panic!(),
-            }
-        }
-    }
-
-    #[test]
-    fn test_permutations() {
-        {
-            let v: [i32; 0] = [];
-            let mut it = v.permutations();
-            let (min_size, max_opt) = it.size_hint();
-            assert_eq!(min_size, 1);
-            assert_eq!(max_opt.unwrap(), 1);
-            assert_eq!(it.next(), Some(v.to_vec()));
-            assert_eq!(it.next(), None);
-        }
-        {
-            let v = ["Hello".to_string()];
-            let mut it = v.permutations();
-            let (min_size, max_opt) = it.size_hint();
-            assert_eq!(min_size, 1);
-            assert_eq!(max_opt.unwrap(), 1);
-            assert_eq!(it.next(), Some(v.to_vec()));
-            assert_eq!(it.next(), None);
-        }
-        {
-            let v = [1, 2, 3];
-            let mut it = v.permutations();
-            let (min_size, max_opt) = it.size_hint();
-            assert_eq!(min_size, 3*2);
-            assert_eq!(max_opt.unwrap(), 3*2);
-            assert_eq!(it.next(), Some(vec![1,2,3]));
-            assert_eq!(it.next(), Some(vec![1,3,2]));
-            assert_eq!(it.next(), Some(vec![3,1,2]));
-            let (min_size, max_opt) = it.size_hint();
-            assert_eq!(min_size, 3);
-            assert_eq!(max_opt.unwrap(), 3);
-            assert_eq!(it.next(), Some(vec![3,2,1]));
-            assert_eq!(it.next(), Some(vec![2,3,1]));
-            assert_eq!(it.next(), Some(vec![2,1,3]));
-            assert_eq!(it.next(), None);
-        }
-        {
-            // check that we have N! permutations
-            let v = ['A', 'B', 'C', 'D', 'E', 'F'];
-            let mut amt = 0;
-            let mut it = v.permutations();
-            let (min_size, max_opt) = it.size_hint();
-            for _perm in it.by_ref() {
-                amt += 1;
-            }
-            assert_eq!(amt, it.swaps.swaps_made);
-            assert_eq!(amt, min_size);
-            assert_eq!(amt, 2 * 3 * 4 * 5 * 6);
-            assert_eq!(amt, max_opt.unwrap());
-        }
-    }
-
-    #[test]
-    fn test_lexicographic_permutations() {
-        let v : &mut[_] = &mut[1, 2, 3, 4, 5];
-        assert!(v.prev_permutation() == false);
-        assert!(v.next_permutation());
-        let b: &mut[_] = &mut[1, 2, 3, 5, 4];
-        assert!(v == b);
-        assert!(v.prev_permutation());
-        let b: &mut[_] = &mut[1, 2, 3, 4, 5];
-        assert!(v == b);
-        assert!(v.next_permutation());
-        assert!(v.next_permutation());
-        let b: &mut[_] = &mut[1, 2, 4, 3, 5];
-        assert!(v == b);
-        assert!(v.next_permutation());
-        let b: &mut[_] = &mut[1, 2, 4, 5, 3];
-        assert!(v == b);
-
-        let v : &mut[_] = &mut[1, 0, 0, 0];
-        assert!(v.next_permutation() == false);
-        assert!(v.prev_permutation());
-        let b: &mut[_] = &mut[0, 1, 0, 0];
-        assert!(v == b);
-        assert!(v.prev_permutation());
-        let b: &mut[_] = &mut[0, 0, 1, 0];
-        assert!(v == b);
-        assert!(v.prev_permutation());
-        let b: &mut[_] = &mut[0, 0, 0, 1];
-        assert!(v == b);
-        assert!(v.prev_permutation() == false);
-    }
-
-    #[test]
-    fn test_lexicographic_permutations_empty_and_short() {
-        let empty : &mut[i32] = &mut[];
-        assert!(empty.next_permutation() == false);
-        let b: &mut[i32] = &mut[];
-        assert!(empty == b);
-        assert!(empty.prev_permutation() == false);
-        assert!(empty == b);
-
-        let one_elem : &mut[_] = &mut[4];
-        assert!(one_elem.prev_permutation() == false);
-        let b: &mut[_] = &mut[4];
-        assert!(one_elem == b);
-        assert!(one_elem.next_permutation() == false);
-        assert!(one_elem == b);
-
-        let two_elem : &mut[_] = &mut[1, 2];
-        assert!(two_elem.prev_permutation() == false);
-        let b : &mut[_] = &mut[1, 2];
-        let c : &mut[_] = &mut[2, 1];
-        assert!(two_elem == b);
-        assert!(two_elem.next_permutation());
-        assert!(two_elem == c);
-        assert!(two_elem.next_permutation() == false);
-        assert!(two_elem == c);
-        assert!(two_elem.prev_permutation());
-        assert!(two_elem == b);
-        assert!(two_elem.prev_permutation() == false);
-        assert!(two_elem == b);
-    }
-
-    #[test]
-    fn test_position_elem() {
-        assert!([].position_elem(&1).is_none());
-
-        let v1 = vec![1, 2, 3, 3, 2, 5];
-        assert_eq!(v1.position_elem(&1), Some(0));
-        assert_eq!(v1.position_elem(&2), Some(1));
-        assert_eq!(v1.position_elem(&5), Some(5));
-        assert!(v1.position_elem(&4).is_none());
-    }
-
-    #[test]
-    fn test_binary_search() {
-        assert_eq!([1,2,3,4,5].binary_search(&5).ok(), Some(4));
-        assert_eq!([1,2,3,4,5].binary_search(&4).ok(), Some(3));
-        assert_eq!([1,2,3,4,5].binary_search(&3).ok(), Some(2));
-        assert_eq!([1,2,3,4,5].binary_search(&2).ok(), Some(1));
-        assert_eq!([1,2,3,4,5].binary_search(&1).ok(), Some(0));
-
-        assert_eq!([2,4,6,8,10].binary_search(&1).ok(), None);
-        assert_eq!([2,4,6,8,10].binary_search(&5).ok(), None);
-        assert_eq!([2,4,6,8,10].binary_search(&4).ok(), Some(1));
-        assert_eq!([2,4,6,8,10].binary_search(&10).ok(), Some(4));
-
-        assert_eq!([2,4,6,8].binary_search(&1).ok(), None);
-        assert_eq!([2,4,6,8].binary_search(&5).ok(), None);
-        assert_eq!([2,4,6,8].binary_search(&4).ok(), Some(1));
-        assert_eq!([2,4,6,8].binary_search(&8).ok(), Some(3));
-
-        assert_eq!([2,4,6].binary_search(&1).ok(), None);
-        assert_eq!([2,4,6].binary_search(&5).ok(), None);
-        assert_eq!([2,4,6].binary_search(&4).ok(), Some(1));
-        assert_eq!([2,4,6].binary_search(&6).ok(), Some(2));
-
-        assert_eq!([2,4].binary_search(&1).ok(), None);
-        assert_eq!([2,4].binary_search(&5).ok(), None);
-        assert_eq!([2,4].binary_search(&2).ok(), Some(0));
-        assert_eq!([2,4].binary_search(&4).ok(), Some(1));
-
-        assert_eq!([2].binary_search(&1).ok(), None);
-        assert_eq!([2].binary_search(&5).ok(), None);
-        assert_eq!([2].binary_search(&2).ok(), Some(0));
-
-        assert_eq!([].binary_search(&1).ok(), None);
-        assert_eq!([].binary_search(&5).ok(), None);
-
-        assert!([1,1,1,1,1].binary_search(&1).ok() != None);
-        assert!([1,1,1,1,2].binary_search(&1).ok() != None);
-        assert!([1,1,1,2,2].binary_search(&1).ok() != None);
-        assert!([1,1,2,2,2].binary_search(&1).ok() != None);
-        assert_eq!([1,2,2,2,2].binary_search(&1).ok(), Some(0));
-
-        assert_eq!([1,2,3,4,5].binary_search(&6).ok(), None);
-        assert_eq!([1,2,3,4,5].binary_search(&0).ok(), None);
-    }
-
-    #[test]
-    fn test_reverse() {
-        let mut v = vec![10, 20];
-        assert_eq!(v[0], 10);
-        assert_eq!(v[1], 20);
-        v.reverse();
-        assert_eq!(v[0], 20);
-        assert_eq!(v[1], 10);
-
-        let mut v3 = Vec::<i32>::new();
-        v3.reverse();
-        assert!(v3.is_empty());
-    }
-
-    #[test]
-    fn test_sort() {
-        for len in 4..25 {
-            for _ in 0..100 {
-                let mut v: Vec<_> = thread_rng().gen_iter::<i32>().take(len).collect();
-                let mut v1 = v.clone();
-
-                v.sort();
-                assert!(v.windows(2).all(|w| w[0] <= w[1]));
-
-                v1.sort_by(|a, b| a.cmp(b));
-                assert!(v1.windows(2).all(|w| w[0] <= w[1]));
-
-                v1.sort_by(|a, b| b.cmp(a));
-                assert!(v1.windows(2).all(|w| w[0] >= w[1]));
-            }
-        }
-
-        // shouldn't panic
-        let mut v: [i32; 0] = [];
-        v.sort();
-
-        let mut v = [0xDEADBEEFu64];
-        v.sort();
-        assert!(v == [0xDEADBEEF]);
-    }
-
-    #[test]
-    fn test_sort_stability() {
-        for len in 4..25 {
-            for _ in 0..10 {
-                let mut counts = [0; 10];
-
-                // create a vector like [(6, 1), (5, 1), (6, 2), ...],
-                // where the first item of each tuple is random, but
-                // the second item represents which occurrence of that
-                // number this element is, i.e. the second elements
-                // will occur in sorted order.
-                let mut v: Vec<_> = (0..len).map(|_| {
-                        let n = thread_rng().gen::<usize>() % 10;
-                        counts[n] += 1;
-                        (n, counts[n])
-                    }).collect();
-
-                // only sort on the first element, so an unstable sort
-                // may mix up the counts.
-                v.sort_by(|&(a,_), &(b,_)| a.cmp(&b));
-
-                // this comparison includes the count (the second item
-                // of the tuple), so elements with equal first items
-                // will need to be ordered with increasing
-                // counts... i.e. exactly asserting that this sort is
-                // stable.
-                assert!(v.windows(2).all(|w| w[0] <= w[1]));
-            }
-        }
-    }
-
-    #[test]
-    fn test_concat() {
-        let v: [Vec<i32>; 0] = [];
-        let c = v.concat();
-        assert_eq!(c, []);
-        let d = [vec![1], vec![2, 3]].concat();
-        assert_eq!(d, [1, 2, 3]);
-
-        let v: &[&[_]] = &[&[1], &[2, 3]];
-        assert_eq!(v.connect(&0), [1, 0, 2, 3]);
-        let v: &[&[_]] = &[&[1], &[2], &[3]];
-        assert_eq!(v.connect(&0), [1, 0, 2, 0, 3]);
-    }
-
-    #[test]
-    fn test_connect() {
-        let v: [Vec<i32>; 0] = [];
-        assert_eq!(v.connect(&0), []);
-        assert_eq!([vec![1], vec![2, 3]].connect(&0), [1, 0, 2, 3]);
-        assert_eq!([vec![1], vec![2], vec![3]].connect(&0), [1, 0, 2, 0, 3]);
-
-        let v: [&[_]; 2] = [&[1], &[2, 3]];
-        assert_eq!(v.connect(&0), [1, 0, 2, 3]);
-        let v: [&[_]; 3] = [&[1], &[2], &[3]];
-        assert_eq!(v.connect(&0), [1, 0, 2, 0, 3]);
-    }
-
-    #[test]
-    fn test_insert() {
-        let mut a = vec![1, 2, 4];
-        a.insert(2, 3);
-        assert_eq!(a, [1, 2, 3, 4]);
-
-        let mut a = vec![1, 2, 3];
-        a.insert(0, 0);
-        assert_eq!(a, [0, 1, 2, 3]);
-
-        let mut a = vec![1, 2, 3];
-        a.insert(3, 4);
-        assert_eq!(a, [1, 2, 3, 4]);
-
-        let mut a = vec![];
-        a.insert(0, 1);
-        assert_eq!(a, [1]);
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_insert_oob() {
-        let mut a = vec![1, 2, 3];
-        a.insert(4, 5);
-    }
-
-    #[test]
-    fn test_remove() {
-        let mut a = vec![1, 2, 3, 4];
-
-        assert_eq!(a.remove(2), 3);
-        assert_eq!(a, [1, 2, 4]);
-
-        assert_eq!(a.remove(2), 4);
-        assert_eq!(a, [1, 2]);
-
-        assert_eq!(a.remove(0), 1);
-        assert_eq!(a, [2]);
-
-        assert_eq!(a.remove(0), 2);
-        assert_eq!(a, []);
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_remove_fail() {
-        let mut a = vec![1];
-        let _ = a.remove(0);
-        let _ = a.remove(0);
-    }
-
-    #[test]
-    fn test_capacity() {
-        let mut v = vec![0];
-        v.reserve_exact(10);
-        assert!(v.capacity() >= 11);
-    }
-
-    #[test]
-    fn test_slice_2() {
-        let v = vec![1, 2, 3, 4, 5];
-        let v = v.slice(1, 3);
-        assert_eq!(v.len(), 2);
-        assert_eq!(v[0], 2);
-        assert_eq!(v[1], 3);
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_permute_fail() {
-        let v: [(Box<_>, Rc<_>); 4] =
-            [(box 0, Rc::new(0)), (box 0, Rc::new(0)),
-             (box 0, Rc::new(0)), (box 0, Rc::new(0))];
-        let mut i = 0;
-        for _ in v.permutations() {
-            if i == 2 {
-                panic!()
-            }
-            i += 1;
-        }
-    }
-
-    #[test]
-    fn test_total_ord() {
-        let c = &[1, 2, 3];
-        [1, 2, 3, 4][..].cmp(c) == Greater;
-        let c = &[1, 2, 3, 4];
-        [1, 2, 3][..].cmp(c) == Less;
-        let c = &[1, 2, 3, 6];
-        [1, 2, 3, 4][..].cmp(c) == Equal;
-        let c = &[1, 2, 3, 4, 5, 6];
-        [1, 2, 3, 4, 5, 5, 5, 5][..].cmp(c) == Less;
-        let c = &[1, 2, 3, 4];
-        [2, 2][..].cmp(c) == Greater;
-    }
-
-    #[test]
-    fn test_iterator() {
-        let xs = [1, 2, 5, 10, 11];
-        let mut it = xs.iter();
-        assert_eq!(it.size_hint(), (5, Some(5)));
-        assert_eq!(it.next().unwrap(), &1);
-        assert_eq!(it.size_hint(), (4, Some(4)));
-        assert_eq!(it.next().unwrap(), &2);
-        assert_eq!(it.size_hint(), (3, Some(3)));
-        assert_eq!(it.next().unwrap(), &5);
-        assert_eq!(it.size_hint(), (2, Some(2)));
-        assert_eq!(it.next().unwrap(), &10);
-        assert_eq!(it.size_hint(), (1, Some(1)));
-        assert_eq!(it.next().unwrap(), &11);
-        assert_eq!(it.size_hint(), (0, Some(0)));
-        assert!(it.next().is_none());
-    }
-
-    #[test]
-    fn test_random_access_iterator() {
-        let xs = [1, 2, 5, 10, 11];
-        let mut it = xs.iter();
-
-        assert_eq!(it.indexable(), 5);
-        assert_eq!(it.idx(0).unwrap(), &1);
-        assert_eq!(it.idx(2).unwrap(), &5);
-        assert_eq!(it.idx(4).unwrap(), &11);
-        assert!(it.idx(5).is_none());
-
-        assert_eq!(it.next().unwrap(), &1);
-        assert_eq!(it.indexable(), 4);
-        assert_eq!(it.idx(0).unwrap(), &2);
-        assert_eq!(it.idx(3).unwrap(), &11);
-        assert!(it.idx(4).is_none());
-
-        assert_eq!(it.next().unwrap(), &2);
-        assert_eq!(it.indexable(), 3);
-        assert_eq!(it.idx(1).unwrap(), &10);
-        assert!(it.idx(3).is_none());
-
-        assert_eq!(it.next().unwrap(), &5);
-        assert_eq!(it.indexable(), 2);
-        assert_eq!(it.idx(1).unwrap(), &11);
-
-        assert_eq!(it.next().unwrap(), &10);
-        assert_eq!(it.indexable(), 1);
-        assert_eq!(it.idx(0).unwrap(), &11);
-        assert!(it.idx(1).is_none());
-
-        assert_eq!(it.next().unwrap(), &11);
-        assert_eq!(it.indexable(), 0);
-        assert!(it.idx(0).is_none());
-
-        assert!(it.next().is_none());
-    }
-
-    #[test]
-    fn test_iter_size_hints() {
-        let mut xs = [1, 2, 5, 10, 11];
-        assert_eq!(xs.iter().size_hint(), (5, Some(5)));
-        assert_eq!(xs.iter_mut().size_hint(), (5, Some(5)));
-    }
-
-    #[test]
-    fn test_iter_clone() {
-        let xs = [1, 2, 5];
-        let mut it = xs.iter();
-        it.next();
-        let mut jt = it.clone();
-        assert_eq!(it.next(), jt.next());
-        assert_eq!(it.next(), jt.next());
-        assert_eq!(it.next(), jt.next());
-    }
-
-    #[test]
-    fn test_mut_iterator() {
-        let mut xs = [1, 2, 3, 4, 5];
-        for x in &mut xs {
-            *x += 1;
-        }
-        assert!(xs == [2, 3, 4, 5, 6])
-    }
-
-    #[test]
-    fn test_rev_iterator() {
-
-        let xs = [1, 2, 5, 10, 11];
-        let ys = [11, 10, 5, 2, 1];
-        let mut i = 0;
-        for &x in xs.iter().rev() {
-            assert_eq!(x, ys[i]);
-            i += 1;
-        }
-        assert_eq!(i, 5);
-    }
-
-    #[test]
-    fn test_mut_rev_iterator() {
-        let mut xs = [1, 2, 3, 4, 5];
-        for (i,x) in xs.iter_mut().rev().enumerate() {
-            *x += i;
-        }
-        assert!(xs == [5, 5, 5, 5, 5])
-    }
-
-    #[test]
-    fn test_move_iterator() {
-        let xs = vec![1,2,3,4,5];
-        assert_eq!(xs.into_iter().fold(0, |a: usize, b: usize| 10*a + b), 12345);
-    }
-
-    #[test]
-    fn test_move_rev_iterator() {
-        let xs = vec![1,2,3,4,5];
-        assert_eq!(xs.into_iter().rev().fold(0, |a: usize, b: usize| 10*a + b), 54321);
-    }
-
-    #[test]
-    fn test_splitator() {
-        let xs = &[1,2,3,4,5];
-
-        let splits: &[&[_]] = &[&[1], &[3], &[5]];
-        assert_eq!(xs.split(|x| *x % 2 == 0).collect::<Vec<_>>(),
-                   splits);
-        let splits: &[&[_]] = &[&[], &[2,3,4,5]];
-        assert_eq!(xs.split(|x| *x == 1).collect::<Vec<_>>(),
-                   splits);
-        let splits: &[&[_]] = &[&[1,2,3,4], &[]];
-        assert_eq!(xs.split(|x| *x == 5).collect::<Vec<_>>(),
-                   splits);
-        let splits: &[&[_]] = &[&[1,2,3,4,5]];
-        assert_eq!(xs.split(|x| *x == 10).collect::<Vec<_>>(),
-                   splits);
-        let splits: &[&[_]] = &[&[], &[], &[], &[], &[], &[]];
-        assert_eq!(xs.split(|_| true).collect::<Vec<&[i32]>>(),
-                   splits);
-
-        let xs: &[i32] = &[];
-        let splits: &[&[i32]] = &[&[]];
-        assert_eq!(xs.split(|x| *x == 5).collect::<Vec<&[i32]>>(), splits);
-    }
-
-    #[test]
-    fn test_splitnator() {
-        let xs = &[1,2,3,4,5];
-
-        let splits: &[&[_]] = &[&[1,2,3,4,5]];
-        assert_eq!(xs.splitn(0, |x| *x % 2 == 0).collect::<Vec<_>>(),
-                   splits);
-        let splits: &[&[_]] = &[&[1], &[3,4,5]];
-        assert_eq!(xs.splitn(1, |x| *x % 2 == 0).collect::<Vec<_>>(),
-                   splits);
-        let splits: &[&[_]] = &[&[], &[], &[], &[4,5]];
-        assert_eq!(xs.splitn(3, |_| true).collect::<Vec<_>>(),
-                   splits);
-
-        let xs: &[i32] = &[];
-        let splits: &[&[i32]] = &[&[]];
-        assert_eq!(xs.splitn(1, |x| *x == 5).collect::<Vec<_>>(), splits);
-    }
-
-    #[test]
-    fn test_splitnator_mut() {
-        let xs = &mut [1,2,3,4,5];
-
-        let splits: &[&mut[_]] = &[&mut [1,2,3,4,5]];
-        assert_eq!(xs.splitn_mut(0, |x| *x % 2 == 0).collect::<Vec<_>>(),
-                   splits);
-        let splits: &[&mut[_]] = &[&mut [1], &mut [3,4,5]];
-        assert_eq!(xs.splitn_mut(1, |x| *x % 2 == 0).collect::<Vec<_>>(),
-                   splits);
-        let splits: &[&mut[_]] = &[&mut [], &mut [], &mut [], &mut [4,5]];
-        assert_eq!(xs.splitn_mut(3, |_| true).collect::<Vec<_>>(),
-                   splits);
-
-        let xs: &mut [i32] = &mut [];
-        let splits: &[&mut[i32]] = &[&mut []];
-        assert_eq!(xs.splitn_mut(1, |x| *x == 5).collect::<Vec<_>>(),
-                   splits);
-    }
-
-    #[test]
-    fn test_rsplitator() {
-        let xs = &[1,2,3,4,5];
-
-        let splits: &[&[_]] = &[&[5], &[3], &[1]];
-        assert_eq!(xs.split(|x| *x % 2 == 0).rev().collect::<Vec<_>>(),
-                   splits);
-        let splits: &[&[_]] = &[&[2,3,4,5], &[]];
-        assert_eq!(xs.split(|x| *x == 1).rev().collect::<Vec<_>>(),
-                   splits);
-        let splits: &[&[_]] = &[&[], &[1,2,3,4]];
-        assert_eq!(xs.split(|x| *x == 5).rev().collect::<Vec<_>>(),
-                   splits);
-        let splits: &[&[_]] = &[&[1,2,3,4,5]];
-        assert_eq!(xs.split(|x| *x == 10).rev().collect::<Vec<_>>(),
-                   splits);
-
-        let xs: &[i32] = &[];
-        let splits: &[&[i32]] = &[&[]];
-        assert_eq!(xs.split(|x| *x == 5).rev().collect::<Vec<&[i32]>>(), splits);
-    }
-
-    #[test]
-    fn test_rsplitnator() {
-        let xs = &[1,2,3,4,5];
-
-        let splits: &[&[_]] = &[&[1,2,3,4,5]];
-        assert_eq!(xs.rsplitn(0, |x| *x % 2 == 0).collect::<Vec<_>>(),
-                   splits);
-        let splits: &[&[_]] = &[&[5], &[1,2,3]];
-        assert_eq!(xs.rsplitn(1, |x| *x % 2 == 0).collect::<Vec<_>>(),
-                   splits);
-        let splits: &[&[_]] = &[&[], &[], &[], &[1,2]];
-        assert_eq!(xs.rsplitn(3, |_| true).collect::<Vec<_>>(),
-                   splits);
-
-        let xs: &[i32]  = &[];
-        let splits: &[&[i32]] = &[&[]];
-        assert_eq!(xs.rsplitn(1, |x| *x == 5).collect::<Vec<&[i32]>>(), splits);
-    }
-
-    #[test]
-    fn test_windowsator() {
-        let v = &[1,2,3,4];
-
-        let wins: &[&[_]] = &[&[1,2], &[2,3], &[3,4]];
-        assert_eq!(v.windows(2).collect::<Vec<_>>(), wins);
-
-        let wins: &[&[_]] = &[&[1,2,3], &[2,3,4]];
-        assert_eq!(v.windows(3).collect::<Vec<_>>(), wins);
-        assert!(v.windows(6).next().is_none());
-
-        let wins: &[&[_]] = &[&[3,4], &[2,3], &[1,2]];
-        assert_eq!(v.windows(2).rev().collect::<Vec<&[_]>>(), wins);
-        let mut it = v.windows(2);
-        assert_eq!(it.indexable(), 3);
-        let win: &[_] = &[1,2];
-        assert_eq!(it.idx(0).unwrap(), win);
-        let win: &[_] = &[2,3];
-        assert_eq!(it.idx(1).unwrap(), win);
-        let win: &[_] = &[3,4];
-        assert_eq!(it.idx(2).unwrap(), win);
-        assert_eq!(it.idx(3), None);
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_windowsator_0() {
-        let v = &[1,2,3,4];
-        let _it = v.windows(0);
-    }
-
-    #[test]
-    fn test_chunksator() {
-        use core::iter::ExactSizeIterator;
-
-        let v = &[1,2,3,4,5];
-
-        assert_eq!(v.chunks(2).len(), 3);
-
-        let chunks: &[&[_]] = &[&[1,2], &[3,4], &[5]];
-        assert_eq!(v.chunks(2).collect::<Vec<_>>(), chunks);
-        let chunks: &[&[_]] = &[&[1,2,3], &[4,5]];
-        assert_eq!(v.chunks(3).collect::<Vec<_>>(), chunks);
-        let chunks: &[&[_]] = &[&[1,2,3,4,5]];
-        assert_eq!(v.chunks(6).collect::<Vec<_>>(), chunks);
-
-        let chunks: &[&[_]] = &[&[5], &[3,4], &[1,2]];
-        assert_eq!(v.chunks(2).rev().collect::<Vec<_>>(), chunks);
-        let mut it = v.chunks(2);
-        assert_eq!(it.indexable(), 3);
-
-        let chunk: &[_] = &[1,2];
-        assert_eq!(it.idx(0).unwrap(), chunk);
-        let chunk: &[_] = &[3,4];
-        assert_eq!(it.idx(1).unwrap(), chunk);
-        let chunk: &[_] = &[5];
-        assert_eq!(it.idx(2).unwrap(), chunk);
-        assert_eq!(it.idx(3), None);
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_chunksator_0() {
-        let v = &[1,2,3,4];
-        let _it = v.chunks(0);
-    }
-
-    #[test]
-    fn test_move_from() {
-        let mut a = [1,2,3,4,5];
-        let b = vec![6,7,8];
-        assert_eq!(a.move_from(b, 0, 3), 3);
-        assert!(a == [6,7,8,4,5]);
-        let mut a = [7,2,8,1];
-        let b = vec![3,1,4,1,5,9];
-        assert_eq!(a.move_from(b, 0, 6), 4);
-        assert!(a == [3,1,4,1]);
-        let mut a = [1,2,3,4];
-        let b = vec![5,6,7,8,9,0];
-        assert_eq!(a.move_from(b, 2, 3), 1);
-        assert!(a == [7,2,3,4]);
-        let mut a = [1,2,3,4,5];
-        let b = vec![5,6,7,8,9,0];
-        assert_eq!(a[2..4].move_from(b,1,6), 2);
-        assert!(a == [1,2,6,7,5]);
-    }
-
-    #[test]
-    fn test_reverse_part() {
-        let mut values = [1,2,3,4,5];
-        values[1..4].reverse();
-        assert!(values == [1,4,3,2,5]);
-    }
-
-    #[test]
-    fn test_show() {
-        macro_rules! test_show_vec {
-            ($x:expr, $x_str:expr) => ({
-                let (x, x_str) = ($x, $x_str);
-                assert_eq!(format!("{:?}", x), x_str);
-                assert_eq!(format!("{:?}", x), x_str);
-            })
-        }
-        let empty = Vec::<i32>::new();
-        test_show_vec!(empty, "[]");
-        test_show_vec!(vec![1], "[1]");
-        test_show_vec!(vec![1, 2, 3], "[1, 2, 3]");
-        test_show_vec!(vec![vec![], vec![1], vec![1, 1]],
-                       "[[], [1], [1, 1]]");
-
-        let empty_mut: &mut [i32] = &mut[];
-        test_show_vec!(empty_mut, "[]");
-        let v = &mut[1];
-        test_show_vec!(v, "[1]");
-        let v = &mut[1, 2, 3];
-        test_show_vec!(v, "[1, 2, 3]");
-        let v: &mut[&mut[_]] = &mut[&mut[], &mut[1], &mut[1, 1]];
-        test_show_vec!(v, "[[], [1], [1, 1]]");
-    }
-
-    #[test]
-    fn test_vec_default() {
-        macro_rules! t {
-            ($ty:ty) => {{
-                let v: $ty = Default::default();
-                assert!(v.is_empty());
-            }}
-        }
-
-        t!(&[i32]);
-        t!(Vec<i32>);
-    }
-
-    #[test]
-    fn test_bytes_set_memory() {
-        use slice::bytes::MutableByteVector;
-        let mut values = [1,2,3,4,5];
-        values[0..5].set_memory(0xAB);
-        assert!(values == [0xAB, 0xAB, 0xAB, 0xAB, 0xAB]);
-        values[2..4].set_memory(0xFF);
-        assert!(values == [0xAB, 0xAB, 0xFF, 0xFF, 0xAB]);
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_overflow_does_not_cause_segfault() {
-        let mut v = vec![];
-        v.reserve_exact(-1);
-        v.push(1);
-        v.push(2);
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_overflow_does_not_cause_segfault_managed() {
-        let mut v = vec![Rc::new(1)];
-        v.reserve_exact(-1);
-        v.push(Rc::new(2));
-    }
-
-    #[test]
-    fn test_mut_split_at() {
-        let mut values = [1u8,2,3,4,5];
-        {
-            let (left, right) = values.split_at_mut(2);
-            {
-                let left: &[_] = left;
-                assert!(left[..left.len()] == [1, 2]);
-            }
-            for p in left {
-                *p += 1;
-            }
-
-            {
-                let right: &[_] = right;
-                assert!(right[..right.len()] == [3, 4, 5]);
-            }
-            for p in right {
-                *p += 2;
-            }
-        }
-
-        assert!(values == [2, 3, 5, 6, 7]);
-    }
-
-    #[derive(Clone, PartialEq)]
-    struct Foo;
-
-    #[test]
-    fn test_iter_zero_sized() {
-        let mut v = vec![Foo, Foo, Foo];
-        assert_eq!(v.len(), 3);
-        let mut cnt = 0;
-
-        for f in &v {
-            assert!(*f == Foo);
-            cnt += 1;
-        }
-        assert_eq!(cnt, 3);
-
-        for f in &v[1..3] {
-            assert!(*f == Foo);
-            cnt += 1;
-        }
-        assert_eq!(cnt, 5);
-
-        for f in &mut v {
-            assert!(*f == Foo);
-            cnt += 1;
-        }
-        assert_eq!(cnt, 8);
-
-        for f in v {
-            assert!(f == Foo);
-            cnt += 1;
-        }
-        assert_eq!(cnt, 11);
-
-        let xs: [Foo; 3] = [Foo, Foo, Foo];
-        cnt = 0;
-        for f in &xs {
-            assert!(*f == Foo);
-            cnt += 1;
-        }
-        assert!(cnt == 3);
-    }
-
-    #[test]
-    fn test_shrink_to_fit() {
-        let mut xs = vec![0, 1, 2, 3];
-        for i in 4..100 {
-            xs.push(i)
-        }
-        assert_eq!(xs.capacity(), 128);
-        xs.shrink_to_fit();
-        assert_eq!(xs.capacity(), 100);
-        assert_eq!(xs, (0..100).collect::<Vec<_>>());
-    }
-
-    #[test]
-    fn test_starts_with() {
-        assert!(b"foobar".starts_with(b"foo"));
-        assert!(!b"foobar".starts_with(b"oob"));
-        assert!(!b"foobar".starts_with(b"bar"));
-        assert!(!b"foo".starts_with(b"foobar"));
-        assert!(!b"bar".starts_with(b"foobar"));
-        assert!(b"foobar".starts_with(b"foobar"));
-        let empty: &[u8] = &[];
-        assert!(empty.starts_with(empty));
-        assert!(!empty.starts_with(b"foo"));
-        assert!(b"foobar".starts_with(empty));
-    }
-
-    #[test]
-    fn test_ends_with() {
-        assert!(b"foobar".ends_with(b"bar"));
-        assert!(!b"foobar".ends_with(b"oba"));
-        assert!(!b"foobar".ends_with(b"foo"));
-        assert!(!b"foo".ends_with(b"foobar"));
-        assert!(!b"bar".ends_with(b"foobar"));
-        assert!(b"foobar".ends_with(b"foobar"));
-        let empty: &[u8] = &[];
-        assert!(empty.ends_with(empty));
-        assert!(!empty.ends_with(b"foo"));
-        assert!(b"foobar".ends_with(empty));
-    }
-
-    #[test]
-    fn test_mut_splitator() {
-        let mut xs = [0,1,0,2,3,0,0,4,5,0];
-        assert_eq!(xs.split_mut(|x| *x == 0).count(), 6);
-        for slice in xs.split_mut(|x| *x == 0) {
-            slice.reverse();
-        }
-        assert!(xs == [0,1,0,3,2,0,0,5,4,0]);
-
-        let mut xs = [0,1,0,2,3,0,0,4,5,0,6,7];
-        for slice in xs.split_mut(|x| *x == 0).take(5) {
-            slice.reverse();
-        }
-        assert!(xs == [0,1,0,3,2,0,0,5,4,0,6,7]);
-    }
-
-    #[test]
-    fn test_mut_splitator_rev() {
-        let mut xs = [1,2,0,3,4,0,0,5,6,0];
-        for slice in xs.split_mut(|x| *x == 0).rev().take(4) {
-            slice.reverse();
-        }
-        assert!(xs == [1,2,0,4,3,0,0,6,5,0]);
-    }
-
-    #[test]
-    fn test_get_mut() {
-        let mut v = [0,1,2];
-        assert_eq!(v.get_mut(3), None);
-        v.get_mut(1).map(|e| *e = 7);
-        assert_eq!(v[1], 7);
-        let mut x = 2;
-        assert_eq!(v.get_mut(2), Some(&mut x));
-    }
-
-    #[test]
-    fn test_mut_chunks() {
-        use core::iter::ExactSizeIterator;
-
-        let mut v = [0, 1, 2, 3, 4, 5, 6];
-        assert_eq!(v.chunks_mut(2).len(), 4);
-        for (i, chunk) in v.chunks_mut(3).enumerate() {
-            for x in chunk {
-                *x = i as u8;
-            }
-        }
-        let result = [0, 0, 0, 1, 1, 1, 2];
-        assert!(v == result);
-    }
-
-    #[test]
-    fn test_mut_chunks_rev() {
-        let mut v = [0, 1, 2, 3, 4, 5, 6];
-        for (i, chunk) in v.chunks_mut(3).rev().enumerate() {
-            for x in chunk {
-                *x = i as u8;
-            }
-        }
-        let result = [2, 2, 2, 1, 1, 1, 0];
-        assert!(v == result);
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_mut_chunks_0() {
-        let mut v = [1, 2, 3, 4];
-        let _it = v.chunks_mut(0);
-    }
-
-    #[test]
-    fn test_mut_last() {
-        let mut x = [1, 2, 3, 4, 5];
-        let h = x.last_mut();
-        assert_eq!(*h.unwrap(), 5);
-
-        let y: &mut [i32] = &mut [];
-        assert!(y.last_mut().is_none());
-    }
-
-    #[test]
-    fn test_to_vec() {
-        let xs: Box<_> = box [1, 2, 3];
-        let ys = xs.to_vec();
-        assert_eq!(ys, [1, 2, 3]);
-    }
-}
-
-#[cfg(test)]
-mod bench {
-    use prelude::*;
-    use core::mem;
-    use core::ptr;
-    use core::iter::repeat;
-    use std::rand::{weak_rng, Rng};
-    use test::{Bencher, black_box};
-
-    #[bench]
-    fn iterator(b: &mut Bencher) {
-        // peculiar numbers to stop LLVM from optimising the summation
-        // out.
-        let v: Vec<_> = (0..100).map(|i| i ^ (i << 1) ^ (i >> 1)).collect();
-
-        b.iter(|| {
-            let mut sum = 0;
-            for x in &v {
-                sum += *x;
-            }
-            // sum == 11806, to stop dead code elimination.
-            if sum == 0 {panic!()}
-        })
-    }
-
-    #[bench]
-    fn mut_iterator(b: &mut Bencher) {
-        let mut v: Vec<_> = repeat(0).take(100).collect();
-
-        b.iter(|| {
-            let mut i = 0;
-            for x in &mut v {
-                *x = i;
-                i += 1;
-            }
-        })
-    }
-
-    #[bench]
-    fn concat(b: &mut Bencher) {
-        let xss: Vec<Vec<i32>> =
-            (0..100).map(|i| (0..i).collect()).collect();
-        b.iter(|| {
-            xss.concat();
-        });
-    }
-
-    #[bench]
-    fn connect(b: &mut Bencher) {
-        let xss: Vec<Vec<i32>> =
-            (0..100).map(|i| (0..i).collect()).collect();
-        b.iter(|| {
-            xss.connect(&0)
-        });
-    }
-
-    #[bench]
-    fn push(b: &mut Bencher) {
-        let mut vec = Vec::<i32>::new();
-        b.iter(|| {
-            vec.push(0);
-            black_box(&vec);
-        });
-    }
-
-    #[bench]
-    fn starts_with_same_vector(b: &mut Bencher) {
-        let vec: Vec<_> = (0..100).collect();
-        b.iter(|| {
-            vec.starts_with(&vec)
-        })
-    }
-
-    #[bench]
-    fn starts_with_single_element(b: &mut Bencher) {
-        let vec: Vec<_> = vec![0];
-        b.iter(|| {
-            vec.starts_with(&vec)
-        })
-    }
-
-    #[bench]
-    fn starts_with_diff_one_element_at_end(b: &mut Bencher) {
-        let vec: Vec<_> = (0..100).collect();
-        let mut match_vec: Vec<_> = (0..99).collect();
-        match_vec.push(0);
-        b.iter(|| {
-            vec.starts_with(&match_vec)
-        })
-    }
-
-    #[bench]
-    fn ends_with_same_vector(b: &mut Bencher) {
-        let vec: Vec<_> = (0..100).collect();
-        b.iter(|| {
-            vec.ends_with(&vec)
-        })
-    }
-
-    #[bench]
-    fn ends_with_single_element(b: &mut Bencher) {
-        let vec: Vec<_> = vec![0];
-        b.iter(|| {
-            vec.ends_with(&vec)
-        })
-    }
-
-    #[bench]
-    fn ends_with_diff_one_element_at_beginning(b: &mut Bencher) {
-        let vec: Vec<_> = (0..100).collect();
-        let mut match_vec: Vec<_> = (0..100).collect();
-        match_vec[0] = 200;
-        b.iter(|| {
-            vec.starts_with(&match_vec)
-        })
-    }
-
-    #[bench]
-    fn contains_last_element(b: &mut Bencher) {
-        let vec: Vec<_> = (0..100).collect();
-        b.iter(|| {
-            vec.contains(&99)
-        })
-    }
-
-    #[bench]
-    fn zero_1kb_from_elem(b: &mut Bencher) {
-        b.iter(|| {
-            repeat(0u8).take(1024).collect::<Vec<_>>()
-        });
-    }
-
-    #[bench]
-    fn zero_1kb_set_memory(b: &mut Bencher) {
-        b.iter(|| {
-            let mut v = Vec::<u8>::with_capacity(1024);
-            unsafe {
-                let vp = v.as_mut_ptr();
-                ptr::set_memory(vp, 0, 1024);
-                v.set_len(1024);
-            }
-            v
-        });
-    }
-
-    #[bench]
-    fn zero_1kb_loop_set(b: &mut Bencher) {
-        b.iter(|| {
-            let mut v = Vec::<u8>::with_capacity(1024);
-            unsafe {
-                v.set_len(1024);
-            }
-            for i in 0..1024 {
-                v[i] = 0;
-            }
-        });
-    }
-
-    #[bench]
-    fn zero_1kb_mut_iter(b: &mut Bencher) {
-        b.iter(|| {
-            let mut v = Vec::<u8>::with_capacity(1024);
-            unsafe {
-                v.set_len(1024);
-            }
-            for x in &mut v {
-                *x = 0;
-            }
-            v
-        });
-    }
-
-    #[bench]
-    fn random_inserts(b: &mut Bencher) {
-        let mut rng = weak_rng();
-        b.iter(|| {
-            let mut v: Vec<_> = repeat((0, 0)).take(30).collect();
-            for _ in 0..100 {
-                let l = v.len();
-                v.insert(rng.gen::<usize>() % (l + 1),
-                         (1, 1));
-            }
-        })
-    }
-    #[bench]
-    fn random_removes(b: &mut Bencher) {
-        let mut rng = weak_rng();
-        b.iter(|| {
-            let mut v: Vec<_> = repeat((0, 0)).take(130).collect();
-            for _ in 0..100 {
-                let l = v.len();
-                v.remove(rng.gen::<usize>() % l);
-            }
-        })
-    }
-
-    #[bench]
-    fn sort_random_small(b: &mut Bencher) {
-        let mut rng = weak_rng();
-        b.iter(|| {
-            let mut v: Vec<_> = rng.gen_iter::<u64>().take(5).collect();
-            v.sort();
-        });
-        b.bytes = 5 * mem::size_of::<u64>() as u64;
-    }
-
-    #[bench]
-    fn sort_random_medium(b: &mut Bencher) {
-        let mut rng = weak_rng();
-        b.iter(|| {
-            let mut v: Vec<_> = rng.gen_iter::<u64>().take(100).collect();
-            v.sort();
-        });
-        b.bytes = 100 * mem::size_of::<u64>() as u64;
-    }
-
-    #[bench]
-    fn sort_random_large(b: &mut Bencher) {
-        let mut rng = weak_rng();
-        b.iter(|| {
-            let mut v: Vec<_> = rng.gen_iter::<u64>().take(10000).collect();
-            v.sort();
-        });
-        b.bytes = 10000 * mem::size_of::<u64>() as u64;
-    }
-
-    #[bench]
-    fn sort_sorted(b: &mut Bencher) {
-        let mut v: Vec<_> = (0..10000).collect();
-        b.iter(|| {
-            v.sort();
-        });
-        b.bytes = (v.len() * mem::size_of_val(&v[0])) as u64;
-    }
-
-    type BigSortable = (u64, u64, u64, u64);
-
-    #[bench]
-    fn sort_big_random_small(b: &mut Bencher) {
-        let mut rng = weak_rng();
-        b.iter(|| {
-            let mut v = rng.gen_iter::<BigSortable>().take(5)
-                           .collect::<Vec<BigSortable>>();
-            v.sort();
-        });
-        b.bytes = 5 * mem::size_of::<BigSortable>() as u64;
-    }
-
-    #[bench]
-    fn sort_big_random_medium(b: &mut Bencher) {
-        let mut rng = weak_rng();
-        b.iter(|| {
-            let mut v = rng.gen_iter::<BigSortable>().take(100)
-                           .collect::<Vec<BigSortable>>();
-            v.sort();
-        });
-        b.bytes = 100 * mem::size_of::<BigSortable>() as u64;
-    }
-
-    #[bench]
-    fn sort_big_random_large(b: &mut Bencher) {
-        let mut rng = weak_rng();
-        b.iter(|| {
-            let mut v = rng.gen_iter::<BigSortable>().take(10000)
-                           .collect::<Vec<BigSortable>>();
-            v.sort();
-        });
-        b.bytes = 10000 * mem::size_of::<BigSortable>() as u64;
-    }
-
-    #[bench]
-    fn sort_big_sorted(b: &mut Bencher) {
-        let mut v: Vec<BigSortable> = (0..10000).map(|i| (i, i, i, i)).collect();
-        b.iter(|| {
-            v.sort();
-        });
-        b.bytes = (v.len() * mem::size_of_val(&v[0])) as u64;
-    }
-}
index 06674f6f0ab7576491e91f94442b4981cb608e46..fc93b0b75a7ab9e2a3e561b49526e055fc2c198a 100644 (file)
@@ -2690,1668 +2690,3 @@ pub fn to_uppercase(&self) -> String {
         return s;
     }
 }
-
-#[cfg(test)]
-mod tests {
-    use prelude::*;
-
-    use core::iter::AdditiveIterator;
-    use super::from_utf8;
-    use super::Utf8Error;
-
-    #[test]
-    fn test_le() {
-        assert!("" <= "");
-        assert!("" <= "foo");
-        assert!("foo" <= "foo");
-        assert!("foo" != "bar");
-    }
-
-    #[test]
-    fn test_len() {
-        assert_eq!("".len(), 0);
-        assert_eq!("hello world".len(), 11);
-        assert_eq!("\x63".len(), 1);
-        assert_eq!("\u{a2}".len(), 2);
-        assert_eq!("\u{3c0}".len(), 2);
-        assert_eq!("\u{2620}".len(), 3);
-        assert_eq!("\u{1d11e}".len(), 4);
-
-        assert_eq!("".chars().count(), 0);
-        assert_eq!("hello world".chars().count(), 11);
-        assert_eq!("\x63".chars().count(), 1);
-        assert_eq!("\u{a2}".chars().count(), 1);
-        assert_eq!("\u{3c0}".chars().count(), 1);
-        assert_eq!("\u{2620}".chars().count(), 1);
-        assert_eq!("\u{1d11e}".chars().count(), 1);
-        assert_eq!("ประเทศไทย中华Việt Nam".chars().count(), 19);
-
-        assert_eq!("hello".width(false), 10);
-        assert_eq!("hello".width(true), 10);
-        assert_eq!("\0\0\0\0\0".width(false), 0);
-        assert_eq!("\0\0\0\0\0".width(true), 0);
-        assert_eq!("".width(false), 0);
-        assert_eq!("".width(true), 0);
-        assert_eq!("\u{2081}\u{2082}\u{2083}\u{2084}".width(false), 4);
-        assert_eq!("\u{2081}\u{2082}\u{2083}\u{2084}".width(true), 8);
-    }
-
-    #[test]
-    fn test_find() {
-        assert_eq!("hello".find('l'), Some(2));
-        assert_eq!("hello".find(|c:char| c == 'o'), Some(4));
-        assert!("hello".find('x').is_none());
-        assert!("hello".find(|c:char| c == 'x').is_none());
-        assert_eq!("ประเทศไทย中华Việt Nam".find('华'), Some(30));
-        assert_eq!("ประเทศไทย中华Việt Nam".find(|c: char| c == '华'), Some(30));
-    }
-
-    #[test]
-    fn test_rfind() {
-        assert_eq!("hello".rfind('l'), Some(3));
-        assert_eq!("hello".rfind(|c:char| c == 'o'), Some(4));
-        assert!("hello".rfind('x').is_none());
-        assert!("hello".rfind(|c:char| c == 'x').is_none());
-        assert_eq!("ประเทศไทย中华Việt Nam".rfind('华'), Some(30));
-        assert_eq!("ประเทศไทย中华Việt Nam".rfind(|c: char| c == '华'), Some(30));
-    }
-
-    #[test]
-    fn test_collect() {
-        let empty = String::from_str("");
-        let s: String = empty.chars().collect();
-        assert_eq!(empty, s);
-        let data = String::from_str("ประเทศไทย中");
-        let s: String = data.chars().collect();
-        assert_eq!(data, s);
-    }
-
-    #[test]
-    fn test_into_bytes() {
-        let data = String::from_str("asdf");
-        let buf = data.into_bytes();
-        assert_eq!(b"asdf", buf);
-    }
-
-    #[test]
-    fn test_find_str() {
-        // byte positions
-        assert_eq!("".find_str(""), Some(0));
-        assert!("banana".find_str("apple pie").is_none());
-
-        let data = "abcabc";
-        assert_eq!(data[0..6].find_str("ab"), Some(0));
-        assert_eq!(data[2..6].find_str("ab"), Some(3 - 2));
-        assert!(data[2..4].find_str("ab").is_none());
-
-        let string = "ประเทศไทย中华Việt Nam";
-        let mut data = String::from_str(string);
-        data.push_str(string);
-        assert!(data.find_str("ไท华").is_none());
-        assert_eq!(data[0..43].find_str(""), Some(0));
-        assert_eq!(data[6..43].find_str(""), Some(6 - 6));
-
-        assert_eq!(data[0..43].find_str("ประ"), Some( 0));
-        assert_eq!(data[0..43].find_str("ทศไ"), Some(12));
-        assert_eq!(data[0..43].find_str("ย中"), Some(24));
-        assert_eq!(data[0..43].find_str("iệt"), Some(34));
-        assert_eq!(data[0..43].find_str("Nam"), Some(40));
-
-        assert_eq!(data[43..86].find_str("ประ"), Some(43 - 43));
-        assert_eq!(data[43..86].find_str("ทศไ"), Some(55 - 43));
-        assert_eq!(data[43..86].find_str("ย中"), Some(67 - 43));
-        assert_eq!(data[43..86].find_str("iệt"), Some(77 - 43));
-        assert_eq!(data[43..86].find_str("Nam"), Some(83 - 43));
-    }
-
-    #[test]
-    fn test_slice_chars() {
-        fn t(a: &str, b: &str, start: usize) {
-            assert_eq!(a.slice_chars(start, start + b.chars().count()), b);
-        }
-        t("", "", 0);
-        t("hello", "llo", 2);
-        t("hello", "el", 1);
-        t("αβλ", "β", 1);
-        t("αβλ", "", 3);
-        assert_eq!("ะเทศไท", "ประเทศไทย中华Việt Nam".slice_chars(2, 8));
-    }
-
-    fn s(x: &str) -> String { x.to_string() }
-
-    macro_rules! test_concat {
-        ($expected: expr, $string: expr) => {
-            {
-                let s: String = $string.concat();
-                assert_eq!($expected, s);
-            }
-        }
-    }
-
-    #[test]
-    fn test_concat_for_different_types() {
-        test_concat!("ab", vec![s("a"), s("b")]);
-        test_concat!("ab", vec!["a", "b"]);
-        test_concat!("ab", vec!["a", "b"]);
-        test_concat!("ab", vec![s("a"), s("b")]);
-    }
-
-    #[test]
-    fn test_concat_for_different_lengths() {
-        let empty: &[&str] = &[];
-        test_concat!("", empty);
-        test_concat!("a", ["a"]);
-        test_concat!("ab", ["a", "b"]);
-        test_concat!("abc", ["", "a", "bc"]);
-    }
-
-    macro_rules! test_connect {
-        ($expected: expr, $string: expr, $delim: expr) => {
-            {
-                let s = $string.connect($delim);
-                assert_eq!($expected, s);
-            }
-        }
-    }
-
-    #[test]
-    fn test_connect_for_different_types() {
-        test_connect!("a-b", ["a", "b"], "-");
-        let hyphen = "-".to_string();
-        test_connect!("a-b", [s("a"), s("b")], &*hyphen);
-        test_connect!("a-b", vec!["a", "b"], &*hyphen);
-        test_connect!("a-b", &*vec!["a", "b"], "-");
-        test_connect!("a-b", vec![s("a"), s("b")], "-");
-    }
-
-    #[test]
-    fn test_connect_for_different_lengths() {
-        let empty: &[&str] = &[];
-        test_connect!("", empty, "-");
-        test_connect!("a", ["a"], "-");
-        test_connect!("a-b", ["a", "b"], "-");
-        test_connect!("-a-bc", ["", "a", "bc"], "-");
-    }
-
-    #[test]
-    fn test_unsafe_slice() {
-        assert_eq!("ab", unsafe {"abc".slice_unchecked(0, 2)});
-        assert_eq!("bc", unsafe {"abc".slice_unchecked(1, 3)});
-        assert_eq!("", unsafe {"abc".slice_unchecked(1, 1)});
-        fn a_million_letter_a() -> String {
-            let mut i = 0;
-            let mut rs = String::new();
-            while i < 100000 {
-                rs.push_str("aaaaaaaaaa");
-                i += 1;
-            }
-            rs
-        }
-        fn half_a_million_letter_a() -> String {
-            let mut i = 0;
-            let mut rs = String::new();
-            while i < 100000 {
-                rs.push_str("aaaaa");
-                i += 1;
-            }
-            rs
-        }
-        let letters = a_million_letter_a();
-        assert!(half_a_million_letter_a() ==
-            unsafe {String::from_str(letters.slice_unchecked(
-                                     0,
-                                     500000))});
-    }
-
-    #[test]
-    fn test_starts_with() {
-        assert!(("".starts_with("")));
-        assert!(("abc".starts_with("")));
-        assert!(("abc".starts_with("a")));
-        assert!((!"a".starts_with("abc")));
-        assert!((!"".starts_with("abc")));
-        assert!((!"ödd".starts_with("-")));
-        assert!(("ödd".starts_with("öd")));
-    }
-
-    #[test]
-    fn test_ends_with() {
-        assert!(("".ends_with("")));
-        assert!(("abc".ends_with("")));
-        assert!(("abc".ends_with("c")));
-        assert!((!"a".ends_with("abc")));
-        assert!((!"".ends_with("abc")));
-        assert!((!"ddö".ends_with("-")));
-        assert!(("ddö".ends_with("dö")));
-    }
-
-    #[test]
-    fn test_is_empty() {
-        assert!("".is_empty());
-        assert!(!"a".is_empty());
-    }
-
-    #[test]
-    fn test_replace() {
-        let a = "a";
-        assert_eq!("".replace(a, "b"), String::from_str(""));
-        assert_eq!("a".replace(a, "b"), String::from_str("b"));
-        assert_eq!("ab".replace(a, "b"), String::from_str("bb"));
-        let test = "test";
-        assert!(" test test ".replace(test, "toast") ==
-            String::from_str(" toast toast "));
-        assert_eq!(" test test ".replace(test, ""), String::from_str("   "));
-    }
-
-    #[test]
-    fn test_replace_2a() {
-        let data = "ประเทศไทย中华";
-        let repl = "دولة الكويت";
-
-        let a = "ประเ";
-        let a2 = "دولة الكويتทศไทย中华";
-        assert_eq!(data.replace(a, repl), a2);
-    }
-
-    #[test]
-    fn test_replace_2b() {
-        let data = "ประเทศไทย中华";
-        let repl = "دولة الكويت";
-
-        let b = "ะเ";
-        let b2 = "ปรدولة الكويتทศไทย中华";
-        assert_eq!(data.replace(b, repl), b2);
-    }
-
-    #[test]
-    fn test_replace_2c() {
-        let data = "ประเทศไทย中华";
-        let repl = "دولة الكويت";
-
-        let c = "中华";
-        let c2 = "ประเทศไทยدولة الكويت";
-        assert_eq!(data.replace(c, repl), c2);
-    }
-
-    #[test]
-    fn test_replace_2d() {
-        let data = "ประเทศไทย中华";
-        let repl = "دولة الكويت";
-
-        let d = "ไท华";
-        assert_eq!(data.replace(d, repl), data);
-    }
-
-    #[test]
-    fn test_slice() {
-        assert_eq!("ab", "abc".slice(0, 2));
-        assert_eq!("bc", "abc".slice(1, 3));
-        assert_eq!("", "abc".slice(1, 1));
-        assert_eq!("\u{65e5}", "\u{65e5}\u{672c}".slice(0, 3));
-
-        let data = "ประเทศไทย中华";
-        assert_eq!("ป", data.slice(0, 3));
-        assert_eq!("ร", data.slice(3, 6));
-        assert_eq!("", data.slice(3, 3));
-        assert_eq!("华", data.slice(30, 33));
-
-        fn a_million_letter_x() -> String {
-            let mut i = 0;
-            let mut rs = String::new();
-            while i < 100000 {
-                rs.push_str("华华华华华华华华华华");
-                i += 1;
-            }
-            rs
-        }
-        fn half_a_million_letter_x() -> String {
-            let mut i = 0;
-            let mut rs = String::new();
-            while i < 100000 {
-                rs.push_str("华华华华华");
-                i += 1;
-            }
-            rs
-        }
-        let letters = a_million_letter_x();
-        assert!(half_a_million_letter_x() ==
-            String::from_str(letters.slice(0, 3 * 500000)));
-    }
-
-    #[test]
-    fn test_slice_2() {
-        let ss = "中华Việt Nam";
-
-        assert_eq!("华", ss.slice(3, 6));
-        assert_eq!("Việt Nam", ss.slice(6, 16));
-
-        assert_eq!("ab", "abc".slice(0, 2));
-        assert_eq!("bc", "abc".slice(1, 3));
-        assert_eq!("", "abc".slice(1, 1));
-
-        assert_eq!("中", ss.slice(0, 3));
-        assert_eq!("华V", ss.slice(3, 7));
-        assert_eq!("", ss.slice(3, 3));
-        /*0: 中
-          3: 华
-          6: V
-          7: i
-          8: ệ
-         11: t
-         12:
-         13: N
-         14: a
-         15: m */
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_slice_fail() {
-        "中华Việt Nam".slice(0, 2);
-    }
-
-    #[test]
-    fn test_slice_from() {
-        assert_eq!("abcd".slice_from(0), "abcd");
-        assert_eq!("abcd".slice_from(2), "cd");
-        assert_eq!("abcd".slice_from(4), "");
-    }
-    #[test]
-    fn test_slice_to() {
-        assert_eq!("abcd".slice_to(0), "");
-        assert_eq!("abcd".slice_to(2), "ab");
-        assert_eq!("abcd".slice_to(4), "abcd");
-    }
-
-    #[test]
-    fn test_trim_left_matches() {
-        let v: &[char] = &[];
-        assert_eq!(" *** foo *** ".trim_left_matches(v), " *** foo *** ");
-        let chars: &[char] = &['*', ' '];
-        assert_eq!(" *** foo *** ".trim_left_matches(chars), "foo *** ");
-        assert_eq!(" ***  *** ".trim_left_matches(chars), "");
-        assert_eq!("foo *** ".trim_left_matches(chars), "foo *** ");
-
-        assert_eq!("11foo1bar11".trim_left_matches('1'), "foo1bar11");
-        let chars: &[char] = &['1', '2'];
-        assert_eq!("12foo1bar12".trim_left_matches(chars), "foo1bar12");
-        assert_eq!("123foo1bar123".trim_left_matches(|c: char| c.is_numeric()), "foo1bar123");
-    }
-
-    #[test]
-    fn test_trim_right_matches() {
-        let v: &[char] = &[];
-        assert_eq!(" *** foo *** ".trim_right_matches(v), " *** foo *** ");
-        let chars: &[char] = &['*', ' '];
-        assert_eq!(" *** foo *** ".trim_right_matches(chars), " *** foo");
-        assert_eq!(" ***  *** ".trim_right_matches(chars), "");
-        assert_eq!(" *** foo".trim_right_matches(chars), " *** foo");
-
-        assert_eq!("11foo1bar11".trim_right_matches('1'), "11foo1bar");
-        let chars: &[char] = &['1', '2'];
-        assert_eq!("12foo1bar12".trim_right_matches(chars), "12foo1bar");
-        assert_eq!("123foo1bar123".trim_right_matches(|c: char| c.is_numeric()), "123foo1bar");
-    }
-
-    #[test]
-    fn test_trim_matches() {
-        let v: &[char] = &[];
-        assert_eq!(" *** foo *** ".trim_matches(v), " *** foo *** ");
-        let chars: &[char] = &['*', ' '];
-        assert_eq!(" *** foo *** ".trim_matches(chars), "foo");
-        assert_eq!(" ***  *** ".trim_matches(chars), "");
-        assert_eq!("foo".trim_matches(chars), "foo");
-
-        assert_eq!("11foo1bar11".trim_matches('1'), "foo1bar");
-        let chars: &[char] = &['1', '2'];
-        assert_eq!("12foo1bar12".trim_matches(chars), "foo1bar");
-        assert_eq!("123foo1bar123".trim_matches(|c: char| c.is_numeric()), "foo1bar");
-    }
-
-    #[test]
-    fn test_trim_left() {
-        assert_eq!("".trim_left(), "");
-        assert_eq!("a".trim_left(), "a");
-        assert_eq!("    ".trim_left(), "");
-        assert_eq!("     blah".trim_left(), "blah");
-        assert_eq!("   \u{3000}  wut".trim_left(), "wut");
-        assert_eq!("hey ".trim_left(), "hey ");
-    }
-
-    #[test]
-    fn test_trim_right() {
-        assert_eq!("".trim_right(), "");
-        assert_eq!("a".trim_right(), "a");
-        assert_eq!("    ".trim_right(), "");
-        assert_eq!("blah     ".trim_right(), "blah");
-        assert_eq!("wut   \u{3000}  ".trim_right(), "wut");
-        assert_eq!(" hey".trim_right(), " hey");
-    }
-
-    #[test]
-    fn test_trim() {
-        assert_eq!("".trim(), "");
-        assert_eq!("a".trim(), "a");
-        assert_eq!("    ".trim(), "");
-        assert_eq!("    blah     ".trim(), "blah");
-        assert_eq!("\nwut   \u{3000}  ".trim(), "wut");
-        assert_eq!(" hey dude ".trim(), "hey dude");
-    }
-
-    #[test]
-    fn test_is_whitespace() {
-        assert!("".chars().all(|c| c.is_whitespace()));
-        assert!(" ".chars().all(|c| c.is_whitespace()));
-        assert!("\u{2009}".chars().all(|c| c.is_whitespace())); // Thin space
-        assert!("  \n\t   ".chars().all(|c| c.is_whitespace()));
-        assert!(!"   _   ".chars().all(|c| c.is_whitespace()));
-    }
-
-    #[test]
-    fn test_slice_shift_char() {
-        let data = "ประเทศไทย中";
-        assert_eq!(data.slice_shift_char(), Some(('ป', "ระเทศไทย中")));
-    }
-
-    #[test]
-    fn test_slice_shift_char_2() {
-        let empty = "";
-        assert_eq!(empty.slice_shift_char(), None);
-    }
-
-    #[test]
-    fn test_is_utf8() {
-        // deny overlong encodings
-        assert!(from_utf8(&[0xc0, 0x80]).is_err());
-        assert!(from_utf8(&[0xc0, 0xae]).is_err());
-        assert!(from_utf8(&[0xe0, 0x80, 0x80]).is_err());
-        assert!(from_utf8(&[0xe0, 0x80, 0xaf]).is_err());
-        assert!(from_utf8(&[0xe0, 0x81, 0x81]).is_err());
-        assert!(from_utf8(&[0xf0, 0x82, 0x82, 0xac]).is_err());
-        assert!(from_utf8(&[0xf4, 0x90, 0x80, 0x80]).is_err());
-
-        // deny surrogates
-        assert!(from_utf8(&[0xED, 0xA0, 0x80]).is_err());
-        assert!(from_utf8(&[0xED, 0xBF, 0xBF]).is_err());
-
-        assert!(from_utf8(&[0xC2, 0x80]).is_ok());
-        assert!(from_utf8(&[0xDF, 0xBF]).is_ok());
-        assert!(from_utf8(&[0xE0, 0xA0, 0x80]).is_ok());
-        assert!(from_utf8(&[0xED, 0x9F, 0xBF]).is_ok());
-        assert!(from_utf8(&[0xEE, 0x80, 0x80]).is_ok());
-        assert!(from_utf8(&[0xEF, 0xBF, 0xBF]).is_ok());
-        assert!(from_utf8(&[0xF0, 0x90, 0x80, 0x80]).is_ok());
-        assert!(from_utf8(&[0xF4, 0x8F, 0xBF, 0xBF]).is_ok());
-    }
-
-    #[test]
-    fn test_is_utf16() {
-        use unicode::str::is_utf16;
-        macro_rules! pos {
-            ($($e:expr),*) => { { $(assert!(is_utf16($e));)* } }
-        }
-
-        // non-surrogates
-        pos!(&[0x0000],
-             &[0x0001, 0x0002],
-             &[0xD7FF],
-             &[0xE000]);
-
-        // surrogate pairs (randomly generated with Python 3's
-        // .encode('utf-16be'))
-        pos!(&[0xdb54, 0xdf16, 0xd880, 0xdee0, 0xdb6a, 0xdd45],
-             &[0xd91f, 0xdeb1, 0xdb31, 0xdd84, 0xd8e2, 0xde14],
-             &[0xdb9f, 0xdc26, 0xdb6f, 0xde58, 0xd850, 0xdfae]);
-
-        // mixtures (also random)
-        pos!(&[0xd921, 0xdcc2, 0x002d, 0x004d, 0xdb32, 0xdf65],
-             &[0xdb45, 0xdd2d, 0x006a, 0xdacd, 0xddfe, 0x0006],
-             &[0x0067, 0xd8ff, 0xddb7, 0x000f, 0xd900, 0xdc80]);
-
-        // negative tests
-        macro_rules! neg {
-            ($($e:expr),*) => { { $(assert!(!is_utf16($e));)* } }
-        }
-
-        neg!(
-            // surrogate + regular unit
-            &[0xdb45, 0x0000],
-            // surrogate + lead surrogate
-            &[0xd900, 0xd900],
-            // unterminated surrogate
-            &[0xd8ff],
-            // trail surrogate without a lead
-            &[0xddb7]);
-
-        // random byte sequences that Python 3's .decode('utf-16be')
-        // failed on
-        neg!(&[0x5b3d, 0x0141, 0xde9e, 0x8fdc, 0xc6e7],
-             &[0xdf5a, 0x82a5, 0x62b9, 0xb447, 0x92f3],
-             &[0xda4e, 0x42bc, 0x4462, 0xee98, 0xc2ca],
-             &[0xbe00, 0xb04a, 0x6ecb, 0xdd89, 0xe278],
-             &[0x0465, 0xab56, 0xdbb6, 0xa893, 0x665e],
-             &[0x6b7f, 0x0a19, 0x40f4, 0xa657, 0xdcc5],
-             &[0x9b50, 0xda5e, 0x24ec, 0x03ad, 0x6dee],
-             &[0x8d17, 0xcaa7, 0xf4ae, 0xdf6e, 0xbed7],
-             &[0xdaee, 0x2584, 0x7d30, 0xa626, 0x121a],
-             &[0xd956, 0x4b43, 0x7570, 0xccd6, 0x4f4a],
-             &[0x9dcf, 0x1b49, 0x4ba5, 0xfce9, 0xdffe],
-             &[0x6572, 0xce53, 0xb05a, 0xf6af, 0xdacf],
-             &[0x1b90, 0x728c, 0x9906, 0xdb68, 0xf46e],
-             &[0x1606, 0xbeca, 0xbe76, 0x860f, 0xdfa5],
-             &[0x8b4f, 0xde7a, 0xd220, 0x9fac, 0x2b6f],
-             &[0xb8fe, 0xebbe, 0xda32, 0x1a5f, 0x8b8b],
-             &[0x934b, 0x8956, 0xc434, 0x1881, 0xddf7],
-             &[0x5a95, 0x13fc, 0xf116, 0xd89b, 0x93f9],
-             &[0xd640, 0x71f1, 0xdd7d, 0x77eb, 0x1cd8],
-             &[0x348b, 0xaef0, 0xdb2c, 0xebf1, 0x1282],
-             &[0x50d7, 0xd824, 0x5010, 0xb369, 0x22ea]);
-    }
-
-    #[test]
-    fn test_as_bytes() {
-        // no null
-        let v = [
-            224, 184, 168, 224, 185, 132, 224, 184, 151, 224, 184, 162, 228,
-            184, 173, 229, 141, 142, 86, 105, 225, 187, 135, 116, 32, 78, 97,
-            109
-        ];
-        let b: &[u8] = &[];
-        assert_eq!("".as_bytes(), b);
-        assert_eq!("abc".as_bytes(), b"abc");
-        assert_eq!("ศไทย中华Việt Nam".as_bytes(), v);
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_as_bytes_fail() {
-        // Don't double free. (I'm not sure if this exercises the
-        // original problem code path anymore.)
-        let s = String::from_str("");
-        let _bytes = s.as_bytes();
-        panic!();
-    }
-
-    #[test]
-    fn test_as_ptr() {
-        let buf = "hello".as_ptr();
-        unsafe {
-            assert_eq!(*buf.offset(0), b'h');
-            assert_eq!(*buf.offset(1), b'e');
-            assert_eq!(*buf.offset(2), b'l');
-            assert_eq!(*buf.offset(3), b'l');
-            assert_eq!(*buf.offset(4), b'o');
-        }
-    }
-
-    #[test]
-    fn test_subslice_offset() {
-        let a = "kernelsprite";
-        let b = &a[7..a.len()];
-        let c = &a[0..a.len() - 6];
-        assert_eq!(a.subslice_offset(b), 7);
-        assert_eq!(a.subslice_offset(c), 0);
-
-        let string = "a\nb\nc";
-        let lines: Vec<&str> = string.lines().collect();
-        assert_eq!(string.subslice_offset(lines[0]), 0);
-        assert_eq!(string.subslice_offset(lines[1]), 2);
-        assert_eq!(string.subslice_offset(lines[2]), 4);
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_subslice_offset_2() {
-        let a = "alchemiter";
-        let b = "cruxtruder";
-        a.subslice_offset(b);
-    }
-
-    #[test]
-    fn vec_str_conversions() {
-        let s1: String = String::from_str("All mimsy were the borogoves");
-
-        let v: Vec<u8> = s1.as_bytes().to_vec();
-        let s2: String = String::from_str(from_utf8(&v).unwrap());
-        let mut i = 0;
-        let n1 = s1.len();
-        let n2 = v.len();
-        assert_eq!(n1, n2);
-        while i < n1 {
-            let a: u8 = s1.as_bytes()[i];
-            let b: u8 = s2.as_bytes()[i];
-            debug!("{}", a);
-            debug!("{}", b);
-            assert_eq!(a, b);
-            i += 1;
-        }
-    }
-
-    #[test]
-    fn test_contains() {
-        assert!("abcde".contains("bcd"));
-        assert!("abcde".contains("abcd"));
-        assert!("abcde".contains("bcde"));
-        assert!("abcde".contains(""));
-        assert!("".contains(""));
-        assert!(!"abcde".contains("def"));
-        assert!(!"".contains("a"));
-
-        let data = "ประเทศไทย中华Việt Nam";
-        assert!(data.contains("ประเ"));
-        assert!(data.contains("ะเ"));
-        assert!(data.contains("中华"));
-        assert!(!data.contains("ไท华"));
-    }
-
-    #[test]
-    fn test_contains_char() {
-        assert!("abc".contains_char('b'));
-        assert!("a".contains_char('a'));
-        assert!(!"abc".contains_char('d'));
-        assert!(!"".contains_char('a'));
-    }
-
-    #[test]
-    fn test_char_at() {
-        let s = "ศไทย中华Việt Nam";
-        let v = vec!['ศ','ไ','ท','ย','中','华','V','i','ệ','t',' ','N','a','m'];
-        let mut pos = 0;
-        for ch in &v {
-            assert!(s.char_at(pos) == *ch);
-            pos += ch.to_string().len();
-        }
-    }
-
-    #[test]
-    fn test_char_at_reverse() {
-        let s = "ศไทย中华Việt Nam";
-        let v = vec!['ศ','ไ','ท','ย','中','华','V','i','ệ','t',' ','N','a','m'];
-        let mut pos = s.len();
-        for ch in v.iter().rev() {
-            assert!(s.char_at_reverse(pos) == *ch);
-            pos -= ch.to_string().len();
-        }
-    }
-
-    #[test]
-    fn test_escape_unicode() {
-        assert_eq!("abc".escape_unicode(),
-                   String::from_str("\\u{61}\\u{62}\\u{63}"));
-        assert_eq!("a c".escape_unicode(),
-                   String::from_str("\\u{61}\\u{20}\\u{63}"));
-        assert_eq!("\r\n\t".escape_unicode(),
-                   String::from_str("\\u{d}\\u{a}\\u{9}"));
-        assert_eq!("'\"\\".escape_unicode(),
-                   String::from_str("\\u{27}\\u{22}\\u{5c}"));
-        assert_eq!("\x00\x01\u{fe}\u{ff}".escape_unicode(),
-                   String::from_str("\\u{0}\\u{1}\\u{fe}\\u{ff}"));
-        assert_eq!("\u{100}\u{ffff}".escape_unicode(),
-                   String::from_str("\\u{100}\\u{ffff}"));
-        assert_eq!("\u{10000}\u{10ffff}".escape_unicode(),
-                   String::from_str("\\u{10000}\\u{10ffff}"));
-        assert_eq!("ab\u{fb00}".escape_unicode(),
-                   String::from_str("\\u{61}\\u{62}\\u{fb00}"));
-        assert_eq!("\u{1d4ea}\r".escape_unicode(),
-                   String::from_str("\\u{1d4ea}\\u{d}"));
-    }
-
-    #[test]
-    fn test_escape_default() {
-        assert_eq!("abc".escape_default(), String::from_str("abc"));
-        assert_eq!("a c".escape_default(), String::from_str("a c"));
-        assert_eq!("\r\n\t".escape_default(), String::from_str("\\r\\n\\t"));
-        assert_eq!("'\"\\".escape_default(), String::from_str("\\'\\\"\\\\"));
-        assert_eq!("\u{100}\u{ffff}".escape_default(),
-                   String::from_str("\\u{100}\\u{ffff}"));
-        assert_eq!("\u{10000}\u{10ffff}".escape_default(),
-                   String::from_str("\\u{10000}\\u{10ffff}"));
-        assert_eq!("ab\u{fb00}".escape_default(),
-                   String::from_str("ab\\u{fb00}"));
-        assert_eq!("\u{1d4ea}\r".escape_default(),
-                   String::from_str("\\u{1d4ea}\\r"));
-    }
-
-    #[test]
-    fn test_total_ord() {
-        "1234".cmp("123") == Greater;
-        "123".cmp("1234") == Less;
-        "1234".cmp("1234") == Equal;
-        "12345555".cmp("123456") == Less;
-        "22".cmp("1234") == Greater;
-    }
-
-    #[test]
-    fn test_char_range_at() {
-        let data = "b¢€𤭢𤭢€¢b";
-        assert_eq!('b', data.char_range_at(0).ch);
-        assert_eq!('¢', data.char_range_at(1).ch);
-        assert_eq!('€', data.char_range_at(3).ch);
-        assert_eq!('𤭢', data.char_range_at(6).ch);
-        assert_eq!('𤭢', data.char_range_at(10).ch);
-        assert_eq!('€', data.char_range_at(14).ch);
-        assert_eq!('¢', data.char_range_at(17).ch);
-        assert_eq!('b', data.char_range_at(19).ch);
-    }
-
-    #[test]
-    fn test_char_range_at_reverse_underflow() {
-        assert_eq!("abc".char_range_at_reverse(0).next, 0);
-    }
-
-    #[test]
-    fn test_iterator() {
-        let s = "ศไทย中华Việt Nam";
-        let v = ['ศ','ไ','ท','ย','中','华','V','i','ệ','t',' ','N','a','m'];
-
-        let mut pos = 0;
-        let it = s.chars();
-
-        for c in it {
-            assert_eq!(c, v[pos]);
-            pos += 1;
-        }
-        assert_eq!(pos, v.len());
-    }
-
-    #[test]
-    fn test_rev_iterator() {
-        let s = "ศไทย中华Việt Nam";
-        let v = ['m', 'a', 'N', ' ', 't', 'ệ','i','V','华','中','ย','ท','ไ','ศ'];
-
-        let mut pos = 0;
-        let it = s.chars().rev();
-
-        for c in it {
-            assert_eq!(c, v[pos]);
-            pos += 1;
-        }
-        assert_eq!(pos, v.len());
-    }
-
-    #[test]
-    fn test_chars_decoding() {
-        let mut bytes = [0; 4];
-        for c in (0..0x110000).filter_map(|c| ::core::char::from_u32(c)) {
-            let len = c.encode_utf8(&mut bytes).unwrap_or(0);
-            let s = ::core::str::from_utf8(&bytes[..len]).unwrap();
-            if Some(c) != s.chars().next() {
-                panic!("character {:x}={} does not decode correctly", c as u32, c);
-            }
-        }
-    }
-
-    #[test]
-    fn test_chars_rev_decoding() {
-        let mut bytes = [0; 4];
-        for c in (0..0x110000).filter_map(|c| ::core::char::from_u32(c)) {
-            let len = c.encode_utf8(&mut bytes).unwrap_or(0);
-            let s = ::core::str::from_utf8(&bytes[..len]).unwrap();
-            if Some(c) != s.chars().rev().next() {
-                panic!("character {:x}={} does not decode correctly", c as u32, c);
-            }
-        }
-    }
-
-    #[test]
-    fn test_iterator_clone() {
-        let s = "ศไทย中华Việt Nam";
-        let mut it = s.chars();
-        it.next();
-        assert!(it.clone().zip(it).all(|(x,y)| x == y));
-    }
-
-    #[test]
-    fn test_bytesator() {
-        let s = "ศไทย中华Việt Nam";
-        let v = [
-            224, 184, 168, 224, 185, 132, 224, 184, 151, 224, 184, 162, 228,
-            184, 173, 229, 141, 142, 86, 105, 225, 187, 135, 116, 32, 78, 97,
-            109
-        ];
-        let mut pos = 0;
-
-        for b in s.bytes() {
-            assert_eq!(b, v[pos]);
-            pos += 1;
-        }
-    }
-
-    #[test]
-    fn test_bytes_revator() {
-        let s = "ศไทย中华Việt Nam";
-        let v = [
-            224, 184, 168, 224, 185, 132, 224, 184, 151, 224, 184, 162, 228,
-            184, 173, 229, 141, 142, 86, 105, 225, 187, 135, 116, 32, 78, 97,
-            109
-        ];
-        let mut pos = v.len();
-
-        for b in s.bytes().rev() {
-            pos -= 1;
-            assert_eq!(b, v[pos]);
-        }
-    }
-
-    #[test]
-    fn test_char_indicesator() {
-        let s = "ศไทย中华Việt Nam";
-        let p = [0, 3, 6, 9, 12, 15, 18, 19, 20, 23, 24, 25, 26, 27];
-        let v = ['ศ','ไ','ท','ย','中','华','V','i','ệ','t',' ','N','a','m'];
-
-        let mut pos = 0;
-        let it = s.char_indices();
-
-        for c in it {
-            assert_eq!(c, (p[pos], v[pos]));
-            pos += 1;
-        }
-        assert_eq!(pos, v.len());
-        assert_eq!(pos, p.len());
-    }
-
-    #[test]
-    fn test_char_indices_revator() {
-        let s = "ศไทย中华Việt Nam";
-        let p = [27, 26, 25, 24, 23, 20, 19, 18, 15, 12, 9, 6, 3, 0];
-        let v = ['m', 'a', 'N', ' ', 't', 'ệ','i','V','华','中','ย','ท','ไ','ศ'];
-
-        let mut pos = 0;
-        let it = s.char_indices().rev();
-
-        for c in it {
-            assert_eq!(c, (p[pos], v[pos]));
-            pos += 1;
-        }
-        assert_eq!(pos, v.len());
-        assert_eq!(pos, p.len());
-    }
-
-    #[test]
-    fn test_splitn_char_iterator() {
-        let data = "\nMäry häd ä little lämb\nLittle lämb\n";
-
-        let split: Vec<&str> = data.splitn(3, ' ').collect();
-        assert_eq!(split, ["\nMäry", "häd", "ä", "little lämb\nLittle lämb\n"]);
-
-        let split: Vec<&str> = data.splitn(3, |c: char| c == ' ').collect();
-        assert_eq!(split, ["\nMäry", "häd", "ä", "little lämb\nLittle lämb\n"]);
-
-        // Unicode
-        let split: Vec<&str> = data.splitn(3, 'ä').collect();
-        assert_eq!(split, ["\nM", "ry h", "d ", " little lämb\nLittle lämb\n"]);
-
-        let split: Vec<&str> = data.splitn(3, |c: char| c == 'ä').collect();
-        assert_eq!(split, ["\nM", "ry h", "d ", " little lämb\nLittle lämb\n"]);
-    }
-
-    #[test]
-    fn test_split_char_iterator_no_trailing() {
-        let data = "\nMäry häd ä little lämb\nLittle lämb\n";
-
-        let split: Vec<&str> = data.split('\n').collect();
-        assert_eq!(split, ["", "Märy häd ä little lämb", "Little lämb", ""]);
-
-        let split: Vec<&str> = data.split_terminator('\n').collect();
-        assert_eq!(split, ["", "Märy häd ä little lämb", "Little lämb"]);
-    }
-
-    #[test]
-    fn test_words() {
-        let data = "\n \tMäry   häd\tä  little lämb\nLittle lämb\n";
-        let words: Vec<&str> = data.words().collect();
-        assert_eq!(words, ["Märy", "häd", "ä", "little", "lämb", "Little", "lämb"])
-    }
-
-    #[test]
-    fn test_nfd_chars() {
-        macro_rules! t {
-            ($input: expr, $expected: expr) => {
-                assert_eq!($input.nfd_chars().collect::<String>(), $expected);
-            }
-        }
-        t!("abc", "abc");
-        t!("\u{1e0b}\u{1c4}", "d\u{307}\u{1c4}");
-        t!("\u{2026}", "\u{2026}");
-        t!("\u{2126}", "\u{3a9}");
-        t!("\u{1e0b}\u{323}", "d\u{323}\u{307}");
-        t!("\u{1e0d}\u{307}", "d\u{323}\u{307}");
-        t!("a\u{301}", "a\u{301}");
-        t!("\u{301}a", "\u{301}a");
-        t!("\u{d4db}", "\u{1111}\u{1171}\u{11b6}");
-        t!("\u{ac1c}", "\u{1100}\u{1162}");
-    }
-
-    #[test]
-    fn test_nfkd_chars() {
-        macro_rules! t {
-            ($input: expr, $expected: expr) => {
-                assert_eq!($input.nfkd_chars().collect::<String>(), $expected);
-            }
-        }
-        t!("abc", "abc");
-        t!("\u{1e0b}\u{1c4}", "d\u{307}DZ\u{30c}");
-        t!("\u{2026}", "...");
-        t!("\u{2126}", "\u{3a9}");
-        t!("\u{1e0b}\u{323}", "d\u{323}\u{307}");
-        t!("\u{1e0d}\u{307}", "d\u{323}\u{307}");
-        t!("a\u{301}", "a\u{301}");
-        t!("\u{301}a", "\u{301}a");
-        t!("\u{d4db}", "\u{1111}\u{1171}\u{11b6}");
-        t!("\u{ac1c}", "\u{1100}\u{1162}");
-    }
-
-    #[test]
-    fn test_nfc_chars() {
-        macro_rules! t {
-            ($input: expr, $expected: expr) => {
-                assert_eq!($input.nfc_chars().collect::<String>(), $expected);
-            }
-        }
-        t!("abc", "abc");
-        t!("\u{1e0b}\u{1c4}", "\u{1e0b}\u{1c4}");
-        t!("\u{2026}", "\u{2026}");
-        t!("\u{2126}", "\u{3a9}");
-        t!("\u{1e0b}\u{323}", "\u{1e0d}\u{307}");
-        t!("\u{1e0d}\u{307}", "\u{1e0d}\u{307}");
-        t!("a\u{301}", "\u{e1}");
-        t!("\u{301}a", "\u{301}a");
-        t!("\u{d4db}", "\u{d4db}");
-        t!("\u{ac1c}", "\u{ac1c}");
-        t!("a\u{300}\u{305}\u{315}\u{5ae}b", "\u{e0}\u{5ae}\u{305}\u{315}b");
-    }
-
-    #[test]
-    fn test_nfkc_chars() {
-        macro_rules! t {
-            ($input: expr, $expected: expr) => {
-                assert_eq!($input.nfkc_chars().collect::<String>(), $expected);
-            }
-        }
-        t!("abc", "abc");
-        t!("\u{1e0b}\u{1c4}", "\u{1e0b}D\u{17d}");
-        t!("\u{2026}", "...");
-        t!("\u{2126}", "\u{3a9}");
-        t!("\u{1e0b}\u{323}", "\u{1e0d}\u{307}");
-        t!("\u{1e0d}\u{307}", "\u{1e0d}\u{307}");
-        t!("a\u{301}", "\u{e1}");
-        t!("\u{301}a", "\u{301}a");
-        t!("\u{d4db}", "\u{d4db}");
-        t!("\u{ac1c}", "\u{ac1c}");
-        t!("a\u{300}\u{305}\u{315}\u{5ae}b", "\u{e0}\u{5ae}\u{305}\u{315}b");
-    }
-
-    #[test]
-    fn test_lines() {
-        let data = "\nMäry häd ä little lämb\n\nLittle lämb\n";
-        let lines: Vec<&str> = data.lines().collect();
-        assert_eq!(lines, ["", "Märy häd ä little lämb", "", "Little lämb"]);
-
-        let data = "\nMäry häd ä little lämb\n\nLittle lämb"; // no trailing \n
-        let lines: Vec<&str> = data.lines().collect();
-        assert_eq!(lines, ["", "Märy häd ä little lämb", "", "Little lämb"]);
-    }
-
-    #[test]
-    fn test_graphemes() {
-        use core::iter::order;
-        // official Unicode test data
-        // from http://www.unicode.org/Public/UCD/latest/ucd/auxiliary/GraphemeBreakTest.txt
-        let test_same: [(_, &[_]); 325] = [
-            ("\u{20}\u{20}", &["\u{20}", "\u{20}"]),
-            ("\u{20}\u{308}\u{20}", &["\u{20}\u{308}", "\u{20}"]),
-            ("\u{20}\u{D}", &["\u{20}", "\u{D}"]),
-            ("\u{20}\u{308}\u{D}", &["\u{20}\u{308}", "\u{D}"]),
-            ("\u{20}\u{A}", &["\u{20}", "\u{A}"]),
-            ("\u{20}\u{308}\u{A}", &["\u{20}\u{308}", "\u{A}"]),
-            ("\u{20}\u{1}", &["\u{20}", "\u{1}"]),
-            ("\u{20}\u{308}\u{1}", &["\u{20}\u{308}", "\u{1}"]),
-            ("\u{20}\u{300}", &["\u{20}\u{300}"]),
-            ("\u{20}\u{308}\u{300}", &["\u{20}\u{308}\u{300}"]),
-            ("\u{20}\u{1100}", &["\u{20}", "\u{1100}"]),
-            ("\u{20}\u{308}\u{1100}", &["\u{20}\u{308}", "\u{1100}"]),
-            ("\u{20}\u{1160}", &["\u{20}", "\u{1160}"]),
-            ("\u{20}\u{308}\u{1160}", &["\u{20}\u{308}", "\u{1160}"]),
-            ("\u{20}\u{11A8}", &["\u{20}", "\u{11A8}"]),
-            ("\u{20}\u{308}\u{11A8}", &["\u{20}\u{308}", "\u{11A8}"]),
-            ("\u{20}\u{AC00}", &["\u{20}", "\u{AC00}"]),
-            ("\u{20}\u{308}\u{AC00}", &["\u{20}\u{308}", "\u{AC00}"]),
-            ("\u{20}\u{AC01}", &["\u{20}", "\u{AC01}"]),
-            ("\u{20}\u{308}\u{AC01}", &["\u{20}\u{308}", "\u{AC01}"]),
-            ("\u{20}\u{1F1E6}", &["\u{20}", "\u{1F1E6}"]),
-            ("\u{20}\u{308}\u{1F1E6}", &["\u{20}\u{308}", "\u{1F1E6}"]),
-            ("\u{20}\u{378}", &["\u{20}", "\u{378}"]),
-            ("\u{20}\u{308}\u{378}", &["\u{20}\u{308}", "\u{378}"]),
-            ("\u{D}\u{20}", &["\u{D}", "\u{20}"]),
-            ("\u{D}\u{308}\u{20}", &["\u{D}", "\u{308}", "\u{20}"]),
-            ("\u{D}\u{D}", &["\u{D}", "\u{D}"]),
-            ("\u{D}\u{308}\u{D}", &["\u{D}", "\u{308}", "\u{D}"]),
-            ("\u{D}\u{A}", &["\u{D}\u{A}"]),
-            ("\u{D}\u{308}\u{A}", &["\u{D}", "\u{308}", "\u{A}"]),
-            ("\u{D}\u{1}", &["\u{D}", "\u{1}"]),
-            ("\u{D}\u{308}\u{1}", &["\u{D}", "\u{308}", "\u{1}"]),
-            ("\u{D}\u{300}", &["\u{D}", "\u{300}"]),
-            ("\u{D}\u{308}\u{300}", &["\u{D}", "\u{308}\u{300}"]),
-            ("\u{D}\u{903}", &["\u{D}", "\u{903}"]),
-            ("\u{D}\u{1100}", &["\u{D}", "\u{1100}"]),
-            ("\u{D}\u{308}\u{1100}", &["\u{D}", "\u{308}", "\u{1100}"]),
-            ("\u{D}\u{1160}", &["\u{D}", "\u{1160}"]),
-            ("\u{D}\u{308}\u{1160}", &["\u{D}", "\u{308}", "\u{1160}"]),
-            ("\u{D}\u{11A8}", &["\u{D}", "\u{11A8}"]),
-            ("\u{D}\u{308}\u{11A8}", &["\u{D}", "\u{308}", "\u{11A8}"]),
-            ("\u{D}\u{AC00}", &["\u{D}", "\u{AC00}"]),
-            ("\u{D}\u{308}\u{AC00}", &["\u{D}", "\u{308}", "\u{AC00}"]),
-            ("\u{D}\u{AC01}", &["\u{D}", "\u{AC01}"]),
-            ("\u{D}\u{308}\u{AC01}", &["\u{D}", "\u{308}", "\u{AC01}"]),
-            ("\u{D}\u{1F1E6}", &["\u{D}", "\u{1F1E6}"]),
-            ("\u{D}\u{308}\u{1F1E6}", &["\u{D}", "\u{308}", "\u{1F1E6}"]),
-            ("\u{D}\u{378}", &["\u{D}", "\u{378}"]),
-            ("\u{D}\u{308}\u{378}", &["\u{D}", "\u{308}", "\u{378}"]),
-            ("\u{A}\u{20}", &["\u{A}", "\u{20}"]),
-            ("\u{A}\u{308}\u{20}", &["\u{A}", "\u{308}", "\u{20}"]),
-            ("\u{A}\u{D}", &["\u{A}", "\u{D}"]),
-            ("\u{A}\u{308}\u{D}", &["\u{A}", "\u{308}", "\u{D}"]),
-            ("\u{A}\u{A}", &["\u{A}", "\u{A}"]),
-            ("\u{A}\u{308}\u{A}", &["\u{A}", "\u{308}", "\u{A}"]),
-            ("\u{A}\u{1}", &["\u{A}", "\u{1}"]),
-            ("\u{A}\u{308}\u{1}", &["\u{A}", "\u{308}", "\u{1}"]),
-            ("\u{A}\u{300}", &["\u{A}", "\u{300}"]),
-            ("\u{A}\u{308}\u{300}", &["\u{A}", "\u{308}\u{300}"]),
-            ("\u{A}\u{903}", &["\u{A}", "\u{903}"]),
-            ("\u{A}\u{1100}", &["\u{A}", "\u{1100}"]),
-            ("\u{A}\u{308}\u{1100}", &["\u{A}", "\u{308}", "\u{1100}"]),
-            ("\u{A}\u{1160}", &["\u{A}", "\u{1160}"]),
-            ("\u{A}\u{308}\u{1160}", &["\u{A}", "\u{308}", "\u{1160}"]),
-            ("\u{A}\u{11A8}", &["\u{A}", "\u{11A8}"]),
-            ("\u{A}\u{308}\u{11A8}", &["\u{A}", "\u{308}", "\u{11A8}"]),
-            ("\u{A}\u{AC00}", &["\u{A}", "\u{AC00}"]),
-            ("\u{A}\u{308}\u{AC00}", &["\u{A}", "\u{308}", "\u{AC00}"]),
-            ("\u{A}\u{AC01}", &["\u{A}", "\u{AC01}"]),
-            ("\u{A}\u{308}\u{AC01}", &["\u{A}", "\u{308}", "\u{AC01}"]),
-            ("\u{A}\u{1F1E6}", &["\u{A}", "\u{1F1E6}"]),
-            ("\u{A}\u{308}\u{1F1E6}", &["\u{A}", "\u{308}", "\u{1F1E6}"]),
-            ("\u{A}\u{378}", &["\u{A}", "\u{378}"]),
-            ("\u{A}\u{308}\u{378}", &["\u{A}", "\u{308}", "\u{378}"]),
-            ("\u{1}\u{20}", &["\u{1}", "\u{20}"]),
-            ("\u{1}\u{308}\u{20}", &["\u{1}", "\u{308}", "\u{20}"]),
-            ("\u{1}\u{D}", &["\u{1}", "\u{D}"]),
-            ("\u{1}\u{308}\u{D}", &["\u{1}", "\u{308}", "\u{D}"]),
-            ("\u{1}\u{A}", &["\u{1}", "\u{A}"]),
-            ("\u{1}\u{308}\u{A}", &["\u{1}", "\u{308}", "\u{A}"]),
-            ("\u{1}\u{1}", &["\u{1}", "\u{1}"]),
-            ("\u{1}\u{308}\u{1}", &["\u{1}", "\u{308}", "\u{1}"]),
-            ("\u{1}\u{300}", &["\u{1}", "\u{300}"]),
-            ("\u{1}\u{308}\u{300}", &["\u{1}", "\u{308}\u{300}"]),
-            ("\u{1}\u{903}", &["\u{1}", "\u{903}"]),
-            ("\u{1}\u{1100}", &["\u{1}", "\u{1100}"]),
-            ("\u{1}\u{308}\u{1100}", &["\u{1}", "\u{308}", "\u{1100}"]),
-            ("\u{1}\u{1160}", &["\u{1}", "\u{1160}"]),
-            ("\u{1}\u{308}\u{1160}", &["\u{1}", "\u{308}", "\u{1160}"]),
-            ("\u{1}\u{11A8}", &["\u{1}", "\u{11A8}"]),
-            ("\u{1}\u{308}\u{11A8}", &["\u{1}", "\u{308}", "\u{11A8}"]),
-            ("\u{1}\u{AC00}", &["\u{1}", "\u{AC00}"]),
-            ("\u{1}\u{308}\u{AC00}", &["\u{1}", "\u{308}", "\u{AC00}"]),
-            ("\u{1}\u{AC01}", &["\u{1}", "\u{AC01}"]),
-            ("\u{1}\u{308}\u{AC01}", &["\u{1}", "\u{308}", "\u{AC01}"]),
-            ("\u{1}\u{1F1E6}", &["\u{1}", "\u{1F1E6}"]),
-            ("\u{1}\u{308}\u{1F1E6}", &["\u{1}", "\u{308}", "\u{1F1E6}"]),
-            ("\u{1}\u{378}", &["\u{1}", "\u{378}"]),
-            ("\u{1}\u{308}\u{378}", &["\u{1}", "\u{308}", "\u{378}"]),
-            ("\u{300}\u{20}", &["\u{300}", "\u{20}"]),
-            ("\u{300}\u{308}\u{20}", &["\u{300}\u{308}", "\u{20}"]),
-            ("\u{300}\u{D}", &["\u{300}", "\u{D}"]),
-            ("\u{300}\u{308}\u{D}", &["\u{300}\u{308}", "\u{D}"]),
-            ("\u{300}\u{A}", &["\u{300}", "\u{A}"]),
-            ("\u{300}\u{308}\u{A}", &["\u{300}\u{308}", "\u{A}"]),
-            ("\u{300}\u{1}", &["\u{300}", "\u{1}"]),
-            ("\u{300}\u{308}\u{1}", &["\u{300}\u{308}", "\u{1}"]),
-            ("\u{300}\u{300}", &["\u{300}\u{300}"]),
-            ("\u{300}\u{308}\u{300}", &["\u{300}\u{308}\u{300}"]),
-            ("\u{300}\u{1100}", &["\u{300}", "\u{1100}"]),
-            ("\u{300}\u{308}\u{1100}", &["\u{300}\u{308}", "\u{1100}"]),
-            ("\u{300}\u{1160}", &["\u{300}", "\u{1160}"]),
-            ("\u{300}\u{308}\u{1160}", &["\u{300}\u{308}", "\u{1160}"]),
-            ("\u{300}\u{11A8}", &["\u{300}", "\u{11A8}"]),
-            ("\u{300}\u{308}\u{11A8}", &["\u{300}\u{308}", "\u{11A8}"]),
-            ("\u{300}\u{AC00}", &["\u{300}", "\u{AC00}"]),
-            ("\u{300}\u{308}\u{AC00}", &["\u{300}\u{308}", "\u{AC00}"]),
-            ("\u{300}\u{AC01}", &["\u{300}", "\u{AC01}"]),
-            ("\u{300}\u{308}\u{AC01}", &["\u{300}\u{308}", "\u{AC01}"]),
-            ("\u{300}\u{1F1E6}", &["\u{300}", "\u{1F1E6}"]),
-            ("\u{300}\u{308}\u{1F1E6}", &["\u{300}\u{308}", "\u{1F1E6}"]),
-            ("\u{300}\u{378}", &["\u{300}", "\u{378}"]),
-            ("\u{300}\u{308}\u{378}", &["\u{300}\u{308}", "\u{378}"]),
-            ("\u{903}\u{20}", &["\u{903}", "\u{20}"]),
-            ("\u{903}\u{308}\u{20}", &["\u{903}\u{308}", "\u{20}"]),
-            ("\u{903}\u{D}", &["\u{903}", "\u{D}"]),
-            ("\u{903}\u{308}\u{D}", &["\u{903}\u{308}", "\u{D}"]),
-            ("\u{903}\u{A}", &["\u{903}", "\u{A}"]),
-            ("\u{903}\u{308}\u{A}", &["\u{903}\u{308}", "\u{A}"]),
-            ("\u{903}\u{1}", &["\u{903}", "\u{1}"]),
-            ("\u{903}\u{308}\u{1}", &["\u{903}\u{308}", "\u{1}"]),
-            ("\u{903}\u{300}", &["\u{903}\u{300}"]),
-            ("\u{903}\u{308}\u{300}", &["\u{903}\u{308}\u{300}"]),
-            ("\u{903}\u{1100}", &["\u{903}", "\u{1100}"]),
-            ("\u{903}\u{308}\u{1100}", &["\u{903}\u{308}", "\u{1100}"]),
-            ("\u{903}\u{1160}", &["\u{903}", "\u{1160}"]),
-            ("\u{903}\u{308}\u{1160}", &["\u{903}\u{308}", "\u{1160}"]),
-            ("\u{903}\u{11A8}", &["\u{903}", "\u{11A8}"]),
-            ("\u{903}\u{308}\u{11A8}", &["\u{903}\u{308}", "\u{11A8}"]),
-            ("\u{903}\u{AC00}", &["\u{903}", "\u{AC00}"]),
-            ("\u{903}\u{308}\u{AC00}", &["\u{903}\u{308}", "\u{AC00}"]),
-            ("\u{903}\u{AC01}", &["\u{903}", "\u{AC01}"]),
-            ("\u{903}\u{308}\u{AC01}", &["\u{903}\u{308}", "\u{AC01}"]),
-            ("\u{903}\u{1F1E6}", &["\u{903}", "\u{1F1E6}"]),
-            ("\u{903}\u{308}\u{1F1E6}", &["\u{903}\u{308}", "\u{1F1E6}"]),
-            ("\u{903}\u{378}", &["\u{903}", "\u{378}"]),
-            ("\u{903}\u{308}\u{378}", &["\u{903}\u{308}", "\u{378}"]),
-            ("\u{1100}\u{20}", &["\u{1100}", "\u{20}"]),
-            ("\u{1100}\u{308}\u{20}", &["\u{1100}\u{308}", "\u{20}"]),
-            ("\u{1100}\u{D}", &["\u{1100}", "\u{D}"]),
-            ("\u{1100}\u{308}\u{D}", &["\u{1100}\u{308}", "\u{D}"]),
-            ("\u{1100}\u{A}", &["\u{1100}", "\u{A}"]),
-            ("\u{1100}\u{308}\u{A}", &["\u{1100}\u{308}", "\u{A}"]),
-            ("\u{1100}\u{1}", &["\u{1100}", "\u{1}"]),
-            ("\u{1100}\u{308}\u{1}", &["\u{1100}\u{308}", "\u{1}"]),
-            ("\u{1100}\u{300}", &["\u{1100}\u{300}"]),
-            ("\u{1100}\u{308}\u{300}", &["\u{1100}\u{308}\u{300}"]),
-            ("\u{1100}\u{1100}", &["\u{1100}\u{1100}"]),
-            ("\u{1100}\u{308}\u{1100}", &["\u{1100}\u{308}", "\u{1100}"]),
-            ("\u{1100}\u{1160}", &["\u{1100}\u{1160}"]),
-            ("\u{1100}\u{308}\u{1160}", &["\u{1100}\u{308}", "\u{1160}"]),
-            ("\u{1100}\u{11A8}", &["\u{1100}", "\u{11A8}"]),
-            ("\u{1100}\u{308}\u{11A8}", &["\u{1100}\u{308}", "\u{11A8}"]),
-            ("\u{1100}\u{AC00}", &["\u{1100}\u{AC00}"]),
-            ("\u{1100}\u{308}\u{AC00}", &["\u{1100}\u{308}", "\u{AC00}"]),
-            ("\u{1100}\u{AC01}", &["\u{1100}\u{AC01}"]),
-            ("\u{1100}\u{308}\u{AC01}", &["\u{1100}\u{308}", "\u{AC01}"]),
-            ("\u{1100}\u{1F1E6}", &["\u{1100}", "\u{1F1E6}"]),
-            ("\u{1100}\u{308}\u{1F1E6}", &["\u{1100}\u{308}", "\u{1F1E6}"]),
-            ("\u{1100}\u{378}", &["\u{1100}", "\u{378}"]),
-            ("\u{1100}\u{308}\u{378}", &["\u{1100}\u{308}", "\u{378}"]),
-            ("\u{1160}\u{20}", &["\u{1160}", "\u{20}"]),
-            ("\u{1160}\u{308}\u{20}", &["\u{1160}\u{308}", "\u{20}"]),
-            ("\u{1160}\u{D}", &["\u{1160}", "\u{D}"]),
-            ("\u{1160}\u{308}\u{D}", &["\u{1160}\u{308}", "\u{D}"]),
-            ("\u{1160}\u{A}", &["\u{1160}", "\u{A}"]),
-            ("\u{1160}\u{308}\u{A}", &["\u{1160}\u{308}", "\u{A}"]),
-            ("\u{1160}\u{1}", &["\u{1160}", "\u{1}"]),
-            ("\u{1160}\u{308}\u{1}", &["\u{1160}\u{308}", "\u{1}"]),
-            ("\u{1160}\u{300}", &["\u{1160}\u{300}"]),
-            ("\u{1160}\u{308}\u{300}", &["\u{1160}\u{308}\u{300}"]),
-            ("\u{1160}\u{1100}", &["\u{1160}", "\u{1100}"]),
-            ("\u{1160}\u{308}\u{1100}", &["\u{1160}\u{308}", "\u{1100}"]),
-            ("\u{1160}\u{1160}", &["\u{1160}\u{1160}"]),
-            ("\u{1160}\u{308}\u{1160}", &["\u{1160}\u{308}", "\u{1160}"]),
-            ("\u{1160}\u{11A8}", &["\u{1160}\u{11A8}"]),
-            ("\u{1160}\u{308}\u{11A8}", &["\u{1160}\u{308}", "\u{11A8}"]),
-            ("\u{1160}\u{AC00}", &["\u{1160}", "\u{AC00}"]),
-            ("\u{1160}\u{308}\u{AC00}", &["\u{1160}\u{308}", "\u{AC00}"]),
-            ("\u{1160}\u{AC01}", &["\u{1160}", "\u{AC01}"]),
-            ("\u{1160}\u{308}\u{AC01}", &["\u{1160}\u{308}", "\u{AC01}"]),
-            ("\u{1160}\u{1F1E6}", &["\u{1160}", "\u{1F1E6}"]),
-            ("\u{1160}\u{308}\u{1F1E6}", &["\u{1160}\u{308}", "\u{1F1E6}"]),
-            ("\u{1160}\u{378}", &["\u{1160}", "\u{378}"]),
-            ("\u{1160}\u{308}\u{378}", &["\u{1160}\u{308}", "\u{378}"]),
-            ("\u{11A8}\u{20}", &["\u{11A8}", "\u{20}"]),
-            ("\u{11A8}\u{308}\u{20}", &["\u{11A8}\u{308}", "\u{20}"]),
-            ("\u{11A8}\u{D}", &["\u{11A8}", "\u{D}"]),
-            ("\u{11A8}\u{308}\u{D}", &["\u{11A8}\u{308}", "\u{D}"]),
-            ("\u{11A8}\u{A}", &["\u{11A8}", "\u{A}"]),
-            ("\u{11A8}\u{308}\u{A}", &["\u{11A8}\u{308}", "\u{A}"]),
-            ("\u{11A8}\u{1}", &["\u{11A8}", "\u{1}"]),
-            ("\u{11A8}\u{308}\u{1}", &["\u{11A8}\u{308}", "\u{1}"]),
-            ("\u{11A8}\u{300}", &["\u{11A8}\u{300}"]),
-            ("\u{11A8}\u{308}\u{300}", &["\u{11A8}\u{308}\u{300}"]),
-            ("\u{11A8}\u{1100}", &["\u{11A8}", "\u{1100}"]),
-            ("\u{11A8}\u{308}\u{1100}", &["\u{11A8}\u{308}", "\u{1100}"]),
-            ("\u{11A8}\u{1160}", &["\u{11A8}", "\u{1160}"]),
-            ("\u{11A8}\u{308}\u{1160}", &["\u{11A8}\u{308}", "\u{1160}"]),
-            ("\u{11A8}\u{11A8}", &["\u{11A8}\u{11A8}"]),
-            ("\u{11A8}\u{308}\u{11A8}", &["\u{11A8}\u{308}", "\u{11A8}"]),
-            ("\u{11A8}\u{AC00}", &["\u{11A8}", "\u{AC00}"]),
-            ("\u{11A8}\u{308}\u{AC00}", &["\u{11A8}\u{308}", "\u{AC00}"]),
-            ("\u{11A8}\u{AC01}", &["\u{11A8}", "\u{AC01}"]),
-            ("\u{11A8}\u{308}\u{AC01}", &["\u{11A8}\u{308}", "\u{AC01}"]),
-            ("\u{11A8}\u{1F1E6}", &["\u{11A8}", "\u{1F1E6}"]),
-            ("\u{11A8}\u{308}\u{1F1E6}", &["\u{11A8}\u{308}", "\u{1F1E6}"]),
-            ("\u{11A8}\u{378}", &["\u{11A8}", "\u{378}"]),
-            ("\u{11A8}\u{308}\u{378}", &["\u{11A8}\u{308}", "\u{378}"]),
-            ("\u{AC00}\u{20}", &["\u{AC00}", "\u{20}"]),
-            ("\u{AC00}\u{308}\u{20}", &["\u{AC00}\u{308}", "\u{20}"]),
-            ("\u{AC00}\u{D}", &["\u{AC00}", "\u{D}"]),
-            ("\u{AC00}\u{308}\u{D}", &["\u{AC00}\u{308}", "\u{D}"]),
-            ("\u{AC00}\u{A}", &["\u{AC00}", "\u{A}"]),
-            ("\u{AC00}\u{308}\u{A}", &["\u{AC00}\u{308}", "\u{A}"]),
-            ("\u{AC00}\u{1}", &["\u{AC00}", "\u{1}"]),
-            ("\u{AC00}\u{308}\u{1}", &["\u{AC00}\u{308}", "\u{1}"]),
-            ("\u{AC00}\u{300}", &["\u{AC00}\u{300}"]),
-            ("\u{AC00}\u{308}\u{300}", &["\u{AC00}\u{308}\u{300}"]),
-            ("\u{AC00}\u{1100}", &["\u{AC00}", "\u{1100}"]),
-            ("\u{AC00}\u{308}\u{1100}", &["\u{AC00}\u{308}", "\u{1100}"]),
-            ("\u{AC00}\u{1160}", &["\u{AC00}\u{1160}"]),
-            ("\u{AC00}\u{308}\u{1160}", &["\u{AC00}\u{308}", "\u{1160}"]),
-            ("\u{AC00}\u{11A8}", &["\u{AC00}\u{11A8}"]),
-            ("\u{AC00}\u{308}\u{11A8}", &["\u{AC00}\u{308}", "\u{11A8}"]),
-            ("\u{AC00}\u{AC00}", &["\u{AC00}", "\u{AC00}"]),
-            ("\u{AC00}\u{308}\u{AC00}", &["\u{AC00}\u{308}", "\u{AC00}"]),
-            ("\u{AC00}\u{AC01}", &["\u{AC00}", "\u{AC01}"]),
-            ("\u{AC00}\u{308}\u{AC01}", &["\u{AC00}\u{308}", "\u{AC01}"]),
-            ("\u{AC00}\u{1F1E6}", &["\u{AC00}", "\u{1F1E6}"]),
-            ("\u{AC00}\u{308}\u{1F1E6}", &["\u{AC00}\u{308}", "\u{1F1E6}"]),
-            ("\u{AC00}\u{378}", &["\u{AC00}", "\u{378}"]),
-            ("\u{AC00}\u{308}\u{378}", &["\u{AC00}\u{308}", "\u{378}"]),
-            ("\u{AC01}\u{20}", &["\u{AC01}", "\u{20}"]),
-            ("\u{AC01}\u{308}\u{20}", &["\u{AC01}\u{308}", "\u{20}"]),
-            ("\u{AC01}\u{D}", &["\u{AC01}", "\u{D}"]),
-            ("\u{AC01}\u{308}\u{D}", &["\u{AC01}\u{308}", "\u{D}"]),
-            ("\u{AC01}\u{A}", &["\u{AC01}", "\u{A}"]),
-            ("\u{AC01}\u{308}\u{A}", &["\u{AC01}\u{308}", "\u{A}"]),
-            ("\u{AC01}\u{1}", &["\u{AC01}", "\u{1}"]),
-            ("\u{AC01}\u{308}\u{1}", &["\u{AC01}\u{308}", "\u{1}"]),
-            ("\u{AC01}\u{300}", &["\u{AC01}\u{300}"]),
-            ("\u{AC01}\u{308}\u{300}", &["\u{AC01}\u{308}\u{300}"]),
-            ("\u{AC01}\u{1100}", &["\u{AC01}", "\u{1100}"]),
-            ("\u{AC01}\u{308}\u{1100}", &["\u{AC01}\u{308}", "\u{1100}"]),
-            ("\u{AC01}\u{1160}", &["\u{AC01}", "\u{1160}"]),
-            ("\u{AC01}\u{308}\u{1160}", &["\u{AC01}\u{308}", "\u{1160}"]),
-            ("\u{AC01}\u{11A8}", &["\u{AC01}\u{11A8}"]),
-            ("\u{AC01}\u{308}\u{11A8}", &["\u{AC01}\u{308}", "\u{11A8}"]),
-            ("\u{AC01}\u{AC00}", &["\u{AC01}", "\u{AC00}"]),
-            ("\u{AC01}\u{308}\u{AC00}", &["\u{AC01}\u{308}", "\u{AC00}"]),
-            ("\u{AC01}\u{AC01}", &["\u{AC01}", "\u{AC01}"]),
-            ("\u{AC01}\u{308}\u{AC01}", &["\u{AC01}\u{308}", "\u{AC01}"]),
-            ("\u{AC01}\u{1F1E6}", &["\u{AC01}", "\u{1F1E6}"]),
-            ("\u{AC01}\u{308}\u{1F1E6}", &["\u{AC01}\u{308}", "\u{1F1E6}"]),
-            ("\u{AC01}\u{378}", &["\u{AC01}", "\u{378}"]),
-            ("\u{AC01}\u{308}\u{378}", &["\u{AC01}\u{308}", "\u{378}"]),
-            ("\u{1F1E6}\u{20}", &["\u{1F1E6}", "\u{20}"]),
-            ("\u{1F1E6}\u{308}\u{20}", &["\u{1F1E6}\u{308}", "\u{20}"]),
-            ("\u{1F1E6}\u{D}", &["\u{1F1E6}", "\u{D}"]),
-            ("\u{1F1E6}\u{308}\u{D}", &["\u{1F1E6}\u{308}", "\u{D}"]),
-            ("\u{1F1E6}\u{A}", &["\u{1F1E6}", "\u{A}"]),
-            ("\u{1F1E6}\u{308}\u{A}", &["\u{1F1E6}\u{308}", "\u{A}"]),
-            ("\u{1F1E6}\u{1}", &["\u{1F1E6}", "\u{1}"]),
-            ("\u{1F1E6}\u{308}\u{1}", &["\u{1F1E6}\u{308}", "\u{1}"]),
-            ("\u{1F1E6}\u{300}", &["\u{1F1E6}\u{300}"]),
-            ("\u{1F1E6}\u{308}\u{300}", &["\u{1F1E6}\u{308}\u{300}"]),
-            ("\u{1F1E6}\u{1100}", &["\u{1F1E6}", "\u{1100}"]),
-            ("\u{1F1E6}\u{308}\u{1100}", &["\u{1F1E6}\u{308}", "\u{1100}"]),
-            ("\u{1F1E6}\u{1160}", &["\u{1F1E6}", "\u{1160}"]),
-            ("\u{1F1E6}\u{308}\u{1160}", &["\u{1F1E6}\u{308}", "\u{1160}"]),
-            ("\u{1F1E6}\u{11A8}", &["\u{1F1E6}", "\u{11A8}"]),
-            ("\u{1F1E6}\u{308}\u{11A8}", &["\u{1F1E6}\u{308}", "\u{11A8}"]),
-            ("\u{1F1E6}\u{AC00}", &["\u{1F1E6}", "\u{AC00}"]),
-            ("\u{1F1E6}\u{308}\u{AC00}", &["\u{1F1E6}\u{308}", "\u{AC00}"]),
-            ("\u{1F1E6}\u{AC01}", &["\u{1F1E6}", "\u{AC01}"]),
-            ("\u{1F1E6}\u{308}\u{AC01}", &["\u{1F1E6}\u{308}", "\u{AC01}"]),
-            ("\u{1F1E6}\u{1F1E6}", &["\u{1F1E6}\u{1F1E6}"]),
-            ("\u{1F1E6}\u{308}\u{1F1E6}", &["\u{1F1E6}\u{308}", "\u{1F1E6}"]),
-            ("\u{1F1E6}\u{378}", &["\u{1F1E6}", "\u{378}"]),
-            ("\u{1F1E6}\u{308}\u{378}", &["\u{1F1E6}\u{308}", "\u{378}"]),
-            ("\u{378}\u{20}", &["\u{378}", "\u{20}"]),
-            ("\u{378}\u{308}\u{20}", &["\u{378}\u{308}", "\u{20}"]),
-            ("\u{378}\u{D}", &["\u{378}", "\u{D}"]),
-            ("\u{378}\u{308}\u{D}", &["\u{378}\u{308}", "\u{D}"]),
-            ("\u{378}\u{A}", &["\u{378}", "\u{A}"]),
-            ("\u{378}\u{308}\u{A}", &["\u{378}\u{308}", "\u{A}"]),
-            ("\u{378}\u{1}", &["\u{378}", "\u{1}"]),
-            ("\u{378}\u{308}\u{1}", &["\u{378}\u{308}", "\u{1}"]),
-            ("\u{378}\u{300}", &["\u{378}\u{300}"]),
-            ("\u{378}\u{308}\u{300}", &["\u{378}\u{308}\u{300}"]),
-            ("\u{378}\u{1100}", &["\u{378}", "\u{1100}"]),
-            ("\u{378}\u{308}\u{1100}", &["\u{378}\u{308}", "\u{1100}"]),
-            ("\u{378}\u{1160}", &["\u{378}", "\u{1160}"]),
-            ("\u{378}\u{308}\u{1160}", &["\u{378}\u{308}", "\u{1160}"]),
-            ("\u{378}\u{11A8}", &["\u{378}", "\u{11A8}"]),
-            ("\u{378}\u{308}\u{11A8}", &["\u{378}\u{308}", "\u{11A8}"]),
-            ("\u{378}\u{AC00}", &["\u{378}", "\u{AC00}"]),
-            ("\u{378}\u{308}\u{AC00}", &["\u{378}\u{308}", "\u{AC00}"]),
-            ("\u{378}\u{AC01}", &["\u{378}", "\u{AC01}"]),
-            ("\u{378}\u{308}\u{AC01}", &["\u{378}\u{308}", "\u{AC01}"]),
-            ("\u{378}\u{1F1E6}", &["\u{378}", "\u{1F1E6}"]),
-            ("\u{378}\u{308}\u{1F1E6}", &["\u{378}\u{308}", "\u{1F1E6}"]),
-            ("\u{378}\u{378}", &["\u{378}", "\u{378}"]),
-            ("\u{378}\u{308}\u{378}", &["\u{378}\u{308}", "\u{378}"]),
-            ("\u{61}\u{1F1E6}\u{62}", &["\u{61}", "\u{1F1E6}", "\u{62}"]),
-            ("\u{1F1F7}\u{1F1FA}", &["\u{1F1F7}\u{1F1FA}"]),
-            ("\u{1F1F7}\u{1F1FA}\u{1F1F8}", &["\u{1F1F7}\u{1F1FA}\u{1F1F8}"]),
-            ("\u{1F1F7}\u{1F1FA}\u{1F1F8}\u{1F1EA}",
-            &["\u{1F1F7}\u{1F1FA}\u{1F1F8}\u{1F1EA}"]),
-            ("\u{1F1F7}\u{1F1FA}\u{200B}\u{1F1F8}\u{1F1EA}",
-             &["\u{1F1F7}\u{1F1FA}", "\u{200B}", "\u{1F1F8}\u{1F1EA}"]),
-            ("\u{1F1E6}\u{1F1E7}\u{1F1E8}", &["\u{1F1E6}\u{1F1E7}\u{1F1E8}"]),
-            ("\u{1F1E6}\u{200D}\u{1F1E7}\u{1F1E8}", &["\u{1F1E6}\u{200D}",
-             "\u{1F1E7}\u{1F1E8}"]),
-            ("\u{1F1E6}\u{1F1E7}\u{200D}\u{1F1E8}",
-             &["\u{1F1E6}\u{1F1E7}\u{200D}", "\u{1F1E8}"]),
-            ("\u{20}\u{200D}\u{646}", &["\u{20}\u{200D}", "\u{646}"]),
-            ("\u{646}\u{200D}\u{20}", &["\u{646}\u{200D}", "\u{20}"]),
-        ];
-
-        let test_diff: [(_, &[_], &[_]); 23] = [
-            ("\u{20}\u{903}", &["\u{20}\u{903}"], &["\u{20}", "\u{903}"]), ("\u{20}\u{308}\u{903}",
-            &["\u{20}\u{308}\u{903}"], &["\u{20}\u{308}", "\u{903}"]), ("\u{D}\u{308}\u{903}",
-            &["\u{D}", "\u{308}\u{903}"], &["\u{D}", "\u{308}", "\u{903}"]), ("\u{A}\u{308}\u{903}",
-            &["\u{A}", "\u{308}\u{903}"], &["\u{A}", "\u{308}", "\u{903}"]), ("\u{1}\u{308}\u{903}",
-            &["\u{1}", "\u{308}\u{903}"], &["\u{1}", "\u{308}", "\u{903}"]), ("\u{300}\u{903}",
-            &["\u{300}\u{903}"], &["\u{300}", "\u{903}"]), ("\u{300}\u{308}\u{903}",
-            &["\u{300}\u{308}\u{903}"], &["\u{300}\u{308}", "\u{903}"]), ("\u{903}\u{903}",
-            &["\u{903}\u{903}"], &["\u{903}", "\u{903}"]), ("\u{903}\u{308}\u{903}",
-            &["\u{903}\u{308}\u{903}"], &["\u{903}\u{308}", "\u{903}"]), ("\u{1100}\u{903}",
-            &["\u{1100}\u{903}"], &["\u{1100}", "\u{903}"]), ("\u{1100}\u{308}\u{903}",
-            &["\u{1100}\u{308}\u{903}"], &["\u{1100}\u{308}", "\u{903}"]), ("\u{1160}\u{903}",
-            &["\u{1160}\u{903}"], &["\u{1160}", "\u{903}"]), ("\u{1160}\u{308}\u{903}",
-            &["\u{1160}\u{308}\u{903}"], &["\u{1160}\u{308}", "\u{903}"]), ("\u{11A8}\u{903}",
-            &["\u{11A8}\u{903}"], &["\u{11A8}", "\u{903}"]), ("\u{11A8}\u{308}\u{903}",
-            &["\u{11A8}\u{308}\u{903}"], &["\u{11A8}\u{308}", "\u{903}"]), ("\u{AC00}\u{903}",
-            &["\u{AC00}\u{903}"], &["\u{AC00}", "\u{903}"]), ("\u{AC00}\u{308}\u{903}",
-            &["\u{AC00}\u{308}\u{903}"], &["\u{AC00}\u{308}", "\u{903}"]), ("\u{AC01}\u{903}",
-            &["\u{AC01}\u{903}"], &["\u{AC01}", "\u{903}"]), ("\u{AC01}\u{308}\u{903}",
-            &["\u{AC01}\u{308}\u{903}"], &["\u{AC01}\u{308}", "\u{903}"]), ("\u{1F1E6}\u{903}",
-            &["\u{1F1E6}\u{903}"], &["\u{1F1E6}", "\u{903}"]), ("\u{1F1E6}\u{308}\u{903}",
-            &["\u{1F1E6}\u{308}\u{903}"], &["\u{1F1E6}\u{308}", "\u{903}"]), ("\u{378}\u{903}",
-            &["\u{378}\u{903}"], &["\u{378}", "\u{903}"]), ("\u{378}\u{308}\u{903}",
-            &["\u{378}\u{308}\u{903}"], &["\u{378}\u{308}", "\u{903}"]),
-        ];
-
-        for &(s, g) in &test_same[..] {
-            // test forward iterator
-            assert!(order::equals(s.graphemes(true), g.iter().cloned()));
-            assert!(order::equals(s.graphemes(false), g.iter().cloned()));
-
-            // test reverse iterator
-            assert!(order::equals(s.graphemes(true).rev(), g.iter().rev().cloned()));
-            assert!(order::equals(s.graphemes(false).rev(), g.iter().rev().cloned()));
-        }
-
-        for &(s, gt, gf) in &test_diff {
-            // test forward iterator
-            assert!(order::equals(s.graphemes(true), gt.iter().cloned()));
-            assert!(order::equals(s.graphemes(false), gf.iter().cloned()));
-
-            // test reverse iterator
-            assert!(order::equals(s.graphemes(true).rev(), gt.iter().rev().cloned()));
-            assert!(order::equals(s.graphemes(false).rev(), gf.iter().rev().cloned()));
-        }
-
-        // test the indices iterators
-        let s = "a̐éö̲\r\n";
-        let gr_inds = s.grapheme_indices(true).collect::<Vec<(usize, &str)>>();
-        let b: &[_] = &[(0, "a̐"), (3, "é"), (6, "ö̲"), (11, "\r\n")];
-        assert_eq!(gr_inds, b);
-        let gr_inds = s.grapheme_indices(true).rev().collect::<Vec<(usize, &str)>>();
-        let b: &[_] = &[(11, "\r\n"), (6, "ö̲"), (3, "é"), (0, "a̐")];
-        assert_eq!(gr_inds, b);
-        let mut gr_inds_iter = s.grapheme_indices(true);
-        {
-            let gr_inds = gr_inds_iter.by_ref();
-            let e1 = gr_inds.size_hint();
-            assert_eq!(e1, (1, Some(13)));
-            let c = gr_inds.count();
-            assert_eq!(c, 4);
-        }
-        let e2 = gr_inds_iter.size_hint();
-        assert_eq!(e2, (0, Some(0)));
-
-        // make sure the reverse iterator does the right thing with "\n" at beginning of string
-        let s = "\n\r\n\r";
-        let gr = s.graphemes(true).rev().collect::<Vec<&str>>();
-        let b: &[_] = &["\r", "\r\n", "\n"];
-        assert_eq!(gr, b);
-    }
-
-    #[test]
-    fn test_split_strator() {
-        fn t(s: &str, sep: &str, u: &[&str]) {
-            let v: Vec<&str> = s.split_str(sep).collect();
-            assert_eq!(v, u);
-        }
-        t("--1233345--", "12345", &["--1233345--"]);
-        t("abc::hello::there", "::", &["abc", "hello", "there"]);
-        t("::hello::there", "::", &["", "hello", "there"]);
-        t("hello::there::", "::", &["hello", "there", ""]);
-        t("::hello::there::", "::", &["", "hello", "there", ""]);
-        t("ประเทศไทย中华Việt Nam", "中华", &["ประเทศไทย", "Việt Nam"]);
-        t("zzXXXzzYYYzz", "zz", &["", "XXX", "YYY", ""]);
-        t("zzXXXzYYYz", "XXX", &["zz", "zYYYz"]);
-        t(".XXX.YYY.", ".", &["", "XXX", "YYY", ""]);
-        t("", ".", &[""]);
-        t("zz", "zz", &["",""]);
-        t("ok", "z", &["ok"]);
-        t("zzz", "zz", &["","z"]);
-        t("zzzzz", "zz", &["","","z"]);
-    }
-
-    #[test]
-    fn test_str_default() {
-        use core::default::Default;
-        fn t<S: Default + Str>() {
-            let s: S = Default::default();
-            assert_eq!(s.as_slice(), "");
-        }
-
-        t::<&str>();
-        t::<String>();
-    }
-
-    #[test]
-    fn test_str_container() {
-        fn sum_len(v: &[&str]) -> usize {
-            v.iter().map(|x| x.len()).sum()
-        }
-
-        let s = String::from_str("01234");
-        assert_eq!(5, sum_len(&["012", "", "34"]));
-        assert_eq!(5, sum_len(&[&String::from_str("01"),
-                                &String::from_str("2"),
-                                &String::from_str("34"),
-                                &String::from_str("")]));
-        assert_eq!(5, sum_len(&[&s]));
-    }
-
-    #[test]
-    fn test_str_from_utf8() {
-        let xs = b"hello";
-        assert_eq!(from_utf8(xs), Ok("hello"));
-
-        let xs = "ศไทย中华Việt Nam".as_bytes();
-        assert_eq!(from_utf8(xs), Ok("ศไทย中华Việt Nam"));
-
-        let xs = b"hello\xFF";
-        assert_eq!(from_utf8(xs), Err(Utf8Error::TooShort));
-    }
-}
-
-#[cfg(test)]
-mod bench {
-    use super::*;
-    use prelude::{SliceExt, IteratorExt, SliceConcatExt};
-    use test::Bencher;
-    use test::black_box;
-
-    #[bench]
-    fn char_iterator(b: &mut Bencher) {
-        let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
-
-        b.iter(|| s.chars().count());
-    }
-
-    #[bench]
-    fn char_iterator_for(b: &mut Bencher) {
-        let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
-
-        b.iter(|| {
-            for ch in s.chars() { black_box(ch); }
-        });
-    }
-
-    #[bench]
-    fn char_iterator_ascii(b: &mut Bencher) {
-        let s = "Mary had a little lamb, Little lamb
-        Mary had a little lamb, Little lamb
-        Mary had a little lamb, Little lamb
-        Mary had a little lamb, Little lamb
-        Mary had a little lamb, Little lamb
-        Mary had a little lamb, Little lamb";
-
-        b.iter(|| s.chars().count());
-    }
-
-    #[bench]
-    fn char_iterator_rev(b: &mut Bencher) {
-        let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
-
-        b.iter(|| s.chars().rev().count());
-    }
-
-    #[bench]
-    fn char_iterator_rev_for(b: &mut Bencher) {
-        let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
-
-        b.iter(|| {
-            for ch in s.chars().rev() { black_box(ch); }
-        });
-    }
-
-    #[bench]
-    fn char_indicesator(b: &mut Bencher) {
-        let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
-        let len = s.chars().count();
-
-        b.iter(|| assert_eq!(s.char_indices().count(), len));
-    }
-
-    #[bench]
-    fn char_indicesator_rev(b: &mut Bencher) {
-        let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
-        let len = s.chars().count();
-
-        b.iter(|| assert_eq!(s.char_indices().rev().count(), len));
-    }
-
-    #[bench]
-    fn split_unicode_ascii(b: &mut Bencher) {
-        let s = "ประเทศไทย中华Việt Namประเทศไทย中华Việt Nam";
-
-        b.iter(|| assert_eq!(s.split('V').count(), 3));
-    }
-
-    #[bench]
-    fn split_ascii(b: &mut Bencher) {
-        let s = "Mary had a little lamb, Little lamb, little-lamb.";
-        let len = s.split(' ').count();
-
-        b.iter(|| assert_eq!(s.split(' ').count(), len));
-    }
-
-    #[bench]
-    fn split_extern_fn(b: &mut Bencher) {
-        let s = "Mary had a little lamb, Little lamb, little-lamb.";
-        let len = s.split(' ').count();
-        fn pred(c: char) -> bool { c == ' ' }
-
-        b.iter(|| assert_eq!(s.split(pred).count(), len));
-    }
-
-    #[bench]
-    fn split_closure(b: &mut Bencher) {
-        let s = "Mary had a little lamb, Little lamb, little-lamb.";
-        let len = s.split(' ').count();
-
-        b.iter(|| assert_eq!(s.split(|c: char| c == ' ').count(), len));
-    }
-
-    #[bench]
-    fn split_slice(b: &mut Bencher) {
-        let s = "Mary had a little lamb, Little lamb, little-lamb.";
-        let len = s.split(' ').count();
-
-        let c: &[char] = &[' '];
-        b.iter(|| assert_eq!(s.split(c).count(), len));
-    }
-
-    #[bench]
-    fn bench_connect(b: &mut Bencher) {
-        let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
-        let sep = "→";
-        let v = vec![s, s, s, s, s, s, s, s, s, s];
-        b.iter(|| {
-            assert_eq!(v.connect(sep).len(), s.len() * 10 + sep.len() * 9);
-        })
-    }
-
-    #[bench]
-    fn bench_contains_short_short(b: &mut Bencher) {
-        let haystack = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
-        let needle = "sit";
-
-        b.iter(|| {
-            assert!(haystack.contains(needle));
-        })
-    }
-
-    #[bench]
-    fn bench_contains_short_long(b: &mut Bencher) {
-        let haystack = "\
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse quis lorem sit amet dolor \
-ultricies condimentum. Praesent iaculis purus elit, ac malesuada quam malesuada in. Duis sed orci \
-eros. Suspendisse sit amet magna mollis, mollis nunc luctus, imperdiet mi. Integer fringilla non \
-sem ut lacinia. Fusce varius tortor a risus porttitor hendrerit. Morbi mauris dui, ultricies nec \
-tempus vel, gravida nec quam.
-
-In est dui, tincidunt sed tempus interdum, adipiscing laoreet ante. Etiam tempor, tellus quis \
-sagittis interdum, nulla purus mattis sem, quis auctor erat odio ac tellus. In nec nunc sit amet \
-diam volutpat molestie at sed ipsum. Vestibulum laoreet consequat vulputate. Integer accumsan \
-lorem ac dignissim placerat. Suspendisse convallis faucibus lorem. Aliquam erat volutpat. In vel \
-eleifend felis. Sed suscipit nulla lorem, sed mollis est sollicitudin et. Nam fermentum egestas \
-interdum. Curabitur ut nisi justo.
-
-Sed sollicitudin ipsum tellus, ut condimentum leo eleifend nec. Cras ut velit ante. Phasellus nec \
-mollis odio. Mauris molestie erat in arcu mattis, at aliquet dolor vehicula. Quisque malesuada \
-lectus sit amet nisi pretium, a condimentum ipsum porta. Morbi at dapibus diam. Praesent egestas \
-est sed risus elementum, eu rutrum metus ultrices. Etiam fermentum consectetur magna, id rutrum \
-felis accumsan a. Aliquam ut pellentesque libero. Sed mi nulla, lobortis eu tortor id, suscipit \
-ultricies neque. Morbi iaculis sit amet risus at iaculis. Praesent eget ligula quis turpis \
-feugiat suscipit vel non arcu. Interdum et malesuada fames ac ante ipsum primis in faucibus. \
-Aliquam sit amet placerat lorem.
-
-Cras a lacus vel ante posuere elementum. Nunc est leo, bibendum ut facilisis vel, bibendum at \
-mauris. Nullam adipiscing diam vel odio ornare, luctus adipiscing mi luctus. Nulla facilisi. \
-Mauris adipiscing bibendum neque, quis adipiscing lectus tempus et. Sed feugiat erat et nisl \
-lobortis pharetra. Donec vitae erat enim. Nullam sit amet felis et quam lacinia tincidunt. Aliquam \
-suscipit dapibus urna. Sed volutpat urna in magna pulvinar volutpat. Phasellus nec tellus ac diam \
-cursus accumsan.
-
-Nam lectus enim, dapibus non nisi tempor, consectetur convallis massa. Maecenas eleifend dictum \
-feugiat. Etiam quis mauris vel risus luctus mattis a a nunc. Nullam orci quam, imperdiet id \
-vehicula in, porttitor ut nibh. Duis sagittis adipiscing nisl vitae congue. Donec mollis risus eu \
-leo suscipit, varius porttitor nulla porta. Pellentesque ut sem nec nisi euismod vehicula. Nulla \
-malesuada sollicitudin quam eu fermentum.";
-        let needle = "english";
-
-        b.iter(|| {
-            assert!(!haystack.contains(needle));
-        })
-    }
-
-    #[bench]
-    fn bench_contains_bad_naive(b: &mut Bencher) {
-        let haystack = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
-        let needle = "aaaaaaaab";
-
-        b.iter(|| {
-            assert!(!haystack.contains(needle));
-        })
-    }
-
-    #[bench]
-    fn bench_contains_equal(b: &mut Bencher) {
-        let haystack = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
-        let needle = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
-
-        b.iter(|| {
-            assert!(haystack.contains(needle));
-        })
-    }
-}
index 64dec9731ec21cc4fd5afb56e7d8a62aaf6757cb..6d1b929cf601ce90299d4bcbfef09869c3dd1ecc 100644 (file)
@@ -1014,450 +1014,3 @@ fn write_str(&mut self, s: &str) -> fmt::Result {
         Ok(())
     }
 }
-
-#[cfg(test)]
-mod tests {
-    use prelude::*;
-    use test::Bencher;
-
-    use str::Utf8Error;
-    use core::iter::repeat;
-    use super::{as_string, CowString};
-
-    #[test]
-    fn test_as_string() {
-        let x = "foo";
-        assert_eq!(x, &**as_string(x));
-    }
-
-    #[test]
-    fn test_from_str() {
-      let owned: Option<::std::string::String> = "string".parse().ok();
-      assert_eq!(owned.as_ref().map(|s| &**s), Some("string"));
-    }
-
-    #[test]
-    fn test_unsized_to_string() {
-        let s: &str = "abc";
-        let _: String = (*s).to_string();
-    }
-
-    #[test]
-    fn test_from_utf8() {
-        let xs = b"hello".to_vec();
-        assert_eq!(String::from_utf8(xs).unwrap(),
-                   String::from_str("hello"));
-
-        let xs = "ศไทย中华Việt Nam".as_bytes().to_vec();
-        assert_eq!(String::from_utf8(xs).unwrap(),
-                   String::from_str("ศไทย中华Việt Nam"));
-
-        let xs = b"hello\xFF".to_vec();
-        let err = String::from_utf8(xs).err().unwrap();
-        assert_eq!(err.utf8_error(), Utf8Error::TooShort);
-        assert_eq!(err.into_bytes(), b"hello\xff".to_vec());
-    }
-
-    #[test]
-    fn test_from_utf8_lossy() {
-        let xs = b"hello";
-        let ys: CowString = "hello".into_cow();
-        assert_eq!(String::from_utf8_lossy(xs), ys);
-
-        let xs = "ศไทย中华Việt Nam".as_bytes();
-        let ys: CowString = "ศไทย中华Việt Nam".into_cow();
-        assert_eq!(String::from_utf8_lossy(xs), ys);
-
-        let xs = b"Hello\xC2 There\xFF Goodbye";
-        assert_eq!(String::from_utf8_lossy(xs),
-                   String::from_str("Hello\u{FFFD} There\u{FFFD} Goodbye").into_cow());
-
-        let xs = b"Hello\xC0\x80 There\xE6\x83 Goodbye";
-        assert_eq!(String::from_utf8_lossy(xs),
-                   String::from_str("Hello\u{FFFD}\u{FFFD} There\u{FFFD} Goodbye").into_cow());
-
-        let xs = b"\xF5foo\xF5\x80bar";
-        assert_eq!(String::from_utf8_lossy(xs),
-                   String::from_str("\u{FFFD}foo\u{FFFD}\u{FFFD}bar").into_cow());
-
-        let xs = b"\xF1foo\xF1\x80bar\xF1\x80\x80baz";
-        assert_eq!(String::from_utf8_lossy(xs),
-                   String::from_str("\u{FFFD}foo\u{FFFD}bar\u{FFFD}baz").into_cow());
-
-        let xs = b"\xF4foo\xF4\x80bar\xF4\xBFbaz";
-        assert_eq!(String::from_utf8_lossy(xs),
-                   String::from_str("\u{FFFD}foo\u{FFFD}bar\u{FFFD}\u{FFFD}baz").into_cow());
-
-        let xs = b"\xF0\x80\x80\x80foo\xF0\x90\x80\x80bar";
-        assert_eq!(String::from_utf8_lossy(xs), String::from_str("\u{FFFD}\u{FFFD}\u{FFFD}\u{FFFD}\
-                                               foo\u{10000}bar").into_cow());
-
-        // surrogates
-        let xs = b"\xED\xA0\x80foo\xED\xBF\xBFbar";
-        assert_eq!(String::from_utf8_lossy(xs), String::from_str("\u{FFFD}\u{FFFD}\u{FFFD}foo\
-                                               \u{FFFD}\u{FFFD}\u{FFFD}bar").into_cow());
-    }
-
-    #[test]
-    fn test_from_utf16() {
-        let pairs =
-            [(String::from_str("𐍅𐌿𐌻𐍆𐌹𐌻𐌰\n"),
-              vec![0xd800, 0xdf45, 0xd800, 0xdf3f,
-                0xd800, 0xdf3b, 0xd800, 0xdf46,
-                0xd800, 0xdf39, 0xd800, 0xdf3b,
-                0xd800, 0xdf30, 0x000a]),
-
-             (String::from_str("𐐒𐑉𐐮𐑀𐐲𐑋 𐐏𐐲𐑍\n"),
-              vec![0xd801, 0xdc12, 0xd801,
-                0xdc49, 0xd801, 0xdc2e, 0xd801,
-                0xdc40, 0xd801, 0xdc32, 0xd801,
-                0xdc4b, 0x0020, 0xd801, 0xdc0f,
-                0xd801, 0xdc32, 0xd801, 0xdc4d,
-                0x000a]),
-
-             (String::from_str("𐌀𐌖𐌋𐌄𐌑𐌉·𐌌𐌄𐌕𐌄𐌋𐌉𐌑\n"),
-              vec![0xd800, 0xdf00, 0xd800, 0xdf16,
-                0xd800, 0xdf0b, 0xd800, 0xdf04,
-                0xd800, 0xdf11, 0xd800, 0xdf09,
-                0x00b7, 0xd800, 0xdf0c, 0xd800,
-                0xdf04, 0xd800, 0xdf15, 0xd800,
-                0xdf04, 0xd800, 0xdf0b, 0xd800,
-                0xdf09, 0xd800, 0xdf11, 0x000a ]),
-
-             (String::from_str("𐒋𐒘𐒈𐒑𐒛𐒒 𐒕𐒓 𐒈𐒚𐒍 𐒏𐒜𐒒𐒖𐒆 𐒕𐒆\n"),
-              vec![0xd801, 0xdc8b, 0xd801, 0xdc98,
-                0xd801, 0xdc88, 0xd801, 0xdc91,
-                0xd801, 0xdc9b, 0xd801, 0xdc92,
-                0x0020, 0xd801, 0xdc95, 0xd801,
-                0xdc93, 0x0020, 0xd801, 0xdc88,
-                0xd801, 0xdc9a, 0xd801, 0xdc8d,
-                0x0020, 0xd801, 0xdc8f, 0xd801,
-                0xdc9c, 0xd801, 0xdc92, 0xd801,
-                0xdc96, 0xd801, 0xdc86, 0x0020,
-                0xd801, 0xdc95, 0xd801, 0xdc86,
-                0x000a ]),
-             // Issue #12318, even-numbered non-BMP planes
-             (String::from_str("\u{20000}"),
-              vec![0xD840, 0xDC00])];
-
-        for p in &pairs {
-            let (s, u) = (*p).clone();
-            let s_as_utf16 = s.utf16_units().collect::<Vec<u16>>();
-            let u_as_string = String::from_utf16(&u).unwrap();
-
-            assert!(::unicode::str::is_utf16(&u));
-            assert_eq!(s_as_utf16, u);
-
-            assert_eq!(u_as_string, s);
-            assert_eq!(String::from_utf16_lossy(&u), s);
-
-            assert_eq!(String::from_utf16(&s_as_utf16).unwrap(), s);
-            assert_eq!(u_as_string.utf16_units().collect::<Vec<u16>>(), u);
-        }
-    }
-
-    #[test]
-    fn test_utf16_invalid() {
-        // completely positive cases tested above.
-        // lead + eof
-        assert!(String::from_utf16(&[0xD800]).is_err());
-        // lead + lead
-        assert!(String::from_utf16(&[0xD800, 0xD800]).is_err());
-
-        // isolated trail
-        assert!(String::from_utf16(&[0x0061, 0xDC00]).is_err());
-
-        // general
-        assert!(String::from_utf16(&[0xD800, 0xd801, 0xdc8b, 0xD800]).is_err());
-    }
-
-    #[test]
-    fn test_from_utf16_lossy() {
-        // completely positive cases tested above.
-        // lead + eof
-        assert_eq!(String::from_utf16_lossy(&[0xD800]), String::from_str("\u{FFFD}"));
-        // lead + lead
-        assert_eq!(String::from_utf16_lossy(&[0xD800, 0xD800]),
-                   String::from_str("\u{FFFD}\u{FFFD}"));
-
-        // isolated trail
-        assert_eq!(String::from_utf16_lossy(&[0x0061, 0xDC00]), String::from_str("a\u{FFFD}"));
-
-        // general
-        assert_eq!(String::from_utf16_lossy(&[0xD800, 0xd801, 0xdc8b, 0xD800]),
-                   String::from_str("\u{FFFD}𐒋\u{FFFD}"));
-    }
-
-    #[test]
-    fn test_push_bytes() {
-        let mut s = String::from_str("ABC");
-        unsafe {
-            let mv = s.as_mut_vec();
-            mv.push_all(&[b'D']);
-        }
-        assert_eq!(s, "ABCD");
-    }
-
-    #[test]
-    fn test_push_str() {
-        let mut s = String::new();
-        s.push_str("");
-        assert_eq!(&s[0..], "");
-        s.push_str("abc");
-        assert_eq!(&s[0..], "abc");
-        s.push_str("ประเทศไทย中华Việt Nam");
-        assert_eq!(&s[0..], "abcประเทศไทย中华Việt Nam");
-    }
-
-    #[test]
-    fn test_push() {
-        let mut data = String::from_str("ประเทศไทย中");
-        data.push('华');
-        data.push('b'); // 1 byte
-        data.push('¢'); // 2 byte
-        data.push('€'); // 3 byte
-        data.push('𤭢'); // 4 byte
-        assert_eq!(data, "ประเทศไทย中华b¢€𤭢");
-    }
-
-    #[test]
-    fn test_pop() {
-        let mut data = String::from_str("ประเทศไทย中华b¢€𤭢");
-        assert_eq!(data.pop().unwrap(), '𤭢'); // 4 bytes
-        assert_eq!(data.pop().unwrap(), '€'); // 3 bytes
-        assert_eq!(data.pop().unwrap(), '¢'); // 2 bytes
-        assert_eq!(data.pop().unwrap(), 'b'); // 1 bytes
-        assert_eq!(data.pop().unwrap(), '华');
-        assert_eq!(data, "ประเทศไทย中");
-    }
-
-    #[test]
-    fn test_str_truncate() {
-        let mut s = String::from_str("12345");
-        s.truncate(5);
-        assert_eq!(s, "12345");
-        s.truncate(3);
-        assert_eq!(s, "123");
-        s.truncate(0);
-        assert_eq!(s, "");
-
-        let mut s = String::from_str("12345");
-        let p = s.as_ptr();
-        s.truncate(3);
-        s.push_str("6");
-        let p_ = s.as_ptr();
-        assert_eq!(p_, p);
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_str_truncate_invalid_len() {
-        let mut s = String::from_str("12345");
-        s.truncate(6);
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_str_truncate_split_codepoint() {
-        let mut s = String::from_str("\u{FC}"); // ü
-        s.truncate(1);
-    }
-
-    #[test]
-    fn test_str_clear() {
-        let mut s = String::from_str("12345");
-        s.clear();
-        assert_eq!(s.len(), 0);
-        assert_eq!(s, "");
-    }
-
-    #[test]
-    fn test_str_add() {
-        let a = String::from_str("12345");
-        let b = a + "2";
-        let b = b + "2";
-        assert_eq!(b.len(), 7);
-        assert_eq!(b, "1234522");
-    }
-
-    #[test]
-    fn remove() {
-        let mut s = "ศไทย中华Việt Nam; foobar".to_string();;
-        assert_eq!(s.remove(0), 'ศ');
-        assert_eq!(s.len(), 33);
-        assert_eq!(s, "ไทย中华Việt Nam; foobar");
-        assert_eq!(s.remove(17), 'ệ');
-        assert_eq!(s, "ไทย中华Vit Nam; foobar");
-    }
-
-    #[test] #[should_panic]
-    fn remove_bad() {
-        "ศ".to_string().remove(1);
-    }
-
-    #[test]
-    fn insert() {
-        let mut s = "foobar".to_string();
-        s.insert(0, 'ệ');
-        assert_eq!(s, "ệfoobar");
-        s.insert(6, 'ย');
-        assert_eq!(s, "ệfooยbar");
-    }
-
-    #[test] #[should_panic] fn insert_bad1() { "".to_string().insert(1, 't'); }
-    #[test] #[should_panic] fn insert_bad2() { "ệ".to_string().insert(1, 't'); }
-
-    #[test]
-    fn test_slicing() {
-        let s = "foobar".to_string();
-        assert_eq!("foobar", &s[..]);
-        assert_eq!("foo", &s[..3]);
-        assert_eq!("bar", &s[3..]);
-        assert_eq!("oob", &s[1..4]);
-    }
-
-    #[test]
-    fn test_simple_types() {
-        assert_eq!(1.to_string(), "1");
-        assert_eq!((-1).to_string(), "-1");
-        assert_eq!(200.to_string(), "200");
-        assert_eq!(2.to_string(), "2");
-        assert_eq!(true.to_string(), "true");
-        assert_eq!(false.to_string(), "false");
-        assert_eq!(("hi".to_string()).to_string(), "hi");
-    }
-
-    #[test]
-    fn test_vectors() {
-        let x: Vec<i32> = vec![];
-        assert_eq!(format!("{:?}", x), "[]");
-        assert_eq!(format!("{:?}", vec![1]), "[1]");
-        assert_eq!(format!("{:?}", vec![1, 2, 3]), "[1, 2, 3]");
-        assert!(format!("{:?}", vec![vec![], vec![1], vec![1, 1]]) ==
-               "[[], [1], [1, 1]]");
-    }
-
-    #[test]
-    fn test_from_iterator() {
-        let s = "ศไทย中华Việt Nam".to_string();
-        let t = "ศไทย中华";
-        let u = "Việt Nam";
-
-        let a: String = s.chars().collect();
-        assert_eq!(s, a);
-
-        let mut b = t.to_string();
-        b.extend(u.chars());
-        assert_eq!(s, b);
-
-        let c: String = vec![t, u].into_iter().collect();
-        assert_eq!(s, c);
-
-        let mut d = t.to_string();
-        d.extend(vec![u].into_iter());
-        assert_eq!(s, d);
-    }
-
-    #[bench]
-    fn bench_with_capacity(b: &mut Bencher) {
-        b.iter(|| {
-            String::with_capacity(100)
-        });
-    }
-
-    #[bench]
-    fn bench_push_str(b: &mut Bencher) {
-        let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
-        b.iter(|| {
-            let mut r = String::new();
-            r.push_str(s);
-        });
-    }
-
-    const REPETITIONS: u64 = 10_000;
-
-    #[bench]
-    fn bench_push_str_one_byte(b: &mut Bencher) {
-        b.bytes = REPETITIONS;
-        b.iter(|| {
-            let mut r = String::new();
-            for _ in 0..REPETITIONS {
-                r.push_str("a")
-            }
-        });
-    }
-
-    #[bench]
-    fn bench_push_char_one_byte(b: &mut Bencher) {
-        b.bytes = REPETITIONS;
-        b.iter(|| {
-            let mut r = String::new();
-            for _ in 0..REPETITIONS {
-                r.push('a')
-            }
-        });
-    }
-
-    #[bench]
-    fn bench_push_char_two_bytes(b: &mut Bencher) {
-        b.bytes = REPETITIONS * 2;
-        b.iter(|| {
-            let mut r = String::new();
-            for _ in 0..REPETITIONS {
-                r.push('â')
-            }
-        });
-    }
-
-    #[bench]
-    fn from_utf8_lossy_100_ascii(b: &mut Bencher) {
-        let s = b"Hello there, the quick brown fox jumped over the lazy dog! \
-                  Lorem ipsum dolor sit amet, consectetur. ";
-
-        assert_eq!(100, s.len());
-        b.iter(|| {
-            let _ = String::from_utf8_lossy(s);
-        });
-    }
-
-    #[bench]
-    fn from_utf8_lossy_100_multibyte(b: &mut Bencher) {
-        let s = "𐌀𐌖𐌋𐌄𐌑𐌉ปรدولة الكويتทศไทย中华𐍅𐌿𐌻𐍆𐌹𐌻𐌰".as_bytes();
-        assert_eq!(100, s.len());
-        b.iter(|| {
-            let _ = String::from_utf8_lossy(s);
-        });
-    }
-
-    #[bench]
-    fn from_utf8_lossy_invalid(b: &mut Bencher) {
-        let s = b"Hello\xC0\x80 There\xE6\x83 Goodbye";
-        b.iter(|| {
-            let _ = String::from_utf8_lossy(s);
-        });
-    }
-
-    #[bench]
-    fn from_utf8_lossy_100_invalid(b: &mut Bencher) {
-        let s = repeat(0xf5).take(100).collect::<Vec<_>>();
-        b.iter(|| {
-            let _ = String::from_utf8_lossy(&s);
-        });
-    }
-
-    #[bench]
-    fn bench_exact_size_shrink_to_fit(b: &mut Bencher) {
-        let s = "Hello there, the quick brown fox jumped over the lazy dog! \
-                 Lorem ipsum dolor sit amet, consectetur. ";
-        // ensure our operation produces an exact-size string before we benchmark it
-        let mut r = String::with_capacity(s.len());
-        r.push_str(s);
-        assert_eq!(r.len(), r.capacity());
-        b.iter(|| {
-            let mut r = String::with_capacity(s.len());
-            r.push_str(s);
-            r.shrink_to_fit();
-            r
-        });
-    }
-}
index 82d68caeb3642749254dbddeb94b06e9455e6849..22da0a191ca2474834d67035ae231d0330a1d568 100644 (file)
@@ -1951,991 +1951,3 @@ fn drop(&mut self) {
         }
     }
 }
-
-#[cfg(test)]
-mod tests {
-    use prelude::*;
-    use core::mem::size_of;
-    use core::iter::repeat;
-    use test::Bencher;
-    use super::as_vec;
-
-    struct DropCounter<'a> {
-        count: &'a mut u32
-    }
-
-    #[unsafe_destructor]
-    impl<'a> Drop for DropCounter<'a> {
-        fn drop(&mut self) {
-            *self.count += 1;
-        }
-    }
-
-    #[test]
-    fn test_as_vec() {
-        let xs = [1u8, 2u8, 3u8];
-        assert_eq!(&**as_vec(&xs), xs);
-    }
-
-    #[test]
-    fn test_as_vec_dtor() {
-        let (mut count_x, mut count_y) = (0, 0);
-        {
-            let xs = &[DropCounter { count: &mut count_x }, DropCounter { count: &mut count_y }];
-            assert_eq!(as_vec(xs).len(), 2);
-        }
-        assert_eq!(count_x, 1);
-        assert_eq!(count_y, 1);
-    }
-
-    #[test]
-    fn test_small_vec_struct() {
-        assert!(size_of::<Vec<u8>>() == size_of::<usize>() * 3);
-    }
-
-    #[test]
-    fn test_double_drop() {
-        struct TwoVec<T> {
-            x: Vec<T>,
-            y: Vec<T>
-        }
-
-        let (mut count_x, mut count_y) = (0, 0);
-        {
-            let mut tv = TwoVec {
-                x: Vec::new(),
-                y: Vec::new()
-            };
-            tv.x.push(DropCounter {count: &mut count_x});
-            tv.y.push(DropCounter {count: &mut count_y});
-
-            // If Vec had a drop flag, here is where it would be zeroed.
-            // Instead, it should rely on its internal state to prevent
-            // doing anything significant when dropped multiple times.
-            drop(tv.x);
-
-            // Here tv goes out of scope, tv.y should be dropped, but not tv.x.
-        }
-
-        assert_eq!(count_x, 1);
-        assert_eq!(count_y, 1);
-    }
-
-    #[test]
-    fn test_reserve() {
-        let mut v = Vec::new();
-        assert_eq!(v.capacity(), 0);
-
-        v.reserve(2);
-        assert!(v.capacity() >= 2);
-
-        for i in 0..16 {
-            v.push(i);
-        }
-
-        assert!(v.capacity() >= 16);
-        v.reserve(16);
-        assert!(v.capacity() >= 32);
-
-        v.push(16);
-
-        v.reserve(16);
-        assert!(v.capacity() >= 33)
-    }
-
-    #[test]
-    fn test_extend() {
-        let mut v = Vec::new();
-        let mut w = Vec::new();
-
-        v.extend(0..3);
-        for i in 0..3 { w.push(i) }
-
-        assert_eq!(v, w);
-
-        v.extend(3..10);
-        for i in 3..10 { w.push(i) }
-
-        assert_eq!(v, w);
-    }
-
-    #[test]
-    fn test_slice_from_mut() {
-        let mut values = vec![1, 2, 3, 4, 5];
-        {
-            let slice = &mut values[2 ..];
-            assert!(slice == [3, 4, 5]);
-            for p in slice {
-                *p += 2;
-            }
-        }
-
-        assert!(values == [1, 2, 5, 6, 7]);
-    }
-
-    #[test]
-    fn test_slice_to_mut() {
-        let mut values = vec![1, 2, 3, 4, 5];
-        {
-            let slice = &mut values[.. 2];
-            assert!(slice == [1, 2]);
-            for p in slice {
-                *p += 1;
-            }
-        }
-
-        assert!(values == [2, 3, 3, 4, 5]);
-    }
-
-    #[test]
-    fn test_split_at_mut() {
-        let mut values = vec![1, 2, 3, 4, 5];
-        {
-            let (left, right) = values.split_at_mut(2);
-            {
-                let left: &[_] = left;
-                assert!(&left[..left.len()] == &[1, 2]);
-            }
-            for p in left {
-                *p += 1;
-            }
-
-            {
-                let right: &[_] = right;
-                assert!(&right[..right.len()] == &[3, 4, 5]);
-            }
-            for p in right {
-                *p += 2;
-            }
-        }
-
-        assert_eq!(values, [2, 3, 5, 6, 7]);
-    }
-
-    #[test]
-    fn test_clone() {
-        let v: Vec<i32> = vec![];
-        let w = vec!(1, 2, 3);
-
-        assert_eq!(v, v.clone());
-
-        let z = w.clone();
-        assert_eq!(w, z);
-        // they should be disjoint in memory.
-        assert!(w.as_ptr() != z.as_ptr())
-    }
-
-    #[test]
-    fn test_clone_from() {
-        let mut v = vec!();
-        let three: Vec<Box<_>> = vec!(box 1, box 2, box 3);
-        let two: Vec<Box<_>> = vec!(box 4, box 5);
-        // zero, long
-        v.clone_from(&three);
-        assert_eq!(v, three);
-
-        // equal
-        v.clone_from(&three);
-        assert_eq!(v, three);
-
-        // long, short
-        v.clone_from(&two);
-        assert_eq!(v, two);
-
-        // short, long
-        v.clone_from(&three);
-        assert_eq!(v, three)
-    }
-
-    #[test]
-    fn test_retain() {
-        let mut vec = vec![1, 2, 3, 4];
-        vec.retain(|&x| x % 2 == 0);
-        assert_eq!(vec, [2, 4]);
-    }
-
-    #[test]
-    fn zero_sized_values() {
-        let mut v = Vec::new();
-        assert_eq!(v.len(), 0);
-        v.push(());
-        assert_eq!(v.len(), 1);
-        v.push(());
-        assert_eq!(v.len(), 2);
-        assert_eq!(v.pop(), Some(()));
-        assert_eq!(v.pop(), Some(()));
-        assert_eq!(v.pop(), None);
-
-        assert_eq!(v.iter().count(), 0);
-        v.push(());
-        assert_eq!(v.iter().count(), 1);
-        v.push(());
-        assert_eq!(v.iter().count(), 2);
-
-        for &() in &v {}
-
-        assert_eq!(v.iter_mut().count(), 2);
-        v.push(());
-        assert_eq!(v.iter_mut().count(), 3);
-        v.push(());
-        assert_eq!(v.iter_mut().count(), 4);
-
-        for &mut () in &mut v {}
-        unsafe { v.set_len(0); }
-        assert_eq!(v.iter_mut().count(), 0);
-    }
-
-    #[test]
-    fn test_partition() {
-        assert_eq!(vec![].into_iter().partition(|x: &i32| *x < 3), (vec![], vec![]));
-        assert_eq!(vec![1, 2, 3].into_iter().partition(|x| *x < 4), (vec![1, 2, 3], vec![]));
-        assert_eq!(vec![1, 2, 3].into_iter().partition(|x| *x < 2), (vec![1], vec![2, 3]));
-        assert_eq!(vec![1, 2, 3].into_iter().partition(|x| *x < 0), (vec![], vec![1, 2, 3]));
-    }
-
-    #[test]
-    fn test_zip_unzip() {
-        let z1 = vec![(1, 4), (2, 5), (3, 6)];
-
-        let (left, right): (Vec<_>, Vec<_>) = z1.iter().cloned().unzip();
-
-        assert_eq!((1, 4), (left[0], right[0]));
-        assert_eq!((2, 5), (left[1], right[1]));
-        assert_eq!((3, 6), (left[2], right[2]));
-    }
-
-    #[test]
-    fn test_unsafe_ptrs() {
-        unsafe {
-            // Test on-stack copy-from-buf.
-            let a = [1, 2, 3];
-            let ptr = a.as_ptr();
-            let b = Vec::from_raw_buf(ptr, 3);
-            assert_eq!(b, [1, 2, 3]);
-
-            // Test on-heap copy-from-buf.
-            let c = vec![1, 2, 3, 4, 5];
-            let ptr = c.as_ptr();
-            let d = Vec::from_raw_buf(ptr, 5);
-            assert_eq!(d, [1, 2, 3, 4, 5]);
-        }
-    }
-
-    #[test]
-    fn test_vec_truncate_drop() {
-        static mut drops: u32 = 0;
-        struct Elem(i32);
-        impl Drop for Elem {
-            fn drop(&mut self) {
-                unsafe { drops += 1; }
-            }
-        }
-
-        let mut v = vec![Elem(1), Elem(2), Elem(3), Elem(4), Elem(5)];
-        assert_eq!(unsafe { drops }, 0);
-        v.truncate(3);
-        assert_eq!(unsafe { drops }, 2);
-        v.truncate(0);
-        assert_eq!(unsafe { drops }, 5);
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_vec_truncate_fail() {
-        struct BadElem(i32);
-        impl Drop for BadElem {
-            fn drop(&mut self) {
-                let BadElem(ref mut x) = *self;
-                if *x == 0xbadbeef {
-                    panic!("BadElem panic: 0xbadbeef")
-                }
-            }
-        }
-
-        let mut v = vec![BadElem(1), BadElem(2), BadElem(0xbadbeef), BadElem(4)];
-        v.truncate(0);
-    }
-
-    #[test]
-    fn test_index() {
-        let vec = vec![1, 2, 3];
-        assert!(vec[1] == 2);
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_index_out_of_bounds() {
-        let vec = vec![1, 2, 3];
-        let _ = vec[3];
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_slice_out_of_bounds_1() {
-        let x = vec![1, 2, 3, 4, 5];
-        &x[-1..];
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_slice_out_of_bounds_2() {
-        let x = vec![1, 2, 3, 4, 5];
-        &x[..6];
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_slice_out_of_bounds_3() {
-        let x = vec![1, 2, 3, 4, 5];
-        &x[-1..4];
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_slice_out_of_bounds_4() {
-        let x = vec![1, 2, 3, 4, 5];
-        &x[1..6];
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_slice_out_of_bounds_5() {
-        let x = vec![1, 2, 3, 4, 5];
-        &x[3..2];
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_swap_remove_empty() {
-        let mut vec= Vec::<i32>::new();
-        vec.swap_remove(0);
-    }
-
-    #[test]
-    fn test_move_iter_unwrap() {
-        let mut vec = Vec::with_capacity(7);
-        vec.push(1);
-        vec.push(2);
-        let ptr = vec.as_ptr();
-        vec = vec.into_iter().into_inner();
-        assert_eq!(vec.as_ptr(), ptr);
-        assert_eq!(vec.capacity(), 7);
-        assert_eq!(vec.len(), 0);
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_map_in_place_incompatible_types_fail() {
-        let v = vec![0, 1, 2];
-        v.map_in_place(|_| ());
-    }
-
-    #[test]
-    fn test_map_in_place() {
-        let v = vec![0, 1, 2];
-        assert_eq!(v.map_in_place(|i: u32| i as i32 - 1), [-1, 0, 1]);
-    }
-
-    #[test]
-    fn test_map_in_place_zero_sized() {
-        let v = vec![(), ()];
-        #[derive(PartialEq, Debug)]
-        struct ZeroSized;
-        assert_eq!(v.map_in_place(|_| ZeroSized), [ZeroSized, ZeroSized]);
-    }
-
-    #[test]
-    fn test_map_in_place_zero_drop_count() {
-        use std::sync::atomic::{AtomicUsize, Ordering, ATOMIC_USIZE_INIT};
-
-        #[derive(Clone, PartialEq, Debug)]
-        struct Nothing;
-        impl Drop for Nothing { fn drop(&mut self) { } }
-
-        #[derive(Clone, PartialEq, Debug)]
-        struct ZeroSized;
-        impl Drop for ZeroSized {
-            fn drop(&mut self) {
-                DROP_COUNTER.fetch_add(1, Ordering::Relaxed);
-            }
-        }
-        const NUM_ELEMENTS: usize = 2;
-        static DROP_COUNTER: AtomicUsize = ATOMIC_USIZE_INIT;
-
-        let v = repeat(Nothing).take(NUM_ELEMENTS).collect::<Vec<_>>();
-
-        DROP_COUNTER.store(0, Ordering::Relaxed);
-
-        let v = v.map_in_place(|_| ZeroSized);
-        assert_eq!(DROP_COUNTER.load(Ordering::Relaxed), 0);
-        drop(v);
-        assert_eq!(DROP_COUNTER.load(Ordering::Relaxed), NUM_ELEMENTS);
-    }
-
-    #[test]
-    fn test_move_items() {
-        let vec = vec![1, 2, 3];
-        let mut vec2 = vec![];
-        for i in vec {
-            vec2.push(i);
-        }
-        assert_eq!(vec2, [1, 2, 3]);
-    }
-
-    #[test]
-    fn test_move_items_reverse() {
-        let vec = vec![1, 2, 3];
-        let mut vec2 = vec![];
-        for i in vec.into_iter().rev() {
-            vec2.push(i);
-        }
-        assert_eq!(vec2, [3, 2, 1]);
-    }
-
-    #[test]
-    fn test_move_items_zero_sized() {
-        let vec = vec![(), (), ()];
-        let mut vec2 = vec![];
-        for i in vec {
-            vec2.push(i);
-        }
-        assert_eq!(vec2, [(), (), ()]);
-    }
-
-    #[test]
-    fn test_drain_items() {
-        let mut vec = vec![1, 2, 3];
-        let mut vec2 = vec![];
-        for i in vec.drain() {
-            vec2.push(i);
-        }
-        assert_eq!(vec, []);
-        assert_eq!(vec2, [ 1, 2, 3 ]);
-    }
-
-    #[test]
-    fn test_drain_items_reverse() {
-        let mut vec = vec![1, 2, 3];
-        let mut vec2 = vec![];
-        for i in vec.drain().rev() {
-            vec2.push(i);
-        }
-        assert_eq!(vec, []);
-        assert_eq!(vec2, [3, 2, 1]);
-    }
-
-    #[test]
-    fn test_drain_items_zero_sized() {
-        let mut vec = vec![(), (), ()];
-        let mut vec2 = vec![];
-        for i in vec.drain() {
-            vec2.push(i);
-        }
-        assert_eq!(vec, []);
-        assert_eq!(vec2, [(), (), ()]);
-    }
-
-    #[test]
-    fn test_into_boxed_slice() {
-        let xs = vec![1, 2, 3];
-        let ys = xs.into_boxed_slice();
-        assert_eq!(&*ys, [1, 2, 3]);
-    }
-
-    #[test]
-    fn test_append() {
-        let mut vec = vec![1, 2, 3];
-        let mut vec2 = vec![4, 5, 6];
-        vec.append(&mut vec2);
-        assert_eq!(vec, [1, 2, 3, 4, 5, 6]);
-        assert_eq!(vec2, []);
-    }
-
-    #[test]
-    fn test_split_off() {
-        let mut vec = vec![1, 2, 3, 4, 5, 6];
-        let vec2 = vec.split_off(4);
-        assert_eq!(vec, [1, 2, 3, 4]);
-        assert_eq!(vec2, [5, 6]);
-    }
-
-    #[bench]
-    fn bench_new(b: &mut Bencher) {
-        b.iter(|| {
-            let v: Vec<u32> = Vec::new();
-            assert_eq!(v.len(), 0);
-            assert_eq!(v.capacity(), 0);
-        })
-    }
-
-    fn do_bench_with_capacity(b: &mut Bencher, src_len: usize) {
-        b.bytes = src_len as u64;
-
-        b.iter(|| {
-            let v: Vec<u32> = Vec::with_capacity(src_len);
-            assert_eq!(v.len(), 0);
-            assert_eq!(v.capacity(), src_len);
-        })
-    }
-
-    #[bench]
-    fn bench_with_capacity_0000(b: &mut Bencher) {
-        do_bench_with_capacity(b, 0)
-    }
-
-    #[bench]
-    fn bench_with_capacity_0010(b: &mut Bencher) {
-        do_bench_with_capacity(b, 10)
-    }
-
-    #[bench]
-    fn bench_with_capacity_0100(b: &mut Bencher) {
-        do_bench_with_capacity(b, 100)
-    }
-
-    #[bench]
-    fn bench_with_capacity_1000(b: &mut Bencher) {
-        do_bench_with_capacity(b, 1000)
-    }
-
-    fn do_bench_from_fn(b: &mut Bencher, src_len: usize) {
-        b.bytes = src_len as u64;
-
-        b.iter(|| {
-            let dst = (0..src_len).collect::<Vec<_>>();
-            assert_eq!(dst.len(), src_len);
-            assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
-        })
-    }
-
-    #[bench]
-    fn bench_from_fn_0000(b: &mut Bencher) {
-        do_bench_from_fn(b, 0)
-    }
-
-    #[bench]
-    fn bench_from_fn_0010(b: &mut Bencher) {
-        do_bench_from_fn(b, 10)
-    }
-
-    #[bench]
-    fn bench_from_fn_0100(b: &mut Bencher) {
-        do_bench_from_fn(b, 100)
-    }
-
-    #[bench]
-    fn bench_from_fn_1000(b: &mut Bencher) {
-        do_bench_from_fn(b, 1000)
-    }
-
-    fn do_bench_from_elem(b: &mut Bencher, src_len: usize) {
-        b.bytes = src_len as u64;
-
-        b.iter(|| {
-            let dst: Vec<usize> = repeat(5).take(src_len).collect();
-            assert_eq!(dst.len(), src_len);
-            assert!(dst.iter().all(|x| *x == 5));
-        })
-    }
-
-    #[bench]
-    fn bench_from_elem_0000(b: &mut Bencher) {
-        do_bench_from_elem(b, 0)
-    }
-
-    #[bench]
-    fn bench_from_elem_0010(b: &mut Bencher) {
-        do_bench_from_elem(b, 10)
-    }
-
-    #[bench]
-    fn bench_from_elem_0100(b: &mut Bencher) {
-        do_bench_from_elem(b, 100)
-    }
-
-    #[bench]
-    fn bench_from_elem_1000(b: &mut Bencher) {
-        do_bench_from_elem(b, 1000)
-    }
-
-    fn do_bench_from_slice(b: &mut Bencher, src_len: usize) {
-        let src: Vec<_> = FromIterator::from_iter(0..src_len);
-
-        b.bytes = src_len as u64;
-
-        b.iter(|| {
-            let dst = src.clone()[..].to_vec();
-            assert_eq!(dst.len(), src_len);
-            assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
-        });
-    }
-
-    #[bench]
-    fn bench_from_slice_0000(b: &mut Bencher) {
-        do_bench_from_slice(b, 0)
-    }
-
-    #[bench]
-    fn bench_from_slice_0010(b: &mut Bencher) {
-        do_bench_from_slice(b, 10)
-    }
-
-    #[bench]
-    fn bench_from_slice_0100(b: &mut Bencher) {
-        do_bench_from_slice(b, 100)
-    }
-
-    #[bench]
-    fn bench_from_slice_1000(b: &mut Bencher) {
-        do_bench_from_slice(b, 1000)
-    }
-
-    fn do_bench_from_iter(b: &mut Bencher, src_len: usize) {
-        let src: Vec<_> = FromIterator::from_iter(0..src_len);
-
-        b.bytes = src_len as u64;
-
-        b.iter(|| {
-            let dst: Vec<_> = FromIterator::from_iter(src.clone().into_iter());
-            assert_eq!(dst.len(), src_len);
-            assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
-        });
-    }
-
-    #[bench]
-    fn bench_from_iter_0000(b: &mut Bencher) {
-        do_bench_from_iter(b, 0)
-    }
-
-    #[bench]
-    fn bench_from_iter_0010(b: &mut Bencher) {
-        do_bench_from_iter(b, 10)
-    }
-
-    #[bench]
-    fn bench_from_iter_0100(b: &mut Bencher) {
-        do_bench_from_iter(b, 100)
-    }
-
-    #[bench]
-    fn bench_from_iter_1000(b: &mut Bencher) {
-        do_bench_from_iter(b, 1000)
-    }
-
-    fn do_bench_extend(b: &mut Bencher, dst_len: usize, src_len: usize) {
-        let dst: Vec<_> = FromIterator::from_iter(0..dst_len);
-        let src: Vec<_> = FromIterator::from_iter(dst_len..dst_len + src_len);
-
-        b.bytes = src_len as u64;
-
-        b.iter(|| {
-            let mut dst = dst.clone();
-            dst.extend(src.clone().into_iter());
-            assert_eq!(dst.len(), dst_len + src_len);
-            assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
-        });
-    }
-
-    #[bench]
-    fn bench_extend_0000_0000(b: &mut Bencher) {
-        do_bench_extend(b, 0, 0)
-    }
-
-    #[bench]
-    fn bench_extend_0000_0010(b: &mut Bencher) {
-        do_bench_extend(b, 0, 10)
-    }
-
-    #[bench]
-    fn bench_extend_0000_0100(b: &mut Bencher) {
-        do_bench_extend(b, 0, 100)
-    }
-
-    #[bench]
-    fn bench_extend_0000_1000(b: &mut Bencher) {
-        do_bench_extend(b, 0, 1000)
-    }
-
-    #[bench]
-    fn bench_extend_0010_0010(b: &mut Bencher) {
-        do_bench_extend(b, 10, 10)
-    }
-
-    #[bench]
-    fn bench_extend_0100_0100(b: &mut Bencher) {
-        do_bench_extend(b, 100, 100)
-    }
-
-    #[bench]
-    fn bench_extend_1000_1000(b: &mut Bencher) {
-        do_bench_extend(b, 1000, 1000)
-    }
-
-    fn do_bench_push_all(b: &mut Bencher, dst_len: usize, src_len: usize) {
-        let dst: Vec<_> = FromIterator::from_iter(0..dst_len);
-        let src: Vec<_> = FromIterator::from_iter(dst_len..dst_len + src_len);
-
-        b.bytes = src_len as u64;
-
-        b.iter(|| {
-            let mut dst = dst.clone();
-            dst.push_all(&src);
-            assert_eq!(dst.len(), dst_len + src_len);
-            assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
-        });
-    }
-
-    #[bench]
-    fn bench_push_all_0000_0000(b: &mut Bencher) {
-        do_bench_push_all(b, 0, 0)
-    }
-
-    #[bench]
-    fn bench_push_all_0000_0010(b: &mut Bencher) {
-        do_bench_push_all(b, 0, 10)
-    }
-
-    #[bench]
-    fn bench_push_all_0000_0100(b: &mut Bencher) {
-        do_bench_push_all(b, 0, 100)
-    }
-
-    #[bench]
-    fn bench_push_all_0000_1000(b: &mut Bencher) {
-        do_bench_push_all(b, 0, 1000)
-    }
-
-    #[bench]
-    fn bench_push_all_0010_0010(b: &mut Bencher) {
-        do_bench_push_all(b, 10, 10)
-    }
-
-    #[bench]
-    fn bench_push_all_0100_0100(b: &mut Bencher) {
-        do_bench_push_all(b, 100, 100)
-    }
-
-    #[bench]
-    fn bench_push_all_1000_1000(b: &mut Bencher) {
-        do_bench_push_all(b, 1000, 1000)
-    }
-
-    fn do_bench_push_all_move(b: &mut Bencher, dst_len: usize, src_len: usize) {
-        let dst: Vec<_> = FromIterator::from_iter(0..dst_len);
-        let src: Vec<_> = FromIterator::from_iter(dst_len..dst_len + src_len);
-
-        b.bytes = src_len as u64;
-
-        b.iter(|| {
-            let mut dst = dst.clone();
-            dst.extend(src.clone().into_iter());
-            assert_eq!(dst.len(), dst_len + src_len);
-            assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
-        });
-    }
-
-    #[bench]
-    fn bench_push_all_move_0000_0000(b: &mut Bencher) {
-        do_bench_push_all_move(b, 0, 0)
-    }
-
-    #[bench]
-    fn bench_push_all_move_0000_0010(b: &mut Bencher) {
-        do_bench_push_all_move(b, 0, 10)
-    }
-
-    #[bench]
-    fn bench_push_all_move_0000_0100(b: &mut Bencher) {
-        do_bench_push_all_move(b, 0, 100)
-    }
-
-    #[bench]
-    fn bench_push_all_move_0000_1000(b: &mut Bencher) {
-        do_bench_push_all_move(b, 0, 1000)
-    }
-
-    #[bench]
-    fn bench_push_all_move_0010_0010(b: &mut Bencher) {
-        do_bench_push_all_move(b, 10, 10)
-    }
-
-    #[bench]
-    fn bench_push_all_move_0100_0100(b: &mut Bencher) {
-        do_bench_push_all_move(b, 100, 100)
-    }
-
-    #[bench]
-    fn bench_push_all_move_1000_1000(b: &mut Bencher) {
-        do_bench_push_all_move(b, 1000, 1000)
-    }
-
-    fn do_bench_clone(b: &mut Bencher, src_len: usize) {
-        let src: Vec<usize> = FromIterator::from_iter(0..src_len);
-
-        b.bytes = src_len as u64;
-
-        b.iter(|| {
-            let dst = src.clone();
-            assert_eq!(dst.len(), src_len);
-            assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
-        });
-    }
-
-    #[bench]
-    fn bench_clone_0000(b: &mut Bencher) {
-        do_bench_clone(b, 0)
-    }
-
-    #[bench]
-    fn bench_clone_0010(b: &mut Bencher) {
-        do_bench_clone(b, 10)
-    }
-
-    #[bench]
-    fn bench_clone_0100(b: &mut Bencher) {
-        do_bench_clone(b, 100)
-    }
-
-    #[bench]
-    fn bench_clone_1000(b: &mut Bencher) {
-        do_bench_clone(b, 1000)
-    }
-
-    fn do_bench_clone_from(b: &mut Bencher, times: usize, dst_len: usize, src_len: usize) {
-        let dst: Vec<_> = FromIterator::from_iter(0..src_len);
-        let src: Vec<_> = FromIterator::from_iter(dst_len..dst_len + src_len);
-
-        b.bytes = (times * src_len) as u64;
-
-        b.iter(|| {
-            let mut dst = dst.clone();
-
-            for _ in 0..times {
-                dst.clone_from(&src);
-
-                assert_eq!(dst.len(), src_len);
-                assert!(dst.iter().enumerate().all(|(i, x)| dst_len + i == *x));
-            }
-        });
-    }
-
-    #[bench]
-    fn bench_clone_from_01_0000_0000(b: &mut Bencher) {
-        do_bench_clone_from(b, 1, 0, 0)
-    }
-
-    #[bench]
-    fn bench_clone_from_01_0000_0010(b: &mut Bencher) {
-        do_bench_clone_from(b, 1, 0, 10)
-    }
-
-    #[bench]
-    fn bench_clone_from_01_0000_0100(b: &mut Bencher) {
-        do_bench_clone_from(b, 1, 0, 100)
-    }
-
-    #[bench]
-    fn bench_clone_from_01_0000_1000(b: &mut Bencher) {
-        do_bench_clone_from(b, 1, 0, 1000)
-    }
-
-    #[bench]
-    fn bench_clone_from_01_0010_0010(b: &mut Bencher) {
-        do_bench_clone_from(b, 1, 10, 10)
-    }
-
-    #[bench]
-    fn bench_clone_from_01_0100_0100(b: &mut Bencher) {
-        do_bench_clone_from(b, 1, 100, 100)
-    }
-
-    #[bench]
-    fn bench_clone_from_01_1000_1000(b: &mut Bencher) {
-        do_bench_clone_from(b, 1, 1000, 1000)
-    }
-
-    #[bench]
-    fn bench_clone_from_01_0010_0100(b: &mut Bencher) {
-        do_bench_clone_from(b, 1, 10, 100)
-    }
-
-    #[bench]
-    fn bench_clone_from_01_0100_1000(b: &mut Bencher) {
-        do_bench_clone_from(b, 1, 100, 1000)
-    }
-
-    #[bench]
-    fn bench_clone_from_01_0010_0000(b: &mut Bencher) {
-        do_bench_clone_from(b, 1, 10, 0)
-    }
-
-    #[bench]
-    fn bench_clone_from_01_0100_0010(b: &mut Bencher) {
-        do_bench_clone_from(b, 1, 100, 10)
-    }
-
-    #[bench]
-    fn bench_clone_from_01_1000_0100(b: &mut Bencher) {
-        do_bench_clone_from(b, 1, 1000, 100)
-    }
-
-    #[bench]
-    fn bench_clone_from_10_0000_0000(b: &mut Bencher) {
-        do_bench_clone_from(b, 10, 0, 0)
-    }
-
-    #[bench]
-    fn bench_clone_from_10_0000_0010(b: &mut Bencher) {
-        do_bench_clone_from(b, 10, 0, 10)
-    }
-
-    #[bench]
-    fn bench_clone_from_10_0000_0100(b: &mut Bencher) {
-        do_bench_clone_from(b, 10, 0, 100)
-    }
-
-    #[bench]
-    fn bench_clone_from_10_0000_1000(b: &mut Bencher) {
-        do_bench_clone_from(b, 10, 0, 1000)
-    }
-
-    #[bench]
-    fn bench_clone_from_10_0010_0010(b: &mut Bencher) {
-        do_bench_clone_from(b, 10, 10, 10)
-    }
-
-    #[bench]
-    fn bench_clone_from_10_0100_0100(b: &mut Bencher) {
-        do_bench_clone_from(b, 10, 100, 100)
-    }
-
-    #[bench]
-    fn bench_clone_from_10_1000_1000(b: &mut Bencher) {
-        do_bench_clone_from(b, 10, 1000, 1000)
-    }
-
-    #[bench]
-    fn bench_clone_from_10_0010_0100(b: &mut Bencher) {
-        do_bench_clone_from(b, 10, 10, 100)
-    }
-
-    #[bench]
-    fn bench_clone_from_10_0100_1000(b: &mut Bencher) {
-        do_bench_clone_from(b, 10, 100, 1000)
-    }
-
-    #[bench]
-    fn bench_clone_from_10_0010_0000(b: &mut Bencher) {
-        do_bench_clone_from(b, 10, 10, 0)
-    }
-
-    #[bench]
-    fn bench_clone_from_10_0100_0010(b: &mut Bencher) {
-        do_bench_clone_from(b, 10, 100, 10)
-    }
-
-    #[bench]
-    fn bench_clone_from_10_1000_0100(b: &mut Bencher) {
-        do_bench_clone_from(b, 10, 1000, 100)
-    }
-}
index 65e44703df10822d89623d691f55d99ad29c7c1d..700ee059a7fa562f1fe1d4216e10ea700fcd9441 100644 (file)
@@ -1768,1121 +1768,3 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         write!(f, "]")
     }
 }
-
-#[cfg(test)]
-mod tests {
-    use self::Taggy::*;
-    use self::Taggypar::*;
-    use prelude::*;
-    use core::iter;
-    use std::fmt::Debug;
-    use std::hash::{self, SipHasher};
-    use test::Bencher;
-    use test;
-
-    use super::VecDeque;
-
-    #[test]
-    #[allow(deprecated)]
-    fn test_simple() {
-        let mut d = VecDeque::new();
-        assert_eq!(d.len(), 0);
-        d.push_front(17);
-        d.push_front(42);
-        d.push_back(137);
-        assert_eq!(d.len(), 3);
-        d.push_back(137);
-        assert_eq!(d.len(), 4);
-        assert_eq!(*d.front().unwrap(), 42);
-        assert_eq!(*d.back().unwrap(), 137);
-        let mut i = d.pop_front();
-        assert_eq!(i, Some(42));
-        i = d.pop_back();
-        assert_eq!(i, Some(137));
-        i = d.pop_back();
-        assert_eq!(i, Some(137));
-        i = d.pop_back();
-        assert_eq!(i, Some(17));
-        assert_eq!(d.len(), 0);
-        d.push_back(3);
-        assert_eq!(d.len(), 1);
-        d.push_front(2);
-        assert_eq!(d.len(), 2);
-        d.push_back(4);
-        assert_eq!(d.len(), 3);
-        d.push_front(1);
-        assert_eq!(d.len(), 4);
-        debug!("{}", d[0]);
-        debug!("{}", d[1]);
-        debug!("{}", d[2]);
-        debug!("{}", d[3]);
-        assert_eq!(d[0], 1);
-        assert_eq!(d[1], 2);
-        assert_eq!(d[2], 3);
-        assert_eq!(d[3], 4);
-    }
-
-    #[cfg(test)]
-    fn test_parameterized<T:Clone + PartialEq + Debug>(a: T, b: T, c: T, d: T) {
-        let mut deq = VecDeque::new();
-        assert_eq!(deq.len(), 0);
-        deq.push_front(a.clone());
-        deq.push_front(b.clone());
-        deq.push_back(c.clone());
-        assert_eq!(deq.len(), 3);
-        deq.push_back(d.clone());
-        assert_eq!(deq.len(), 4);
-        assert_eq!((*deq.front().unwrap()).clone(), b.clone());
-        assert_eq!((*deq.back().unwrap()).clone(), d.clone());
-        assert_eq!(deq.pop_front().unwrap(), b.clone());
-        assert_eq!(deq.pop_back().unwrap(), d.clone());
-        assert_eq!(deq.pop_back().unwrap(), c.clone());
-        assert_eq!(deq.pop_back().unwrap(), a.clone());
-        assert_eq!(deq.len(), 0);
-        deq.push_back(c.clone());
-        assert_eq!(deq.len(), 1);
-        deq.push_front(b.clone());
-        assert_eq!(deq.len(), 2);
-        deq.push_back(d.clone());
-        assert_eq!(deq.len(), 3);
-        deq.push_front(a.clone());
-        assert_eq!(deq.len(), 4);
-        assert_eq!(deq[0].clone(), a.clone());
-        assert_eq!(deq[1].clone(), b.clone());
-        assert_eq!(deq[2].clone(), c.clone());
-        assert_eq!(deq[3].clone(), d.clone());
-    }
-
-    #[test]
-    fn test_push_front_grow() {
-        let mut deq = VecDeque::new();
-        for i in 0..66 {
-            deq.push_front(i);
-        }
-        assert_eq!(deq.len(), 66);
-
-        for i in 0..66 {
-            assert_eq!(deq[i], 65 - i);
-        }
-
-        let mut deq = VecDeque::new();
-        for i in 0..66 {
-            deq.push_back(i);
-        }
-
-        for i in 0..66 {
-            assert_eq!(deq[i], i);
-        }
-    }
-
-    #[test]
-    fn test_index() {
-        let mut deq = VecDeque::new();
-        for i in 1..4 {
-            deq.push_front(i);
-        }
-        assert_eq!(deq[1], 2);
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_index_out_of_bounds() {
-        let mut deq = VecDeque::new();
-        for i in 1..4 {
-            deq.push_front(i);
-        }
-        deq[3];
-    }
-
-    #[bench]
-    fn bench_new(b: &mut test::Bencher) {
-        b.iter(|| {
-            let ring: VecDeque<i32> = VecDeque::new();
-            test::black_box(ring);
-        })
-    }
-
-    #[bench]
-    fn bench_push_back_100(b: &mut test::Bencher) {
-        let mut deq = VecDeque::with_capacity(101);
-        b.iter(|| {
-            for i in 0..100 {
-                deq.push_back(i);
-            }
-            deq.head = 0;
-            deq.tail = 0;
-        })
-    }
-
-    #[bench]
-    fn bench_push_front_100(b: &mut test::Bencher) {
-        let mut deq = VecDeque::with_capacity(101);
-        b.iter(|| {
-            for i in 0..100 {
-                deq.push_front(i);
-            }
-            deq.head = 0;
-            deq.tail = 0;
-        })
-    }
-
-    #[bench]
-    fn bench_pop_back_100(b: &mut test::Bencher) {
-        let mut deq= VecDeque::<i32>::with_capacity(101);
-
-        b.iter(|| {
-            deq.head = 100;
-            deq.tail = 0;
-            while !deq.is_empty() {
-                test::black_box(deq.pop_back());
-            }
-        })
-    }
-
-    #[bench]
-    fn bench_pop_front_100(b: &mut test::Bencher) {
-        let mut deq = VecDeque::<i32>::with_capacity(101);
-
-        b.iter(|| {
-            deq.head = 100;
-            deq.tail = 0;
-            while !deq.is_empty() {
-                test::black_box(deq.pop_front());
-            }
-        })
-    }
-
-    #[bench]
-    fn bench_grow_1025(b: &mut test::Bencher) {
-        b.iter(|| {
-            let mut deq = VecDeque::new();
-            for i in 0..1025 {
-                deq.push_front(i);
-            }
-            test::black_box(deq);
-        })
-    }
-
-    #[bench]
-    fn bench_iter_1000(b: &mut test::Bencher) {
-        let ring: VecDeque<_> = (0..1000).collect();
-
-        b.iter(|| {
-            let mut sum = 0;
-            for &i in &ring {
-                sum += i;
-            }
-            test::black_box(sum);
-        })
-    }
-
-    #[bench]
-    fn bench_mut_iter_1000(b: &mut test::Bencher) {
-        let mut ring: VecDeque<_> = (0..1000).collect();
-
-        b.iter(|| {
-            let mut sum = 0;
-            for i in &mut ring {
-                sum += *i;
-            }
-            test::black_box(sum);
-        })
-    }
-
-    #[derive(Clone, PartialEq, Debug)]
-    enum Taggy {
-        One(i32),
-        Two(i32, i32),
-        Three(i32, i32, i32),
-    }
-
-    #[derive(Clone, PartialEq, Debug)]
-    enum Taggypar<T> {
-        Onepar(T),
-        Twopar(T, T),
-        Threepar(T, T, T),
-    }
-
-    #[derive(Clone, PartialEq, Debug)]
-    struct RecCy {
-        x: i32,
-        y: i32,
-        t: Taggy
-    }
-
-    #[test]
-    fn test_param_int() {
-        test_parameterized::<i32>(5, 72, 64, 175);
-    }
-
-    #[test]
-    fn test_param_taggy() {
-        test_parameterized::<Taggy>(One(1), Two(1, 2), Three(1, 2, 3), Two(17, 42));
-    }
-
-    #[test]
-    fn test_param_taggypar() {
-        test_parameterized::<Taggypar<i32>>(Onepar::<i32>(1),
-                                            Twopar::<i32>(1, 2),
-                                            Threepar::<i32>(1, 2, 3),
-                                            Twopar::<i32>(17, 42));
-    }
-
-    #[test]
-    fn test_param_reccy() {
-        let reccy1 = RecCy { x: 1, y: 2, t: One(1) };
-        let reccy2 = RecCy { x: 345, y: 2, t: Two(1, 2) };
-        let reccy3 = RecCy { x: 1, y: 777, t: Three(1, 2, 3) };
-        let reccy4 = RecCy { x: 19, y: 252, t: Two(17, 42) };
-        test_parameterized::<RecCy>(reccy1, reccy2, reccy3, reccy4);
-    }
-
-    #[test]
-    fn test_with_capacity() {
-        let mut d = VecDeque::with_capacity(0);
-        d.push_back(1);
-        assert_eq!(d.len(), 1);
-        let mut d = VecDeque::with_capacity(50);
-        d.push_back(1);
-        assert_eq!(d.len(), 1);
-    }
-
-    #[test]
-    fn test_with_capacity_non_power_two() {
-        let mut d3 = VecDeque::with_capacity(3);
-        d3.push_back(1);
-
-        // X = None, | = lo
-        // [|1, X, X]
-        assert_eq!(d3.pop_front(), Some(1));
-        // [X, |X, X]
-        assert_eq!(d3.front(), None);
-
-        // [X, |3, X]
-        d3.push_back(3);
-        // [X, |3, 6]
-        d3.push_back(6);
-        // [X, X, |6]
-        assert_eq!(d3.pop_front(), Some(3));
-
-        // Pushing the lo past half way point to trigger
-        // the 'B' scenario for growth
-        // [9, X, |6]
-        d3.push_back(9);
-        // [9, 12, |6]
-        d3.push_back(12);
-
-        d3.push_back(15);
-        // There used to be a bug here about how the
-        // VecDeque made growth assumptions about the
-        // underlying Vec which didn't hold and lead
-        // to corruption.
-        // (Vec grows to next power of two)
-        //good- [9, 12, 15, X, X, X, X, |6]
-        //bug-  [15, 12, X, X, X, |6, X, X]
-        assert_eq!(d3.pop_front(), Some(6));
-
-        // Which leads us to the following state which
-        // would be a failure case.
-        //bug-  [15, 12, X, X, X, X, |X, X]
-        assert_eq!(d3.front(), Some(&9));
-    }
-
-    #[test]
-    fn test_reserve_exact() {
-        let mut d = VecDeque::new();
-        d.push_back(0);
-        d.reserve_exact(50);
-        assert!(d.capacity() >= 51);
-    }
-
-    #[test]
-    fn test_reserve() {
-        let mut d = VecDeque::new();
-        d.push_back(0);
-        d.reserve(50);
-        assert!(d.capacity() >= 51);
-    }
-
-    #[test]
-    fn test_swap() {
-        let mut d: VecDeque<_> = (0..5).collect();
-        d.pop_front();
-        d.swap(0, 3);
-        assert_eq!(d.iter().cloned().collect::<Vec<_>>(), [4, 2, 3, 1]);
-    }
-
-    #[test]
-    fn test_iter() {
-        let mut d = VecDeque::new();
-        assert_eq!(d.iter().next(), None);
-        assert_eq!(d.iter().size_hint(), (0, Some(0)));
-
-        for i in 0..5 {
-            d.push_back(i);
-        }
-        {
-            let b: &[_] = &[&0,&1,&2,&3,&4];
-            assert_eq!(d.iter().collect::<Vec<_>>(), b);
-        }
-
-        for i in 6..9 {
-            d.push_front(i);
-        }
-        {
-            let b: &[_] = &[&8,&7,&6,&0,&1,&2,&3,&4];
-            assert_eq!(d.iter().collect::<Vec<_>>(), b);
-        }
-
-        let mut it = d.iter();
-        let mut len = d.len();
-        loop {
-            match it.next() {
-                None => break,
-                _ => { len -= 1; assert_eq!(it.size_hint(), (len, Some(len))) }
-            }
-        }
-    }
-
-    #[test]
-    fn test_rev_iter() {
-        let mut d = VecDeque::new();
-        assert_eq!(d.iter().rev().next(), None);
-
-        for i in 0..5 {
-            d.push_back(i);
-        }
-        {
-            let b: &[_] = &[&4,&3,&2,&1,&0];
-            assert_eq!(d.iter().rev().collect::<Vec<_>>(), b);
-        }
-
-        for i in 6..9 {
-            d.push_front(i);
-        }
-        let b: &[_] = &[&4,&3,&2,&1,&0,&6,&7,&8];
-        assert_eq!(d.iter().rev().collect::<Vec<_>>(), b);
-    }
-
-    #[test]
-    fn test_mut_rev_iter_wrap() {
-        let mut d = VecDeque::with_capacity(3);
-        assert!(d.iter_mut().rev().next().is_none());
-
-        d.push_back(1);
-        d.push_back(2);
-        d.push_back(3);
-        assert_eq!(d.pop_front(), Some(1));
-        d.push_back(4);
-
-        assert_eq!(d.iter_mut().rev().cloned().collect::<Vec<_>>(),
-                   vec![4, 3, 2]);
-    }
-
-    #[test]
-    fn test_mut_iter() {
-        let mut d = VecDeque::new();
-        assert!(d.iter_mut().next().is_none());
-
-        for i in 0..3 {
-            d.push_front(i);
-        }
-
-        for (i, elt) in d.iter_mut().enumerate() {
-            assert_eq!(*elt, 2 - i);
-            *elt = i;
-        }
-
-        {
-            let mut it = d.iter_mut();
-            assert_eq!(*it.next().unwrap(), 0);
-            assert_eq!(*it.next().unwrap(), 1);
-            assert_eq!(*it.next().unwrap(), 2);
-            assert!(it.next().is_none());
-        }
-    }
-
-    #[test]
-    fn test_mut_rev_iter() {
-        let mut d = VecDeque::new();
-        assert!(d.iter_mut().rev().next().is_none());
-
-        for i in 0..3 {
-            d.push_front(i);
-        }
-
-        for (i, elt) in d.iter_mut().rev().enumerate() {
-            assert_eq!(*elt, i);
-            *elt = i;
-        }
-
-        {
-            let mut it = d.iter_mut().rev();
-            assert_eq!(*it.next().unwrap(), 0);
-            assert_eq!(*it.next().unwrap(), 1);
-            assert_eq!(*it.next().unwrap(), 2);
-            assert!(it.next().is_none());
-        }
-    }
-
-    #[test]
-    fn test_into_iter() {
-
-        // Empty iter
-        {
-            let d: VecDeque<i32> = VecDeque::new();
-            let mut iter = d.into_iter();
-
-            assert_eq!(iter.size_hint(), (0, Some(0)));
-            assert_eq!(iter.next(), None);
-            assert_eq!(iter.size_hint(), (0, Some(0)));
-        }
-
-        // simple iter
-        {
-            let mut d = VecDeque::new();
-            for i in 0..5 {
-                d.push_back(i);
-            }
-
-            let b = vec![0,1,2,3,4];
-            assert_eq!(d.into_iter().collect::<Vec<_>>(), b);
-        }
-
-        // wrapped iter
-        {
-            let mut d = VecDeque::new();
-            for i in 0..5 {
-                d.push_back(i);
-            }
-            for i in 6..9 {
-                d.push_front(i);
-            }
-
-            let b = vec![8,7,6,0,1,2,3,4];
-            assert_eq!(d.into_iter().collect::<Vec<_>>(), b);
-        }
-
-        // partially used
-        {
-            let mut d = VecDeque::new();
-            for i in 0..5 {
-                d.push_back(i);
-            }
-            for i in 6..9 {
-                d.push_front(i);
-            }
-
-            let mut it = d.into_iter();
-            assert_eq!(it.size_hint(), (8, Some(8)));
-            assert_eq!(it.next(), Some(8));
-            assert_eq!(it.size_hint(), (7, Some(7)));
-            assert_eq!(it.next_back(), Some(4));
-            assert_eq!(it.size_hint(), (6, Some(6)));
-            assert_eq!(it.next(), Some(7));
-            assert_eq!(it.size_hint(), (5, Some(5)));
-        }
-    }
-
-    #[test]
-    fn test_drain() {
-
-        // Empty iter
-        {
-            let mut d: VecDeque<i32> = VecDeque::new();
-
-            {
-                let mut iter = d.drain();
-
-                assert_eq!(iter.size_hint(), (0, Some(0)));
-                assert_eq!(iter.next(), None);
-                assert_eq!(iter.size_hint(), (0, Some(0)));
-            }
-
-            assert!(d.is_empty());
-        }
-
-        // simple iter
-        {
-            let mut d = VecDeque::new();
-            for i in 0..5 {
-                d.push_back(i);
-            }
-
-            assert_eq!(d.drain().collect::<Vec<_>>(), [0, 1, 2, 3, 4]);
-            assert!(d.is_empty());
-        }
-
-        // wrapped iter
-        {
-            let mut d = VecDeque::new();
-            for i in 0..5 {
-                d.push_back(i);
-            }
-            for i in 6..9 {
-                d.push_front(i);
-            }
-
-            assert_eq!(d.drain().collect::<Vec<_>>(), [8,7,6,0,1,2,3,4]);
-            assert!(d.is_empty());
-        }
-
-        // partially used
-        {
-            let mut d: VecDeque<_> = VecDeque::new();
-            for i in 0..5 {
-                d.push_back(i);
-            }
-            for i in 6..9 {
-                d.push_front(i);
-            }
-
-            {
-                let mut it = d.drain();
-                assert_eq!(it.size_hint(), (8, Some(8)));
-                assert_eq!(it.next(), Some(8));
-                assert_eq!(it.size_hint(), (7, Some(7)));
-                assert_eq!(it.next_back(), Some(4));
-                assert_eq!(it.size_hint(), (6, Some(6)));
-                assert_eq!(it.next(), Some(7));
-                assert_eq!(it.size_hint(), (5, Some(5)));
-            }
-            assert!(d.is_empty());
-        }
-    }
-
-    #[test]
-    fn test_from_iter() {
-        use core::iter;
-        let v = vec!(1,2,3,4,5,6,7);
-        let deq: VecDeque<_> = v.iter().cloned().collect();
-        let u: Vec<_> = deq.iter().cloned().collect();
-        assert_eq!(u, v);
-
-        let seq = iter::count(0, 2).take(256);
-        let deq: VecDeque<_> = seq.collect();
-        for (i, &x) in deq.iter().enumerate() {
-            assert_eq!(2*i, x);
-        }
-        assert_eq!(deq.len(), 256);
-    }
-
-    #[test]
-    fn test_clone() {
-        let mut d = VecDeque::new();
-        d.push_front(17);
-        d.push_front(42);
-        d.push_back(137);
-        d.push_back(137);
-        assert_eq!(d.len(), 4);
-        let mut e = d.clone();
-        assert_eq!(e.len(), 4);
-        while !d.is_empty() {
-            assert_eq!(d.pop_back(), e.pop_back());
-        }
-        assert_eq!(d.len(), 0);
-        assert_eq!(e.len(), 0);
-    }
-
-    #[test]
-    fn test_eq() {
-        let mut d = VecDeque::new();
-        assert!(d == VecDeque::with_capacity(0));
-        d.push_front(137);
-        d.push_front(17);
-        d.push_front(42);
-        d.push_back(137);
-        let mut e = VecDeque::with_capacity(0);
-        e.push_back(42);
-        e.push_back(17);
-        e.push_back(137);
-        e.push_back(137);
-        assert!(&e == &d);
-        e.pop_back();
-        e.push_back(0);
-        assert!(e != d);
-        e.clear();
-        assert!(e == VecDeque::new());
-    }
-
-    #[test]
-    fn test_hash() {
-      let mut x = VecDeque::new();
-      let mut y = VecDeque::new();
-
-      x.push_back(1);
-      x.push_back(2);
-      x.push_back(3);
-
-      y.push_back(0);
-      y.push_back(1);
-      y.pop_front();
-      y.push_back(2);
-      y.push_back(3);
-
-      assert!(hash::hash::<_, SipHasher>(&x) == hash::hash::<_, SipHasher>(&y));
-    }
-
-    #[test]
-    fn test_ord() {
-        let x = VecDeque::new();
-        let mut y = VecDeque::new();
-        y.push_back(1);
-        y.push_back(2);
-        y.push_back(3);
-        assert!(x < y);
-        assert!(y > x);
-        assert!(x <= x);
-        assert!(x >= x);
-    }
-
-    #[test]
-    fn test_show() {
-        let ringbuf: VecDeque<_> = (0..10).collect();
-        assert_eq!(format!("{:?}", ringbuf), "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]");
-
-        let ringbuf: VecDeque<_> = vec!["just", "one", "test", "more"].iter()
-                                                                        .cloned()
-                                                                        .collect();
-        assert_eq!(format!("{:?}", ringbuf), "[\"just\", \"one\", \"test\", \"more\"]");
-    }
-
-    #[test]
-    fn test_drop() {
-        static mut drops: i32 = 0;
-        struct Elem;
-        impl Drop for Elem {
-            fn drop(&mut self) {
-                unsafe { drops += 1; }
-            }
-        }
-
-        let mut ring = VecDeque::new();
-        ring.push_back(Elem);
-        ring.push_front(Elem);
-        ring.push_back(Elem);
-        ring.push_front(Elem);
-        drop(ring);
-
-        assert_eq!(unsafe {drops}, 4);
-    }
-
-    #[test]
-    fn test_drop_with_pop() {
-        static mut drops: i32 = 0;
-        struct Elem;
-        impl Drop for Elem {
-            fn drop(&mut self) {
-                unsafe { drops += 1; }
-            }
-        }
-
-        let mut ring = VecDeque::new();
-        ring.push_back(Elem);
-        ring.push_front(Elem);
-        ring.push_back(Elem);
-        ring.push_front(Elem);
-
-        drop(ring.pop_back());
-        drop(ring.pop_front());
-        assert_eq!(unsafe {drops}, 2);
-
-        drop(ring);
-        assert_eq!(unsafe {drops}, 4);
-    }
-
-    #[test]
-    fn test_drop_clear() {
-        static mut drops: i32 = 0;
-        struct Elem;
-        impl Drop for Elem {
-            fn drop(&mut self) {
-                unsafe { drops += 1; }
-            }
-        }
-
-        let mut ring = VecDeque::new();
-        ring.push_back(Elem);
-        ring.push_front(Elem);
-        ring.push_back(Elem);
-        ring.push_front(Elem);
-        ring.clear();
-        assert_eq!(unsafe {drops}, 4);
-
-        drop(ring);
-        assert_eq!(unsafe {drops}, 4);
-    }
-
-    #[test]
-    fn test_reserve_grow() {
-        // test growth path A
-        // [T o o H] -> [T o o H . . . . ]
-        let mut ring = VecDeque::with_capacity(4);
-        for i in 0..3 {
-            ring.push_back(i);
-        }
-        ring.reserve(7);
-        for i in 0..3 {
-            assert_eq!(ring.pop_front(), Some(i));
-        }
-
-        // test growth path B
-        // [H T o o] -> [. T o o H . . . ]
-        let mut ring = VecDeque::with_capacity(4);
-        for i in 0..1 {
-            ring.push_back(i);
-            assert_eq!(ring.pop_front(), Some(i));
-        }
-        for i in 0..3 {
-            ring.push_back(i);
-        }
-        ring.reserve(7);
-        for i in 0..3 {
-            assert_eq!(ring.pop_front(), Some(i));
-        }
-
-        // test growth path C
-        // [o o H T] -> [o o H . . . . T ]
-        let mut ring = VecDeque::with_capacity(4);
-        for i in 0..3 {
-            ring.push_back(i);
-            assert_eq!(ring.pop_front(), Some(i));
-        }
-        for i in 0..3 {
-            ring.push_back(i);
-        }
-        ring.reserve(7);
-        for i in 0..3 {
-            assert_eq!(ring.pop_front(), Some(i));
-        }
-    }
-
-    #[test]
-    fn test_get() {
-        let mut ring = VecDeque::new();
-        ring.push_back(0);
-        assert_eq!(ring.get(0), Some(&0));
-        assert_eq!(ring.get(1), None);
-
-        ring.push_back(1);
-        assert_eq!(ring.get(0), Some(&0));
-        assert_eq!(ring.get(1), Some(&1));
-        assert_eq!(ring.get(2), None);
-
-        ring.push_back(2);
-        assert_eq!(ring.get(0), Some(&0));
-        assert_eq!(ring.get(1), Some(&1));
-        assert_eq!(ring.get(2), Some(&2));
-        assert_eq!(ring.get(3), None);
-
-        assert_eq!(ring.pop_front(), Some(0));
-        assert_eq!(ring.get(0), Some(&1));
-        assert_eq!(ring.get(1), Some(&2));
-        assert_eq!(ring.get(2), None);
-
-        assert_eq!(ring.pop_front(), Some(1));
-        assert_eq!(ring.get(0), Some(&2));
-        assert_eq!(ring.get(1), None);
-
-        assert_eq!(ring.pop_front(), Some(2));
-        assert_eq!(ring.get(0), None);
-        assert_eq!(ring.get(1), None);
-    }
-
-    #[test]
-    fn test_get_mut() {
-        let mut ring = VecDeque::new();
-        for i in 0..3 {
-            ring.push_back(i);
-        }
-
-        match ring.get_mut(1) {
-            Some(x) => *x = -1,
-            None => ()
-        };
-
-        assert_eq!(ring.get_mut(0), Some(&mut 0));
-        assert_eq!(ring.get_mut(1), Some(&mut -1));
-        assert_eq!(ring.get_mut(2), Some(&mut 2));
-        assert_eq!(ring.get_mut(3), None);
-
-        assert_eq!(ring.pop_front(), Some(0));
-        assert_eq!(ring.get_mut(0), Some(&mut -1));
-        assert_eq!(ring.get_mut(1), Some(&mut 2));
-        assert_eq!(ring.get_mut(2), None);
-    }
-
-    #[test]
-    fn test_swap_front_back_remove() {
-        fn test(back: bool) {
-            // This test checks that every single combination of tail position and length is tested.
-            // Capacity 15 should be large enough to cover every case.
-            let mut tester = VecDeque::with_capacity(15);
-            let usable_cap = tester.capacity();
-            let final_len = usable_cap / 2;
-
-            for len in 0..final_len {
-                let expected = if back {
-                    (0..len).collect()
-                } else {
-                    (0..len).rev().collect()
-                };
-                for tail_pos in 0..usable_cap {
-                    tester.tail = tail_pos;
-                    tester.head = tail_pos;
-                    if back {
-                        for i in 0..len * 2 {
-                            tester.push_front(i);
-                        }
-                        for i in 0..len {
-                            assert_eq!(tester.swap_back_remove(i), Some(len * 2 - 1 - i));
-                        }
-                    } else {
-                        for i in 0..len * 2 {
-                            tester.push_back(i);
-                        }
-                        for i in 0..len {
-                            let idx = tester.len() - 1 - i;
-                            assert_eq!(tester.swap_front_remove(idx), Some(len * 2 - 1 - i));
-                        }
-                    }
-                    assert!(tester.tail < tester.cap);
-                    assert!(tester.head < tester.cap);
-                    assert_eq!(tester, expected);
-                }
-            }
-        }
-        test(true);
-        test(false);
-    }
-
-    #[test]
-    fn test_insert() {
-        // This test checks that every single combination of tail position, length, and
-        // insertion position is tested. Capacity 15 should be large enough to cover every case.
-
-        let mut tester = VecDeque::with_capacity(15);
-        // can't guarantee we got 15, so have to get what we got.
-        // 15 would be great, but we will definitely get 2^k - 1, for k >= 4, or else
-        // this test isn't covering what it wants to
-        let cap = tester.capacity();
-
-
-        // len is the length *after* insertion
-        for len in 1..cap {
-            // 0, 1, 2, .., len - 1
-            let expected = iter::count(0, 1).take(len).collect();
-            for tail_pos in 0..cap {
-                for to_insert in 0..len {
-                    tester.tail = tail_pos;
-                    tester.head = tail_pos;
-                    for i in 0..len {
-                        if i != to_insert {
-                            tester.push_back(i);
-                        }
-                    }
-                    tester.insert(to_insert, to_insert);
-                    assert!(tester.tail < tester.cap);
-                    assert!(tester.head < tester.cap);
-                    assert_eq!(tester, expected);
-                }
-            }
-        }
-    }
-
-    #[test]
-    fn test_remove() {
-        // This test checks that every single combination of tail position, length, and
-        // removal position is tested. Capacity 15 should be large enough to cover every case.
-
-        let mut tester = VecDeque::with_capacity(15);
-        // can't guarantee we got 15, so have to get what we got.
-        // 15 would be great, but we will definitely get 2^k - 1, for k >= 4, or else
-        // this test isn't covering what it wants to
-        let cap = tester.capacity();
-
-        // len is the length *after* removal
-        for len in 0..cap - 1 {
-            // 0, 1, 2, .., len - 1
-            let expected = iter::count(0, 1).take(len).collect();
-            for tail_pos in 0..cap {
-                for to_remove in 0..len + 1 {
-                    tester.tail = tail_pos;
-                    tester.head = tail_pos;
-                    for i in 0..len {
-                        if i == to_remove {
-                            tester.push_back(1234);
-                        }
-                        tester.push_back(i);
-                    }
-                    if to_remove == len {
-                        tester.push_back(1234);
-                    }
-                    tester.remove(to_remove);
-                    assert!(tester.tail < tester.cap);
-                    assert!(tester.head < tester.cap);
-                    assert_eq!(tester, expected);
-                }
-            }
-        }
-    }
-
-    #[test]
-    fn test_shrink_to_fit() {
-        // This test checks that every single combination of head and tail position,
-        // is tested. Capacity 15 should be large enough to cover every case.
-
-        let mut tester = VecDeque::with_capacity(15);
-        // can't guarantee we got 15, so have to get what we got.
-        // 15 would be great, but we will definitely get 2^k - 1, for k >= 4, or else
-        // this test isn't covering what it wants to
-        let cap = tester.capacity();
-        tester.reserve(63);
-        let max_cap = tester.capacity();
-
-        for len in 0..cap + 1 {
-            // 0, 1, 2, .., len - 1
-            let expected = iter::count(0, 1).take(len).collect();
-            for tail_pos in 0..max_cap + 1 {
-                tester.tail = tail_pos;
-                tester.head = tail_pos;
-                tester.reserve(63);
-                for i in 0..len {
-                    tester.push_back(i);
-                }
-                tester.shrink_to_fit();
-                assert!(tester.capacity() <= cap);
-                assert!(tester.tail < tester.cap);
-                assert!(tester.head < tester.cap);
-                assert_eq!(tester, expected);
-            }
-        }
-    }
-
-    #[test]
-    fn test_front() {
-        let mut ring = VecDeque::new();
-        ring.push_back(10);
-        ring.push_back(20);
-        assert_eq!(ring.front(), Some(&10));
-        ring.pop_front();
-        assert_eq!(ring.front(), Some(&20));
-        ring.pop_front();
-        assert_eq!(ring.front(), None);
-    }
-
-    #[test]
-    fn test_as_slices() {
-        let mut ring: VecDeque<i32> = VecDeque::with_capacity(127);
-        let cap = ring.capacity() as i32;
-        let first = cap/2;
-        let last  = cap - first;
-        for i in 0..first {
-            ring.push_back(i);
-
-            let (left, right) = ring.as_slices();
-            let expected: Vec<_> = (0..i+1).collect();
-            assert_eq!(left, expected);
-            assert_eq!(right, []);
-        }
-
-        for j in -last..0 {
-            ring.push_front(j);
-            let (left, right) = ring.as_slices();
-            let expected_left: Vec<_> = (-last..j+1).rev().collect();
-            let expected_right: Vec<_> = (0..first).collect();
-            assert_eq!(left, expected_left);
-            assert_eq!(right, expected_right);
-        }
-
-        assert_eq!(ring.len() as i32, cap);
-        assert_eq!(ring.capacity() as i32, cap);
-    }
-
-    #[test]
-    fn test_as_mut_slices() {
-        let mut ring: VecDeque<i32> = VecDeque::with_capacity(127);
-        let cap = ring.capacity() as i32;
-        let first = cap/2;
-        let last  = cap - first;
-        for i in 0..first {
-            ring.push_back(i);
-
-            let (left, right) = ring.as_mut_slices();
-            let expected: Vec<_> = (0..i+1).collect();
-            assert_eq!(left, expected);
-            assert_eq!(right, []);
-        }
-
-        for j in -last..0 {
-            ring.push_front(j);
-            let (left, right) = ring.as_mut_slices();
-            let expected_left: Vec<_> = (-last..j+1).rev().collect();
-            let expected_right: Vec<_> = (0..first).collect();
-            assert_eq!(left, expected_left);
-            assert_eq!(right, expected_right);
-        }
-
-        assert_eq!(ring.len() as i32, cap);
-        assert_eq!(ring.capacity() as i32, cap);
-    }
-
-    #[test]
-    fn test_split_off() {
-        // This test checks that every single combination of tail position, length, and
-        // split position is tested. Capacity 15 should be large enough to cover every case.
-
-        let mut tester = VecDeque::with_capacity(15);
-        // can't guarantee we got 15, so have to get what we got.
-        // 15 would be great, but we will definitely get 2^k - 1, for k >= 4, or else
-        // this test isn't covering what it wants to
-        let cap = tester.capacity();
-
-        // len is the length *before* splitting
-        for len in 0..cap {
-            // index to split at
-            for at in 0..len + 1 {
-                // 0, 1, 2, .., at - 1 (may be empty)
-                let expected_self = iter::count(0, 1).take(at).collect();
-                // at, at + 1, .., len - 1 (may be empty)
-                let expected_other = iter::count(at, 1).take(len - at).collect();
-
-                for tail_pos in 0..cap {
-                    tester.tail = tail_pos;
-                    tester.head = tail_pos;
-                    for i in 0..len {
-                        tester.push_back(i);
-                    }
-                    let result = tester.split_off(at);
-                    assert!(tester.tail < tester.cap);
-                    assert!(tester.head < tester.cap);
-                    assert!(result.tail < result.cap);
-                    assert!(result.head < result.cap);
-                    assert_eq!(tester, expected_self);
-                    assert_eq!(result, expected_other);
-                }
-            }
-        }
-    }
-
-    #[test]
-    fn test_append() {
-        let mut a: VecDeque<_> = vec![1, 2, 3].into_iter().collect();
-        let mut b: VecDeque<_> = vec![4, 5, 6].into_iter().collect();
-
-        // normal append
-        a.append(&mut b);
-        assert_eq!(a.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
-        assert_eq!(b.iter().cloned().collect::<Vec<_>>(), []);
-
-        // append nothing to something
-        a.append(&mut b);
-        assert_eq!(a.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
-        assert_eq!(b.iter().cloned().collect::<Vec<_>>(), []);
-
-        // append something to nothing
-        b.append(&mut a);
-        assert_eq!(b.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
-        assert_eq!(a.iter().cloned().collect::<Vec<_>>(), []);
-    }
-}
index 431c8d5df8c0a11dfa27efa2394b1a2db30a57a8..6e67d8763273d7c0156473b126b4662d061911f3 100644 (file)
@@ -1004,510 +1004,3 @@ fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
 impl<V> DoubleEndedIterator for IntoIter<V> {
     fn next_back(&mut self) -> Option<(usize, V)> { self.iter.next_back() }
 }
-
-#[cfg(test)]
-mod test_map {
-    use prelude::*;
-    use core::hash::{hash, SipHasher};
-
-    use super::VecMap;
-    use super::Entry::{Occupied, Vacant};
-
-    #[test]
-    fn test_get_mut() {
-        let mut m = VecMap::new();
-        assert!(m.insert(1, 12).is_none());
-        assert!(m.insert(2, 8).is_none());
-        assert!(m.insert(5, 14).is_none());
-        let new = 100;
-        match m.get_mut(&5) {
-            None => panic!(), Some(x) => *x = new
-        }
-        assert_eq!(m.get(&5), Some(&new));
-    }
-
-    #[test]
-    fn test_len() {
-        let mut map = VecMap::new();
-        assert_eq!(map.len(), 0);
-        assert!(map.is_empty());
-        assert!(map.insert(5, 20).is_none());
-        assert_eq!(map.len(), 1);
-        assert!(!map.is_empty());
-        assert!(map.insert(11, 12).is_none());
-        assert_eq!(map.len(), 2);
-        assert!(!map.is_empty());
-        assert!(map.insert(14, 22).is_none());
-        assert_eq!(map.len(), 3);
-        assert!(!map.is_empty());
-    }
-
-    #[test]
-    fn test_clear() {
-        let mut map = VecMap::new();
-        assert!(map.insert(5, 20).is_none());
-        assert!(map.insert(11, 12).is_none());
-        assert!(map.insert(14, 22).is_none());
-        map.clear();
-        assert!(map.is_empty());
-        assert!(map.get(&5).is_none());
-        assert!(map.get(&11).is_none());
-        assert!(map.get(&14).is_none());
-    }
-
-    #[test]
-    fn test_insert() {
-        let mut m = VecMap::new();
-        assert_eq!(m.insert(1, 2), None);
-        assert_eq!(m.insert(1, 3), Some(2));
-        assert_eq!(m.insert(1, 4), Some(3));
-    }
-
-    #[test]
-    fn test_remove() {
-        let mut m = VecMap::new();
-        m.insert(1, 2);
-        assert_eq!(m.remove(&1), Some(2));
-        assert_eq!(m.remove(&1), None);
-    }
-
-    #[test]
-    fn test_keys() {
-        let mut map = VecMap::new();
-        map.insert(1, 'a');
-        map.insert(2, 'b');
-        map.insert(3, 'c');
-        let keys: Vec<_> = map.keys().collect();
-        assert_eq!(keys.len(), 3);
-        assert!(keys.contains(&1));
-        assert!(keys.contains(&2));
-        assert!(keys.contains(&3));
-    }
-
-    #[test]
-    fn test_values() {
-        let mut map = VecMap::new();
-        map.insert(1, 'a');
-        map.insert(2, 'b');
-        map.insert(3, 'c');
-        let values: Vec<_> = map.values().cloned().collect();
-        assert_eq!(values.len(), 3);
-        assert!(values.contains(&'a'));
-        assert!(values.contains(&'b'));
-        assert!(values.contains(&'c'));
-    }
-
-    #[test]
-    fn test_iterator() {
-        let mut m = VecMap::new();
-
-        assert!(m.insert(0, 1).is_none());
-        assert!(m.insert(1, 2).is_none());
-        assert!(m.insert(3, 5).is_none());
-        assert!(m.insert(6, 10).is_none());
-        assert!(m.insert(10, 11).is_none());
-
-        let mut it = m.iter();
-        assert_eq!(it.size_hint(), (0, Some(11)));
-        assert_eq!(it.next().unwrap(), (0, &1));
-        assert_eq!(it.size_hint(), (0, Some(10)));
-        assert_eq!(it.next().unwrap(), (1, &2));
-        assert_eq!(it.size_hint(), (0, Some(9)));
-        assert_eq!(it.next().unwrap(), (3, &5));
-        assert_eq!(it.size_hint(), (0, Some(7)));
-        assert_eq!(it.next().unwrap(), (6, &10));
-        assert_eq!(it.size_hint(), (0, Some(4)));
-        assert_eq!(it.next().unwrap(), (10, &11));
-        assert_eq!(it.size_hint(), (0, Some(0)));
-        assert!(it.next().is_none());
-    }
-
-    #[test]
-    fn test_iterator_size_hints() {
-        let mut m = VecMap::new();
-
-        assert!(m.insert(0, 1).is_none());
-        assert!(m.insert(1, 2).is_none());
-        assert!(m.insert(3, 5).is_none());
-        assert!(m.insert(6, 10).is_none());
-        assert!(m.insert(10, 11).is_none());
-
-        assert_eq!(m.iter().size_hint(), (0, Some(11)));
-        assert_eq!(m.iter().rev().size_hint(), (0, Some(11)));
-        assert_eq!(m.iter_mut().size_hint(), (0, Some(11)));
-        assert_eq!(m.iter_mut().rev().size_hint(), (0, Some(11)));
-    }
-
-    #[test]
-    fn test_mut_iterator() {
-        let mut m = VecMap::new();
-
-        assert!(m.insert(0, 1).is_none());
-        assert!(m.insert(1, 2).is_none());
-        assert!(m.insert(3, 5).is_none());
-        assert!(m.insert(6, 10).is_none());
-        assert!(m.insert(10, 11).is_none());
-
-        for (k, v) in &mut m {
-            *v += k as isize;
-        }
-
-        let mut it = m.iter();
-        assert_eq!(it.next().unwrap(), (0, &1));
-        assert_eq!(it.next().unwrap(), (1, &3));
-        assert_eq!(it.next().unwrap(), (3, &8));
-        assert_eq!(it.next().unwrap(), (6, &16));
-        assert_eq!(it.next().unwrap(), (10, &21));
-        assert!(it.next().is_none());
-    }
-
-    #[test]
-    fn test_rev_iterator() {
-        let mut m = VecMap::new();
-
-        assert!(m.insert(0, 1).is_none());
-        assert!(m.insert(1, 2).is_none());
-        assert!(m.insert(3, 5).is_none());
-        assert!(m.insert(6, 10).is_none());
-        assert!(m.insert(10, 11).is_none());
-
-        let mut it = m.iter().rev();
-        assert_eq!(it.next().unwrap(), (10, &11));
-        assert_eq!(it.next().unwrap(), (6, &10));
-        assert_eq!(it.next().unwrap(), (3, &5));
-        assert_eq!(it.next().unwrap(), (1, &2));
-        assert_eq!(it.next().unwrap(), (0, &1));
-        assert!(it.next().is_none());
-    }
-
-    #[test]
-    fn test_mut_rev_iterator() {
-        let mut m = VecMap::new();
-
-        assert!(m.insert(0, 1).is_none());
-        assert!(m.insert(1, 2).is_none());
-        assert!(m.insert(3, 5).is_none());
-        assert!(m.insert(6, 10).is_none());
-        assert!(m.insert(10, 11).is_none());
-
-        for (k, v) in m.iter_mut().rev() {
-            *v += k as isize;
-        }
-
-        let mut it = m.iter();
-        assert_eq!(it.next().unwrap(), (0, &1));
-        assert_eq!(it.next().unwrap(), (1, &3));
-        assert_eq!(it.next().unwrap(), (3, &8));
-        assert_eq!(it.next().unwrap(), (6, &16));
-        assert_eq!(it.next().unwrap(), (10, &21));
-        assert!(it.next().is_none());
-    }
-
-    #[test]
-    fn test_move_iter() {
-        let mut m: VecMap<Box<_>> = VecMap::new();
-        m.insert(1, box 2);
-        let mut called = false;
-        for (k, v) in m {
-            assert!(!called);
-            called = true;
-            assert_eq!(k, 1);
-            assert_eq!(v, box 2);
-        }
-        assert!(called);
-    }
-
-    #[test]
-    fn test_drain_iterator() {
-        let mut map = VecMap::new();
-        map.insert(1, "a");
-        map.insert(3, "c");
-        map.insert(2, "b");
-
-        let vec: Vec<_> = map.drain().collect();
-
-        assert_eq!(vec, [(1, "a"), (2, "b"), (3, "c")]);
-        assert_eq!(map.len(), 0);
-    }
-
-    #[test]
-    fn test_append() {
-        let mut a = VecMap::new();
-        a.insert(1, "a");
-        a.insert(2, "b");
-        a.insert(3, "c");
-
-        let mut b = VecMap::new();
-        b.insert(3, "d");  // Overwrite element from a
-        b.insert(4, "e");
-        b.insert(5, "f");
-
-        a.append(&mut b);
-
-        assert_eq!(a.len(), 5);
-        assert_eq!(b.len(), 0);
-        // Capacity shouldn't change for possible reuse
-        assert!(b.capacity() >= 4);
-
-        assert_eq!(a[1], "a");
-        assert_eq!(a[2], "b");
-        assert_eq!(a[3], "d");
-        assert_eq!(a[4], "e");
-        assert_eq!(a[5], "f");
-    }
-
-    #[test]
-    fn test_split_off() {
-        // Split within the key range
-        let mut a = VecMap::new();
-        a.insert(1, "a");
-        a.insert(2, "b");
-        a.insert(3, "c");
-        a.insert(4, "d");
-
-        let b = a.split_off(3);
-
-        assert_eq!(a.len(), 2);
-        assert_eq!(b.len(), 2);
-
-        assert_eq!(a[1], "a");
-        assert_eq!(a[2], "b");
-
-        assert_eq!(b[3], "c");
-        assert_eq!(b[4], "d");
-
-        // Split at 0
-        a.clear();
-        a.insert(1, "a");
-        a.insert(2, "b");
-        a.insert(3, "c");
-        a.insert(4, "d");
-
-        let b = a.split_off(0);
-
-        assert_eq!(a.len(), 0);
-        assert_eq!(b.len(), 4);
-        assert_eq!(b[1], "a");
-        assert_eq!(b[2], "b");
-        assert_eq!(b[3], "c");
-        assert_eq!(b[4], "d");
-
-        // Split behind max_key
-        a.clear();
-        a.insert(1, "a");
-        a.insert(2, "b");
-        a.insert(3, "c");
-        a.insert(4, "d");
-
-        let b = a.split_off(5);
-
-        assert_eq!(a.len(), 4);
-        assert_eq!(b.len(), 0);
-        assert_eq!(a[1], "a");
-        assert_eq!(a[2], "b");
-        assert_eq!(a[3], "c");
-        assert_eq!(a[4], "d");
-    }
-
-    #[test]
-    fn test_show() {
-        let mut map = VecMap::new();
-        let empty = VecMap::<i32>::new();
-
-        map.insert(1, 2);
-        map.insert(3, 4);
-
-        let map_str = format!("{:?}", map);
-        assert!(map_str == "{1: 2, 3: 4}" || map_str == "{3: 4, 1: 2}");
-        assert_eq!(format!("{:?}", empty), "{}");
-    }
-
-    #[test]
-    fn test_clone() {
-        let mut a = VecMap::new();
-
-        a.insert(1, 'x');
-        a.insert(4, 'y');
-        a.insert(6, 'z');
-
-        assert!(a.clone() == a);
-    }
-
-    #[test]
-    fn test_eq() {
-        let mut a = VecMap::new();
-        let mut b = VecMap::new();
-
-        assert!(a == b);
-        assert!(a.insert(0, 5).is_none());
-        assert!(a != b);
-        assert!(b.insert(0, 4).is_none());
-        assert!(a != b);
-        assert!(a.insert(5, 19).is_none());
-        assert!(a != b);
-        assert!(!b.insert(0, 5).is_none());
-        assert!(a != b);
-        assert!(b.insert(5, 19).is_none());
-        assert!(a == b);
-
-        a = VecMap::new();
-        b = VecMap::with_capacity(1);
-        assert!(a == b);
-    }
-
-    #[test]
-    fn test_lt() {
-        let mut a = VecMap::new();
-        let mut b = VecMap::new();
-
-        assert!(!(a < b) && !(b < a));
-        assert!(b.insert(2, 5).is_none());
-        assert!(a < b);
-        assert!(a.insert(2, 7).is_none());
-        assert!(!(a < b) && b < a);
-        assert!(b.insert(1, 0).is_none());
-        assert!(b < a);
-        assert!(a.insert(0, 6).is_none());
-        assert!(a < b);
-        assert!(a.insert(6, 2).is_none());
-        assert!(a < b && !(b < a));
-    }
-
-    #[test]
-    fn test_ord() {
-        let mut a = VecMap::new();
-        let mut b = VecMap::new();
-
-        assert!(a <= b && a >= b);
-        assert!(a.insert(1, 1).is_none());
-        assert!(a > b && a >= b);
-        assert!(b < a && b <= a);
-        assert!(b.insert(2, 2).is_none());
-        assert!(b > a && b >= a);
-        assert!(a < b && a <= b);
-    }
-
-    #[test]
-    fn test_hash() {
-        let mut x = VecMap::new();
-        let mut y = VecMap::new();
-
-        assert!(hash::<_, SipHasher>(&x) == hash::<_, SipHasher>(&y));
-        x.insert(1, 'a');
-        x.insert(2, 'b');
-        x.insert(3, 'c');
-
-        y.insert(3, 'c');
-        y.insert(2, 'b');
-        y.insert(1, 'a');
-
-        assert!(hash::<_, SipHasher>(&x) == hash::<_, SipHasher>(&y));
-
-        x.insert(1000, 'd');
-        x.remove(&1000);
-
-        assert!(hash::<_, SipHasher>(&x) == hash::<_, SipHasher>(&y));
-    }
-
-    #[test]
-    fn test_from_iter() {
-        let xs = vec![(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e')];
-
-        let map: VecMap<_> = xs.iter().cloned().collect();
-
-        for &(k, v) in &xs {
-            assert_eq!(map.get(&k), Some(&v));
-        }
-    }
-
-    #[test]
-    fn test_index() {
-        let mut map = VecMap::new();
-
-        map.insert(1, 2);
-        map.insert(2, 1);
-        map.insert(3, 4);
-
-        assert_eq!(map[3], 4);
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_index_nonexistent() {
-        let mut map = VecMap::new();
-
-        map.insert(1, 2);
-        map.insert(2, 1);
-        map.insert(3, 4);
-
-        map[4];
-    }
-
-    #[test]
-    fn test_entry(){
-        let xs = [(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)];
-
-        let mut map: VecMap<_> = xs.iter().cloned().collect();
-
-        // Existing key (insert)
-        match map.entry(1) {
-            Vacant(_) => unreachable!(),
-            Occupied(mut view) => {
-                assert_eq!(view.get(), &10);
-                assert_eq!(view.insert(100), 10);
-            }
-        }
-        assert_eq!(map.get(&1).unwrap(), &100);
-        assert_eq!(map.len(), 6);
-
-
-        // Existing key (update)
-        match map.entry(2) {
-            Vacant(_) => unreachable!(),
-            Occupied(mut view) => {
-                let v = view.get_mut();
-                *v *= 10;
-            }
-        }
-        assert_eq!(map.get(&2).unwrap(), &200);
-        assert_eq!(map.len(), 6);
-
-        // Existing key (take)
-        match map.entry(3) {
-            Vacant(_) => unreachable!(),
-            Occupied(view) => {
-                assert_eq!(view.remove(), 30);
-            }
-        }
-        assert_eq!(map.get(&3), None);
-        assert_eq!(map.len(), 5);
-
-
-        // Inexistent key (insert)
-        match map.entry(10) {
-            Occupied(_) => unreachable!(),
-            Vacant(view) => {
-                assert_eq!(*view.insert(1000), 1000);
-            }
-        }
-        assert_eq!(map.get(&10).unwrap(), &1000);
-        assert_eq!(map.len(), 6);
-    }
-}
-
-#[cfg(test)]
-mod bench {
-    use super::VecMap;
-
-    map_insert_rand_bench!{insert_rand_100,    100,    VecMap}
-    map_insert_rand_bench!{insert_rand_10_000, 10_000, VecMap}
-
-    map_insert_seq_bench!{insert_seq_100,    100,    VecMap}
-    map_insert_seq_bench!{insert_seq_10_000, 10_000, VecMap}
-
-    map_find_rand_bench!{find_rand_100,    100,    VecMap}
-    map_find_rand_bench!{find_rand_10_000, 10_000, VecMap}
-
-    map_find_seq_bench!{find_seq_100,    100,    VecMap}
-    map_find_seq_bench!{find_seq_10_000, 10_000, VecMap}
-}
diff --git a/src/libcollectionstest/bench.rs b/src/libcollectionstest/bench.rs
new file mode 100644 (file)
index 0000000..2396a57
--- /dev/null
@@ -0,0 +1,122 @@
+// Copyright 2013-2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+macro_rules! map_insert_rand_bench {
+    ($name: ident, $n: expr, $map: ident) => (
+        #[bench]
+        pub fn $name(b: &mut ::test::Bencher) {
+            use std::rand;
+            use std::rand::Rng;
+            use test::black_box;
+
+            let n: usize = $n;
+            let mut map = $map::new();
+            // setup
+            let mut rng = rand::weak_rng();
+
+            for _ in 0..n {
+                let i = rng.gen() % n;
+                map.insert(i, i);
+            }
+
+            // measure
+            b.iter(|| {
+                let k = rng.gen() % n;
+                map.insert(k, k);
+                map.remove(&k);
+            });
+            black_box(map);
+        }
+    )
+}
+
+macro_rules! map_insert_seq_bench {
+    ($name: ident, $n: expr, $map: ident) => (
+        #[bench]
+        pub fn $name(b: &mut ::test::Bencher) {
+            use test::black_box;
+
+            let mut map = $map::new();
+            let n: usize = $n;
+            // setup
+            for i in 0..n {
+                map.insert(i * 2, i * 2);
+            }
+
+            // measure
+            let mut i = 1;
+            b.iter(|| {
+                map.insert(i, i);
+                map.remove(&i);
+                i = (i + 2) % n;
+            });
+            black_box(map);
+        }
+    )
+}
+
+macro_rules! map_find_rand_bench {
+    ($name: ident, $n: expr, $map: ident) => (
+        #[bench]
+        pub fn $name(b: &mut ::test::Bencher) {
+            use std::iter::IteratorExt;
+            use std::rand::Rng;
+            use std::rand;
+            use std::vec::Vec;
+            use test::black_box;
+
+            let mut map = $map::new();
+            let n: usize = $n;
+
+            // setup
+            let mut rng = rand::weak_rng();
+            let mut keys: Vec<_> = (0..n).map(|_| rng.gen() % n).collect();
+
+            for &k in &keys {
+                map.insert(k, k);
+            }
+
+            rng.shuffle(&mut keys);
+
+            // measure
+            let mut i = 0;
+            b.iter(|| {
+                let t = map.get(&keys[i]);
+                i = (i + 1) % n;
+                black_box(t);
+            })
+        }
+    )
+}
+
+macro_rules! map_find_seq_bench {
+    ($name: ident, $n: expr, $map: ident) => (
+        #[bench]
+        pub fn $name(b: &mut ::test::Bencher) {
+            use test::black_box;
+
+            let mut map = $map::new();
+            let n: usize = $n;
+
+            // setup
+            for i in 0..n {
+                map.insert(i, i);
+            }
+
+            // measure
+            let mut i = 0;
+            b.iter(|| {
+                let x = map.get(&i);
+                i = (i + 1) % n;
+                black_box(x);
+            })
+        }
+    )
+}
diff --git a/src/libcollectionstest/binary_heap.rs b/src/libcollectionstest/binary_heap.rs
new file mode 100644 (file)
index 0000000..47a366b
--- /dev/null
@@ -0,0 +1,219 @@
+// Copyright 2013-2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::collections::BinaryHeap;
+
+#[test]
+fn test_iterator() {
+    let data = vec![5, 9, 3];
+    let iterout = [9, 5, 3];
+    let heap = BinaryHeap::from_vec(data);
+    let mut i = 0;
+    for el in &heap {
+        assert_eq!(*el, iterout[i]);
+        i += 1;
+    }
+}
+
+#[test]
+fn test_iterator_reverse() {
+    let data = vec![5, 9, 3];
+    let iterout = vec![3, 5, 9];
+    let pq = BinaryHeap::from_vec(data);
+
+    let v: Vec<_> = pq.iter().rev().cloned().collect();
+    assert_eq!(v, iterout);
+}
+
+#[test]
+fn test_move_iter() {
+    let data = vec![5, 9, 3];
+    let iterout = vec![9, 5, 3];
+    let pq = BinaryHeap::from_vec(data);
+
+    let v: Vec<_> = pq.into_iter().collect();
+    assert_eq!(v, iterout);
+}
+
+#[test]
+fn test_move_iter_size_hint() {
+    let data = vec![5, 9];
+    let pq = BinaryHeap::from_vec(data);
+
+    let mut it = pq.into_iter();
+
+    assert_eq!(it.size_hint(), (2, Some(2)));
+    assert_eq!(it.next(), Some(9));
+
+    assert_eq!(it.size_hint(), (1, Some(1)));
+    assert_eq!(it.next(), Some(5));
+
+    assert_eq!(it.size_hint(), (0, Some(0)));
+    assert_eq!(it.next(), None);
+}
+
+#[test]
+fn test_move_iter_reverse() {
+    let data = vec![5, 9, 3];
+    let iterout = vec![3, 5, 9];
+    let pq = BinaryHeap::from_vec(data);
+
+    let v: Vec<_> = pq.into_iter().rev().collect();
+    assert_eq!(v, iterout);
+}
+
+#[test]
+fn test_peek_and_pop() {
+    let data = vec![2, 4, 6, 2, 1, 8, 10, 3, 5, 7, 0, 9, 1];
+    let mut sorted = data.clone();
+    sorted.sort();
+    let mut heap = BinaryHeap::from_vec(data);
+    while !heap.is_empty() {
+        assert_eq!(heap.peek().unwrap(), sorted.last().unwrap());
+        assert_eq!(heap.pop().unwrap(), sorted.pop().unwrap());
+    }
+}
+
+#[test]
+fn test_push() {
+    let mut heap = BinaryHeap::from_vec(vec![2, 4, 9]);
+    assert_eq!(heap.len(), 3);
+    assert!(*heap.peek().unwrap() == 9);
+    heap.push(11);
+    assert_eq!(heap.len(), 4);
+    assert!(*heap.peek().unwrap() == 11);
+    heap.push(5);
+    assert_eq!(heap.len(), 5);
+    assert!(*heap.peek().unwrap() == 11);
+    heap.push(27);
+    assert_eq!(heap.len(), 6);
+    assert!(*heap.peek().unwrap() == 27);
+    heap.push(3);
+    assert_eq!(heap.len(), 7);
+    assert!(*heap.peek().unwrap() == 27);
+    heap.push(103);
+    assert_eq!(heap.len(), 8);
+    assert!(*heap.peek().unwrap() == 103);
+}
+
+#[test]
+fn test_push_unique() {
+    let mut heap = BinaryHeap::<Box<_>>::from_vec(vec![box 2, box 4, box 9]);
+    assert_eq!(heap.len(), 3);
+    assert!(*heap.peek().unwrap() == box 9);
+    heap.push(box 11);
+    assert_eq!(heap.len(), 4);
+    assert!(*heap.peek().unwrap() == box 11);
+    heap.push(box 5);
+    assert_eq!(heap.len(), 5);
+    assert!(*heap.peek().unwrap() == box 11);
+    heap.push(box 27);
+    assert_eq!(heap.len(), 6);
+    assert!(*heap.peek().unwrap() == box 27);
+    heap.push(box 3);
+    assert_eq!(heap.len(), 7);
+    assert!(*heap.peek().unwrap() == box 27);
+    heap.push(box 103);
+    assert_eq!(heap.len(), 8);
+    assert!(*heap.peek().unwrap() == box 103);
+}
+
+#[test]
+fn test_push_pop() {
+    let mut heap = BinaryHeap::from_vec(vec![5, 5, 2, 1, 3]);
+    assert_eq!(heap.len(), 5);
+    assert_eq!(heap.push_pop(6), 6);
+    assert_eq!(heap.len(), 5);
+    assert_eq!(heap.push_pop(0), 5);
+    assert_eq!(heap.len(), 5);
+    assert_eq!(heap.push_pop(4), 5);
+    assert_eq!(heap.len(), 5);
+    assert_eq!(heap.push_pop(1), 4);
+    assert_eq!(heap.len(), 5);
+}
+
+#[test]
+fn test_replace() {
+    let mut heap = BinaryHeap::from_vec(vec![5, 5, 2, 1, 3]);
+    assert_eq!(heap.len(), 5);
+    assert_eq!(heap.replace(6).unwrap(), 5);
+    assert_eq!(heap.len(), 5);
+    assert_eq!(heap.replace(0).unwrap(), 6);
+    assert_eq!(heap.len(), 5);
+    assert_eq!(heap.replace(4).unwrap(), 5);
+    assert_eq!(heap.len(), 5);
+    assert_eq!(heap.replace(1).unwrap(), 4);
+    assert_eq!(heap.len(), 5);
+}
+
+fn check_to_vec(mut data: Vec<i32>) {
+    let heap = BinaryHeap::from_vec(data.clone());
+    let mut v = heap.clone().into_vec();
+    v.sort();
+    data.sort();
+
+    assert_eq!(v, data);
+    assert_eq!(heap.into_sorted_vec(), data);
+}
+
+#[test]
+fn test_to_vec() {
+    check_to_vec(vec![]);
+    check_to_vec(vec![5]);
+    check_to_vec(vec![3, 2]);
+    check_to_vec(vec![2, 3]);
+    check_to_vec(vec![5, 1, 2]);
+    check_to_vec(vec![1, 100, 2, 3]);
+    check_to_vec(vec![1, 3, 5, 7, 9, 2, 4, 6, 8, 0]);
+    check_to_vec(vec![2, 4, 6, 2, 1, 8, 10, 3, 5, 7, 0, 9, 1]);
+    check_to_vec(vec![9, 11, 9, 9, 9, 9, 11, 2, 3, 4, 11, 9, 0, 0, 0, 0]);
+    check_to_vec(vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
+    check_to_vec(vec![10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]);
+    check_to_vec(vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 1, 2]);
+    check_to_vec(vec![5, 4, 3, 2, 1, 5, 4, 3, 2, 1, 5, 4, 3, 2, 1]);
+}
+
+#[test]
+fn test_empty_pop() {
+    let mut heap = BinaryHeap::<i32>::new();
+    assert!(heap.pop().is_none());
+}
+
+#[test]
+fn test_empty_peek() {
+    let empty = BinaryHeap::<i32>::new();
+    assert!(empty.peek().is_none());
+}
+
+#[test]
+fn test_empty_replace() {
+    let mut heap = BinaryHeap::new();
+    assert!(heap.replace(5).is_none());
+}
+
+#[test]
+fn test_from_iter() {
+    let xs = vec![9, 8, 7, 6, 5, 4, 3, 2, 1];
+
+    let mut q: BinaryHeap<_> = xs.iter().rev().cloned().collect();
+
+    for &x in &xs {
+        assert_eq!(q.pop().unwrap(), x);
+    }
+}
+
+#[test]
+fn test_drain() {
+    let mut q: BinaryHeap<_> = [9, 8, 7, 6, 5, 4, 3, 2, 1].iter().cloned().collect();
+
+    assert_eq!(q.drain().take(5).count(), 5);
+
+    assert!(q.is_empty());
+}
diff --git a/src/libcollectionstest/bit/mod.rs b/src/libcollectionstest/bit/mod.rs
new file mode 100644 (file)
index 0000000..8e06524
--- /dev/null
@@ -0,0 +1,12 @@
+// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+mod set;
+mod vec;
diff --git a/src/libcollectionstest/bit/set.rs b/src/libcollectionstest/bit/set.rs
new file mode 100644 (file)
index 0000000..4b4995d
--- /dev/null
@@ -0,0 +1,441 @@
+// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::cmp::Ordering::{Equal, Greater, Less};
+use std::collections::{BitSet, BitVec};
+use std::iter::range_step;
+
+#[test]
+fn test_bit_set_show() {
+    let mut s = BitSet::new();
+    s.insert(1);
+    s.insert(10);
+    s.insert(50);
+    s.insert(2);
+    assert_eq!("{1, 2, 10, 50}", format!("{:?}", s));
+}
+
+#[test]
+fn test_bit_set_from_usizes() {
+    let usizes = vec![0, 2, 2, 3];
+    let a: BitSet = usizes.into_iter().collect();
+    let mut b = BitSet::new();
+    b.insert(0);
+    b.insert(2);
+    b.insert(3);
+    assert_eq!(a, b);
+}
+
+#[test]
+fn test_bit_set_iterator() {
+    let usizes = vec![0, 2, 2, 3];
+    let bit_vec: BitSet = usizes.into_iter().collect();
+
+    let idxs: Vec<_> = bit_vec.iter().collect();
+    assert_eq!(idxs, [0, 2, 3]);
+
+    let long: BitSet = (0..10000).filter(|&n| n % 2 == 0).collect();
+    let real: Vec<_> = range_step(0, 10000, 2).collect();
+
+    let idxs: Vec<_> = long.iter().collect();
+    assert_eq!(idxs, real);
+}
+
+#[test]
+fn test_bit_set_frombit_vec_init() {
+    let bools = [true, false];
+    let lengths = [10, 64, 100];
+    for &b in &bools {
+        for &l in &lengths {
+            let bitset = BitSet::from_bit_vec(BitVec::from_elem(l, b));
+            assert_eq!(bitset.contains(&1), b);
+            assert_eq!(bitset.contains(&(l-1)), b);
+            assert!(!bitset.contains(&l));
+        }
+    }
+}
+
+#[test]
+fn test_bit_vec_masking() {
+    let b = BitVec::from_elem(140, true);
+    let mut bs = BitSet::from_bit_vec(b);
+    assert!(bs.contains(&139));
+    assert!(!bs.contains(&140));
+    assert!(bs.insert(150));
+    assert!(!bs.contains(&140));
+    assert!(!bs.contains(&149));
+    assert!(bs.contains(&150));
+    assert!(!bs.contains(&151));
+}
+
+#[test]
+fn test_bit_set_basic() {
+    let mut b = BitSet::new();
+    assert!(b.insert(3));
+    assert!(!b.insert(3));
+    assert!(b.contains(&3));
+    assert!(b.insert(4));
+    assert!(!b.insert(4));
+    assert!(b.contains(&3));
+    assert!(b.insert(400));
+    assert!(!b.insert(400));
+    assert!(b.contains(&400));
+    assert_eq!(b.len(), 3);
+}
+
+#[test]
+fn test_bit_set_intersection() {
+    let mut a = BitSet::new();
+    let mut b = BitSet::new();
+
+    assert!(a.insert(11));
+    assert!(a.insert(1));
+    assert!(a.insert(3));
+    assert!(a.insert(77));
+    assert!(a.insert(103));
+    assert!(a.insert(5));
+
+    assert!(b.insert(2));
+    assert!(b.insert(11));
+    assert!(b.insert(77));
+    assert!(b.insert(5));
+    assert!(b.insert(3));
+
+    let expected = [3, 5, 11, 77];
+    let actual: Vec<_> = a.intersection(&b).collect();
+    assert_eq!(actual, expected);
+}
+
+#[test]
+fn test_bit_set_difference() {
+    let mut a = BitSet::new();
+    let mut b = BitSet::new();
+
+    assert!(a.insert(1));
+    assert!(a.insert(3));
+    assert!(a.insert(5));
+    assert!(a.insert(200));
+    assert!(a.insert(500));
+
+    assert!(b.insert(3));
+    assert!(b.insert(200));
+
+    let expected = [1, 5, 500];
+    let actual: Vec<_> = a.difference(&b).collect();
+    assert_eq!(actual, expected);
+}
+
+#[test]
+fn test_bit_set_symmetric_difference() {
+    let mut a = BitSet::new();
+    let mut b = BitSet::new();
+
+    assert!(a.insert(1));
+    assert!(a.insert(3));
+    assert!(a.insert(5));
+    assert!(a.insert(9));
+    assert!(a.insert(11));
+
+    assert!(b.insert(3));
+    assert!(b.insert(9));
+    assert!(b.insert(14));
+    assert!(b.insert(220));
+
+    let expected = [1, 5, 11, 14, 220];
+    let actual: Vec<_> = a.symmetric_difference(&b).collect();
+    assert_eq!(actual, expected);
+}
+
+#[test]
+fn test_bit_set_union() {
+    let mut a = BitSet::new();
+    let mut b = BitSet::new();
+    assert!(a.insert(1));
+    assert!(a.insert(3));
+    assert!(a.insert(5));
+    assert!(a.insert(9));
+    assert!(a.insert(11));
+    assert!(a.insert(160));
+    assert!(a.insert(19));
+    assert!(a.insert(24));
+    assert!(a.insert(200));
+
+    assert!(b.insert(1));
+    assert!(b.insert(5));
+    assert!(b.insert(9));
+    assert!(b.insert(13));
+    assert!(b.insert(19));
+
+    let expected = [1, 3, 5, 9, 11, 13, 19, 24, 160, 200];
+    let actual: Vec<_> = a.union(&b).collect();
+    assert_eq!(actual, expected);
+}
+
+#[test]
+fn test_bit_set_subset() {
+    let mut set1 = BitSet::new();
+    let mut set2 = BitSet::new();
+
+    assert!(set1.is_subset(&set2)); //  {}  {}
+    set2.insert(100);
+    assert!(set1.is_subset(&set2)); //  {}  { 1 }
+    set2.insert(200);
+    assert!(set1.is_subset(&set2)); //  {}  { 1, 2 }
+    set1.insert(200);
+    assert!(set1.is_subset(&set2)); //  { 2 }  { 1, 2 }
+    set1.insert(300);
+    assert!(!set1.is_subset(&set2)); // { 2, 3 }  { 1, 2 }
+    set2.insert(300);
+    assert!(set1.is_subset(&set2)); // { 2, 3 }  { 1, 2, 3 }
+    set2.insert(400);
+    assert!(set1.is_subset(&set2)); // { 2, 3 }  { 1, 2, 3, 4 }
+    set2.remove(&100);
+    assert!(set1.is_subset(&set2)); // { 2, 3 }  { 2, 3, 4 }
+    set2.remove(&300);
+    assert!(!set1.is_subset(&set2)); // { 2, 3 }  { 2, 4 }
+    set1.remove(&300);
+    assert!(set1.is_subset(&set2)); // { 2 }  { 2, 4 }
+}
+
+#[test]
+fn test_bit_set_is_disjoint() {
+    let a = BitSet::from_bit_vec(BitVec::from_bytes(&[0b10100010]));
+    let b = BitSet::from_bit_vec(BitVec::from_bytes(&[0b01000000]));
+    let c = BitSet::new();
+    let d = BitSet::from_bit_vec(BitVec::from_bytes(&[0b00110000]));
+
+    assert!(!a.is_disjoint(&d));
+    assert!(!d.is_disjoint(&a));
+
+    assert!(a.is_disjoint(&b));
+    assert!(a.is_disjoint(&c));
+    assert!(b.is_disjoint(&a));
+    assert!(b.is_disjoint(&c));
+    assert!(c.is_disjoint(&a));
+    assert!(c.is_disjoint(&b));
+}
+
+#[test]
+fn test_bit_set_union_with() {
+    //a should grow to include larger elements
+    let mut a = BitSet::new();
+    a.insert(0);
+    let mut b = BitSet::new();
+    b.insert(5);
+    let expected = BitSet::from_bit_vec(BitVec::from_bytes(&[0b10000100]));
+    a.union_with(&b);
+    assert_eq!(a, expected);
+
+    // Standard
+    let mut a = BitSet::from_bit_vec(BitVec::from_bytes(&[0b10100010]));
+    let mut b = BitSet::from_bit_vec(BitVec::from_bytes(&[0b01100010]));
+    let c = a.clone();
+    a.union_with(&b);
+    b.union_with(&c);
+    assert_eq!(a.len(), 4);
+    assert_eq!(b.len(), 4);
+}
+
+#[test]
+fn test_bit_set_intersect_with() {
+    // Explicitly 0'ed bits
+    let mut a = BitSet::from_bit_vec(BitVec::from_bytes(&[0b10100010]));
+    let mut b = BitSet::from_bit_vec(BitVec::from_bytes(&[0b00000000]));
+    let c = a.clone();
+    a.intersect_with(&b);
+    b.intersect_with(&c);
+    assert!(a.is_empty());
+    assert!(b.is_empty());
+
+    // Uninitialized bits should behave like 0's
+    let mut a = BitSet::from_bit_vec(BitVec::from_bytes(&[0b10100010]));
+    let mut b = BitSet::new();
+    let c = a.clone();
+    a.intersect_with(&b);
+    b.intersect_with(&c);
+    assert!(a.is_empty());
+    assert!(b.is_empty());
+
+    // Standard
+    let mut a = BitSet::from_bit_vec(BitVec::from_bytes(&[0b10100010]));
+    let mut b = BitSet::from_bit_vec(BitVec::from_bytes(&[0b01100010]));
+    let c = a.clone();
+    a.intersect_with(&b);
+    b.intersect_with(&c);
+    assert_eq!(a.len(), 2);
+    assert_eq!(b.len(), 2);
+}
+
+#[test]
+fn test_bit_set_difference_with() {
+    // Explicitly 0'ed bits
+    let mut a = BitSet::from_bit_vec(BitVec::from_bytes(&[0b00000000]));
+    let b = BitSet::from_bit_vec(BitVec::from_bytes(&[0b10100010]));
+    a.difference_with(&b);
+    assert!(a.is_empty());
+
+    // Uninitialized bits should behave like 0's
+    let mut a = BitSet::new();
+    let b = BitSet::from_bit_vec(BitVec::from_bytes(&[0b11111111]));
+    a.difference_with(&b);
+    assert!(a.is_empty());
+
+    // Standard
+    let mut a = BitSet::from_bit_vec(BitVec::from_bytes(&[0b10100010]));
+    let mut b = BitSet::from_bit_vec(BitVec::from_bytes(&[0b01100010]));
+    let c = a.clone();
+    a.difference_with(&b);
+    b.difference_with(&c);
+    assert_eq!(a.len(), 1);
+    assert_eq!(b.len(), 1);
+}
+
+#[test]
+fn test_bit_set_symmetric_difference_with() {
+    //a should grow to include larger elements
+    let mut a = BitSet::new();
+    a.insert(0);
+    a.insert(1);
+    let mut b = BitSet::new();
+    b.insert(1);
+    b.insert(5);
+    let expected = BitSet::from_bit_vec(BitVec::from_bytes(&[0b10000100]));
+    a.symmetric_difference_with(&b);
+    assert_eq!(a, expected);
+
+    let mut a = BitSet::from_bit_vec(BitVec::from_bytes(&[0b10100010]));
+    let b = BitSet::new();
+    let c = a.clone();
+    a.symmetric_difference_with(&b);
+    assert_eq!(a, c);
+
+    // Standard
+    let mut a = BitSet::from_bit_vec(BitVec::from_bytes(&[0b11100010]));
+    let mut b = BitSet::from_bit_vec(BitVec::from_bytes(&[0b01101010]));
+    let c = a.clone();
+    a.symmetric_difference_with(&b);
+    b.symmetric_difference_with(&c);
+    assert_eq!(a.len(), 2);
+    assert_eq!(b.len(), 2);
+}
+
+#[test]
+fn test_bit_set_eq() {
+    let a = BitSet::from_bit_vec(BitVec::from_bytes(&[0b10100010]));
+    let b = BitSet::from_bit_vec(BitVec::from_bytes(&[0b00000000]));
+    let c = BitSet::new();
+
+    assert!(a == a);
+    assert!(a != b);
+    assert!(a != c);
+    assert!(b == b);
+    assert!(b == c);
+    assert!(c == c);
+}
+
+#[test]
+fn test_bit_set_cmp() {
+    let a = BitSet::from_bit_vec(BitVec::from_bytes(&[0b10100010]));
+    let b = BitSet::from_bit_vec(BitVec::from_bytes(&[0b00000000]));
+    let c = BitSet::new();
+
+    assert_eq!(a.cmp(&b), Greater);
+    assert_eq!(a.cmp(&c), Greater);
+    assert_eq!(b.cmp(&a), Less);
+    assert_eq!(b.cmp(&c), Equal);
+    assert_eq!(c.cmp(&a), Less);
+    assert_eq!(c.cmp(&b), Equal);
+}
+
+#[test]
+fn test_bit_vec_remove() {
+    let mut a = BitSet::new();
+
+    assert!(a.insert(1));
+    assert!(a.remove(&1));
+
+    assert!(a.insert(100));
+    assert!(a.remove(&100));
+
+    assert!(a.insert(1000));
+    assert!(a.remove(&1000));
+    a.shrink_to_fit();
+}
+
+#[test]
+fn test_bit_vec_clone() {
+    let mut a = BitSet::new();
+
+    assert!(a.insert(1));
+    assert!(a.insert(100));
+    assert!(a.insert(1000));
+
+    let mut b = a.clone();
+
+    assert!(a == b);
+
+    assert!(b.remove(&1));
+    assert!(a.contains(&1));
+
+    assert!(a.remove(&1000));
+    assert!(b.contains(&1000));
+}
+
+mod bench {
+    use std::collections::{BitSet, BitVec};
+    use std::rand::{Rng, self};
+    use std::u32;
+
+    use test::{Bencher, black_box};
+
+    const BENCH_BITS : usize = 1 << 14;
+
+    fn rng() -> rand::IsaacRng {
+        let seed: &[_] = &[1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
+        rand::SeedableRng::from_seed(seed)
+    }
+
+    #[bench]
+    fn bench_bit_vecset_small(b: &mut Bencher) {
+        let mut r = rng();
+        let mut bit_vec = BitSet::new();
+        b.iter(|| {
+            for _ in 0..100 {
+                bit_vec.insert((r.next_u32() as usize) % u32::BITS as usize);
+            }
+            black_box(&bit_vec);
+        });
+    }
+
+    #[bench]
+    fn bench_bit_vecset_big(b: &mut Bencher) {
+        let mut r = rng();
+        let mut bit_vec = BitSet::new();
+        b.iter(|| {
+            for _ in 0..100 {
+                bit_vec.insert((r.next_u32() as usize) % BENCH_BITS);
+            }
+            black_box(&bit_vec);
+        });
+    }
+
+    #[bench]
+    fn bench_bit_vecset_iter(b: &mut Bencher) {
+        let bit_vec = BitSet::from_bit_vec(BitVec::from_fn(BENCH_BITS,
+                                              |idx| {idx % 3 == 0}));
+        b.iter(|| {
+            let mut sum = 0;
+            for idx in &bit_vec {
+                sum += idx as usize;
+            }
+            sum
+        })
+    }
+}
diff --git a/src/libcollectionstest/bit/vec.rs b/src/libcollectionstest/bit/vec.rs
new file mode 100644 (file)
index 0000000..3826974
--- /dev/null
@@ -0,0 +1,729 @@
+// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::collections::BitVec;
+use std::u32;
+
+#[test]
+fn test_to_str() {
+    let zerolen = BitVec::new();
+    assert_eq!(format!("{:?}", zerolen), "");
+
+    let eightbits = BitVec::from_elem(8, false);
+    assert_eq!(format!("{:?}", eightbits), "00000000")
+}
+
+#[test]
+fn test_0_elements() {
+    let act = BitVec::new();
+    let exp = Vec::new();
+    assert!(act.eq_vec(&exp));
+    assert!(act.none() && act.all());
+}
+
+#[test]
+fn test_1_element() {
+    let mut act = BitVec::from_elem(1, false);
+    assert!(act.eq_vec(&[false]));
+    assert!(act.none() && !act.all());
+    act = BitVec::from_elem(1, true);
+    assert!(act.eq_vec(&[true]));
+    assert!(!act.none() && act.all());
+}
+
+#[test]
+fn test_2_elements() {
+    let mut b = BitVec::from_elem(2, false);
+    b.set(0, true);
+    b.set(1, false);
+    assert_eq!(format!("{:?}", b), "10");
+    assert!(!b.none() && !b.all());
+}
+
+#[test]
+fn test_10_elements() {
+    let mut act;
+    // all 0
+
+    act = BitVec::from_elem(10, false);
+    assert!((act.eq_vec(
+                &[false, false, false, false, false, false, false, false, false, false])));
+    assert!(act.none() && !act.all());
+    // all 1
+
+    act = BitVec::from_elem(10, true);
+    assert!((act.eq_vec(&[true, true, true, true, true, true, true, true, true, true])));
+    assert!(!act.none() && act.all());
+    // mixed
+
+    act = BitVec::from_elem(10, false);
+    act.set(0, true);
+    act.set(1, true);
+    act.set(2, true);
+    act.set(3, true);
+    act.set(4, true);
+    assert!((act.eq_vec(&[true, true, true, true, true, false, false, false, false, false])));
+    assert!(!act.none() && !act.all());
+    // mixed
+
+    act = BitVec::from_elem(10, false);
+    act.set(5, true);
+    act.set(6, true);
+    act.set(7, true);
+    act.set(8, true);
+    act.set(9, true);
+    assert!((act.eq_vec(&[false, false, false, false, false, true, true, true, true, true])));
+    assert!(!act.none() && !act.all());
+    // mixed
+
+    act = BitVec::from_elem(10, false);
+    act.set(0, true);
+    act.set(3, true);
+    act.set(6, true);
+    act.set(9, true);
+    assert!((act.eq_vec(&[true, false, false, true, false, false, true, false, false, true])));
+    assert!(!act.none() && !act.all());
+}
+
+#[test]
+fn test_31_elements() {
+    let mut act;
+    // all 0
+
+    act = BitVec::from_elem(31, false);
+    assert!(act.eq_vec(
+            &[false, false, false, false, false, false, false, false, false, false, false,
+              false, false, false, false, false, false, false, false, false, false, false,
+              false, false, false, false, false, false, false, false, false]));
+    assert!(act.none() && !act.all());
+    // all 1
+
+    act = BitVec::from_elem(31, true);
+    assert!(act.eq_vec(
+            &[true, true, true, true, true, true, true, true, true, true, true, true, true,
+              true, true, true, true, true, true, true, true, true, true, true, true, true,
+              true, true, true, true, true]));
+    assert!(!act.none() && act.all());
+    // mixed
+
+    act = BitVec::from_elem(31, false);
+    act.set(0, true);
+    act.set(1, true);
+    act.set(2, true);
+    act.set(3, true);
+    act.set(4, true);
+    act.set(5, true);
+    act.set(6, true);
+    act.set(7, true);
+    assert!(act.eq_vec(
+            &[true, true, true, true, true, true, true, true, false, false, false, false, false,
+              false, false, false, false, false, false, false, false, false, false, false,
+              false, false, false, false, false, false, false]));
+    assert!(!act.none() && !act.all());
+    // mixed
+
+    act = BitVec::from_elem(31, false);
+    act.set(16, true);
+    act.set(17, true);
+    act.set(18, true);
+    act.set(19, true);
+    act.set(20, true);
+    act.set(21, true);
+    act.set(22, true);
+    act.set(23, true);
+    assert!(act.eq_vec(
+            &[false, false, false, false, false, false, false, false, false, false, false,
+              false, false, false, false, false, true, true, true, true, true, true, true, true,
+              false, false, false, false, false, false, false]));
+    assert!(!act.none() && !act.all());
+    // mixed
+
+    act = BitVec::from_elem(31, false);
+    act.set(24, true);
+    act.set(25, true);
+    act.set(26, true);
+    act.set(27, true);
+    act.set(28, true);
+    act.set(29, true);
+    act.set(30, true);
+    assert!(act.eq_vec(
+            &[false, false, false, false, false, false, false, false, false, false, false,
+              false, false, false, false, false, false, false, false, false, false, false,
+              false, false, true, true, true, true, true, true, true]));
+    assert!(!act.none() && !act.all());
+    // mixed
+
+    act = BitVec::from_elem(31, false);
+    act.set(3, true);
+    act.set(17, true);
+    act.set(30, true);
+    assert!(act.eq_vec(
+            &[false, false, false, true, false, false, false, false, false, false, false, false,
+              false, false, false, false, false, true, false, false, false, false, false, false,
+              false, false, false, false, false, false, true]));
+    assert!(!act.none() && !act.all());
+}
+
+#[test]
+fn test_32_elements() {
+    let mut act;
+    // all 0
+
+    act = BitVec::from_elem(32, false);
+    assert!(act.eq_vec(
+            &[false, false, false, false, false, false, false, false, false, false, false,
+              false, false, false, false, false, false, false, false, false, false, false,
+              false, false, false, false, false, false, false, false, false, false]));
+    assert!(act.none() && !act.all());
+    // all 1
+
+    act = BitVec::from_elem(32, true);
+    assert!(act.eq_vec(
+            &[true, true, true, true, true, true, true, true, true, true, true, true, true,
+              true, true, true, true, true, true, true, true, true, true, true, true, true,
+              true, true, true, true, true, true]));
+    assert!(!act.none() && act.all());
+    // mixed
+
+    act = BitVec::from_elem(32, false);
+    act.set(0, true);
+    act.set(1, true);
+    act.set(2, true);
+    act.set(3, true);
+    act.set(4, true);
+    act.set(5, true);
+    act.set(6, true);
+    act.set(7, true);
+    assert!(act.eq_vec(
+            &[true, true, true, true, true, true, true, true, false, false, false, false, false,
+              false, false, false, false, false, false, false, false, false, false, false,
+              false, false, false, false, false, false, false, false]));
+    assert!(!act.none() && !act.all());
+    // mixed
+
+    act = BitVec::from_elem(32, false);
+    act.set(16, true);
+    act.set(17, true);
+    act.set(18, true);
+    act.set(19, true);
+    act.set(20, true);
+    act.set(21, true);
+    act.set(22, true);
+    act.set(23, true);
+    assert!(act.eq_vec(
+            &[false, false, false, false, false, false, false, false, false, false, false,
+              false, false, false, false, false, true, true, true, true, true, true, true, true,
+              false, false, false, false, false, false, false, false]));
+    assert!(!act.none() && !act.all());
+    // mixed
+
+    act = BitVec::from_elem(32, false);
+    act.set(24, true);
+    act.set(25, true);
+    act.set(26, true);
+    act.set(27, true);
+    act.set(28, true);
+    act.set(29, true);
+    act.set(30, true);
+    act.set(31, true);
+    assert!(act.eq_vec(
+            &[false, false, false, false, false, false, false, false, false, false, false,
+              false, false, false, false, false, false, false, false, false, false, false,
+              false, false, true, true, true, true, true, true, true, true]));
+    assert!(!act.none() && !act.all());
+    // mixed
+
+    act = BitVec::from_elem(32, false);
+    act.set(3, true);
+    act.set(17, true);
+    act.set(30, true);
+    act.set(31, true);
+    assert!(act.eq_vec(
+            &[false, false, false, true, false, false, false, false, false, false, false, false,
+              false, false, false, false, false, true, false, false, false, false, false, false,
+              false, false, false, false, false, false, true, true]));
+    assert!(!act.none() && !act.all());
+}
+
+#[test]
+fn test_33_elements() {
+    let mut act;
+    // all 0
+
+    act = BitVec::from_elem(33, false);
+    assert!(act.eq_vec(
+            &[false, false, false, false, false, false, false, false, false, false, false,
+              false, false, false, false, false, false, false, false, false, false, false,
+              false, false, false, false, false, false, false, false, false, false, false]));
+    assert!(act.none() && !act.all());
+    // all 1
+
+    act = BitVec::from_elem(33, true);
+    assert!(act.eq_vec(
+            &[true, true, true, true, true, true, true, true, true, true, true, true, true,
+              true, true, true, true, true, true, true, true, true, true, true, true, true,
+              true, true, true, true, true, true, true]));
+    assert!(!act.none() && act.all());
+    // mixed
+
+    act = BitVec::from_elem(33, false);
+    act.set(0, true);
+    act.set(1, true);
+    act.set(2, true);
+    act.set(3, true);
+    act.set(4, true);
+    act.set(5, true);
+    act.set(6, true);
+    act.set(7, true);
+    assert!(act.eq_vec(
+            &[true, true, true, true, true, true, true, true, false, false, false, false, false,
+              false, false, false, false, false, false, false, false, false, false, false,
+              false, false, false, false, false, false, false, false, false]));
+    assert!(!act.none() && !act.all());
+    // mixed
+
+    act = BitVec::from_elem(33, false);
+    act.set(16, true);
+    act.set(17, true);
+    act.set(18, true);
+    act.set(19, true);
+    act.set(20, true);
+    act.set(21, true);
+    act.set(22, true);
+    act.set(23, true);
+    assert!(act.eq_vec(
+            &[false, false, false, false, false, false, false, false, false, false, false,
+              false, false, false, false, false, true, true, true, true, true, true, true, true,
+              false, false, false, false, false, false, false, false, false]));
+    assert!(!act.none() && !act.all());
+    // mixed
+
+    act = BitVec::from_elem(33, false);
+    act.set(24, true);
+    act.set(25, true);
+    act.set(26, true);
+    act.set(27, true);
+    act.set(28, true);
+    act.set(29, true);
+    act.set(30, true);
+    act.set(31, true);
+    assert!(act.eq_vec(
+            &[false, false, false, false, false, false, false, false, false, false, false,
+              false, false, false, false, false, false, false, false, false, false, false,
+              false, false, true, true, true, true, true, true, true, true, false]));
+    assert!(!act.none() && !act.all());
+    // mixed
+
+    act = BitVec::from_elem(33, false);
+    act.set(3, true);
+    act.set(17, true);
+    act.set(30, true);
+    act.set(31, true);
+    act.set(32, true);
+    assert!(act.eq_vec(
+            &[false, false, false, true, false, false, false, false, false, false, false, false,
+              false, false, false, false, false, true, false, false, false, false, false, false,
+              false, false, false, false, false, false, true, true, true]));
+    assert!(!act.none() && !act.all());
+}
+
+#[test]
+fn test_equal_differing_sizes() {
+    let v0 = BitVec::from_elem(10, false);
+    let v1 = BitVec::from_elem(11, false);
+    assert!(v0 != v1);
+}
+
+#[test]
+fn test_equal_greatly_differing_sizes() {
+    let v0 = BitVec::from_elem(10, false);
+    let v1 = BitVec::from_elem(110, false);
+    assert!(v0 != v1);
+}
+
+#[test]
+fn test_equal_sneaky_small() {
+    let mut a = BitVec::from_elem(1, false);
+    a.set(0, true);
+
+    let mut b = BitVec::from_elem(1, true);
+    b.set(0, true);
+
+    assert_eq!(a, b);
+}
+
+#[test]
+fn test_equal_sneaky_big() {
+    let mut a = BitVec::from_elem(100, false);
+    for i in 0..100 {
+        a.set(i, true);
+    }
+
+    let mut b = BitVec::from_elem(100, true);
+    for i in 0..100 {
+        b.set(i, true);
+    }
+
+    assert_eq!(a, b);
+}
+
+#[test]
+fn test_from_bytes() {
+    let bit_vec = BitVec::from_bytes(&[0b10110110, 0b00000000, 0b11111111]);
+    let str = concat!("10110110", "00000000", "11111111");
+    assert_eq!(format!("{:?}", bit_vec), str);
+}
+
+#[test]
+fn test_to_bytes() {
+    let mut bv = BitVec::from_elem(3, true);
+    bv.set(1, false);
+    assert_eq!(bv.to_bytes(), [0b10100000]);
+
+    let mut bv = BitVec::from_elem(9, false);
+    bv.set(2, true);
+    bv.set(8, true);
+    assert_eq!(bv.to_bytes(), [0b00100000, 0b10000000]);
+}
+
+#[test]
+fn test_from_bools() {
+    let bools = vec![true, false, true, true];
+    let bit_vec: BitVec = bools.iter().map(|n| *n).collect();
+    assert_eq!(format!("{:?}", bit_vec), "1011");
+}
+
+#[test]
+fn test_to_bools() {
+    let bools = vec![false, false, true, false, false, true, true, false];
+    assert_eq!(BitVec::from_bytes(&[0b00100110]).iter().collect::<Vec<bool>>(), bools);
+}
+
+#[test]
+fn test_bit_vec_iterator() {
+    let bools = vec![true, false, true, true];
+    let bit_vec: BitVec = bools.iter().map(|n| *n).collect();
+
+    assert_eq!(bit_vec.iter().collect::<Vec<bool>>(), bools);
+
+    let long: Vec<_> = (0..10000).map(|i| i % 2 == 0).collect();
+    let bit_vec: BitVec = long.iter().map(|n| *n).collect();
+    assert_eq!(bit_vec.iter().collect::<Vec<bool>>(), long)
+}
+
+#[test]
+fn test_small_difference() {
+    let mut b1 = BitVec::from_elem(3, false);
+    let mut b2 = BitVec::from_elem(3, false);
+    b1.set(0, true);
+    b1.set(1, true);
+    b2.set(1, true);
+    b2.set(2, true);
+    assert!(b1.difference(&b2));
+    assert!(b1[0]);
+    assert!(!b1[1]);
+    assert!(!b1[2]);
+}
+
+#[test]
+fn test_big_difference() {
+    let mut b1 = BitVec::from_elem(100, false);
+    let mut b2 = BitVec::from_elem(100, false);
+    b1.set(0, true);
+    b1.set(40, true);
+    b2.set(40, true);
+    b2.set(80, true);
+    assert!(b1.difference(&b2));
+    assert!(b1[0]);
+    assert!(!b1[40]);
+    assert!(!b1[80]);
+}
+
+#[test]
+fn test_small_clear() {
+    let mut b = BitVec::from_elem(14, true);
+    assert!(!b.none() && b.all());
+    b.clear();
+    assert!(b.none() && !b.all());
+}
+
+#[test]
+fn test_big_clear() {
+    let mut b = BitVec::from_elem(140, true);
+    assert!(!b.none() && b.all());
+    b.clear();
+    assert!(b.none() && !b.all());
+}
+
+#[test]
+fn test_bit_vec_lt() {
+    let mut a = BitVec::from_elem(5, false);
+    let mut b = BitVec::from_elem(5, false);
+
+    assert!(!(a < b) && !(b < a));
+    b.set(2, true);
+    assert!(a < b);
+    a.set(3, true);
+    assert!(a < b);
+    a.set(2, true);
+    assert!(!(a < b) && b < a);
+    b.set(0, true);
+    assert!(a < b);
+}
+
+#[test]
+fn test_ord() {
+    let mut a = BitVec::from_elem(5, false);
+    let mut b = BitVec::from_elem(5, false);
+
+    assert!(a <= b && a >= b);
+    a.set(1, true);
+    assert!(a > b && a >= b);
+    assert!(b < a && b <= a);
+    b.set(1, true);
+    b.set(2, true);
+    assert!(b > a && b >= a);
+    assert!(a < b && a <= b);
+}
+
+
+#[test]
+fn test_small_bit_vec_tests() {
+    let v = BitVec::from_bytes(&[0]);
+    assert!(!v.all());
+    assert!(!v.any());
+    assert!(v.none());
+
+    let v = BitVec::from_bytes(&[0b00010100]);
+    assert!(!v.all());
+    assert!(v.any());
+    assert!(!v.none());
+
+    let v = BitVec::from_bytes(&[0xFF]);
+    assert!(v.all());
+    assert!(v.any());
+    assert!(!v.none());
+}
+
+#[test]
+fn test_big_bit_vec_tests() {
+    let v = BitVec::from_bytes(&[ // 88 bits
+        0, 0, 0, 0,
+        0, 0, 0, 0,
+        0, 0, 0]);
+    assert!(!v.all());
+    assert!(!v.any());
+    assert!(v.none());
+
+    let v = BitVec::from_bytes(&[ // 88 bits
+        0, 0, 0b00010100, 0,
+        0, 0, 0, 0b00110100,
+        0, 0, 0]);
+    assert!(!v.all());
+    assert!(v.any());
+    assert!(!v.none());
+
+    let v = BitVec::from_bytes(&[ // 88 bits
+        0xFF, 0xFF, 0xFF, 0xFF,
+        0xFF, 0xFF, 0xFF, 0xFF,
+        0xFF, 0xFF, 0xFF]);
+    assert!(v.all());
+    assert!(v.any());
+    assert!(!v.none());
+}
+
+#[test]
+fn test_bit_vec_push_pop() {
+    let mut s = BitVec::from_elem(5 * u32::BITS as usize - 2, false);
+    assert_eq!(s.len(), 5 * u32::BITS as usize - 2);
+    assert_eq!(s[5 * u32::BITS as usize - 3], false);
+    s.push(true);
+    s.push(true);
+    assert_eq!(s[5 * u32::BITS as usize - 2], true);
+    assert_eq!(s[5 * u32::BITS as usize - 1], true);
+    // Here the internal vector will need to be extended
+    s.push(false);
+    assert_eq!(s[5 * u32::BITS as usize], false);
+    s.push(false);
+    assert_eq!(s[5 * u32::BITS as usize + 1], false);
+    assert_eq!(s.len(), 5 * u32::BITS as usize + 2);
+    // Pop it all off
+    assert_eq!(s.pop(), Some(false));
+    assert_eq!(s.pop(), Some(false));
+    assert_eq!(s.pop(), Some(true));
+    assert_eq!(s.pop(), Some(true));
+    assert_eq!(s.len(), 5 * u32::BITS as usize - 2);
+}
+
+#[test]
+fn test_bit_vec_truncate() {
+    let mut s = BitVec::from_elem(5 * u32::BITS as usize, true);
+
+    assert_eq!(s, BitVec::from_elem(5 * u32::BITS as usize, true));
+    assert_eq!(s.len(), 5 * u32::BITS as usize);
+    s.truncate(4 * u32::BITS as usize);
+    assert_eq!(s, BitVec::from_elem(4 * u32::BITS as usize, true));
+    assert_eq!(s.len(), 4 * u32::BITS as usize);
+    // Truncating to a size > s.len() should be a noop
+    s.truncate(5 * u32::BITS as usize);
+    assert_eq!(s, BitVec::from_elem(4 * u32::BITS as usize, true));
+    assert_eq!(s.len(), 4 * u32::BITS as usize);
+    s.truncate(3 * u32::BITS as usize - 10);
+    assert_eq!(s, BitVec::from_elem(3 * u32::BITS as usize - 10, true));
+    assert_eq!(s.len(), 3 * u32::BITS as usize - 10);
+    s.truncate(0);
+    assert_eq!(s, BitVec::from_elem(0, true));
+    assert_eq!(s.len(), 0);
+}
+
+#[test]
+fn test_bit_vec_reserve() {
+    let mut s = BitVec::from_elem(5 * u32::BITS as usize, true);
+    // Check capacity
+    assert!(s.capacity() >= 5 * u32::BITS as usize);
+    s.reserve(2 * u32::BITS as usize);
+    assert!(s.capacity() >= 7 * u32::BITS as usize);
+    s.reserve(7 * u32::BITS as usize);
+    assert!(s.capacity() >= 12 * u32::BITS as usize);
+    s.reserve_exact(7 * u32::BITS as usize);
+    assert!(s.capacity() >= 12 * u32::BITS as usize);
+    s.reserve(7 * u32::BITS as usize + 1);
+    assert!(s.capacity() >= 12 * u32::BITS as usize + 1);
+    // Check that length hasn't changed
+    assert_eq!(s.len(), 5 * u32::BITS as usize);
+    s.push(true);
+    s.push(false);
+    s.push(true);
+    assert_eq!(s[5 * u32::BITS as usize - 1], true);
+    assert_eq!(s[5 * u32::BITS as usize - 0], true);
+    assert_eq!(s[5 * u32::BITS as usize + 1], false);
+    assert_eq!(s[5 * u32::BITS as usize + 2], true);
+}
+
+#[test]
+fn test_bit_vec_grow() {
+    let mut bit_vec = BitVec::from_bytes(&[0b10110110, 0b00000000, 0b10101010]);
+    bit_vec.grow(32, true);
+    assert_eq!(bit_vec, BitVec::from_bytes(&[0b10110110, 0b00000000, 0b10101010,
+                                 0xFF, 0xFF, 0xFF, 0xFF]));
+    bit_vec.grow(64, false);
+    assert_eq!(bit_vec, BitVec::from_bytes(&[0b10110110, 0b00000000, 0b10101010,
+                                 0xFF, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0]));
+    bit_vec.grow(16, true);
+    assert_eq!(bit_vec, BitVec::from_bytes(&[0b10110110, 0b00000000, 0b10101010,
+                                 0xFF, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF]));
+}
+
+#[test]
+fn test_bit_vec_extend() {
+    let mut bit_vec = BitVec::from_bytes(&[0b10110110, 0b00000000, 0b11111111]);
+    let ext = BitVec::from_bytes(&[0b01001001, 0b10010010, 0b10111101]);
+    bit_vec.extend(ext.iter());
+    assert_eq!(bit_vec, BitVec::from_bytes(&[0b10110110, 0b00000000, 0b11111111,
+                                 0b01001001, 0b10010010, 0b10111101]));
+}
+
+mod bench {
+    use std::collections::BitVec;
+    use std::u32;
+    use std::rand::{Rng, self};
+
+    use test::{Bencher, black_box};
+
+    const BENCH_BITS : usize = 1 << 14;
+
+    fn rng() -> rand::IsaacRng {
+        let seed: &[_] = &[1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
+        rand::SeedableRng::from_seed(seed)
+    }
+
+    #[bench]
+    fn bench_usize_small(b: &mut Bencher) {
+        let mut r = rng();
+        let mut bit_vec = 0 as usize;
+        b.iter(|| {
+            for _ in 0..100 {
+                bit_vec |= 1 << ((r.next_u32() as usize) % u32::BITS as usize);
+            }
+            black_box(&bit_vec);
+        });
+    }
+
+    #[bench]
+    fn bench_bit_set_big_fixed(b: &mut Bencher) {
+        let mut r = rng();
+        let mut bit_vec = BitVec::from_elem(BENCH_BITS, false);
+        b.iter(|| {
+            for _ in 0..100 {
+                bit_vec.set((r.next_u32() as usize) % BENCH_BITS, true);
+            }
+            black_box(&bit_vec);
+        });
+    }
+
+    #[bench]
+    fn bench_bit_set_big_variable(b: &mut Bencher) {
+        let mut r = rng();
+        let mut bit_vec = BitVec::from_elem(BENCH_BITS, false);
+        b.iter(|| {
+            for _ in 0..100 {
+                bit_vec.set((r.next_u32() as usize) % BENCH_BITS, r.gen());
+            }
+            black_box(&bit_vec);
+        });
+    }
+
+    #[bench]
+    fn bench_bit_set_small(b: &mut Bencher) {
+        let mut r = rng();
+        let mut bit_vec = BitVec::from_elem(u32::BITS as usize, false);
+        b.iter(|| {
+            for _ in 0..100 {
+                bit_vec.set((r.next_u32() as usize) % u32::BITS as usize, true);
+            }
+            black_box(&bit_vec);
+        });
+    }
+
+    #[bench]
+    fn bench_bit_vec_big_union(b: &mut Bencher) {
+        let mut b1 = BitVec::from_elem(BENCH_BITS, false);
+        let b2 = BitVec::from_elem(BENCH_BITS, false);
+        b.iter(|| {
+            b1.union(&b2)
+        })
+    }
+
+    #[bench]
+    fn bench_bit_vec_small_iter(b: &mut Bencher) {
+        let bit_vec = BitVec::from_elem(u32::BITS as usize, false);
+        b.iter(|| {
+            let mut sum = 0;
+            for _ in 0..10 {
+                for pres in &bit_vec {
+                    sum += pres as usize;
+                }
+            }
+            sum
+        })
+    }
+
+    #[bench]
+    fn bench_bit_vec_big_iter(b: &mut Bencher) {
+        let bit_vec = BitVec::from_elem(BENCH_BITS, false);
+        b.iter(|| {
+            let mut sum = 0;
+            for pres in &bit_vec {
+                sum += pres as usize;
+            }
+            sum
+        })
+    }
+}
diff --git a/src/libcollectionstest/btree/map.rs b/src/libcollectionstest/btree/map.rs
new file mode 100644 (file)
index 0000000..10d69c9
--- /dev/null
@@ -0,0 +1,299 @@
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::collections::BTreeMap;
+use std::collections::Bound::{Excluded, Included, Unbounded, self};
+use std::collections::btree_map::Entry::{Occupied, Vacant};
+use std::iter::range_inclusive;
+
+#[test]
+fn test_basic_large() {
+    let mut map = BTreeMap::new();
+    let size = 10000;
+    assert_eq!(map.len(), 0);
+
+    for i in 0..size {
+        assert_eq!(map.insert(i, 10*i), None);
+        assert_eq!(map.len(), i + 1);
+    }
+
+    for i in 0..size {
+        assert_eq!(map.get(&i).unwrap(), &(i*10));
+    }
+
+    for i in size..size*2 {
+        assert_eq!(map.get(&i), None);
+    }
+
+    for i in 0..size {
+        assert_eq!(map.insert(i, 100*i), Some(10*i));
+        assert_eq!(map.len(), size);
+    }
+
+    for i in 0..size {
+        assert_eq!(map.get(&i).unwrap(), &(i*100));
+    }
+
+    for i in 0..size/2 {
+        assert_eq!(map.remove(&(i*2)), Some(i*200));
+        assert_eq!(map.len(), size - i - 1);
+    }
+
+    for i in 0..size/2 {
+        assert_eq!(map.get(&(2*i)), None);
+        assert_eq!(map.get(&(2*i+1)).unwrap(), &(i*200 + 100));
+    }
+
+    for i in 0..size/2 {
+        assert_eq!(map.remove(&(2*i)), None);
+        assert_eq!(map.remove(&(2*i+1)), Some(i*200 + 100));
+        assert_eq!(map.len(), size/2 - i - 1);
+    }
+}
+
+#[test]
+fn test_basic_small() {
+    let mut map = BTreeMap::new();
+    assert_eq!(map.remove(&1), None);
+    assert_eq!(map.get(&1), None);
+    assert_eq!(map.insert(1, 1), None);
+    assert_eq!(map.get(&1), Some(&1));
+    assert_eq!(map.insert(1, 2), Some(1));
+    assert_eq!(map.get(&1), Some(&2));
+    assert_eq!(map.insert(2, 4), None);
+    assert_eq!(map.get(&2), Some(&4));
+    assert_eq!(map.remove(&1), Some(2));
+    assert_eq!(map.remove(&2), Some(4));
+    assert_eq!(map.remove(&1), None);
+}
+
+#[test]
+fn test_iter() {
+    let size = 10000;
+
+    // Forwards
+    let mut map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
+
+    fn test<T>(size: usize, mut iter: T) where T: Iterator<Item=(usize, usize)> {
+        for i in 0..size {
+            assert_eq!(iter.size_hint(), (size - i, Some(size - i)));
+            assert_eq!(iter.next().unwrap(), (i, i));
+        }
+        assert_eq!(iter.size_hint(), (0, Some(0)));
+        assert_eq!(iter.next(), None);
+    }
+    test(size, map.iter().map(|(&k, &v)| (k, v)));
+    test(size, map.iter_mut().map(|(&k, &mut v)| (k, v)));
+    test(size, map.into_iter());
+}
+
+#[test]
+fn test_iter_rev() {
+    let size = 10000;
+
+    // Forwards
+    let mut map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
+
+    fn test<T>(size: usize, mut iter: T) where T: Iterator<Item=(usize, usize)> {
+        for i in 0..size {
+            assert_eq!(iter.size_hint(), (size - i, Some(size - i)));
+            assert_eq!(iter.next().unwrap(), (size - i - 1, size - i - 1));
+        }
+        assert_eq!(iter.size_hint(), (0, Some(0)));
+        assert_eq!(iter.next(), None);
+    }
+    test(size, map.iter().rev().map(|(&k, &v)| (k, v)));
+    test(size, map.iter_mut().rev().map(|(&k, &mut v)| (k, v)));
+    test(size, map.into_iter().rev());
+}
+
+#[test]
+fn test_iter_mixed() {
+    let size = 10000;
+
+    // Forwards
+    let mut map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
+
+    fn test<T>(size: usize, mut iter: T)
+            where T: Iterator<Item=(usize, usize)> + DoubleEndedIterator {
+        for i in 0..size / 4 {
+            assert_eq!(iter.size_hint(), (size - i * 2, Some(size - i * 2)));
+            assert_eq!(iter.next().unwrap(), (i, i));
+            assert_eq!(iter.next_back().unwrap(), (size - i - 1, size - i - 1));
+        }
+        for i in size / 4..size * 3 / 4 {
+            assert_eq!(iter.size_hint(), (size * 3 / 4 - i, Some(size * 3 / 4 - i)));
+            assert_eq!(iter.next().unwrap(), (i, i));
+        }
+        assert_eq!(iter.size_hint(), (0, Some(0)));
+        assert_eq!(iter.next(), None);
+    }
+    test(size, map.iter().map(|(&k, &v)| (k, v)));
+    test(size, map.iter_mut().map(|(&k, &mut v)| (k, v)));
+    test(size, map.into_iter());
+}
+
+#[test]
+fn test_range_small() {
+    let size = 5;
+
+    // Forwards
+    let map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
+
+    let mut j = 0;
+    for ((&k, &v), i) in map.range(Included(&2), Unbounded).zip(2..size) {
+        assert_eq!(k, i);
+        assert_eq!(v, i);
+        j += 1;
+    }
+    assert_eq!(j, size - 2);
+}
+
+#[test]
+fn test_range_1000() {
+    let size = 1000;
+    let map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
+
+    fn test(map: &BTreeMap<u32, u32>, size: u32, min: Bound<&u32>, max: Bound<&u32>) {
+        let mut kvs = map.range(min, max).map(|(&k, &v)| (k, v));
+        let mut pairs = (0..size).map(|i| (i, i));
+
+        for (kv, pair) in kvs.by_ref().zip(pairs.by_ref()) {
+            assert_eq!(kv, pair);
+        }
+        assert_eq!(kvs.next(), None);
+        assert_eq!(pairs.next(), None);
+    }
+    test(&map, size, Included(&0), Excluded(&size));
+    test(&map, size, Unbounded, Excluded(&size));
+    test(&map, size, Included(&0), Included(&(size - 1)));
+    test(&map, size, Unbounded, Included(&(size - 1)));
+    test(&map, size, Included(&0), Unbounded);
+    test(&map, size, Unbounded, Unbounded);
+}
+
+#[test]
+fn test_range() {
+    let size = 200;
+    let map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
+
+    for i in 0..size {
+        for j in i..size {
+            let mut kvs = map.range(Included(&i), Included(&j)).map(|(&k, &v)| (k, v));
+            let mut pairs = range_inclusive(i, j).map(|i| (i, i));
+
+            for (kv, pair) in kvs.by_ref().zip(pairs.by_ref()) {
+                assert_eq!(kv, pair);
+            }
+            assert_eq!(kvs.next(), None);
+            assert_eq!(pairs.next(), None);
+        }
+    }
+}
+
+#[test]
+fn test_entry(){
+    let xs = [(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)];
+
+    let mut map: BTreeMap<_, _> = xs.iter().cloned().collect();
+
+    // Existing key (insert)
+    match map.entry(1) {
+        Vacant(_) => unreachable!(),
+        Occupied(mut view) => {
+            assert_eq!(view.get(), &10);
+            assert_eq!(view.insert(100), 10);
+        }
+    }
+    assert_eq!(map.get(&1).unwrap(), &100);
+    assert_eq!(map.len(), 6);
+
+
+    // Existing key (update)
+    match map.entry(2) {
+        Vacant(_) => unreachable!(),
+        Occupied(mut view) => {
+            let v = view.get_mut();
+            *v *= 10;
+        }
+    }
+    assert_eq!(map.get(&2).unwrap(), &200);
+    assert_eq!(map.len(), 6);
+
+    // Existing key (take)
+    match map.entry(3) {
+        Vacant(_) => unreachable!(),
+        Occupied(view) => {
+            assert_eq!(view.remove(), 30);
+        }
+    }
+    assert_eq!(map.get(&3), None);
+    assert_eq!(map.len(), 5);
+
+
+    // Inexistent key (insert)
+    match map.entry(10) {
+        Occupied(_) => unreachable!(),
+        Vacant(view) => {
+            assert_eq!(*view.insert(1000), 1000);
+        }
+    }
+    assert_eq!(map.get(&10).unwrap(), &1000);
+    assert_eq!(map.len(), 6);
+}
+
+mod bench {
+    use std::collections::BTreeMap;
+    use std::rand::{Rng, weak_rng};
+
+    use test::{Bencher, black_box};
+
+    map_insert_rand_bench!{insert_rand_100,    100,    BTreeMap}
+    map_insert_rand_bench!{insert_rand_10_000, 10_000, BTreeMap}
+
+    map_insert_seq_bench!{insert_seq_100,    100,    BTreeMap}
+    map_insert_seq_bench!{insert_seq_10_000, 10_000, BTreeMap}
+
+    map_find_rand_bench!{find_rand_100,    100,    BTreeMap}
+    map_find_rand_bench!{find_rand_10_000, 10_000, BTreeMap}
+
+    map_find_seq_bench!{find_seq_100,    100,    BTreeMap}
+    map_find_seq_bench!{find_seq_10_000, 10_000, BTreeMap}
+
+    fn bench_iter(b: &mut Bencher, size: i32) {
+        let mut map = BTreeMap::<i32, i32>::new();
+        let mut rng = weak_rng();
+
+        for _ in 0..size {
+            map.insert(rng.gen(), rng.gen());
+        }
+
+        b.iter(|| {
+            for entry in &map {
+                black_box(entry);
+            }
+        });
+    }
+
+    #[bench]
+    pub fn iter_20(b: &mut Bencher) {
+        bench_iter(b, 20);
+    }
+
+    #[bench]
+    pub fn iter_1000(b: &mut Bencher) {
+        bench_iter(b, 1000);
+    }
+
+    #[bench]
+    pub fn iter_100000(b: &mut Bencher) {
+        bench_iter(b, 100000);
+    }
+}
diff --git a/src/libcollectionstest/btree/mod.rs b/src/libcollectionstest/btree/mod.rs
new file mode 100644 (file)
index 0000000..0db48f3
--- /dev/null
@@ -0,0 +1,12 @@
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+mod map;
+mod set;
diff --git a/src/libcollectionstest/btree/set.rs b/src/libcollectionstest/btree/set.rs
new file mode 100644 (file)
index 0000000..488f0d7
--- /dev/null
@@ -0,0 +1,180 @@
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::collections::BTreeSet;
+use std::hash::{SipHasher, self};
+
+#[test]
+fn test_clone_eq() {
+  let mut m = BTreeSet::new();
+
+  m.insert(1);
+  m.insert(2);
+
+  assert!(m.clone() == m);
+}
+
+#[test]
+fn test_hash() {
+  let mut x = BTreeSet::new();
+  let mut y = BTreeSet::new();
+
+  x.insert(1);
+  x.insert(2);
+  x.insert(3);
+
+  y.insert(3);
+  y.insert(2);
+  y.insert(1);
+
+  assert!(hash::hash::<_, SipHasher>(&x) == hash::hash::<_, SipHasher>(&y));
+}
+
+struct Counter<'a, 'b> {
+    i: &'a mut usize,
+    expected: &'b [i32],
+}
+
+impl<'a, 'b, 'c> FnMut<(&'c i32,)> for Counter<'a, 'b> {
+    type Output = bool;
+
+    extern "rust-call" fn call_mut(&mut self, (&x,): (&'c i32,)) -> bool {
+        assert_eq!(x, self.expected[*self.i]);
+        *self.i += 1;
+        true
+    }
+}
+
+fn check<F>(a: &[i32], b: &[i32], expected: &[i32], f: F) where
+    // FIXME Replace Counter with `Box<FnMut(_) -> _>`
+    F: FnOnce(&BTreeSet<i32>, &BTreeSet<i32>, Counter) -> bool,
+{
+    let mut set_a = BTreeSet::new();
+    let mut set_b = BTreeSet::new();
+
+    for x in a { assert!(set_a.insert(*x)) }
+    for y in b { assert!(set_b.insert(*y)) }
+
+    let mut i = 0;
+    f(&set_a, &set_b, Counter { i: &mut i, expected: expected });
+    assert_eq!(i, expected.len());
+}
+
+#[test]
+fn test_intersection() {
+    fn check_intersection(a: &[i32], b: &[i32], expected: &[i32]) {
+        check(a, b, expected, |x, y, f| x.intersection(y).all(f))
+    }
+
+    check_intersection(&[], &[], &[]);
+    check_intersection(&[1, 2, 3], &[], &[]);
+    check_intersection(&[], &[1, 2, 3], &[]);
+    check_intersection(&[2], &[1, 2, 3], &[2]);
+    check_intersection(&[1, 2, 3], &[2], &[2]);
+    check_intersection(&[11, 1, 3, 77, 103, 5, -5],
+                       &[2, 11, 77, -9, -42, 5, 3],
+                       &[3, 5, 11, 77]);
+}
+
+#[test]
+fn test_difference() {
+    fn check_difference(a: &[i32], b: &[i32], expected: &[i32]) {
+        check(a, b, expected, |x, y, f| x.difference(y).all(f))
+    }
+
+    check_difference(&[], &[], &[]);
+    check_difference(&[1, 12], &[], &[1, 12]);
+    check_difference(&[], &[1, 2, 3, 9], &[]);
+    check_difference(&[1, 3, 5, 9, 11],
+                     &[3, 9],
+                     &[1, 5, 11]);
+    check_difference(&[-5, 11, 22, 33, 40, 42],
+                     &[-12, -5, 14, 23, 34, 38, 39, 50],
+                     &[11, 22, 33, 40, 42]);
+}
+
+#[test]
+fn test_symmetric_difference() {
+    fn check_symmetric_difference(a: &[i32], b: &[i32], expected: &[i32]) {
+        check(a, b, expected, |x, y, f| x.symmetric_difference(y).all(f))
+    }
+
+    check_symmetric_difference(&[], &[], &[]);
+    check_symmetric_difference(&[1, 2, 3], &[2], &[1, 3]);
+    check_symmetric_difference(&[2], &[1, 2, 3], &[1, 3]);
+    check_symmetric_difference(&[1, 3, 5, 9, 11],
+                               &[-2, 3, 9, 14, 22],
+                               &[-2, 1, 5, 11, 14, 22]);
+}
+
+#[test]
+fn test_union() {
+    fn check_union(a: &[i32], b: &[i32], expected: &[i32]) {
+        check(a, b, expected, |x, y, f| x.union(y).all(f))
+    }
+
+    check_union(&[], &[], &[]);
+    check_union(&[1, 2, 3], &[2], &[1, 2, 3]);
+    check_union(&[2], &[1, 2, 3], &[1, 2, 3]);
+    check_union(&[1, 3, 5, 9, 11, 16, 19, 24],
+                &[-2, 1, 5, 9, 13, 19],
+                &[-2, 1, 3, 5, 9, 11, 13, 16, 19, 24]);
+}
+
+#[test]
+fn test_zip() {
+    let mut x = BTreeSet::new();
+    x.insert(5);
+    x.insert(12);
+    x.insert(11);
+
+    let mut y = BTreeSet::new();
+    y.insert("foo");
+    y.insert("bar");
+
+    let x = x;
+    let y = y;
+    let mut z = x.iter().zip(y.iter());
+
+    // FIXME: #5801: this needs a type hint to compile...
+    let result: Option<(&usize, & &'static str)> = z.next();
+    assert_eq!(result.unwrap(), (&5, &("bar")));
+
+    let result: Option<(&usize, & &'static str)> = z.next();
+    assert_eq!(result.unwrap(), (&11, &("foo")));
+
+    let result: Option<(&usize, & &'static str)> = z.next();
+    assert!(result.is_none());
+}
+
+#[test]
+fn test_from_iter() {
+    let xs = [1, 2, 3, 4, 5, 6, 7, 8, 9];
+
+    let set: BTreeSet<_> = xs.iter().cloned().collect();
+
+    for x in &xs {
+        assert!(set.contains(x));
+    }
+}
+
+#[test]
+fn test_show() {
+    let mut set = BTreeSet::new();
+    let empty = BTreeSet::<i32>::new();
+
+    set.insert(1);
+    set.insert(2);
+
+    let set_str = format!("{:?}", set);
+
+    assert_eq!(set_str, "{1, 2}");
+    assert_eq!(format!("{:?}", empty), "{}");
+}
diff --git a/src/libcollectionstest/enum_set.rs b/src/libcollectionstest/enum_set.rs
new file mode 100644 (file)
index 0000000..a740c53
--- /dev/null
@@ -0,0 +1,240 @@
+// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::collections::EnumSet;
+
+#[derive(Copy, PartialEq, Debug)]
+#[repr(usize)]
+enum Foo {
+    A, B, C
+}
+
+impl CLike for Foo {
+    fn to_usize(&self) -> usize {
+        *self as usize
+    }
+
+    fn from_usize(v: usize) -> Foo {
+        unsafe { mem::transmute(v) }
+    }
+}
+
+#[test]
+fn test_new() {
+    let e: EnumSet<Foo> = EnumSet::new();
+    assert!(e.is_empty());
+}
+
+#[test]
+fn test_show() {
+    let mut e = EnumSet::new();
+    assert!(format!("{:?}", e) == "{}");
+    e.insert(A);
+    assert!(format!("{:?}", e) == "{A}");
+    e.insert(C);
+    assert!(format!("{:?}", e) == "{A, C}");
+}
+
+#[test]
+fn test_len() {
+    let mut e = EnumSet::new();
+    assert_eq!(e.len(), 0);
+    e.insert(A);
+    e.insert(B);
+    e.insert(C);
+    assert_eq!(e.len(), 3);
+    e.remove(&A);
+    assert_eq!(e.len(), 2);
+    e.clear();
+    assert_eq!(e.len(), 0);
+}
+
+///////////////////////////////////////////////////////////////////////////
+// intersect
+
+#[test]
+fn test_two_empties_do_not_intersect() {
+    let e1: EnumSet<Foo> = EnumSet::new();
+    let e2: EnumSet<Foo> = EnumSet::new();
+    assert!(e1.is_disjoint(&e2));
+}
+
+#[test]
+fn test_empty_does_not_intersect_with_full() {
+    let e1: EnumSet<Foo> = EnumSet::new();
+
+    let mut e2: EnumSet<Foo> = EnumSet::new();
+    e2.insert(A);
+    e2.insert(B);
+    e2.insert(C);
+
+    assert!(e1.is_disjoint(&e2));
+}
+
+#[test]
+fn test_disjoint_intersects() {
+    let mut e1: EnumSet<Foo> = EnumSet::new();
+    e1.insert(A);
+
+    let mut e2: EnumSet<Foo> = EnumSet::new();
+    e2.insert(B);
+
+    assert!(e1.is_disjoint(&e2));
+}
+
+#[test]
+fn test_overlapping_intersects() {
+    let mut e1: EnumSet<Foo> = EnumSet::new();
+    e1.insert(A);
+
+    let mut e2: EnumSet<Foo> = EnumSet::new();
+    e2.insert(A);
+    e2.insert(B);
+
+    assert!(!e1.is_disjoint(&e2));
+}
+
+///////////////////////////////////////////////////////////////////////////
+// contains and contains_elem
+
+#[test]
+fn test_superset() {
+    let mut e1: EnumSet<Foo> = EnumSet::new();
+    e1.insert(A);
+
+    let mut e2: EnumSet<Foo> = EnumSet::new();
+    e2.insert(A);
+    e2.insert(B);
+
+    let mut e3: EnumSet<Foo> = EnumSet::new();
+    e3.insert(C);
+
+    assert!(e1.is_subset(&e2));
+    assert!(e2.is_superset(&e1));
+    assert!(!e3.is_superset(&e2));
+    assert!(!e2.is_superset(&e3))
+}
+
+#[test]
+fn test_contains() {
+    let mut e1: EnumSet<Foo> = EnumSet::new();
+    e1.insert(A);
+    assert!(e1.contains(&A));
+    assert!(!e1.contains(&B));
+    assert!(!e1.contains(&C));
+
+    e1.insert(A);
+    e1.insert(B);
+    assert!(e1.contains(&A));
+    assert!(e1.contains(&B));
+    assert!(!e1.contains(&C));
+}
+
+///////////////////////////////////////////////////////////////////////////
+// iter
+
+#[test]
+fn test_iterator() {
+    let mut e1: EnumSet<Foo> = EnumSet::new();
+
+    let elems: ::vec::Vec<Foo> = e1.iter().collect();
+    assert!(elems.is_empty());
+
+    e1.insert(A);
+    let elems: ::vec::Vec<_> = e1.iter().collect();
+    assert_eq!([A], elems);
+
+    e1.insert(C);
+    let elems: ::vec::Vec<_> = e1.iter().collect();
+    assert_eq!([A,C], elems);
+
+    e1.insert(C);
+    let elems: ::vec::Vec<_> = e1.iter().collect();
+    assert_eq!([A,C], elems);
+
+    e1.insert(B);
+    let elems: ::vec::Vec<_> = e1.iter().collect();
+    assert_eq!([A,B,C], elems);
+}
+
+///////////////////////////////////////////////////////////////////////////
+// operators
+
+#[test]
+fn test_operators() {
+    let mut e1: EnumSet<Foo> = EnumSet::new();
+    e1.insert(A);
+    e1.insert(C);
+
+    let mut e2: EnumSet<Foo> = EnumSet::new();
+    e2.insert(B);
+    e2.insert(C);
+
+    let e_union = e1 | e2;
+    let elems: ::vec::Vec<_> = e_union.iter().collect();
+    assert_eq!([A,B,C], elems);
+
+    let e_intersection = e1 & e2;
+    let elems: ::vec::Vec<_> = e_intersection.iter().collect();
+    assert_eq!([C], elems);
+
+    // Another way to express intersection
+    let e_intersection = e1 - (e1 - e2);
+    let elems: ::vec::Vec<_> = e_intersection.iter().collect();
+    assert_eq!([C], elems);
+
+    let e_subtract = e1 - e2;
+    let elems: ::vec::Vec<_> = e_subtract.iter().collect();
+    assert_eq!([A], elems);
+
+    // Bitwise XOR of two sets, aka symmetric difference
+    let e_symmetric_diff = e1 ^ e2;
+    let elems: ::vec::Vec<_> = e_symmetric_diff.iter().collect();
+    assert_eq!([A,B], elems);
+
+    // Another way to express symmetric difference
+    let e_symmetric_diff = (e1 - e2) | (e2 - e1);
+    let elems: ::vec::Vec<_> = e_symmetric_diff.iter().collect();
+    assert_eq!([A,B], elems);
+
+    // Yet another way to express symmetric difference
+    let e_symmetric_diff = (e1 | e2) - (e1 & e2);
+    let elems: ::vec::Vec<_> = e_symmetric_diff.iter().collect();
+    assert_eq!([A,B], elems);
+}
+
+#[test]
+#[should_panic]
+fn test_overflow() {
+    #[allow(dead_code)]
+    #[derive(Copy)]
+    #[repr(usize)]
+    enum Bar {
+        V00, V01, V02, V03, V04, V05, V06, V07, V08, V09,
+        V10, V11, V12, V13, V14, V15, V16, V17, V18, V19,
+        V20, V21, V22, V23, V24, V25, V26, V27, V28, V29,
+        V30, V31, V32, V33, V34, V35, V36, V37, V38, V39,
+        V40, V41, V42, V43, V44, V45, V46, V47, V48, V49,
+        V50, V51, V52, V53, V54, V55, V56, V57, V58, V59,
+        V60, V61, V62, V63, V64, V65, V66, V67, V68, V69,
+    }
+
+    impl CLike for Bar {
+        fn to_usize(&self) -> usize {
+            *self as usize
+        }
+
+        fn from_usize(v: usize) -> Bar {
+            unsafe { mem::transmute(v) }
+        }
+    }
+    let mut set = EnumSet::new();
+    set.insert(Bar::V64);
+}
diff --git a/src/libcollectionstest/fmt.rs b/src/libcollectionstest/fmt.rs
new file mode 100644 (file)
index 0000000..9a9aa71
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2013-2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::fmt;
+
+#[test]
+fn test_format() {
+    let s = fmt::format(format_args!("Hello, {}!", "world"));
+    assert_eq!(s.as_slice(), "Hello, world!");
+}
diff --git a/src/libcollectionstest/lib.rs b/src/libcollectionstest/lib.rs
new file mode 100644 (file)
index 0000000..4cf1d01
--- /dev/null
@@ -0,0 +1,44 @@
+// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![allow(deprecated)]
+#![feature(box_syntax)]
+#![feature(collections)]
+#![feature(core)]
+#![feature(hash)]
+#![feature(rand)]
+#![feature(rustc_private)]
+#![feature(str_words)]
+#![feature(test)]
+#![feature(unboxed_closures)]
+#![feature(unicode)]
+#![feature(unsafe_destructor)]
+
+#[macro_use] extern crate log;
+
+extern crate collections;
+extern crate test;
+extern crate unicode;
+
+#[cfg(test)] #[macro_use] mod bench;
+
+mod binary_heap;
+mod bit;
+mod btree;
+// FIXME(japaric) privacy
+//mod enum_set;
+mod fmt;
+mod linked_list;
+mod slice;
+mod str;
+mod string;
+mod vec_deque;
+mod vec_map;
+mod vec;
diff --git a/src/libcollectionstest/linked_list.rs b/src/libcollectionstest/linked_list.rs
new file mode 100644 (file)
index 0000000..95d4988
--- /dev/null
@@ -0,0 +1,589 @@
+// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::collections::LinkedList;
+use std::hash::{SipHasher, self};
+
+use test;
+
+// FIXME(japaric) privacy
+/*
+pub fn check_links<T>(list: &LinkedList<T>) {
+    let mut len = 0;
+    let mut last_ptr: Option<&Node<T>> = None;
+    let mut node_ptr: &Node<T>;
+    match list.list_head {
+        None => { assert_eq!(0, list.length); return }
+        Some(ref node) => node_ptr = &**node,
+    }
+    loop {
+        match (last_ptr, node_ptr.prev.resolve_immut()) {
+            (None   , None      ) => {}
+            (None   , _         ) => panic!("prev link for list_head"),
+            (Some(p), Some(pptr)) => {
+                assert_eq!(p as *const Node<T>, pptr as *const Node<T>);
+            }
+            _ => panic!("prev link is none, not good"),
+        }
+        match node_ptr.next {
+            Some(ref next) => {
+                last_ptr = Some(node_ptr);
+                node_ptr = &**next;
+                len += 1;
+            }
+            None => {
+                len += 1;
+                break;
+            }
+        }
+    }
+    assert_eq!(len, list.length);
+}
+*/
+
+#[test]
+fn test_basic() {
+    let mut m = LinkedList::<Box<_>>::new();
+    assert_eq!(m.pop_front(), None);
+    assert_eq!(m.pop_back(), None);
+    assert_eq!(m.pop_front(), None);
+    m.push_front(box 1);
+    assert_eq!(m.pop_front(), Some(box 1));
+    m.push_back(box 2);
+    m.push_back(box 3);
+    assert_eq!(m.len(), 2);
+    assert_eq!(m.pop_front(), Some(box 2));
+    assert_eq!(m.pop_front(), Some(box 3));
+    assert_eq!(m.len(), 0);
+    assert_eq!(m.pop_front(), None);
+    m.push_back(box 1);
+    m.push_back(box 3);
+    m.push_back(box 5);
+    m.push_back(box 7);
+    assert_eq!(m.pop_front(), Some(box 1));
+
+    let mut n = LinkedList::new();
+    n.push_front(2);
+    n.push_front(3);
+    {
+        assert_eq!(n.front().unwrap(), &3);
+        let x = n.front_mut().unwrap();
+        assert_eq!(*x, 3);
+        *x = 0;
+    }
+    {
+        assert_eq!(n.back().unwrap(), &2);
+        let y = n.back_mut().unwrap();
+        assert_eq!(*y, 2);
+        *y = 1;
+    }
+    assert_eq!(n.pop_front(), Some(0));
+    assert_eq!(n.pop_front(), Some(1));
+}
+
+#[cfg(test)]
+fn generate_test() -> LinkedList<i32> {
+    list_from(&[0,1,2,3,4,5,6])
+}
+
+#[cfg(test)]
+fn list_from<T: Clone>(v: &[T]) -> LinkedList<T> {
+    v.iter().cloned().collect()
+}
+
+// FIXME(japaric) privacy
+/*
+#[test]
+fn test_append() {
+    // Empty to empty
+    {
+        let mut m = LinkedList::<i32>::new();
+        let mut n = LinkedList::new();
+        m.append(&mut n);
+        check_links(&m);
+        assert_eq!(m.len(), 0);
+        assert_eq!(n.len(), 0);
+    }
+    // Non-empty to empty
+    {
+        let mut m = LinkedList::new();
+        let mut n = LinkedList::new();
+        n.push_back(2);
+        m.append(&mut n);
+        check_links(&m);
+        assert_eq!(m.len(), 1);
+        assert_eq!(m.pop_back(), Some(2));
+        assert_eq!(n.len(), 0);
+        check_links(&m);
+    }
+    // Empty to non-empty
+    {
+        let mut m = LinkedList::new();
+        let mut n = LinkedList::new();
+        m.push_back(2);
+        m.append(&mut n);
+        check_links(&m);
+        assert_eq!(m.len(), 1);
+        assert_eq!(m.pop_back(), Some(2));
+        check_links(&m);
+    }
+
+    // Non-empty to non-empty
+    let v = vec![1,2,3,4,5];
+    let u = vec![9,8,1,2,3,4,5];
+    let mut m = list_from(&v);
+    let mut n = list_from(&u);
+    m.append(&mut n);
+    check_links(&m);
+    let mut sum = v;
+    sum.push_all(&u);
+    assert_eq!(sum.len(), m.len());
+    for elt in sum {
+        assert_eq!(m.pop_front(), Some(elt))
+    }
+    assert_eq!(n.len(), 0);
+    // let's make sure it's working properly, since we
+    // did some direct changes to private members
+    n.push_back(3);
+    assert_eq!(n.len(), 1);
+    assert_eq!(n.pop_front(), Some(3));
+    check_links(&n);
+}
+*/
+
+#[test]
+fn test_split_off() {
+    // singleton
+    {
+        let mut m = LinkedList::new();
+        m.push_back(1);
+
+        let p = m.split_off(0);
+        assert_eq!(m.len(), 0);
+        assert_eq!(p.len(), 1);
+        assert_eq!(p.back(), Some(&1));
+        assert_eq!(p.front(), Some(&1));
+    }
+
+    // not singleton, forwards
+    {
+        let u = vec![1,2,3,4,5];
+        let mut m = list_from(&u);
+        let mut n = m.split_off(2);
+        assert_eq!(m.len(), 2);
+        assert_eq!(n.len(), 3);
+        for elt in 1..3 {
+            assert_eq!(m.pop_front(), Some(elt));
+        }
+        for elt in 3..6 {
+            assert_eq!(n.pop_front(), Some(elt));
+        }
+    }
+    // not singleton, backwards
+    {
+        let u = vec![1,2,3,4,5];
+        let mut m = list_from(&u);
+        let mut n = m.split_off(4);
+        assert_eq!(m.len(), 4);
+        assert_eq!(n.len(), 1);
+        for elt in 1..5 {
+            assert_eq!(m.pop_front(), Some(elt));
+        }
+        for elt in 5..6 {
+            assert_eq!(n.pop_front(), Some(elt));
+        }
+    }
+
+    // no-op on the last index
+    {
+        let mut m = LinkedList::new();
+        m.push_back(1);
+
+        let p = m.split_off(1);
+        assert_eq!(m.len(), 1);
+        assert_eq!(p.len(), 0);
+        assert_eq!(m.back(), Some(&1));
+        assert_eq!(m.front(), Some(&1));
+    }
+
+}
+
+#[test]
+fn test_iterator() {
+    let m = generate_test();
+    for (i, elt) in m.iter().enumerate() {
+        assert_eq!(i as i32, *elt);
+    }
+    let mut n = LinkedList::new();
+    assert_eq!(n.iter().next(), None);
+    n.push_front(4);
+    let mut it = n.iter();
+    assert_eq!(it.size_hint(), (1, Some(1)));
+    assert_eq!(it.next().unwrap(), &4);
+    assert_eq!(it.size_hint(), (0, Some(0)));
+    assert_eq!(it.next(), None);
+}
+
+#[test]
+fn test_iterator_clone() {
+    let mut n = LinkedList::new();
+    n.push_back(2);
+    n.push_back(3);
+    n.push_back(4);
+    let mut it = n.iter();
+    it.next();
+    let mut jt = it.clone();
+    assert_eq!(it.next(), jt.next());
+    assert_eq!(it.next_back(), jt.next_back());
+    assert_eq!(it.next(), jt.next());
+}
+
+#[test]
+fn test_iterator_double_end() {
+    let mut n = LinkedList::new();
+    assert_eq!(n.iter().next(), None);
+    n.push_front(4);
+    n.push_front(5);
+    n.push_front(6);
+    let mut it = n.iter();
+    assert_eq!(it.size_hint(), (3, Some(3)));
+    assert_eq!(it.next().unwrap(), &6);
+    assert_eq!(it.size_hint(), (2, Some(2)));
+    assert_eq!(it.next_back().unwrap(), &4);
+    assert_eq!(it.size_hint(), (1, Some(1)));
+    assert_eq!(it.next_back().unwrap(), &5);
+    assert_eq!(it.next_back(), None);
+    assert_eq!(it.next(), None);
+}
+
+#[test]
+fn test_rev_iter() {
+    let m = generate_test();
+    for (i, elt) in m.iter().rev().enumerate() {
+        assert_eq!((6 - i) as i32, *elt);
+    }
+    let mut n = LinkedList::new();
+    assert_eq!(n.iter().rev().next(), None);
+    n.push_front(4);
+    let mut it = n.iter().rev();
+    assert_eq!(it.size_hint(), (1, Some(1)));
+    assert_eq!(it.next().unwrap(), &4);
+    assert_eq!(it.size_hint(), (0, Some(0)));
+    assert_eq!(it.next(), None);
+}
+
+#[test]
+fn test_mut_iter() {
+    let mut m = generate_test();
+    let mut len = m.len();
+    for (i, elt) in m.iter_mut().enumerate() {
+        assert_eq!(i as i32, *elt);
+        len -= 1;
+    }
+    assert_eq!(len, 0);
+    let mut n = LinkedList::new();
+    assert!(n.iter_mut().next().is_none());
+    n.push_front(4);
+    n.push_back(5);
+    let mut it = n.iter_mut();
+    assert_eq!(it.size_hint(), (2, Some(2)));
+    assert!(it.next().is_some());
+    assert!(it.next().is_some());
+    assert_eq!(it.size_hint(), (0, Some(0)));
+    assert!(it.next().is_none());
+}
+
+#[test]
+fn test_iterator_mut_double_end() {
+    let mut n = LinkedList::new();
+    assert!(n.iter_mut().next_back().is_none());
+    n.push_front(4);
+    n.push_front(5);
+    n.push_front(6);
+    let mut it = n.iter_mut();
+    assert_eq!(it.size_hint(), (3, Some(3)));
+    assert_eq!(*it.next().unwrap(), 6);
+    assert_eq!(it.size_hint(), (2, Some(2)));
+    assert_eq!(*it.next_back().unwrap(), 4);
+    assert_eq!(it.size_hint(), (1, Some(1)));
+    assert_eq!(*it.next_back().unwrap(), 5);
+    assert!(it.next_back().is_none());
+    assert!(it.next().is_none());
+}
+
+// FIXME(japaric) privacy
+/*
+#[test]
+fn test_insert_prev() {
+    let mut m = list_from(&[0,2,4,6,8]);
+    let len = m.len();
+    {
+        let mut it = m.iter_mut();
+        it.insert_next(-2);
+        loop {
+            match it.next() {
+                None => break,
+                Some(elt) => {
+                    it.insert_next(*elt + 1);
+                    match it.peek_next() {
+                        Some(x) => assert_eq!(*x, *elt + 2),
+                        None => assert_eq!(8, *elt),
+                    }
+                }
+            }
+        }
+        it.insert_next(0);
+        it.insert_next(1);
+    }
+    check_links(&m);
+    assert_eq!(m.len(), 3 + len * 2);
+    assert_eq!(m.into_iter().collect::<Vec<_>>(), [-2,0,1,2,3,4,5,6,7,8,9,0,1]);
+}
+*/
+
+#[test]
+fn test_mut_rev_iter() {
+    let mut m = generate_test();
+    for (i, elt) in m.iter_mut().rev().enumerate() {
+        assert_eq!((6 - i) as i32, *elt);
+    }
+    let mut n = LinkedList::new();
+    assert!(n.iter_mut().rev().next().is_none());
+    n.push_front(4);
+    let mut it = n.iter_mut().rev();
+    assert!(it.next().is_some());
+    assert!(it.next().is_none());
+}
+
+// FIXME(japaric) privacy
+/*
+#[test]
+fn test_send() {
+    let n = list_from(&[1,2,3]);
+    thread::spawn(move || {
+        check_links(&n);
+        let a: &[_] = &[&1,&2,&3];
+        assert_eq!(a, n.iter().collect::<Vec<_>>());
+    }).join().ok().unwrap();
+}
+*/
+
+#[test]
+fn test_eq() {
+    let mut n = list_from(&[]);
+    let mut m = list_from(&[]);
+    assert!(n == m);
+    n.push_front(1);
+    assert!(n != m);
+    m.push_back(1);
+    assert!(n == m);
+
+    let n = list_from(&[2,3,4]);
+    let m = list_from(&[1,2,3]);
+    assert!(n != m);
+}
+
+#[test]
+fn test_hash() {
+  let mut x = LinkedList::new();
+  let mut y = LinkedList::new();
+
+  assert!(hash::hash::<_, SipHasher>(&x) == hash::hash::<_, SipHasher>(&y));
+
+  x.push_back(1);
+  x.push_back(2);
+  x.push_back(3);
+
+  y.push_front(3);
+  y.push_front(2);
+  y.push_front(1);
+
+  assert!(hash::hash::<_, SipHasher>(&x) == hash::hash::<_, SipHasher>(&y));
+}
+
+#[test]
+fn test_ord() {
+    let n = list_from(&[]);
+    let m = list_from(&[1,2,3]);
+    assert!(n < m);
+    assert!(m > n);
+    assert!(n <= n);
+    assert!(n >= n);
+}
+
+#[test]
+fn test_ord_nan() {
+    let nan = 0.0f64/0.0;
+    let n = list_from(&[nan]);
+    let m = list_from(&[nan]);
+    assert!(!(n < m));
+    assert!(!(n > m));
+    assert!(!(n <= m));
+    assert!(!(n >= m));
+
+    let n = list_from(&[nan]);
+    let one = list_from(&[1.0f64]);
+    assert!(!(n < one));
+    assert!(!(n > one));
+    assert!(!(n <= one));
+    assert!(!(n >= one));
+
+    let u = list_from(&[1.0f64,2.0,nan]);
+    let v = list_from(&[1.0f64,2.0,3.0]);
+    assert!(!(u < v));
+    assert!(!(u > v));
+    assert!(!(u <= v));
+    assert!(!(u >= v));
+
+    let s = list_from(&[1.0f64,2.0,4.0,2.0]);
+    let t = list_from(&[1.0f64,2.0,3.0,2.0]);
+    assert!(!(s < t));
+    assert!(s > one);
+    assert!(!(s <= one));
+    assert!(s >= one);
+}
+
+// FIXME(japaric) privacy
+/*
+#[test]
+fn test_fuzz() {
+    for _ in 0..25 {
+        fuzz_test(3);
+        fuzz_test(16);
+        fuzz_test(189);
+    }
+}
+*/
+
+#[test]
+fn test_show() {
+    let list: LinkedList<_> = (0..10).collect();
+    assert_eq!(format!("{:?}", list), "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]");
+
+    let list: LinkedList<_> = vec!["just", "one", "test", "more"].iter().cloned().collect();
+    assert_eq!(format!("{:?}", list), "[\"just\", \"one\", \"test\", \"more\"]");
+}
+
+// FIXME(japaric) privacy
+/*
+#[cfg(test)]
+fn fuzz_test(sz: i32) {
+    let mut m: LinkedList<_> = LinkedList::new();
+    let mut v = vec![];
+    for i in 0..sz {
+        check_links(&m);
+        let r: u8 = rand::random();
+        match r % 6 {
+            0 => {
+                m.pop_back();
+                v.pop();
+            }
+            1 => {
+                if !v.is_empty() {
+                    m.pop_front();
+                    v.remove(0);
+                }
+            }
+            2 | 4 =>  {
+                m.push_front(-i);
+                v.insert(0, -i);
+            }
+            3 | 5 | _ => {
+                m.push_back(i);
+                v.push(i);
+            }
+        }
+    }
+
+    check_links(&m);
+
+    let mut i = 0;
+    for (a, &b) in m.into_iter().zip(v.iter()) {
+        i += 1;
+        assert_eq!(a, b);
+    }
+    assert_eq!(i, v.len());
+}
+*/
+
+#[bench]
+fn bench_collect_into(b: &mut test::Bencher) {
+    let v = &[0; 64];
+    b.iter(|| {
+        let _: LinkedList<_> = v.iter().cloned().collect();
+    })
+}
+
+#[bench]
+fn bench_push_front(b: &mut test::Bencher) {
+    let mut m: LinkedList<_> = LinkedList::new();
+    b.iter(|| {
+        m.push_front(0);
+    })
+}
+
+#[bench]
+fn bench_push_back(b: &mut test::Bencher) {
+    let mut m: LinkedList<_> = LinkedList::new();
+    b.iter(|| {
+        m.push_back(0);
+    })
+}
+
+#[bench]
+fn bench_push_back_pop_back(b: &mut test::Bencher) {
+    let mut m: LinkedList<_> = LinkedList::new();
+    b.iter(|| {
+        m.push_back(0);
+        m.pop_back();
+    })
+}
+
+#[bench]
+fn bench_push_front_pop_front(b: &mut test::Bencher) {
+    let mut m: LinkedList<_> = LinkedList::new();
+    b.iter(|| {
+        m.push_front(0);
+        m.pop_front();
+    })
+}
+
+#[bench]
+fn bench_iter(b: &mut test::Bencher) {
+    let v = &[0; 128];
+    let m: LinkedList<_> = v.iter().cloned().collect();
+    b.iter(|| {
+        assert!(m.iter().count() == 128);
+    })
+}
+#[bench]
+fn bench_iter_mut(b: &mut test::Bencher) {
+    let v = &[0; 128];
+    let mut m: LinkedList<_> = v.iter().cloned().collect();
+    b.iter(|| {
+        assert!(m.iter_mut().count() == 128);
+    })
+}
+#[bench]
+fn bench_iter_rev(b: &mut test::Bencher) {
+    let v = &[0; 128];
+    let m: LinkedList<_> = v.iter().cloned().collect();
+    b.iter(|| {
+        assert!(m.iter().rev().count() == 128);
+    })
+}
+#[bench]
+fn bench_iter_mut_rev(b: &mut test::Bencher) {
+    let v = &[0; 128];
+    let mut m: LinkedList<_> = v.iter().cloned().collect();
+    b.iter(|| {
+        assert!(m.iter_mut().rev().count() == 128);
+    })
+}
diff --git a/src/libcollectionstest/slice.rs b/src/libcollectionstest/slice.rs
new file mode 100644 (file)
index 0000000..7d50a1a
--- /dev/null
@@ -0,0 +1,1627 @@
+// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::cmp::Ordering::{Equal, Greater, Less};
+use std::default::Default;
+use std::iter::RandomAccessIterator;
+use std::mem;
+use std::rand::{Rng, thread_rng};
+use std::rc::Rc;
+use std::slice::ElementSwaps;
+
+fn square(n: usize) -> usize { n * n }
+
+fn is_odd(n: &usize) -> bool { *n % 2 == 1 }
+
+#[test]
+fn test_from_fn() {
+    // Test on-stack from_fn.
+    let mut v: Vec<_> = (0..3).map(square).collect();
+    {
+        let v = v;
+        assert_eq!(v.len(), 3);
+        assert_eq!(v[0], 0);
+        assert_eq!(v[1], 1);
+        assert_eq!(v[2], 4);
+    }
+
+    // Test on-heap from_fn.
+    v = (0..5).map(square).collect();
+    {
+        let v = v;
+        assert_eq!(v.len(), 5);
+        assert_eq!(v[0], 0);
+        assert_eq!(v[1], 1);
+        assert_eq!(v[2], 4);
+        assert_eq!(v[3], 9);
+        assert_eq!(v[4], 16);
+    }
+}
+
+#[test]
+fn test_from_elem() {
+    // Test on-stack from_elem.
+    let mut v = vec![10, 10];
+    {
+        let v = v;
+        assert_eq!(v.len(), 2);
+        assert_eq!(v[0], 10);
+        assert_eq!(v[1], 10);
+    }
+
+    // Test on-heap from_elem.
+    v = vec![20; 6];
+    {
+        let v = v.as_slice();
+        assert_eq!(v[0], 20);
+        assert_eq!(v[1], 20);
+        assert_eq!(v[2], 20);
+        assert_eq!(v[3], 20);
+        assert_eq!(v[4], 20);
+        assert_eq!(v[5], 20);
+    }
+}
+
+#[test]
+fn test_is_empty() {
+    let xs: [i32; 0] = [];
+    assert!(xs.is_empty());
+    assert!(![0].is_empty());
+}
+
+#[test]
+fn test_len_divzero() {
+    type Z = [i8; 0];
+    let v0 : &[Z] = &[];
+    let v1 : &[Z] = &[[]];
+    let v2 : &[Z] = &[[], []];
+    assert_eq!(mem::size_of::<Z>(), 0);
+    assert_eq!(v0.len(), 0);
+    assert_eq!(v1.len(), 1);
+    assert_eq!(v2.len(), 2);
+}
+
+#[test]
+fn test_get() {
+    let mut a = vec![11];
+    assert_eq!(a.get(1), None);
+    a = vec![11, 12];
+    assert_eq!(a.get(1).unwrap(), &12);
+    a = vec![11, 12, 13];
+    assert_eq!(a.get(1).unwrap(), &12);
+}
+
+#[test]
+fn test_first() {
+    let mut a = vec![];
+    assert_eq!(a.first(), None);
+    a = vec![11];
+    assert_eq!(a.first().unwrap(), &11);
+    a = vec![11, 12];
+    assert_eq!(a.first().unwrap(), &11);
+}
+
+#[test]
+fn test_first_mut() {
+    let mut a = vec![];
+    assert_eq!(a.first_mut(), None);
+    a = vec![11];
+    assert_eq!(*a.first_mut().unwrap(), 11);
+    a = vec![11, 12];
+    assert_eq!(*a.first_mut().unwrap(), 11);
+}
+
+#[test]
+fn test_tail() {
+    let mut a = vec![11];
+    let b: &[i32] = &[];
+    assert_eq!(a.tail(), b);
+    a = vec![11, 12];
+    let b: &[i32] = &[12];
+    assert_eq!(a.tail(), b);
+}
+
+#[test]
+fn test_tail_mut() {
+    let mut a = vec![11];
+    let b: &mut [i32] = &mut [];
+    assert!(a.tail_mut() == b);
+    a = vec![11, 12];
+    let b: &mut [_] = &mut [12];
+    assert!(a.tail_mut() == b);
+}
+
+#[test]
+#[should_panic]
+fn test_tail_empty() {
+    let a = Vec::<i32>::new();
+    a.tail();
+}
+
+#[test]
+#[should_panic]
+fn test_tail_mut_empty() {
+    let mut a = Vec::<i32>::new();
+    a.tail_mut();
+}
+
+#[test]
+fn test_init() {
+    let mut a = vec![11];
+    let b: &[i32] = &[];
+    assert_eq!(a.init(), b);
+    a = vec![11, 12];
+    let b: &[_] = &[11];
+    assert_eq!(a.init(), b);
+}
+
+#[test]
+fn test_init_mut() {
+    let mut a = vec![11];
+    let b: &mut [i32] = &mut [];
+    assert!(a.init_mut() == b);
+    a = vec![11, 12];
+    let b: &mut [_] = &mut [11];
+    assert!(a.init_mut() == b);
+}
+
+#[test]
+#[should_panic]
+fn test_init_empty() {
+    let a = Vec::<i32>::new();
+    a.init();
+}
+
+#[test]
+#[should_panic]
+fn test_init_mut_empty() {
+    let mut a = Vec::<i32>::new();
+    a.init_mut();
+}
+
+#[test]
+fn test_last() {
+    let mut a = vec![];
+    assert_eq!(a.last(), None);
+    a = vec![11];
+    assert_eq!(a.last().unwrap(), &11);
+    a = vec![11, 12];
+    assert_eq!(a.last().unwrap(), &12);
+}
+
+#[test]
+fn test_last_mut() {
+    let mut a = vec![];
+    assert_eq!(a.last_mut(), None);
+    a = vec![11];
+    assert_eq!(*a.last_mut().unwrap(), 11);
+    a = vec![11, 12];
+    assert_eq!(*a.last_mut().unwrap(), 12);
+}
+
+#[test]
+fn test_slice() {
+    // Test fixed length vector.
+    let vec_fixed = [1, 2, 3, 4];
+    let v_a = vec_fixed[1..vec_fixed.len()].to_vec();
+    assert_eq!(v_a.len(), 3);
+
+    assert_eq!(v_a[0], 2);
+    assert_eq!(v_a[1], 3);
+    assert_eq!(v_a[2], 4);
+
+    // Test on stack.
+    let vec_stack: &[_] = &[1, 2, 3];
+    let v_b = vec_stack[1..3].to_vec();
+    assert_eq!(v_b.len(), 2);
+
+    assert_eq!(v_b[0], 2);
+    assert_eq!(v_b[1], 3);
+
+    // Test `Box<[T]>`
+    let vec_unique = vec![1, 2, 3, 4, 5, 6];
+    let v_d = vec_unique[1..6].to_vec();
+    assert_eq!(v_d.len(), 5);
+
+    assert_eq!(v_d[0], 2);
+    assert_eq!(v_d[1], 3);
+    assert_eq!(v_d[2], 4);
+    assert_eq!(v_d[3], 5);
+    assert_eq!(v_d[4], 6);
+}
+
+#[test]
+fn test_slice_from() {
+    let vec: &[_] = &[1, 2, 3, 4];
+    assert_eq!(&vec[..], vec);
+    let b: &[_] = &[3, 4];
+    assert_eq!(&vec[2..], b);
+    let b: &[_] = &[];
+    assert_eq!(&vec[4..], b);
+}
+
+#[test]
+fn test_slice_to() {
+    let vec: &[_] = &[1, 2, 3, 4];
+    assert_eq!(&vec[..4], vec);
+    let b: &[_] = &[1, 2];
+    assert_eq!(&vec[..2], b);
+    let b: &[_] = &[];
+    assert_eq!(&vec[..0], b);
+}
+
+
+#[test]
+fn test_pop() {
+    let mut v = vec![5];
+    let e = v.pop();
+    assert_eq!(v.len(), 0);
+    assert_eq!(e, Some(5));
+    let f = v.pop();
+    assert_eq!(f, None);
+    let g = v.pop();
+    assert_eq!(g, None);
+}
+
+#[test]
+fn test_swap_remove() {
+    let mut v = vec![1, 2, 3, 4, 5];
+    let mut e = v.swap_remove(0);
+    assert_eq!(e, 1);
+    assert_eq!(v, [5, 2, 3, 4]);
+    e = v.swap_remove(3);
+    assert_eq!(e, 4);
+    assert_eq!(v, [5, 2, 3]);
+}
+
+#[test]
+#[should_panic]
+fn test_swap_remove_fail() {
+    let mut v = vec![1];
+    let _ = v.swap_remove(0);
+    let _ = v.swap_remove(0);
+}
+
+#[test]
+fn test_swap_remove_noncopyable() {
+    // Tests that we don't accidentally run destructors twice.
+    let mut v: Vec<Box<_>> = Vec::new();
+    v.push(box 0u8);
+    v.push(box 0u8);
+    v.push(box 0u8);
+    let mut _e = v.swap_remove(0);
+    assert_eq!(v.len(), 2);
+    _e = v.swap_remove(1);
+    assert_eq!(v.len(), 1);
+    _e = v.swap_remove(0);
+    assert_eq!(v.len(), 0);
+}
+
+#[test]
+fn test_push() {
+    // Test on-stack push().
+    let mut v = vec![];
+    v.push(1);
+    assert_eq!(v.len(), 1);
+    assert_eq!(v[0], 1);
+
+    // Test on-heap push().
+    v.push(2);
+    assert_eq!(v.len(), 2);
+    assert_eq!(v[0], 1);
+    assert_eq!(v[1], 2);
+}
+
+#[test]
+fn test_truncate() {
+    let mut v: Vec<Box<_>> = vec![box 6,box 5,box 4];
+    v.truncate(1);
+    let v = v;
+    assert_eq!(v.len(), 1);
+    assert_eq!(*(v[0]), 6);
+    // If the unsafe block didn't drop things properly, we blow up here.
+}
+
+#[test]
+fn test_clear() {
+    let mut v: Vec<Box<_>> = vec![box 6,box 5,box 4];
+    v.clear();
+    assert_eq!(v.len(), 0);
+    // If the unsafe block didn't drop things properly, we blow up here.
+}
+
+#[test]
+fn test_dedup() {
+    fn case(a: Vec<i32>, b: Vec<i32>) {
+        let mut v = a;
+        v.dedup();
+        assert_eq!(v, b);
+    }
+    case(vec![], vec![]);
+    case(vec![1], vec![1]);
+    case(vec![1,1], vec![1]);
+    case(vec![1,2,3], vec![1,2,3]);
+    case(vec![1,1,2,3], vec![1,2,3]);
+    case(vec![1,2,2,3], vec![1,2,3]);
+    case(vec![1,2,3,3], vec![1,2,3]);
+    case(vec![1,1,2,2,2,3,3], vec![1,2,3]);
+}
+
+#[test]
+fn test_dedup_unique() {
+    let mut v0: Vec<Box<_>> = vec![box 1, box 1, box 2, box 3];
+    v0.dedup();
+    let mut v1: Vec<Box<_>> = vec![box 1, box 2, box 2, box 3];
+    v1.dedup();
+    let mut v2: Vec<Box<_>> = vec![box 1, box 2, box 3, box 3];
+    v2.dedup();
+    /*
+     * If the boxed pointers were leaked or otherwise misused, valgrind
+     * and/or rt should raise errors.
+     */
+}
+
+#[test]
+fn test_dedup_shared() {
+    let mut v0: Vec<Box<_>> = vec![box 1, box 1, box 2, box 3];
+    v0.dedup();
+    let mut v1: Vec<Box<_>> = vec![box 1, box 2, box 2, box 3];
+    v1.dedup();
+    let mut v2: Vec<Box<_>> = vec![box 1, box 2, box 3, box 3];
+    v2.dedup();
+    /*
+     * If the pointers were leaked or otherwise misused, valgrind and/or
+     * rt should raise errors.
+     */
+}
+
+#[test]
+fn test_retain() {
+    let mut v = vec![1, 2, 3, 4, 5];
+    v.retain(is_odd);
+    assert_eq!(v, [1, 3, 5]);
+}
+
+#[test]
+fn test_element_swaps() {
+    let mut v = [1, 2, 3];
+    for (i, (a, b)) in ElementSwaps::new(v.len()).enumerate() {
+        v.swap(a, b);
+        match i {
+            0 => assert!(v == [1, 3, 2]),
+            1 => assert!(v == [3, 1, 2]),
+            2 => assert!(v == [3, 2, 1]),
+            3 => assert!(v == [2, 3, 1]),
+            4 => assert!(v == [2, 1, 3]),
+            5 => assert!(v == [1, 2, 3]),
+            _ => panic!(),
+        }
+    }
+}
+
+// FIXME(japaric) privacy
+/*
+#[test]
+fn test_permutations() {
+    {
+        let v: [i32; 0] = [];
+        let mut it = v.permutations();
+        let (min_size, max_opt) = it.size_hint();
+        assert_eq!(min_size, 1);
+        assert_eq!(max_opt.unwrap(), 1);
+        assert_eq!(it.next(), Some(v.to_vec()));
+        assert_eq!(it.next(), None);
+    }
+    {
+        let v = ["Hello".to_string()];
+        let mut it = v.permutations();
+        let (min_size, max_opt) = it.size_hint();
+        assert_eq!(min_size, 1);
+        assert_eq!(max_opt.unwrap(), 1);
+        assert_eq!(it.next(), Some(v.to_vec()));
+        assert_eq!(it.next(), None);
+    }
+    {
+        let v = [1, 2, 3];
+        let mut it = v.permutations();
+        let (min_size, max_opt) = it.size_hint();
+        assert_eq!(min_size, 3*2);
+        assert_eq!(max_opt.unwrap(), 3*2);
+        assert_eq!(it.next(), Some(vec![1,2,3]));
+        assert_eq!(it.next(), Some(vec![1,3,2]));
+        assert_eq!(it.next(), Some(vec![3,1,2]));
+        let (min_size, max_opt) = it.size_hint();
+        assert_eq!(min_size, 3);
+        assert_eq!(max_opt.unwrap(), 3);
+        assert_eq!(it.next(), Some(vec![3,2,1]));
+        assert_eq!(it.next(), Some(vec![2,3,1]));
+        assert_eq!(it.next(), Some(vec![2,1,3]));
+        assert_eq!(it.next(), None);
+    }
+    {
+        // check that we have N! permutations
+        let v = ['A', 'B', 'C', 'D', 'E', 'F'];
+        let mut amt = 0;
+        let mut it = v.permutations();
+        let (min_size, max_opt) = it.size_hint();
+        for _perm in it.by_ref() {
+            amt += 1;
+        }
+        assert_eq!(amt, it.swaps.swaps_made);
+        assert_eq!(amt, min_size);
+        assert_eq!(amt, 2 * 3 * 4 * 5 * 6);
+        assert_eq!(amt, max_opt.unwrap());
+    }
+}
+*/
+
+#[test]
+fn test_lexicographic_permutations() {
+    let v : &mut[_] = &mut[1, 2, 3, 4, 5];
+    assert!(v.prev_permutation() == false);
+    assert!(v.next_permutation());
+    let b: &mut[_] = &mut[1, 2, 3, 5, 4];
+    assert!(v == b);
+    assert!(v.prev_permutation());
+    let b: &mut[_] = &mut[1, 2, 3, 4, 5];
+    assert!(v == b);
+    assert!(v.next_permutation());
+    assert!(v.next_permutation());
+    let b: &mut[_] = &mut[1, 2, 4, 3, 5];
+    assert!(v == b);
+    assert!(v.next_permutation());
+    let b: &mut[_] = &mut[1, 2, 4, 5, 3];
+    assert!(v == b);
+
+    let v : &mut[_] = &mut[1, 0, 0, 0];
+    assert!(v.next_permutation() == false);
+    assert!(v.prev_permutation());
+    let b: &mut[_] = &mut[0, 1, 0, 0];
+    assert!(v == b);
+    assert!(v.prev_permutation());
+    let b: &mut[_] = &mut[0, 0, 1, 0];
+    assert!(v == b);
+    assert!(v.prev_permutation());
+    let b: &mut[_] = &mut[0, 0, 0, 1];
+    assert!(v == b);
+    assert!(v.prev_permutation() == false);
+}
+
+#[test]
+fn test_lexicographic_permutations_empty_and_short() {
+    let empty : &mut[i32] = &mut[];
+    assert!(empty.next_permutation() == false);
+    let b: &mut[i32] = &mut[];
+    assert!(empty == b);
+    assert!(empty.prev_permutation() == false);
+    assert!(empty == b);
+
+    let one_elem : &mut[_] = &mut[4];
+    assert!(one_elem.prev_permutation() == false);
+    let b: &mut[_] = &mut[4];
+    assert!(one_elem == b);
+    assert!(one_elem.next_permutation() == false);
+    assert!(one_elem == b);
+
+    let two_elem : &mut[_] = &mut[1, 2];
+    assert!(two_elem.prev_permutation() == false);
+    let b : &mut[_] = &mut[1, 2];
+    let c : &mut[_] = &mut[2, 1];
+    assert!(two_elem == b);
+    assert!(two_elem.next_permutation());
+    assert!(two_elem == c);
+    assert!(two_elem.next_permutation() == false);
+    assert!(two_elem == c);
+    assert!(two_elem.prev_permutation());
+    assert!(two_elem == b);
+    assert!(two_elem.prev_permutation() == false);
+    assert!(two_elem == b);
+}
+
+#[test]
+fn test_position_elem() {
+    assert!([].position_elem(&1).is_none());
+
+    let v1 = vec![1, 2, 3, 3, 2, 5];
+    assert_eq!(v1.position_elem(&1), Some(0));
+    assert_eq!(v1.position_elem(&2), Some(1));
+    assert_eq!(v1.position_elem(&5), Some(5));
+    assert!(v1.position_elem(&4).is_none());
+}
+
+#[test]
+fn test_binary_search() {
+    assert_eq!([1,2,3,4,5].binary_search(&5).ok(), Some(4));
+    assert_eq!([1,2,3,4,5].binary_search(&4).ok(), Some(3));
+    assert_eq!([1,2,3,4,5].binary_search(&3).ok(), Some(2));
+    assert_eq!([1,2,3,4,5].binary_search(&2).ok(), Some(1));
+    assert_eq!([1,2,3,4,5].binary_search(&1).ok(), Some(0));
+
+    assert_eq!([2,4,6,8,10].binary_search(&1).ok(), None);
+    assert_eq!([2,4,6,8,10].binary_search(&5).ok(), None);
+    assert_eq!([2,4,6,8,10].binary_search(&4).ok(), Some(1));
+    assert_eq!([2,4,6,8,10].binary_search(&10).ok(), Some(4));
+
+    assert_eq!([2,4,6,8].binary_search(&1).ok(), None);
+    assert_eq!([2,4,6,8].binary_search(&5).ok(), None);
+    assert_eq!([2,4,6,8].binary_search(&4).ok(), Some(1));
+    assert_eq!([2,4,6,8].binary_search(&8).ok(), Some(3));
+
+    assert_eq!([2,4,6].binary_search(&1).ok(), None);
+    assert_eq!([2,4,6].binary_search(&5).ok(), None);
+    assert_eq!([2,4,6].binary_search(&4).ok(), Some(1));
+    assert_eq!([2,4,6].binary_search(&6).ok(), Some(2));
+
+    assert_eq!([2,4].binary_search(&1).ok(), None);
+    assert_eq!([2,4].binary_search(&5).ok(), None);
+    assert_eq!([2,4].binary_search(&2).ok(), Some(0));
+    assert_eq!([2,4].binary_search(&4).ok(), Some(1));
+
+    assert_eq!([2].binary_search(&1).ok(), None);
+    assert_eq!([2].binary_search(&5).ok(), None);
+    assert_eq!([2].binary_search(&2).ok(), Some(0));
+
+    assert_eq!([].binary_search(&1).ok(), None);
+    assert_eq!([].binary_search(&5).ok(), None);
+
+    assert!([1,1,1,1,1].binary_search(&1).ok() != None);
+    assert!([1,1,1,1,2].binary_search(&1).ok() != None);
+    assert!([1,1,1,2,2].binary_search(&1).ok() != None);
+    assert!([1,1,2,2,2].binary_search(&1).ok() != None);
+    assert_eq!([1,2,2,2,2].binary_search(&1).ok(), Some(0));
+
+    assert_eq!([1,2,3,4,5].binary_search(&6).ok(), None);
+    assert_eq!([1,2,3,4,5].binary_search(&0).ok(), None);
+}
+
+#[test]
+fn test_reverse() {
+    let mut v = vec![10, 20];
+    assert_eq!(v[0], 10);
+    assert_eq!(v[1], 20);
+    v.reverse();
+    assert_eq!(v[0], 20);
+    assert_eq!(v[1], 10);
+
+    let mut v3 = Vec::<i32>::new();
+    v3.reverse();
+    assert!(v3.is_empty());
+}
+
+#[test]
+fn test_sort() {
+    for len in 4..25 {
+        for _ in 0..100 {
+            let mut v: Vec<_> = thread_rng().gen_iter::<i32>().take(len).collect();
+            let mut v1 = v.clone();
+
+            v.sort();
+            assert!(v.windows(2).all(|w| w[0] <= w[1]));
+
+            v1.sort_by(|a, b| a.cmp(b));
+            assert!(v1.windows(2).all(|w| w[0] <= w[1]));
+
+            v1.sort_by(|a, b| b.cmp(a));
+            assert!(v1.windows(2).all(|w| w[0] >= w[1]));
+        }
+    }
+
+    // shouldn't panic
+    let mut v: [i32; 0] = [];
+    v.sort();
+
+    let mut v = [0xDEADBEEFu64];
+    v.sort();
+    assert!(v == [0xDEADBEEF]);
+}
+
+#[test]
+fn test_sort_stability() {
+    for len in 4..25 {
+        for _ in 0..10 {
+            let mut counts = [0; 10];
+
+            // create a vector like [(6, 1), (5, 1), (6, 2), ...],
+            // where the first item of each tuple is random, but
+            // the second item represents which occurrence of that
+            // number this element is, i.e. the second elements
+            // will occur in sorted order.
+            let mut v: Vec<_> = (0..len).map(|_| {
+                    let n = thread_rng().gen::<usize>() % 10;
+                    counts[n] += 1;
+                    (n, counts[n])
+                }).collect();
+
+            // only sort on the first element, so an unstable sort
+            // may mix up the counts.
+            v.sort_by(|&(a,_), &(b,_)| a.cmp(&b));
+
+            // this comparison includes the count (the second item
+            // of the tuple), so elements with equal first items
+            // will need to be ordered with increasing
+            // counts... i.e. exactly asserting that this sort is
+            // stable.
+            assert!(v.windows(2).all(|w| w[0] <= w[1]));
+        }
+    }
+}
+
+#[test]
+fn test_concat() {
+    let v: [Vec<i32>; 0] = [];
+    let c = v.concat();
+    assert_eq!(c, []);
+    let d = [vec![1], vec![2, 3]].concat();
+    assert_eq!(d, [1, 2, 3]);
+
+    let v: &[&[_]] = &[&[1], &[2, 3]];
+    assert_eq!(v.connect(&0), [1, 0, 2, 3]);
+    let v: &[&[_]] = &[&[1], &[2], &[3]];
+    assert_eq!(v.connect(&0), [1, 0, 2, 0, 3]);
+}
+
+#[test]
+fn test_connect() {
+    let v: [Vec<i32>; 0] = [];
+    assert_eq!(v.connect(&0), []);
+    assert_eq!([vec![1], vec![2, 3]].connect(&0), [1, 0, 2, 3]);
+    assert_eq!([vec![1], vec![2], vec![3]].connect(&0), [1, 0, 2, 0, 3]);
+
+    let v: [&[_]; 2] = [&[1], &[2, 3]];
+    assert_eq!(v.connect(&0), [1, 0, 2, 3]);
+    let v: [&[_]; 3] = [&[1], &[2], &[3]];
+    assert_eq!(v.connect(&0), [1, 0, 2, 0, 3]);
+}
+
+#[test]
+fn test_insert() {
+    let mut a = vec![1, 2, 4];
+    a.insert(2, 3);
+    assert_eq!(a, [1, 2, 3, 4]);
+
+    let mut a = vec![1, 2, 3];
+    a.insert(0, 0);
+    assert_eq!(a, [0, 1, 2, 3]);
+
+    let mut a = vec![1, 2, 3];
+    a.insert(3, 4);
+    assert_eq!(a, [1, 2, 3, 4]);
+
+    let mut a = vec![];
+    a.insert(0, 1);
+    assert_eq!(a, [1]);
+}
+
+#[test]
+#[should_panic]
+fn test_insert_oob() {
+    let mut a = vec![1, 2, 3];
+    a.insert(4, 5);
+}
+
+#[test]
+fn test_remove() {
+    let mut a = vec![1, 2, 3, 4];
+
+    assert_eq!(a.remove(2), 3);
+    assert_eq!(a, [1, 2, 4]);
+
+    assert_eq!(a.remove(2), 4);
+    assert_eq!(a, [1, 2]);
+
+    assert_eq!(a.remove(0), 1);
+    assert_eq!(a, [2]);
+
+    assert_eq!(a.remove(0), 2);
+    assert_eq!(a, []);
+}
+
+#[test]
+#[should_panic]
+fn test_remove_fail() {
+    let mut a = vec![1];
+    let _ = a.remove(0);
+    let _ = a.remove(0);
+}
+
+#[test]
+fn test_capacity() {
+    let mut v = vec![0];
+    v.reserve_exact(10);
+    assert!(v.capacity() >= 11);
+}
+
+#[test]
+fn test_slice_2() {
+    let v = vec![1, 2, 3, 4, 5];
+    let v = v.slice(1, 3);
+    assert_eq!(v.len(), 2);
+    assert_eq!(v[0], 2);
+    assert_eq!(v[1], 3);
+}
+
+#[test]
+#[should_panic]
+fn test_permute_fail() {
+    let v: [(Box<_>, Rc<_>); 4] =
+        [(box 0, Rc::new(0)), (box 0, Rc::new(0)),
+         (box 0, Rc::new(0)), (box 0, Rc::new(0))];
+    let mut i = 0;
+    for _ in v.permutations() {
+        if i == 2 {
+            panic!()
+        }
+        i += 1;
+    }
+}
+
+#[test]
+fn test_total_ord() {
+    let c = &[1, 2, 3];
+    [1, 2, 3, 4][..].cmp(c) == Greater;
+    let c = &[1, 2, 3, 4];
+    [1, 2, 3][..].cmp(c) == Less;
+    let c = &[1, 2, 3, 6];
+    [1, 2, 3, 4][..].cmp(c) == Equal;
+    let c = &[1, 2, 3, 4, 5, 6];
+    [1, 2, 3, 4, 5, 5, 5, 5][..].cmp(c) == Less;
+    let c = &[1, 2, 3, 4];
+    [2, 2][..].cmp(c) == Greater;
+}
+
+#[test]
+fn test_iterator() {
+    let xs = [1, 2, 5, 10, 11];
+    let mut it = xs.iter();
+    assert_eq!(it.size_hint(), (5, Some(5)));
+    assert_eq!(it.next().unwrap(), &1);
+    assert_eq!(it.size_hint(), (4, Some(4)));
+    assert_eq!(it.next().unwrap(), &2);
+    assert_eq!(it.size_hint(), (3, Some(3)));
+    assert_eq!(it.next().unwrap(), &5);
+    assert_eq!(it.size_hint(), (2, Some(2)));
+    assert_eq!(it.next().unwrap(), &10);
+    assert_eq!(it.size_hint(), (1, Some(1)));
+    assert_eq!(it.next().unwrap(), &11);
+    assert_eq!(it.size_hint(), (0, Some(0)));
+    assert!(it.next().is_none());
+}
+
+#[test]
+fn test_random_access_iterator() {
+    let xs = [1, 2, 5, 10, 11];
+    let mut it = xs.iter();
+
+    assert_eq!(it.indexable(), 5);
+    assert_eq!(it.idx(0).unwrap(), &1);
+    assert_eq!(it.idx(2).unwrap(), &5);
+    assert_eq!(it.idx(4).unwrap(), &11);
+    assert!(it.idx(5).is_none());
+
+    assert_eq!(it.next().unwrap(), &1);
+    assert_eq!(it.indexable(), 4);
+    assert_eq!(it.idx(0).unwrap(), &2);
+    assert_eq!(it.idx(3).unwrap(), &11);
+    assert!(it.idx(4).is_none());
+
+    assert_eq!(it.next().unwrap(), &2);
+    assert_eq!(it.indexable(), 3);
+    assert_eq!(it.idx(1).unwrap(), &10);
+    assert!(it.idx(3).is_none());
+
+    assert_eq!(it.next().unwrap(), &5);
+    assert_eq!(it.indexable(), 2);
+    assert_eq!(it.idx(1).unwrap(), &11);
+
+    assert_eq!(it.next().unwrap(), &10);
+    assert_eq!(it.indexable(), 1);
+    assert_eq!(it.idx(0).unwrap(), &11);
+    assert!(it.idx(1).is_none());
+
+    assert_eq!(it.next().unwrap(), &11);
+    assert_eq!(it.indexable(), 0);
+    assert!(it.idx(0).is_none());
+
+    assert!(it.next().is_none());
+}
+
+#[test]
+fn test_iter_size_hints() {
+    let mut xs = [1, 2, 5, 10, 11];
+    assert_eq!(xs.iter().size_hint(), (5, Some(5)));
+    assert_eq!(xs.iter_mut().size_hint(), (5, Some(5)));
+}
+
+#[test]
+fn test_iter_clone() {
+    let xs = [1, 2, 5];
+    let mut it = xs.iter();
+    it.next();
+    let mut jt = it.clone();
+    assert_eq!(it.next(), jt.next());
+    assert_eq!(it.next(), jt.next());
+    assert_eq!(it.next(), jt.next());
+}
+
+#[test]
+fn test_mut_iterator() {
+    let mut xs = [1, 2, 3, 4, 5];
+    for x in &mut xs {
+        *x += 1;
+    }
+    assert!(xs == [2, 3, 4, 5, 6])
+}
+
+#[test]
+fn test_rev_iterator() {
+
+    let xs = [1, 2, 5, 10, 11];
+    let ys = [11, 10, 5, 2, 1];
+    let mut i = 0;
+    for &x in xs.iter().rev() {
+        assert_eq!(x, ys[i]);
+        i += 1;
+    }
+    assert_eq!(i, 5);
+}
+
+#[test]
+fn test_mut_rev_iterator() {
+    let mut xs = [1, 2, 3, 4, 5];
+    for (i,x) in xs.iter_mut().rev().enumerate() {
+        *x += i;
+    }
+    assert!(xs == [5, 5, 5, 5, 5])
+}
+
+#[test]
+fn test_move_iterator() {
+    let xs = vec![1,2,3,4,5];
+    assert_eq!(xs.into_iter().fold(0, |a: usize, b: usize| 10*a + b), 12345);
+}
+
+#[test]
+fn test_move_rev_iterator() {
+    let xs = vec![1,2,3,4,5];
+    assert_eq!(xs.into_iter().rev().fold(0, |a: usize, b: usize| 10*a + b), 54321);
+}
+
+#[test]
+fn test_splitator() {
+    let xs = &[1,2,3,4,5];
+
+    let splits: &[&[_]] = &[&[1], &[3], &[5]];
+    assert_eq!(xs.split(|x| *x % 2 == 0).collect::<Vec<_>>(),
+               splits);
+    let splits: &[&[_]] = &[&[], &[2,3,4,5]];
+    assert_eq!(xs.split(|x| *x == 1).collect::<Vec<_>>(),
+               splits);
+    let splits: &[&[_]] = &[&[1,2,3,4], &[]];
+    assert_eq!(xs.split(|x| *x == 5).collect::<Vec<_>>(),
+               splits);
+    let splits: &[&[_]] = &[&[1,2,3,4,5]];
+    assert_eq!(xs.split(|x| *x == 10).collect::<Vec<_>>(),
+               splits);
+    let splits: &[&[_]] = &[&[], &[], &[], &[], &[], &[]];
+    assert_eq!(xs.split(|_| true).collect::<Vec<&[i32]>>(),
+               splits);
+
+    let xs: &[i32] = &[];
+    let splits: &[&[i32]] = &[&[]];
+    assert_eq!(xs.split(|x| *x == 5).collect::<Vec<&[i32]>>(), splits);
+}
+
+#[test]
+fn test_splitnator() {
+    let xs = &[1,2,3,4,5];
+
+    let splits: &[&[_]] = &[&[1,2,3,4,5]];
+    assert_eq!(xs.splitn(0, |x| *x % 2 == 0).collect::<Vec<_>>(),
+               splits);
+    let splits: &[&[_]] = &[&[1], &[3,4,5]];
+    assert_eq!(xs.splitn(1, |x| *x % 2 == 0).collect::<Vec<_>>(),
+               splits);
+    let splits: &[&[_]] = &[&[], &[], &[], &[4,5]];
+    assert_eq!(xs.splitn(3, |_| true).collect::<Vec<_>>(),
+               splits);
+
+    let xs: &[i32] = &[];
+    let splits: &[&[i32]] = &[&[]];
+    assert_eq!(xs.splitn(1, |x| *x == 5).collect::<Vec<_>>(), splits);
+}
+
+#[test]
+fn test_splitnator_mut() {
+    let xs = &mut [1,2,3,4,5];
+
+    let splits: &[&mut[_]] = &[&mut [1,2,3,4,5]];
+    assert_eq!(xs.splitn_mut(0, |x| *x % 2 == 0).collect::<Vec<_>>(),
+               splits);
+    let splits: &[&mut[_]] = &[&mut [1], &mut [3,4,5]];
+    assert_eq!(xs.splitn_mut(1, |x| *x % 2 == 0).collect::<Vec<_>>(),
+               splits);
+    let splits: &[&mut[_]] = &[&mut [], &mut [], &mut [], &mut [4,5]];
+    assert_eq!(xs.splitn_mut(3, |_| true).collect::<Vec<_>>(),
+               splits);
+
+    let xs: &mut [i32] = &mut [];
+    let splits: &[&mut[i32]] = &[&mut []];
+    assert_eq!(xs.splitn_mut(1, |x| *x == 5).collect::<Vec<_>>(),
+               splits);
+}
+
+#[test]
+fn test_rsplitator() {
+    let xs = &[1,2,3,4,5];
+
+    let splits: &[&[_]] = &[&[5], &[3], &[1]];
+    assert_eq!(xs.split(|x| *x % 2 == 0).rev().collect::<Vec<_>>(),
+               splits);
+    let splits: &[&[_]] = &[&[2,3,4,5], &[]];
+    assert_eq!(xs.split(|x| *x == 1).rev().collect::<Vec<_>>(),
+               splits);
+    let splits: &[&[_]] = &[&[], &[1,2,3,4]];
+    assert_eq!(xs.split(|x| *x == 5).rev().collect::<Vec<_>>(),
+               splits);
+    let splits: &[&[_]] = &[&[1,2,3,4,5]];
+    assert_eq!(xs.split(|x| *x == 10).rev().collect::<Vec<_>>(),
+               splits);
+
+    let xs: &[i32] = &[];
+    let splits: &[&[i32]] = &[&[]];
+    assert_eq!(xs.split(|x| *x == 5).rev().collect::<Vec<&[i32]>>(), splits);
+}
+
+#[test]
+fn test_rsplitnator() {
+    let xs = &[1,2,3,4,5];
+
+    let splits: &[&[_]] = &[&[1,2,3,4,5]];
+    assert_eq!(xs.rsplitn(0, |x| *x % 2 == 0).collect::<Vec<_>>(),
+               splits);
+    let splits: &[&[_]] = &[&[5], &[1,2,3]];
+    assert_eq!(xs.rsplitn(1, |x| *x % 2 == 0).collect::<Vec<_>>(),
+               splits);
+    let splits: &[&[_]] = &[&[], &[], &[], &[1,2]];
+    assert_eq!(xs.rsplitn(3, |_| true).collect::<Vec<_>>(),
+               splits);
+
+    let xs: &[i32]  = &[];
+    let splits: &[&[i32]] = &[&[]];
+    assert_eq!(xs.rsplitn(1, |x| *x == 5).collect::<Vec<&[i32]>>(), splits);
+}
+
+#[test]
+fn test_windowsator() {
+    let v = &[1,2,3,4];
+
+    let wins: &[&[_]] = &[&[1,2], &[2,3], &[3,4]];
+    assert_eq!(v.windows(2).collect::<Vec<_>>(), wins);
+
+    let wins: &[&[_]] = &[&[1,2,3], &[2,3,4]];
+    assert_eq!(v.windows(3).collect::<Vec<_>>(), wins);
+    assert!(v.windows(6).next().is_none());
+
+    let wins: &[&[_]] = &[&[3,4], &[2,3], &[1,2]];
+    assert_eq!(v.windows(2).rev().collect::<Vec<&[_]>>(), wins);
+    let mut it = v.windows(2);
+    assert_eq!(it.indexable(), 3);
+    let win: &[_] = &[1,2];
+    assert_eq!(it.idx(0).unwrap(), win);
+    let win: &[_] = &[2,3];
+    assert_eq!(it.idx(1).unwrap(), win);
+    let win: &[_] = &[3,4];
+    assert_eq!(it.idx(2).unwrap(), win);
+    assert_eq!(it.idx(3), None);
+}
+
+#[test]
+#[should_panic]
+fn test_windowsator_0() {
+    let v = &[1,2,3,4];
+    let _it = v.windows(0);
+}
+
+#[test]
+fn test_chunksator() {
+    let v = &[1,2,3,4,5];
+
+    assert_eq!(v.chunks(2).len(), 3);
+
+    let chunks: &[&[_]] = &[&[1,2], &[3,4], &[5]];
+    assert_eq!(v.chunks(2).collect::<Vec<_>>(), chunks);
+    let chunks: &[&[_]] = &[&[1,2,3], &[4,5]];
+    assert_eq!(v.chunks(3).collect::<Vec<_>>(), chunks);
+    let chunks: &[&[_]] = &[&[1,2,3,4,5]];
+    assert_eq!(v.chunks(6).collect::<Vec<_>>(), chunks);
+
+    let chunks: &[&[_]] = &[&[5], &[3,4], &[1,2]];
+    assert_eq!(v.chunks(2).rev().collect::<Vec<_>>(), chunks);
+    let mut it = v.chunks(2);
+    assert_eq!(it.indexable(), 3);
+
+    let chunk: &[_] = &[1,2];
+    assert_eq!(it.idx(0).unwrap(), chunk);
+    let chunk: &[_] = &[3,4];
+    assert_eq!(it.idx(1).unwrap(), chunk);
+    let chunk: &[_] = &[5];
+    assert_eq!(it.idx(2).unwrap(), chunk);
+    assert_eq!(it.idx(3), None);
+}
+
+#[test]
+#[should_panic]
+fn test_chunksator_0() {
+    let v = &[1,2,3,4];
+    let _it = v.chunks(0);
+}
+
+#[test]
+fn test_move_from() {
+    let mut a = [1,2,3,4,5];
+    let b = vec![6,7,8];
+    assert_eq!(a.move_from(b, 0, 3), 3);
+    assert!(a == [6,7,8,4,5]);
+    let mut a = [7,2,8,1];
+    let b = vec![3,1,4,1,5,9];
+    assert_eq!(a.move_from(b, 0, 6), 4);
+    assert!(a == [3,1,4,1]);
+    let mut a = [1,2,3,4];
+    let b = vec![5,6,7,8,9,0];
+    assert_eq!(a.move_from(b, 2, 3), 1);
+    assert!(a == [7,2,3,4]);
+    let mut a = [1,2,3,4,5];
+    let b = vec![5,6,7,8,9,0];
+    assert_eq!(a[2..4].move_from(b,1,6), 2);
+    assert!(a == [1,2,6,7,5]);
+}
+
+#[test]
+fn test_reverse_part() {
+    let mut values = [1,2,3,4,5];
+    values[1..4].reverse();
+    assert!(values == [1,4,3,2,5]);
+}
+
+#[test]
+fn test_show() {
+    macro_rules! test_show_vec {
+        ($x:expr, $x_str:expr) => ({
+            let (x, x_str) = ($x, $x_str);
+            assert_eq!(format!("{:?}", x), x_str);
+            assert_eq!(format!("{:?}", x), x_str);
+        })
+    }
+    let empty = Vec::<i32>::new();
+    test_show_vec!(empty, "[]");
+    test_show_vec!(vec![1], "[1]");
+    test_show_vec!(vec![1, 2, 3], "[1, 2, 3]");
+    test_show_vec!(vec![vec![], vec![1], vec![1, 1]],
+                   "[[], [1], [1, 1]]");
+
+    let empty_mut: &mut [i32] = &mut[];
+    test_show_vec!(empty_mut, "[]");
+    let v = &mut[1];
+    test_show_vec!(v, "[1]");
+    let v = &mut[1, 2, 3];
+    test_show_vec!(v, "[1, 2, 3]");
+    let v: &mut[&mut[_]] = &mut[&mut[], &mut[1], &mut[1, 1]];
+    test_show_vec!(v, "[[], [1], [1, 1]]");
+}
+
+#[test]
+fn test_vec_default() {
+    macro_rules! t {
+        ($ty:ty) => {{
+            let v: $ty = Default::default();
+            assert!(v.is_empty());
+        }}
+    }
+
+    t!(&[i32]);
+    t!(Vec<i32>);
+}
+
+#[test]
+fn test_bytes_set_memory() {
+    use std::slice::bytes::MutableByteVector;
+
+    let mut values = [1,2,3,4,5];
+    values[0..5].set_memory(0xAB);
+    assert!(values == [0xAB, 0xAB, 0xAB, 0xAB, 0xAB]);
+    values[2..4].set_memory(0xFF);
+    assert!(values == [0xAB, 0xAB, 0xFF, 0xFF, 0xAB]);
+}
+
+#[test]
+#[should_panic]
+fn test_overflow_does_not_cause_segfault() {
+    let mut v = vec![];
+    v.reserve_exact(-1);
+    v.push(1);
+    v.push(2);
+}
+
+#[test]
+#[should_panic]
+fn test_overflow_does_not_cause_segfault_managed() {
+    let mut v = vec![Rc::new(1)];
+    v.reserve_exact(-1);
+    v.push(Rc::new(2));
+}
+
+#[test]
+fn test_mut_split_at() {
+    let mut values = [1u8,2,3,4,5];
+    {
+        let (left, right) = values.split_at_mut(2);
+        {
+            let left: &[_] = left;
+            assert!(left[..left.len()] == [1, 2]);
+        }
+        for p in left {
+            *p += 1;
+        }
+
+        {
+            let right: &[_] = right;
+            assert!(right[..right.len()] == [3, 4, 5]);
+        }
+        for p in right {
+            *p += 2;
+        }
+    }
+
+    assert!(values == [2, 3, 5, 6, 7]);
+}
+
+#[derive(Clone, PartialEq)]
+struct Foo;
+
+#[test]
+fn test_iter_zero_sized() {
+    let mut v = vec![Foo, Foo, Foo];
+    assert_eq!(v.len(), 3);
+    let mut cnt = 0;
+
+    for f in &v {
+        assert!(*f == Foo);
+        cnt += 1;
+    }
+    assert_eq!(cnt, 3);
+
+    for f in &v[1..3] {
+        assert!(*f == Foo);
+        cnt += 1;
+    }
+    assert_eq!(cnt, 5);
+
+    for f in &mut v {
+        assert!(*f == Foo);
+        cnt += 1;
+    }
+    assert_eq!(cnt, 8);
+
+    for f in v {
+        assert!(f == Foo);
+        cnt += 1;
+    }
+    assert_eq!(cnt, 11);
+
+    let xs: [Foo; 3] = [Foo, Foo, Foo];
+    cnt = 0;
+    for f in &xs {
+        assert!(*f == Foo);
+        cnt += 1;
+    }
+    assert!(cnt == 3);
+}
+
+#[test]
+fn test_shrink_to_fit() {
+    let mut xs = vec![0, 1, 2, 3];
+    for i in 4..100 {
+        xs.push(i)
+    }
+    assert_eq!(xs.capacity(), 128);
+    xs.shrink_to_fit();
+    assert_eq!(xs.capacity(), 100);
+    assert_eq!(xs, (0..100).collect::<Vec<_>>());
+}
+
+#[test]
+fn test_starts_with() {
+    assert!(b"foobar".starts_with(b"foo"));
+    assert!(!b"foobar".starts_with(b"oob"));
+    assert!(!b"foobar".starts_with(b"bar"));
+    assert!(!b"foo".starts_with(b"foobar"));
+    assert!(!b"bar".starts_with(b"foobar"));
+    assert!(b"foobar".starts_with(b"foobar"));
+    let empty: &[u8] = &[];
+    assert!(empty.starts_with(empty));
+    assert!(!empty.starts_with(b"foo"));
+    assert!(b"foobar".starts_with(empty));
+}
+
+#[test]
+fn test_ends_with() {
+    assert!(b"foobar".ends_with(b"bar"));
+    assert!(!b"foobar".ends_with(b"oba"));
+    assert!(!b"foobar".ends_with(b"foo"));
+    assert!(!b"foo".ends_with(b"foobar"));
+    assert!(!b"bar".ends_with(b"foobar"));
+    assert!(b"foobar".ends_with(b"foobar"));
+    let empty: &[u8] = &[];
+    assert!(empty.ends_with(empty));
+    assert!(!empty.ends_with(b"foo"));
+    assert!(b"foobar".ends_with(empty));
+}
+
+#[test]
+fn test_mut_splitator() {
+    let mut xs = [0,1,0,2,3,0,0,4,5,0];
+    assert_eq!(xs.split_mut(|x| *x == 0).count(), 6);
+    for slice in xs.split_mut(|x| *x == 0) {
+        slice.reverse();
+    }
+    assert!(xs == [0,1,0,3,2,0,0,5,4,0]);
+
+    let mut xs = [0,1,0,2,3,0,0,4,5,0,6,7];
+    for slice in xs.split_mut(|x| *x == 0).take(5) {
+        slice.reverse();
+    }
+    assert!(xs == [0,1,0,3,2,0,0,5,4,0,6,7]);
+}
+
+#[test]
+fn test_mut_splitator_rev() {
+    let mut xs = [1,2,0,3,4,0,0,5,6,0];
+    for slice in xs.split_mut(|x| *x == 0).rev().take(4) {
+        slice.reverse();
+    }
+    assert!(xs == [1,2,0,4,3,0,0,6,5,0]);
+}
+
+#[test]
+fn test_get_mut() {
+    let mut v = [0,1,2];
+    assert_eq!(v.get_mut(3), None);
+    v.get_mut(1).map(|e| *e = 7);
+    assert_eq!(v[1], 7);
+    let mut x = 2;
+    assert_eq!(v.get_mut(2), Some(&mut x));
+}
+
+#[test]
+fn test_mut_chunks() {
+    let mut v = [0, 1, 2, 3, 4, 5, 6];
+    assert_eq!(v.chunks_mut(2).len(), 4);
+    for (i, chunk) in v.chunks_mut(3).enumerate() {
+        for x in chunk {
+            *x = i as u8;
+        }
+    }
+    let result = [0, 0, 0, 1, 1, 1, 2];
+    assert!(v == result);
+}
+
+#[test]
+fn test_mut_chunks_rev() {
+    let mut v = [0, 1, 2, 3, 4, 5, 6];
+    for (i, chunk) in v.chunks_mut(3).rev().enumerate() {
+        for x in chunk {
+            *x = i as u8;
+        }
+    }
+    let result = [2, 2, 2, 1, 1, 1, 0];
+    assert!(v == result);
+}
+
+#[test]
+#[should_panic]
+fn test_mut_chunks_0() {
+    let mut v = [1, 2, 3, 4];
+    let _it = v.chunks_mut(0);
+}
+
+#[test]
+fn test_mut_last() {
+    let mut x = [1, 2, 3, 4, 5];
+    let h = x.last_mut();
+    assert_eq!(*h.unwrap(), 5);
+
+    let y: &mut [i32] = &mut [];
+    assert!(y.last_mut().is_none());
+}
+
+#[test]
+fn test_to_vec() {
+    let xs: Box<_> = box [1, 2, 3];
+    let ys = xs.to_vec();
+    assert_eq!(ys, [1, 2, 3]);
+}
+
+mod bench {
+    use std::iter::repeat;
+    use std::{mem, ptr};
+    use std::rand::{Rng, weak_rng};
+
+    use test::{Bencher, black_box};
+
+    #[bench]
+    fn iterator(b: &mut Bencher) {
+        // peculiar numbers to stop LLVM from optimising the summation
+        // out.
+        let v: Vec<_> = (0..100).map(|i| i ^ (i << 1) ^ (i >> 1)).collect();
+
+        b.iter(|| {
+            let mut sum = 0;
+            for x in &v {
+                sum += *x;
+            }
+            // sum == 11806, to stop dead code elimination.
+            if sum == 0 {panic!()}
+        })
+    }
+
+    #[bench]
+    fn mut_iterator(b: &mut Bencher) {
+        let mut v: Vec<_> = repeat(0).take(100).collect();
+
+        b.iter(|| {
+            let mut i = 0;
+            for x in &mut v {
+                *x = i;
+                i += 1;
+            }
+        })
+    }
+
+    #[bench]
+    fn concat(b: &mut Bencher) {
+        let xss: Vec<Vec<i32>> =
+            (0..100).map(|i| (0..i).collect()).collect();
+        b.iter(|| {
+            xss.concat();
+        });
+    }
+
+    #[bench]
+    fn connect(b: &mut Bencher) {
+        let xss: Vec<Vec<i32>> =
+            (0..100).map(|i| (0..i).collect()).collect();
+        b.iter(|| {
+            xss.connect(&0)
+        });
+    }
+
+    #[bench]
+    fn push(b: &mut Bencher) {
+        let mut vec = Vec::<i32>::new();
+        b.iter(|| {
+            vec.push(0);
+            black_box(&vec);
+        });
+    }
+
+    #[bench]
+    fn starts_with_same_vector(b: &mut Bencher) {
+        let vec: Vec<_> = (0..100).collect();
+        b.iter(|| {
+            vec.starts_with(&vec)
+        })
+    }
+
+    #[bench]
+    fn starts_with_single_element(b: &mut Bencher) {
+        let vec: Vec<_> = vec![0];
+        b.iter(|| {
+            vec.starts_with(&vec)
+        })
+    }
+
+    #[bench]
+    fn starts_with_diff_one_element_at_end(b: &mut Bencher) {
+        let vec: Vec<_> = (0..100).collect();
+        let mut match_vec: Vec<_> = (0..99).collect();
+        match_vec.push(0);
+        b.iter(|| {
+            vec.starts_with(&match_vec)
+        })
+    }
+
+    #[bench]
+    fn ends_with_same_vector(b: &mut Bencher) {
+        let vec: Vec<_> = (0..100).collect();
+        b.iter(|| {
+            vec.ends_with(&vec)
+        })
+    }
+
+    #[bench]
+    fn ends_with_single_element(b: &mut Bencher) {
+        let vec: Vec<_> = vec![0];
+        b.iter(|| {
+            vec.ends_with(&vec)
+        })
+    }
+
+    #[bench]
+    fn ends_with_diff_one_element_at_beginning(b: &mut Bencher) {
+        let vec: Vec<_> = (0..100).collect();
+        let mut match_vec: Vec<_> = (0..100).collect();
+        match_vec[0] = 200;
+        b.iter(|| {
+            vec.starts_with(&match_vec)
+        })
+    }
+
+    #[bench]
+    fn contains_last_element(b: &mut Bencher) {
+        let vec: Vec<_> = (0..100).collect();
+        b.iter(|| {
+            vec.contains(&99)
+        })
+    }
+
+    #[bench]
+    fn zero_1kb_from_elem(b: &mut Bencher) {
+        b.iter(|| {
+            repeat(0u8).take(1024).collect::<Vec<_>>()
+        });
+    }
+
+    #[bench]
+    fn zero_1kb_set_memory(b: &mut Bencher) {
+        b.iter(|| {
+            let mut v = Vec::<u8>::with_capacity(1024);
+            unsafe {
+                let vp = v.as_mut_ptr();
+                ptr::set_memory(vp, 0, 1024);
+                v.set_len(1024);
+            }
+            v
+        });
+    }
+
+    #[bench]
+    fn zero_1kb_loop_set(b: &mut Bencher) {
+        b.iter(|| {
+            let mut v = Vec::<u8>::with_capacity(1024);
+            unsafe {
+                v.set_len(1024);
+            }
+            for i in 0..1024 {
+                v[i] = 0;
+            }
+        });
+    }
+
+    #[bench]
+    fn zero_1kb_mut_iter(b: &mut Bencher) {
+        b.iter(|| {
+            let mut v = Vec::<u8>::with_capacity(1024);
+            unsafe {
+                v.set_len(1024);
+            }
+            for x in &mut v {
+                *x = 0;
+            }
+            v
+        });
+    }
+
+    #[bench]
+    fn random_inserts(b: &mut Bencher) {
+        let mut rng = weak_rng();
+        b.iter(|| {
+            let mut v: Vec<_> = repeat((0, 0)).take(30).collect();
+            for _ in 0..100 {
+                let l = v.len();
+                v.insert(rng.gen::<usize>() % (l + 1),
+                         (1, 1));
+            }
+        })
+    }
+    #[bench]
+    fn random_removes(b: &mut Bencher) {
+        let mut rng = weak_rng();
+        b.iter(|| {
+            let mut v: Vec<_> = repeat((0, 0)).take(130).collect();
+            for _ in 0..100 {
+                let l = v.len();
+                v.remove(rng.gen::<usize>() % l);
+            }
+        })
+    }
+
+    #[bench]
+    fn sort_random_small(b: &mut Bencher) {
+        let mut rng = weak_rng();
+        b.iter(|| {
+            let mut v: Vec<_> = rng.gen_iter::<u64>().take(5).collect();
+            v.sort();
+        });
+        b.bytes = 5 * mem::size_of::<u64>() as u64;
+    }
+
+    #[bench]
+    fn sort_random_medium(b: &mut Bencher) {
+        let mut rng = weak_rng();
+        b.iter(|| {
+            let mut v: Vec<_> = rng.gen_iter::<u64>().take(100).collect();
+            v.sort();
+        });
+        b.bytes = 100 * mem::size_of::<u64>() as u64;
+    }
+
+    #[bench]
+    fn sort_random_large(b: &mut Bencher) {
+        let mut rng = weak_rng();
+        b.iter(|| {
+            let mut v: Vec<_> = rng.gen_iter::<u64>().take(10000).collect();
+            v.sort();
+        });
+        b.bytes = 10000 * mem::size_of::<u64>() as u64;
+    }
+
+    #[bench]
+    fn sort_sorted(b: &mut Bencher) {
+        let mut v: Vec<_> = (0..10000).collect();
+        b.iter(|| {
+            v.sort();
+        });
+        b.bytes = (v.len() * mem::size_of_val(&v[0])) as u64;
+    }
+
+    type BigSortable = (u64, u64, u64, u64);
+
+    #[bench]
+    fn sort_big_random_small(b: &mut Bencher) {
+        let mut rng = weak_rng();
+        b.iter(|| {
+            let mut v = rng.gen_iter::<BigSortable>().take(5)
+                           .collect::<Vec<BigSortable>>();
+            v.sort();
+        });
+        b.bytes = 5 * mem::size_of::<BigSortable>() as u64;
+    }
+
+    #[bench]
+    fn sort_big_random_medium(b: &mut Bencher) {
+        let mut rng = weak_rng();
+        b.iter(|| {
+            let mut v = rng.gen_iter::<BigSortable>().take(100)
+                           .collect::<Vec<BigSortable>>();
+            v.sort();
+        });
+        b.bytes = 100 * mem::size_of::<BigSortable>() as u64;
+    }
+
+    #[bench]
+    fn sort_big_random_large(b: &mut Bencher) {
+        let mut rng = weak_rng();
+        b.iter(|| {
+            let mut v = rng.gen_iter::<BigSortable>().take(10000)
+                           .collect::<Vec<BigSortable>>();
+            v.sort();
+        });
+        b.bytes = 10000 * mem::size_of::<BigSortable>() as u64;
+    }
+
+    #[bench]
+    fn sort_big_sorted(b: &mut Bencher) {
+        let mut v: Vec<BigSortable> = (0..10000).map(|i| (i, i, i, i)).collect();
+        b.iter(|| {
+            v.sort();
+        });
+        b.bytes = (v.len() * mem::size_of_val(&v[0])) as u64;
+    }
+}
diff --git a/src/libcollectionstest/str.rs b/src/libcollectionstest/str.rs
new file mode 100644 (file)
index 0000000..79c2d71
--- /dev/null
@@ -0,0 +1,1668 @@
+// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::cmp::Ordering::{Equal, Greater, Less};
+use std::iter::AdditiveIterator;
+use std::str::{Utf8Error, from_utf8};
+
+#[test]
+fn test_le() {
+    assert!("" <= "");
+    assert!("" <= "foo");
+    assert!("foo" <= "foo");
+    assert!("foo" != "bar");
+}
+
+#[test]
+fn test_len() {
+    assert_eq!("".len(), 0);
+    assert_eq!("hello world".len(), 11);
+    assert_eq!("\x63".len(), 1);
+    assert_eq!("\u{a2}".len(), 2);
+    assert_eq!("\u{3c0}".len(), 2);
+    assert_eq!("\u{2620}".len(), 3);
+    assert_eq!("\u{1d11e}".len(), 4);
+
+    assert_eq!("".chars().count(), 0);
+    assert_eq!("hello world".chars().count(), 11);
+    assert_eq!("\x63".chars().count(), 1);
+    assert_eq!("\u{a2}".chars().count(), 1);
+    assert_eq!("\u{3c0}".chars().count(), 1);
+    assert_eq!("\u{2620}".chars().count(), 1);
+    assert_eq!("\u{1d11e}".chars().count(), 1);
+    assert_eq!("ประเทศไทย中华Việt Nam".chars().count(), 19);
+
+    assert_eq!("hello".width(false), 10);
+    assert_eq!("hello".width(true), 10);
+    assert_eq!("\0\0\0\0\0".width(false), 0);
+    assert_eq!("\0\0\0\0\0".width(true), 0);
+    assert_eq!("".width(false), 0);
+    assert_eq!("".width(true), 0);
+    assert_eq!("\u{2081}\u{2082}\u{2083}\u{2084}".width(false), 4);
+    assert_eq!("\u{2081}\u{2082}\u{2083}\u{2084}".width(true), 8);
+}
+
+#[test]
+fn test_find() {
+    assert_eq!("hello".find('l'), Some(2));
+    assert_eq!("hello".find(|c:char| c == 'o'), Some(4));
+    assert!("hello".find('x').is_none());
+    assert!("hello".find(|c:char| c == 'x').is_none());
+    assert_eq!("ประเทศไทย中华Việt Nam".find('华'), Some(30));
+    assert_eq!("ประเทศไทย中华Việt Nam".find(|c: char| c == '华'), Some(30));
+}
+
+#[test]
+fn test_rfind() {
+    assert_eq!("hello".rfind('l'), Some(3));
+    assert_eq!("hello".rfind(|c:char| c == 'o'), Some(4));
+    assert!("hello".rfind('x').is_none());
+    assert!("hello".rfind(|c:char| c == 'x').is_none());
+    assert_eq!("ประเทศไทย中华Việt Nam".rfind('华'), Some(30));
+    assert_eq!("ประเทศไทย中华Việt Nam".rfind(|c: char| c == '华'), Some(30));
+}
+
+#[test]
+fn test_collect() {
+    let empty = String::from_str("");
+    let s: String = empty.chars().collect();
+    assert_eq!(empty, s);
+    let data = String::from_str("ประเทศไทย中");
+    let s: String = data.chars().collect();
+    assert_eq!(data, s);
+}
+
+#[test]
+fn test_into_bytes() {
+    let data = String::from_str("asdf");
+    let buf = data.into_bytes();
+    assert_eq!(b"asdf", buf);
+}
+
+#[test]
+fn test_find_str() {
+    // byte positions
+    assert_eq!("".find_str(""), Some(0));
+    assert!("banana".find_str("apple pie").is_none());
+
+    let data = "abcabc";
+    assert_eq!(data[0..6].find_str("ab"), Some(0));
+    assert_eq!(data[2..6].find_str("ab"), Some(3 - 2));
+    assert!(data[2..4].find_str("ab").is_none());
+
+    let string = "ประเทศไทย中华Việt Nam";
+    let mut data = String::from_str(string);
+    data.push_str(string);
+    assert!(data.find_str("ไท华").is_none());
+    assert_eq!(data[0..43].find_str(""), Some(0));
+    assert_eq!(data[6..43].find_str(""), Some(6 - 6));
+
+    assert_eq!(data[0..43].find_str("ประ"), Some( 0));
+    assert_eq!(data[0..43].find_str("ทศไ"), Some(12));
+    assert_eq!(data[0..43].find_str("ย中"), Some(24));
+    assert_eq!(data[0..43].find_str("iệt"), Some(34));
+    assert_eq!(data[0..43].find_str("Nam"), Some(40));
+
+    assert_eq!(data[43..86].find_str("ประ"), Some(43 - 43));
+    assert_eq!(data[43..86].find_str("ทศไ"), Some(55 - 43));
+    assert_eq!(data[43..86].find_str("ย中"), Some(67 - 43));
+    assert_eq!(data[43..86].find_str("iệt"), Some(77 - 43));
+    assert_eq!(data[43..86].find_str("Nam"), Some(83 - 43));
+}
+
+#[test]
+fn test_slice_chars() {
+    fn t(a: &str, b: &str, start: usize) {
+        assert_eq!(a.slice_chars(start, start + b.chars().count()), b);
+    }
+    t("", "", 0);
+    t("hello", "llo", 2);
+    t("hello", "el", 1);
+    t("αβλ", "β", 1);
+    t("αβλ", "", 3);
+    assert_eq!("ะเทศไท", "ประเทศไทย中华Việt Nam".slice_chars(2, 8));
+}
+
+fn s(x: &str) -> String { x.to_string() }
+
+macro_rules! test_concat {
+    ($expected: expr, $string: expr) => {
+        {
+            let s: String = $string.concat();
+            assert_eq!($expected, s);
+        }
+    }
+}
+
+#[test]
+fn test_concat_for_different_types() {
+    test_concat!("ab", vec![s("a"), s("b")]);
+    test_concat!("ab", vec!["a", "b"]);
+    test_concat!("ab", vec!["a", "b"]);
+    test_concat!("ab", vec![s("a"), s("b")]);
+}
+
+#[test]
+fn test_concat_for_different_lengths() {
+    let empty: &[&str] = &[];
+    test_concat!("", empty);
+    test_concat!("a", ["a"]);
+    test_concat!("ab", ["a", "b"]);
+    test_concat!("abc", ["", "a", "bc"]);
+}
+
+macro_rules! test_connect {
+    ($expected: expr, $string: expr, $delim: expr) => {
+        {
+            let s = $string.connect($delim);
+            assert_eq!($expected, s);
+        }
+    }
+}
+
+#[test]
+fn test_connect_for_different_types() {
+    test_connect!("a-b", ["a", "b"], "-");
+    let hyphen = "-".to_string();
+    test_connect!("a-b", [s("a"), s("b")], &*hyphen);
+    test_connect!("a-b", vec!["a", "b"], &*hyphen);
+    test_connect!("a-b", &*vec!["a", "b"], "-");
+    test_connect!("a-b", vec![s("a"), s("b")], "-");
+}
+
+#[test]
+fn test_connect_for_different_lengths() {
+    let empty: &[&str] = &[];
+    test_connect!("", empty, "-");
+    test_connect!("a", ["a"], "-");
+    test_connect!("a-b", ["a", "b"], "-");
+    test_connect!("-a-bc", ["", "a", "bc"], "-");
+}
+
+#[test]
+fn test_unsafe_slice() {
+    assert_eq!("ab", unsafe {"abc".slice_unchecked(0, 2)});
+    assert_eq!("bc", unsafe {"abc".slice_unchecked(1, 3)});
+    assert_eq!("", unsafe {"abc".slice_unchecked(1, 1)});
+    fn a_million_letter_a() -> String {
+        let mut i = 0;
+        let mut rs = String::new();
+        while i < 100000 {
+            rs.push_str("aaaaaaaaaa");
+            i += 1;
+        }
+        rs
+    }
+    fn half_a_million_letter_a() -> String {
+        let mut i = 0;
+        let mut rs = String::new();
+        while i < 100000 {
+            rs.push_str("aaaaa");
+            i += 1;
+        }
+        rs
+    }
+    let letters = a_million_letter_a();
+    assert!(half_a_million_letter_a() ==
+        unsafe {String::from_str(letters.slice_unchecked(
+                                 0,
+                                 500000))});
+}
+
+#[test]
+fn test_starts_with() {
+    assert!(("".starts_with("")));
+    assert!(("abc".starts_with("")));
+    assert!(("abc".starts_with("a")));
+    assert!((!"a".starts_with("abc")));
+    assert!((!"".starts_with("abc")));
+    assert!((!"ödd".starts_with("-")));
+    assert!(("ödd".starts_with("öd")));
+}
+
+#[test]
+fn test_ends_with() {
+    assert!(("".ends_with("")));
+    assert!(("abc".ends_with("")));
+    assert!(("abc".ends_with("c")));
+    assert!((!"a".ends_with("abc")));
+    assert!((!"".ends_with("abc")));
+    assert!((!"ddö".ends_with("-")));
+    assert!(("ddö".ends_with("dö")));
+}
+
+#[test]
+fn test_is_empty() {
+    assert!("".is_empty());
+    assert!(!"a".is_empty());
+}
+
+#[test]
+fn test_replace() {
+    let a = "a";
+    assert_eq!("".replace(a, "b"), String::from_str(""));
+    assert_eq!("a".replace(a, "b"), String::from_str("b"));
+    assert_eq!("ab".replace(a, "b"), String::from_str("bb"));
+    let test = "test";
+    assert!(" test test ".replace(test, "toast") ==
+        String::from_str(" toast toast "));
+    assert_eq!(" test test ".replace(test, ""), String::from_str("   "));
+}
+
+#[test]
+fn test_replace_2a() {
+    let data = "ประเทศไทย中华";
+    let repl = "دولة الكويت";
+
+    let a = "ประเ";
+    let a2 = "دولة الكويتทศไทย中华";
+    assert_eq!(data.replace(a, repl), a2);
+}
+
+#[test]
+fn test_replace_2b() {
+    let data = "ประเทศไทย中华";
+    let repl = "دولة الكويت";
+
+    let b = "ะเ";
+    let b2 = "ปรدولة الكويتทศไทย中华";
+    assert_eq!(data.replace(b, repl), b2);
+}
+
+#[test]
+fn test_replace_2c() {
+    let data = "ประเทศไทย中华";
+    let repl = "دولة الكويت";
+
+    let c = "中华";
+    let c2 = "ประเทศไทยدولة الكويت";
+    assert_eq!(data.replace(c, repl), c2);
+}
+
+#[test]
+fn test_replace_2d() {
+    let data = "ประเทศไทย中华";
+    let repl = "دولة الكويت";
+
+    let d = "ไท华";
+    assert_eq!(data.replace(d, repl), data);
+}
+
+#[test]
+fn test_slice() {
+    assert_eq!("ab", "abc".slice(0, 2));
+    assert_eq!("bc", "abc".slice(1, 3));
+    assert_eq!("", "abc".slice(1, 1));
+    assert_eq!("\u{65e5}", "\u{65e5}\u{672c}".slice(0, 3));
+
+    let data = "ประเทศไทย中华";
+    assert_eq!("ป", data.slice(0, 3));
+    assert_eq!("ร", data.slice(3, 6));
+    assert_eq!("", data.slice(3, 3));
+    assert_eq!("华", data.slice(30, 33));
+
+    fn a_million_letter_x() -> String {
+        let mut i = 0;
+        let mut rs = String::new();
+        while i < 100000 {
+            rs.push_str("华华华华华华华华华华");
+            i += 1;
+        }
+        rs
+    }
+    fn half_a_million_letter_x() -> String {
+        let mut i = 0;
+        let mut rs = String::new();
+        while i < 100000 {
+            rs.push_str("华华华华华");
+            i += 1;
+        }
+        rs
+    }
+    let letters = a_million_letter_x();
+    assert!(half_a_million_letter_x() ==
+        String::from_str(letters.slice(0, 3 * 500000)));
+}
+
+#[test]
+fn test_slice_2() {
+    let ss = "中华Việt Nam";
+
+    assert_eq!("华", ss.slice(3, 6));
+    assert_eq!("Việt Nam", ss.slice(6, 16));
+
+    assert_eq!("ab", "abc".slice(0, 2));
+    assert_eq!("bc", "abc".slice(1, 3));
+    assert_eq!("", "abc".slice(1, 1));
+
+    assert_eq!("中", ss.slice(0, 3));
+    assert_eq!("华V", ss.slice(3, 7));
+    assert_eq!("", ss.slice(3, 3));
+    /*0: 中
+      3: 华
+      6: V
+      7: i
+      8: ệ
+     11: t
+     12:
+     13: N
+     14: a
+     15: m */
+}
+
+#[test]
+#[should_panic]
+fn test_slice_fail() {
+    "中华Việt Nam".slice(0, 2);
+}
+
+#[test]
+fn test_slice_from() {
+    assert_eq!("abcd".slice_from(0), "abcd");
+    assert_eq!("abcd".slice_from(2), "cd");
+    assert_eq!("abcd".slice_from(4), "");
+}
+#[test]
+fn test_slice_to() {
+    assert_eq!("abcd".slice_to(0), "");
+    assert_eq!("abcd".slice_to(2), "ab");
+    assert_eq!("abcd".slice_to(4), "abcd");
+}
+
+#[test]
+fn test_trim_left_matches() {
+    let v: &[char] = &[];
+    assert_eq!(" *** foo *** ".trim_left_matches(v), " *** foo *** ");
+    let chars: &[char] = &['*', ' '];
+    assert_eq!(" *** foo *** ".trim_left_matches(chars), "foo *** ");
+    assert_eq!(" ***  *** ".trim_left_matches(chars), "");
+    assert_eq!("foo *** ".trim_left_matches(chars), "foo *** ");
+
+    assert_eq!("11foo1bar11".trim_left_matches('1'), "foo1bar11");
+    let chars: &[char] = &['1', '2'];
+    assert_eq!("12foo1bar12".trim_left_matches(chars), "foo1bar12");
+    assert_eq!("123foo1bar123".trim_left_matches(|c: char| c.is_numeric()), "foo1bar123");
+}
+
+#[test]
+fn test_trim_right_matches() {
+    let v: &[char] = &[];
+    assert_eq!(" *** foo *** ".trim_right_matches(v), " *** foo *** ");
+    let chars: &[char] = &['*', ' '];
+    assert_eq!(" *** foo *** ".trim_right_matches(chars), " *** foo");
+    assert_eq!(" ***  *** ".trim_right_matches(chars), "");
+    assert_eq!(" *** foo".trim_right_matches(chars), " *** foo");
+
+    assert_eq!("11foo1bar11".trim_right_matches('1'), "11foo1bar");
+    let chars: &[char] = &['1', '2'];
+    assert_eq!("12foo1bar12".trim_right_matches(chars), "12foo1bar");
+    assert_eq!("123foo1bar123".trim_right_matches(|c: char| c.is_numeric()), "123foo1bar");
+}
+
+#[test]
+fn test_trim_matches() {
+    let v: &[char] = &[];
+    assert_eq!(" *** foo *** ".trim_matches(v), " *** foo *** ");
+    let chars: &[char] = &['*', ' '];
+    assert_eq!(" *** foo *** ".trim_matches(chars), "foo");
+    assert_eq!(" ***  *** ".trim_matches(chars), "");
+    assert_eq!("foo".trim_matches(chars), "foo");
+
+    assert_eq!("11foo1bar11".trim_matches('1'), "foo1bar");
+    let chars: &[char] = &['1', '2'];
+    assert_eq!("12foo1bar12".trim_matches(chars), "foo1bar");
+    assert_eq!("123foo1bar123".trim_matches(|c: char| c.is_numeric()), "foo1bar");
+}
+
+#[test]
+fn test_trim_left() {
+    assert_eq!("".trim_left(), "");
+    assert_eq!("a".trim_left(), "a");
+    assert_eq!("    ".trim_left(), "");
+    assert_eq!("     blah".trim_left(), "blah");
+    assert_eq!("   \u{3000}  wut".trim_left(), "wut");
+    assert_eq!("hey ".trim_left(), "hey ");
+}
+
+#[test]
+fn test_trim_right() {
+    assert_eq!("".trim_right(), "");
+    assert_eq!("a".trim_right(), "a");
+    assert_eq!("    ".trim_right(), "");
+    assert_eq!("blah     ".trim_right(), "blah");
+    assert_eq!("wut   \u{3000}  ".trim_right(), "wut");
+    assert_eq!(" hey".trim_right(), " hey");
+}
+
+#[test]
+fn test_trim() {
+    assert_eq!("".trim(), "");
+    assert_eq!("a".trim(), "a");
+    assert_eq!("    ".trim(), "");
+    assert_eq!("    blah     ".trim(), "blah");
+    assert_eq!("\nwut   \u{3000}  ".trim(), "wut");
+    assert_eq!(" hey dude ".trim(), "hey dude");
+}
+
+#[test]
+fn test_is_whitespace() {
+    assert!("".chars().all(|c| c.is_whitespace()));
+    assert!(" ".chars().all(|c| c.is_whitespace()));
+    assert!("\u{2009}".chars().all(|c| c.is_whitespace())); // Thin space
+    assert!("  \n\t   ".chars().all(|c| c.is_whitespace()));
+    assert!(!"   _   ".chars().all(|c| c.is_whitespace()));
+}
+
+#[test]
+fn test_slice_shift_char() {
+    let data = "ประเทศไทย中";
+    assert_eq!(data.slice_shift_char(), Some(('ป', "ระเทศไทย中")));
+}
+
+#[test]
+fn test_slice_shift_char_2() {
+    let empty = "";
+    assert_eq!(empty.slice_shift_char(), None);
+}
+
+#[test]
+fn test_is_utf8() {
+    // deny overlong encodings
+    assert!(from_utf8(&[0xc0, 0x80]).is_err());
+    assert!(from_utf8(&[0xc0, 0xae]).is_err());
+    assert!(from_utf8(&[0xe0, 0x80, 0x80]).is_err());
+    assert!(from_utf8(&[0xe0, 0x80, 0xaf]).is_err());
+    assert!(from_utf8(&[0xe0, 0x81, 0x81]).is_err());
+    assert!(from_utf8(&[0xf0, 0x82, 0x82, 0xac]).is_err());
+    assert!(from_utf8(&[0xf4, 0x90, 0x80, 0x80]).is_err());
+
+    // deny surrogates
+    assert!(from_utf8(&[0xED, 0xA0, 0x80]).is_err());
+    assert!(from_utf8(&[0xED, 0xBF, 0xBF]).is_err());
+
+    assert!(from_utf8(&[0xC2, 0x80]).is_ok());
+    assert!(from_utf8(&[0xDF, 0xBF]).is_ok());
+    assert!(from_utf8(&[0xE0, 0xA0, 0x80]).is_ok());
+    assert!(from_utf8(&[0xED, 0x9F, 0xBF]).is_ok());
+    assert!(from_utf8(&[0xEE, 0x80, 0x80]).is_ok());
+    assert!(from_utf8(&[0xEF, 0xBF, 0xBF]).is_ok());
+    assert!(from_utf8(&[0xF0, 0x90, 0x80, 0x80]).is_ok());
+    assert!(from_utf8(&[0xF4, 0x8F, 0xBF, 0xBF]).is_ok());
+}
+
+#[test]
+fn test_is_utf16() {
+    use unicode::str::is_utf16;
+
+    macro_rules! pos {
+        ($($e:expr),*) => { { $(assert!(is_utf16($e));)* } }
+    }
+
+    // non-surrogates
+    pos!(&[0x0000],
+         &[0x0001, 0x0002],
+         &[0xD7FF],
+         &[0xE000]);
+
+    // surrogate pairs (randomly generated with Python 3's
+    // .encode('utf-16be'))
+    pos!(&[0xdb54, 0xdf16, 0xd880, 0xdee0, 0xdb6a, 0xdd45],
+         &[0xd91f, 0xdeb1, 0xdb31, 0xdd84, 0xd8e2, 0xde14],
+         &[0xdb9f, 0xdc26, 0xdb6f, 0xde58, 0xd850, 0xdfae]);
+
+    // mixtures (also random)
+    pos!(&[0xd921, 0xdcc2, 0x002d, 0x004d, 0xdb32, 0xdf65],
+         &[0xdb45, 0xdd2d, 0x006a, 0xdacd, 0xddfe, 0x0006],
+         &[0x0067, 0xd8ff, 0xddb7, 0x000f, 0xd900, 0xdc80]);
+
+    // negative tests
+    macro_rules! neg {
+        ($($e:expr),*) => { { $(assert!(!is_utf16($e));)* } }
+    }
+
+    neg!(
+        // surrogate + regular unit
+        &[0xdb45, 0x0000],
+        // surrogate + lead surrogate
+        &[0xd900, 0xd900],
+        // unterminated surrogate
+        &[0xd8ff],
+        // trail surrogate without a lead
+        &[0xddb7]);
+
+    // random byte sequences that Python 3's .decode('utf-16be')
+    // failed on
+    neg!(&[0x5b3d, 0x0141, 0xde9e, 0x8fdc, 0xc6e7],
+         &[0xdf5a, 0x82a5, 0x62b9, 0xb447, 0x92f3],
+         &[0xda4e, 0x42bc, 0x4462, 0xee98, 0xc2ca],
+         &[0xbe00, 0xb04a, 0x6ecb, 0xdd89, 0xe278],
+         &[0x0465, 0xab56, 0xdbb6, 0xa893, 0x665e],
+         &[0x6b7f, 0x0a19, 0x40f4, 0xa657, 0xdcc5],
+         &[0x9b50, 0xda5e, 0x24ec, 0x03ad, 0x6dee],
+         &[0x8d17, 0xcaa7, 0xf4ae, 0xdf6e, 0xbed7],
+         &[0xdaee, 0x2584, 0x7d30, 0xa626, 0x121a],
+         &[0xd956, 0x4b43, 0x7570, 0xccd6, 0x4f4a],
+         &[0x9dcf, 0x1b49, 0x4ba5, 0xfce9, 0xdffe],
+         &[0x6572, 0xce53, 0xb05a, 0xf6af, 0xdacf],
+         &[0x1b90, 0x728c, 0x9906, 0xdb68, 0xf46e],
+         &[0x1606, 0xbeca, 0xbe76, 0x860f, 0xdfa5],
+         &[0x8b4f, 0xde7a, 0xd220, 0x9fac, 0x2b6f],
+         &[0xb8fe, 0xebbe, 0xda32, 0x1a5f, 0x8b8b],
+         &[0x934b, 0x8956, 0xc434, 0x1881, 0xddf7],
+         &[0x5a95, 0x13fc, 0xf116, 0xd89b, 0x93f9],
+         &[0xd640, 0x71f1, 0xdd7d, 0x77eb, 0x1cd8],
+         &[0x348b, 0xaef0, 0xdb2c, 0xebf1, 0x1282],
+         &[0x50d7, 0xd824, 0x5010, 0xb369, 0x22ea]);
+}
+
+#[test]
+fn test_as_bytes() {
+    // no null
+    let v = [
+        224, 184, 168, 224, 185, 132, 224, 184, 151, 224, 184, 162, 228,
+        184, 173, 229, 141, 142, 86, 105, 225, 187, 135, 116, 32, 78, 97,
+        109
+    ];
+    let b: &[u8] = &[];
+    assert_eq!("".as_bytes(), b);
+    assert_eq!("abc".as_bytes(), b"abc");
+    assert_eq!("ศไทย中华Việt Nam".as_bytes(), v);
+}
+
+#[test]
+#[should_panic]
+fn test_as_bytes_fail() {
+    // Don't double free. (I'm not sure if this exercises the
+    // original problem code path anymore.)
+    let s = String::from_str("");
+    let _bytes = s.as_bytes();
+    panic!();
+}
+
+#[test]
+fn test_as_ptr() {
+    let buf = "hello".as_ptr();
+    unsafe {
+        assert_eq!(*buf.offset(0), b'h');
+        assert_eq!(*buf.offset(1), b'e');
+        assert_eq!(*buf.offset(2), b'l');
+        assert_eq!(*buf.offset(3), b'l');
+        assert_eq!(*buf.offset(4), b'o');
+    }
+}
+
+#[test]
+fn test_subslice_offset() {
+    let a = "kernelsprite";
+    let b = &a[7..a.len()];
+    let c = &a[0..a.len() - 6];
+    assert_eq!(a.subslice_offset(b), 7);
+    assert_eq!(a.subslice_offset(c), 0);
+
+    let string = "a\nb\nc";
+    let lines: Vec<&str> = string.lines().collect();
+    assert_eq!(string.subslice_offset(lines[0]), 0);
+    assert_eq!(string.subslice_offset(lines[1]), 2);
+    assert_eq!(string.subslice_offset(lines[2]), 4);
+}
+
+#[test]
+#[should_panic]
+fn test_subslice_offset_2() {
+    let a = "alchemiter";
+    let b = "cruxtruder";
+    a.subslice_offset(b);
+}
+
+#[test]
+fn vec_str_conversions() {
+    let s1: String = String::from_str("All mimsy were the borogoves");
+
+    let v: Vec<u8> = s1.as_bytes().to_vec();
+    let s2: String = String::from_str(from_utf8(&v).unwrap());
+    let mut i = 0;
+    let n1 = s1.len();
+    let n2 = v.len();
+    assert_eq!(n1, n2);
+    while i < n1 {
+        let a: u8 = s1.as_bytes()[i];
+        let b: u8 = s2.as_bytes()[i];
+        debug!("{}", a);
+        debug!("{}", b);
+        assert_eq!(a, b);
+        i += 1;
+    }
+}
+
+#[test]
+fn test_contains() {
+    assert!("abcde".contains("bcd"));
+    assert!("abcde".contains("abcd"));
+    assert!("abcde".contains("bcde"));
+    assert!("abcde".contains(""));
+    assert!("".contains(""));
+    assert!(!"abcde".contains("def"));
+    assert!(!"".contains("a"));
+
+    let data = "ประเทศไทย中华Việt Nam";
+    assert!(data.contains("ประเ"));
+    assert!(data.contains("ะเ"));
+    assert!(data.contains("中华"));
+    assert!(!data.contains("ไท华"));
+}
+
+#[test]
+fn test_contains_char() {
+    assert!("abc".contains_char('b'));
+    assert!("a".contains_char('a'));
+    assert!(!"abc".contains_char('d'));
+    assert!(!"".contains_char('a'));
+}
+
+#[test]
+fn test_char_at() {
+    let s = "ศไทย中华Việt Nam";
+    let v = vec!['ศ','ไ','ท','ย','中','华','V','i','ệ','t',' ','N','a','m'];
+    let mut pos = 0;
+    for ch in &v {
+        assert!(s.char_at(pos) == *ch);
+        pos += ch.to_string().len();
+    }
+}
+
+#[test]
+fn test_char_at_reverse() {
+    let s = "ศไทย中华Việt Nam";
+    let v = vec!['ศ','ไ','ท','ย','中','华','V','i','ệ','t',' ','N','a','m'];
+    let mut pos = s.len();
+    for ch in v.iter().rev() {
+        assert!(s.char_at_reverse(pos) == *ch);
+        pos -= ch.to_string().len();
+    }
+}
+
+#[test]
+fn test_escape_unicode() {
+    assert_eq!("abc".escape_unicode(),
+               String::from_str("\\u{61}\\u{62}\\u{63}"));
+    assert_eq!("a c".escape_unicode(),
+               String::from_str("\\u{61}\\u{20}\\u{63}"));
+    assert_eq!("\r\n\t".escape_unicode(),
+               String::from_str("\\u{d}\\u{a}\\u{9}"));
+    assert_eq!("'\"\\".escape_unicode(),
+               String::from_str("\\u{27}\\u{22}\\u{5c}"));
+    assert_eq!("\x00\x01\u{fe}\u{ff}".escape_unicode(),
+               String::from_str("\\u{0}\\u{1}\\u{fe}\\u{ff}"));
+    assert_eq!("\u{100}\u{ffff}".escape_unicode(),
+               String::from_str("\\u{100}\\u{ffff}"));
+    assert_eq!("\u{10000}\u{10ffff}".escape_unicode(),
+               String::from_str("\\u{10000}\\u{10ffff}"));
+    assert_eq!("ab\u{fb00}".escape_unicode(),
+               String::from_str("\\u{61}\\u{62}\\u{fb00}"));
+    assert_eq!("\u{1d4ea}\r".escape_unicode(),
+               String::from_str("\\u{1d4ea}\\u{d}"));
+}
+
+#[test]
+fn test_escape_default() {
+    assert_eq!("abc".escape_default(), String::from_str("abc"));
+    assert_eq!("a c".escape_default(), String::from_str("a c"));
+    assert_eq!("\r\n\t".escape_default(), String::from_str("\\r\\n\\t"));
+    assert_eq!("'\"\\".escape_default(), String::from_str("\\'\\\"\\\\"));
+    assert_eq!("\u{100}\u{ffff}".escape_default(),
+               String::from_str("\\u{100}\\u{ffff}"));
+    assert_eq!("\u{10000}\u{10ffff}".escape_default(),
+               String::from_str("\\u{10000}\\u{10ffff}"));
+    assert_eq!("ab\u{fb00}".escape_default(),
+               String::from_str("ab\\u{fb00}"));
+    assert_eq!("\u{1d4ea}\r".escape_default(),
+               String::from_str("\\u{1d4ea}\\r"));
+}
+
+#[test]
+fn test_total_ord() {
+    "1234".cmp("123") == Greater;
+    "123".cmp("1234") == Less;
+    "1234".cmp("1234") == Equal;
+    "12345555".cmp("123456") == Less;
+    "22".cmp("1234") == Greater;
+}
+
+#[test]
+fn test_char_range_at() {
+    let data = "b¢€𤭢𤭢€¢b";
+    assert_eq!('b', data.char_range_at(0).ch);
+    assert_eq!('¢', data.char_range_at(1).ch);
+    assert_eq!('€', data.char_range_at(3).ch);
+    assert_eq!('𤭢', data.char_range_at(6).ch);
+    assert_eq!('𤭢', data.char_range_at(10).ch);
+    assert_eq!('€', data.char_range_at(14).ch);
+    assert_eq!('¢', data.char_range_at(17).ch);
+    assert_eq!('b', data.char_range_at(19).ch);
+}
+
+#[test]
+fn test_char_range_at_reverse_underflow() {
+    assert_eq!("abc".char_range_at_reverse(0).next, 0);
+}
+
+#[test]
+fn test_iterator() {
+    let s = "ศไทย中华Việt Nam";
+    let v = ['ศ','ไ','ท','ย','中','华','V','i','ệ','t',' ','N','a','m'];
+
+    let mut pos = 0;
+    let it = s.chars();
+
+    for c in it {
+        assert_eq!(c, v[pos]);
+        pos += 1;
+    }
+    assert_eq!(pos, v.len());
+}
+
+#[test]
+fn test_rev_iterator() {
+    let s = "ศไทย中华Việt Nam";
+    let v = ['m', 'a', 'N', ' ', 't', 'ệ','i','V','华','中','ย','ท','ไ','ศ'];
+
+    let mut pos = 0;
+    let it = s.chars().rev();
+
+    for c in it {
+        assert_eq!(c, v[pos]);
+        pos += 1;
+    }
+    assert_eq!(pos, v.len());
+}
+
+#[test]
+fn test_chars_decoding() {
+    let mut bytes = [0; 4];
+    for c in (0..0x110000).filter_map(::std::char::from_u32) {
+        let len = c.encode_utf8(&mut bytes).unwrap_or(0);
+        let s = ::std::str::from_utf8(&bytes[..len]).unwrap();
+        if Some(c) != s.chars().next() {
+            panic!("character {:x}={} does not decode correctly", c as u32, c);
+        }
+    }
+}
+
+#[test]
+fn test_chars_rev_decoding() {
+    let mut bytes = [0; 4];
+    for c in (0..0x110000).filter_map(::std::char::from_u32) {
+        let len = c.encode_utf8(&mut bytes).unwrap_or(0);
+        let s = ::std::str::from_utf8(&bytes[..len]).unwrap();
+        if Some(c) != s.chars().rev().next() {
+            panic!("character {:x}={} does not decode correctly", c as u32, c);
+        }
+    }
+}
+
+#[test]
+fn test_iterator_clone() {
+    let s = "ศไทย中华Việt Nam";
+    let mut it = s.chars();
+    it.next();
+    assert!(it.clone().zip(it).all(|(x,y)| x == y));
+}
+
+#[test]
+fn test_bytesator() {
+    let s = "ศไทย中华Việt Nam";
+    let v = [
+        224, 184, 168, 224, 185, 132, 224, 184, 151, 224, 184, 162, 228,
+        184, 173, 229, 141, 142, 86, 105, 225, 187, 135, 116, 32, 78, 97,
+        109
+    ];
+    let mut pos = 0;
+
+    for b in s.bytes() {
+        assert_eq!(b, v[pos]);
+        pos += 1;
+    }
+}
+
+#[test]
+fn test_bytes_revator() {
+    let s = "ศไทย中华Việt Nam";
+    let v = [
+        224, 184, 168, 224, 185, 132, 224, 184, 151, 224, 184, 162, 228,
+        184, 173, 229, 141, 142, 86, 105, 225, 187, 135, 116, 32, 78, 97,
+        109
+    ];
+    let mut pos = v.len();
+
+    for b in s.bytes().rev() {
+        pos -= 1;
+        assert_eq!(b, v[pos]);
+    }
+}
+
+#[test]
+fn test_char_indicesator() {
+    let s = "ศไทย中华Việt Nam";
+    let p = [0, 3, 6, 9, 12, 15, 18, 19, 20, 23, 24, 25, 26, 27];
+    let v = ['ศ','ไ','ท','ย','中','华','V','i','ệ','t',' ','N','a','m'];
+
+    let mut pos = 0;
+    let it = s.char_indices();
+
+    for c in it {
+        assert_eq!(c, (p[pos], v[pos]));
+        pos += 1;
+    }
+    assert_eq!(pos, v.len());
+    assert_eq!(pos, p.len());
+}
+
+#[test]
+fn test_char_indices_revator() {
+    let s = "ศไทย中华Việt Nam";
+    let p = [27, 26, 25, 24, 23, 20, 19, 18, 15, 12, 9, 6, 3, 0];
+    let v = ['m', 'a', 'N', ' ', 't', 'ệ','i','V','华','中','ย','ท','ไ','ศ'];
+
+    let mut pos = 0;
+    let it = s.char_indices().rev();
+
+    for c in it {
+        assert_eq!(c, (p[pos], v[pos]));
+        pos += 1;
+    }
+    assert_eq!(pos, v.len());
+    assert_eq!(pos, p.len());
+}
+
+#[test]
+fn test_splitn_char_iterator() {
+    let data = "\nMäry häd ä little lämb\nLittle lämb\n";
+
+    let split: Vec<&str> = data.splitn(3, ' ').collect();
+    assert_eq!(split, ["\nMäry", "häd", "ä", "little lämb\nLittle lämb\n"]);
+
+    let split: Vec<&str> = data.splitn(3, |c: char| c == ' ').collect();
+    assert_eq!(split, ["\nMäry", "häd", "ä", "little lämb\nLittle lämb\n"]);
+
+    // Unicode
+    let split: Vec<&str> = data.splitn(3, 'ä').collect();
+    assert_eq!(split, ["\nM", "ry h", "d ", " little lämb\nLittle lämb\n"]);
+
+    let split: Vec<&str> = data.splitn(3, |c: char| c == 'ä').collect();
+    assert_eq!(split, ["\nM", "ry h", "d ", " little lämb\nLittle lämb\n"]);
+}
+
+#[test]
+fn test_split_char_iterator_no_trailing() {
+    let data = "\nMäry häd ä little lämb\nLittle lämb\n";
+
+    let split: Vec<&str> = data.split('\n').collect();
+    assert_eq!(split, ["", "Märy häd ä little lämb", "Little lämb", ""]);
+
+    let split: Vec<&str> = data.split_terminator('\n').collect();
+    assert_eq!(split, ["", "Märy häd ä little lämb", "Little lämb"]);
+}
+
+#[test]
+fn test_words() {
+    let data = "\n \tMäry   häd\tä  little lämb\nLittle lämb\n";
+    let words: Vec<&str> = data.words().collect();
+    assert_eq!(words, ["Märy", "häd", "ä", "little", "lämb", "Little", "lämb"])
+}
+
+#[test]
+fn test_nfd_chars() {
+    macro_rules! t {
+        ($input: expr, $expected: expr) => {
+            assert_eq!($input.nfd_chars().collect::<String>(), $expected);
+        }
+    }
+    t!("abc", "abc");
+    t!("\u{1e0b}\u{1c4}", "d\u{307}\u{1c4}");
+    t!("\u{2026}", "\u{2026}");
+    t!("\u{2126}", "\u{3a9}");
+    t!("\u{1e0b}\u{323}", "d\u{323}\u{307}");
+    t!("\u{1e0d}\u{307}", "d\u{323}\u{307}");
+    t!("a\u{301}", "a\u{301}");
+    t!("\u{301}a", "\u{301}a");
+    t!("\u{d4db}", "\u{1111}\u{1171}\u{11b6}");
+    t!("\u{ac1c}", "\u{1100}\u{1162}");
+}
+
+#[test]
+fn test_nfkd_chars() {
+    macro_rules! t {
+        ($input: expr, $expected: expr) => {
+            assert_eq!($input.nfkd_chars().collect::<String>(), $expected);
+        }
+    }
+    t!("abc", "abc");
+    t!("\u{1e0b}\u{1c4}", "d\u{307}DZ\u{30c}");
+    t!("\u{2026}", "...");
+    t!("\u{2126}", "\u{3a9}");
+    t!("\u{1e0b}\u{323}", "d\u{323}\u{307}");
+    t!("\u{1e0d}\u{307}", "d\u{323}\u{307}");
+    t!("a\u{301}", "a\u{301}");
+    t!("\u{301}a", "\u{301}a");
+    t!("\u{d4db}", "\u{1111}\u{1171}\u{11b6}");
+    t!("\u{ac1c}", "\u{1100}\u{1162}");
+}
+
+#[test]
+fn test_nfc_chars() {
+    macro_rules! t {
+        ($input: expr, $expected: expr) => {
+            assert_eq!($input.nfc_chars().collect::<String>(), $expected);
+        }
+    }
+    t!("abc", "abc");
+    t!("\u{1e0b}\u{1c4}", "\u{1e0b}\u{1c4}");
+    t!("\u{2026}", "\u{2026}");
+    t!("\u{2126}", "\u{3a9}");
+    t!("\u{1e0b}\u{323}", "\u{1e0d}\u{307}");
+    t!("\u{1e0d}\u{307}", "\u{1e0d}\u{307}");
+    t!("a\u{301}", "\u{e1}");
+    t!("\u{301}a", "\u{301}a");
+    t!("\u{d4db}", "\u{d4db}");
+    t!("\u{ac1c}", "\u{ac1c}");
+    t!("a\u{300}\u{305}\u{315}\u{5ae}b", "\u{e0}\u{5ae}\u{305}\u{315}b");
+}
+
+#[test]
+fn test_nfkc_chars() {
+    macro_rules! t {
+        ($input: expr, $expected: expr) => {
+            assert_eq!($input.nfkc_chars().collect::<String>(), $expected);
+        }
+    }
+    t!("abc", "abc");
+    t!("\u{1e0b}\u{1c4}", "\u{1e0b}D\u{17d}");
+    t!("\u{2026}", "...");
+    t!("\u{2126}", "\u{3a9}");
+    t!("\u{1e0b}\u{323}", "\u{1e0d}\u{307}");
+    t!("\u{1e0d}\u{307}", "\u{1e0d}\u{307}");
+    t!("a\u{301}", "\u{e1}");
+    t!("\u{301}a", "\u{301}a");
+    t!("\u{d4db}", "\u{d4db}");
+    t!("\u{ac1c}", "\u{ac1c}");
+    t!("a\u{300}\u{305}\u{315}\u{5ae}b", "\u{e0}\u{5ae}\u{305}\u{315}b");
+}
+
+#[test]
+fn test_lines() {
+    let data = "\nMäry häd ä little lämb\n\nLittle lämb\n";
+    let lines: Vec<&str> = data.lines().collect();
+    assert_eq!(lines, ["", "Märy häd ä little lämb", "", "Little lämb"]);
+
+    let data = "\nMäry häd ä little lämb\n\nLittle lämb"; // no trailing \n
+    let lines: Vec<&str> = data.lines().collect();
+    assert_eq!(lines, ["", "Märy häd ä little lämb", "", "Little lämb"]);
+}
+
+#[test]
+fn test_graphemes() {
+    use std::iter::order;
+
+    // official Unicode test data
+    // from http://www.unicode.org/Public/UCD/latest/ucd/auxiliary/GraphemeBreakTest.txt
+    let test_same: [(_, &[_]); 325] = [
+        ("\u{20}\u{20}", &["\u{20}", "\u{20}"]),
+        ("\u{20}\u{308}\u{20}", &["\u{20}\u{308}", "\u{20}"]),
+        ("\u{20}\u{D}", &["\u{20}", "\u{D}"]),
+        ("\u{20}\u{308}\u{D}", &["\u{20}\u{308}", "\u{D}"]),
+        ("\u{20}\u{A}", &["\u{20}", "\u{A}"]),
+        ("\u{20}\u{308}\u{A}", &["\u{20}\u{308}", "\u{A}"]),
+        ("\u{20}\u{1}", &["\u{20}", "\u{1}"]),
+        ("\u{20}\u{308}\u{1}", &["\u{20}\u{308}", "\u{1}"]),
+        ("\u{20}\u{300}", &["\u{20}\u{300}"]),
+        ("\u{20}\u{308}\u{300}", &["\u{20}\u{308}\u{300}"]),
+        ("\u{20}\u{1100}", &["\u{20}", "\u{1100}"]),
+        ("\u{20}\u{308}\u{1100}", &["\u{20}\u{308}", "\u{1100}"]),
+        ("\u{20}\u{1160}", &["\u{20}", "\u{1160}"]),
+        ("\u{20}\u{308}\u{1160}", &["\u{20}\u{308}", "\u{1160}"]),
+        ("\u{20}\u{11A8}", &["\u{20}", "\u{11A8}"]),
+        ("\u{20}\u{308}\u{11A8}", &["\u{20}\u{308}", "\u{11A8}"]),
+        ("\u{20}\u{AC00}", &["\u{20}", "\u{AC00}"]),
+        ("\u{20}\u{308}\u{AC00}", &["\u{20}\u{308}", "\u{AC00}"]),
+        ("\u{20}\u{AC01}", &["\u{20}", "\u{AC01}"]),
+        ("\u{20}\u{308}\u{AC01}", &["\u{20}\u{308}", "\u{AC01}"]),
+        ("\u{20}\u{1F1E6}", &["\u{20}", "\u{1F1E6}"]),
+        ("\u{20}\u{308}\u{1F1E6}", &["\u{20}\u{308}", "\u{1F1E6}"]),
+        ("\u{20}\u{378}", &["\u{20}", "\u{378}"]),
+        ("\u{20}\u{308}\u{378}", &["\u{20}\u{308}", "\u{378}"]),
+        ("\u{D}\u{20}", &["\u{D}", "\u{20}"]),
+        ("\u{D}\u{308}\u{20}", &["\u{D}", "\u{308}", "\u{20}"]),
+        ("\u{D}\u{D}", &["\u{D}", "\u{D}"]),
+        ("\u{D}\u{308}\u{D}", &["\u{D}", "\u{308}", "\u{D}"]),
+        ("\u{D}\u{A}", &["\u{D}\u{A}"]),
+        ("\u{D}\u{308}\u{A}", &["\u{D}", "\u{308}", "\u{A}"]),
+        ("\u{D}\u{1}", &["\u{D}", "\u{1}"]),
+        ("\u{D}\u{308}\u{1}", &["\u{D}", "\u{308}", "\u{1}"]),
+        ("\u{D}\u{300}", &["\u{D}", "\u{300}"]),
+        ("\u{D}\u{308}\u{300}", &["\u{D}", "\u{308}\u{300}"]),
+        ("\u{D}\u{903}", &["\u{D}", "\u{903}"]),
+        ("\u{D}\u{1100}", &["\u{D}", "\u{1100}"]),
+        ("\u{D}\u{308}\u{1100}", &["\u{D}", "\u{308}", "\u{1100}"]),
+        ("\u{D}\u{1160}", &["\u{D}", "\u{1160}"]),
+        ("\u{D}\u{308}\u{1160}", &["\u{D}", "\u{308}", "\u{1160}"]),
+        ("\u{D}\u{11A8}", &["\u{D}", "\u{11A8}"]),
+        ("\u{D}\u{308}\u{11A8}", &["\u{D}", "\u{308}", "\u{11A8}"]),
+        ("\u{D}\u{AC00}", &["\u{D}", "\u{AC00}"]),
+        ("\u{D}\u{308}\u{AC00}", &["\u{D}", "\u{308}", "\u{AC00}"]),
+        ("\u{D}\u{AC01}", &["\u{D}", "\u{AC01}"]),
+        ("\u{D}\u{308}\u{AC01}", &["\u{D}", "\u{308}", "\u{AC01}"]),
+        ("\u{D}\u{1F1E6}", &["\u{D}", "\u{1F1E6}"]),
+        ("\u{D}\u{308}\u{1F1E6}", &["\u{D}", "\u{308}", "\u{1F1E6}"]),
+        ("\u{D}\u{378}", &["\u{D}", "\u{378}"]),
+        ("\u{D}\u{308}\u{378}", &["\u{D}", "\u{308}", "\u{378}"]),
+        ("\u{A}\u{20}", &["\u{A}", "\u{20}"]),
+        ("\u{A}\u{308}\u{20}", &["\u{A}", "\u{308}", "\u{20}"]),
+        ("\u{A}\u{D}", &["\u{A}", "\u{D}"]),
+        ("\u{A}\u{308}\u{D}", &["\u{A}", "\u{308}", "\u{D}"]),
+        ("\u{A}\u{A}", &["\u{A}", "\u{A}"]),
+        ("\u{A}\u{308}\u{A}", &["\u{A}", "\u{308}", "\u{A}"]),
+        ("\u{A}\u{1}", &["\u{A}", "\u{1}"]),
+        ("\u{A}\u{308}\u{1}", &["\u{A}", "\u{308}", "\u{1}"]),
+        ("\u{A}\u{300}", &["\u{A}", "\u{300}"]),
+        ("\u{A}\u{308}\u{300}", &["\u{A}", "\u{308}\u{300}"]),
+        ("\u{A}\u{903}", &["\u{A}", "\u{903}"]),
+        ("\u{A}\u{1100}", &["\u{A}", "\u{1100}"]),
+        ("\u{A}\u{308}\u{1100}", &["\u{A}", "\u{308}", "\u{1100}"]),
+        ("\u{A}\u{1160}", &["\u{A}", "\u{1160}"]),
+        ("\u{A}\u{308}\u{1160}", &["\u{A}", "\u{308}", "\u{1160}"]),
+        ("\u{A}\u{11A8}", &["\u{A}", "\u{11A8}"]),
+        ("\u{A}\u{308}\u{11A8}", &["\u{A}", "\u{308}", "\u{11A8}"]),
+        ("\u{A}\u{AC00}", &["\u{A}", "\u{AC00}"]),
+        ("\u{A}\u{308}\u{AC00}", &["\u{A}", "\u{308}", "\u{AC00}"]),
+        ("\u{A}\u{AC01}", &["\u{A}", "\u{AC01}"]),
+        ("\u{A}\u{308}\u{AC01}", &["\u{A}", "\u{308}", "\u{AC01}"]),
+        ("\u{A}\u{1F1E6}", &["\u{A}", "\u{1F1E6}"]),
+        ("\u{A}\u{308}\u{1F1E6}", &["\u{A}", "\u{308}", "\u{1F1E6}"]),
+        ("\u{A}\u{378}", &["\u{A}", "\u{378}"]),
+        ("\u{A}\u{308}\u{378}", &["\u{A}", "\u{308}", "\u{378}"]),
+        ("\u{1}\u{20}", &["\u{1}", "\u{20}"]),
+        ("\u{1}\u{308}\u{20}", &["\u{1}", "\u{308}", "\u{20}"]),
+        ("\u{1}\u{D}", &["\u{1}", "\u{D}"]),
+        ("\u{1}\u{308}\u{D}", &["\u{1}", "\u{308}", "\u{D}"]),
+        ("\u{1}\u{A}", &["\u{1}", "\u{A}"]),
+        ("\u{1}\u{308}\u{A}", &["\u{1}", "\u{308}", "\u{A}"]),
+        ("\u{1}\u{1}", &["\u{1}", "\u{1}"]),
+        ("\u{1}\u{308}\u{1}", &["\u{1}", "\u{308}", "\u{1}"]),
+        ("\u{1}\u{300}", &["\u{1}", "\u{300}"]),
+        ("\u{1}\u{308}\u{300}", &["\u{1}", "\u{308}\u{300}"]),
+        ("\u{1}\u{903}", &["\u{1}", "\u{903}"]),
+        ("\u{1}\u{1100}", &["\u{1}", "\u{1100}"]),
+        ("\u{1}\u{308}\u{1100}", &["\u{1}", "\u{308}", "\u{1100}"]),
+        ("\u{1}\u{1160}", &["\u{1}", "\u{1160}"]),
+        ("\u{1}\u{308}\u{1160}", &["\u{1}", "\u{308}", "\u{1160}"]),
+        ("\u{1}\u{11A8}", &["\u{1}", "\u{11A8}"]),
+        ("\u{1}\u{308}\u{11A8}", &["\u{1}", "\u{308}", "\u{11A8}"]),
+        ("\u{1}\u{AC00}", &["\u{1}", "\u{AC00}"]),
+        ("\u{1}\u{308}\u{AC00}", &["\u{1}", "\u{308}", "\u{AC00}"]),
+        ("\u{1}\u{AC01}", &["\u{1}", "\u{AC01}"]),
+        ("\u{1}\u{308}\u{AC01}", &["\u{1}", "\u{308}", "\u{AC01}"]),
+        ("\u{1}\u{1F1E6}", &["\u{1}", "\u{1F1E6}"]),
+        ("\u{1}\u{308}\u{1F1E6}", &["\u{1}", "\u{308}", "\u{1F1E6}"]),
+        ("\u{1}\u{378}", &["\u{1}", "\u{378}"]),
+        ("\u{1}\u{308}\u{378}", &["\u{1}", "\u{308}", "\u{378}"]),
+        ("\u{300}\u{20}", &["\u{300}", "\u{20}"]),
+        ("\u{300}\u{308}\u{20}", &["\u{300}\u{308}", "\u{20}"]),
+        ("\u{300}\u{D}", &["\u{300}", "\u{D}"]),
+        ("\u{300}\u{308}\u{D}", &["\u{300}\u{308}", "\u{D}"]),
+        ("\u{300}\u{A}", &["\u{300}", "\u{A}"]),
+        ("\u{300}\u{308}\u{A}", &["\u{300}\u{308}", "\u{A}"]),
+        ("\u{300}\u{1}", &["\u{300}", "\u{1}"]),
+        ("\u{300}\u{308}\u{1}", &["\u{300}\u{308}", "\u{1}"]),
+        ("\u{300}\u{300}", &["\u{300}\u{300}"]),
+        ("\u{300}\u{308}\u{300}", &["\u{300}\u{308}\u{300}"]),
+        ("\u{300}\u{1100}", &["\u{300}", "\u{1100}"]),
+        ("\u{300}\u{308}\u{1100}", &["\u{300}\u{308}", "\u{1100}"]),
+        ("\u{300}\u{1160}", &["\u{300}", "\u{1160}"]),
+        ("\u{300}\u{308}\u{1160}", &["\u{300}\u{308}", "\u{1160}"]),
+        ("\u{300}\u{11A8}", &["\u{300}", "\u{11A8}"]),
+        ("\u{300}\u{308}\u{11A8}", &["\u{300}\u{308}", "\u{11A8}"]),
+        ("\u{300}\u{AC00}", &["\u{300}", "\u{AC00}"]),
+        ("\u{300}\u{308}\u{AC00}", &["\u{300}\u{308}", "\u{AC00}"]),
+        ("\u{300}\u{AC01}", &["\u{300}", "\u{AC01}"]),
+        ("\u{300}\u{308}\u{AC01}", &["\u{300}\u{308}", "\u{AC01}"]),
+        ("\u{300}\u{1F1E6}", &["\u{300}", "\u{1F1E6}"]),
+        ("\u{300}\u{308}\u{1F1E6}", &["\u{300}\u{308}", "\u{1F1E6}"]),
+        ("\u{300}\u{378}", &["\u{300}", "\u{378}"]),
+        ("\u{300}\u{308}\u{378}", &["\u{300}\u{308}", "\u{378}"]),
+        ("\u{903}\u{20}", &["\u{903}", "\u{20}"]),
+        ("\u{903}\u{308}\u{20}", &["\u{903}\u{308}", "\u{20}"]),
+        ("\u{903}\u{D}", &["\u{903}", "\u{D}"]),
+        ("\u{903}\u{308}\u{D}", &["\u{903}\u{308}", "\u{D}"]),
+        ("\u{903}\u{A}", &["\u{903}", "\u{A}"]),
+        ("\u{903}\u{308}\u{A}", &["\u{903}\u{308}", "\u{A}"]),
+        ("\u{903}\u{1}", &["\u{903}", "\u{1}"]),
+        ("\u{903}\u{308}\u{1}", &["\u{903}\u{308}", "\u{1}"]),
+        ("\u{903}\u{300}", &["\u{903}\u{300}"]),
+        ("\u{903}\u{308}\u{300}", &["\u{903}\u{308}\u{300}"]),
+        ("\u{903}\u{1100}", &["\u{903}", "\u{1100}"]),
+        ("\u{903}\u{308}\u{1100}", &["\u{903}\u{308}", "\u{1100}"]),
+        ("\u{903}\u{1160}", &["\u{903}", "\u{1160}"]),
+        ("\u{903}\u{308}\u{1160}", &["\u{903}\u{308}", "\u{1160}"]),
+        ("\u{903}\u{11A8}", &["\u{903}", "\u{11A8}"]),
+        ("\u{903}\u{308}\u{11A8}", &["\u{903}\u{308}", "\u{11A8}"]),
+        ("\u{903}\u{AC00}", &["\u{903}", "\u{AC00}"]),
+        ("\u{903}\u{308}\u{AC00}", &["\u{903}\u{308}", "\u{AC00}"]),
+        ("\u{903}\u{AC01}", &["\u{903}", "\u{AC01}"]),
+        ("\u{903}\u{308}\u{AC01}", &["\u{903}\u{308}", "\u{AC01}"]),
+        ("\u{903}\u{1F1E6}", &["\u{903}", "\u{1F1E6}"]),
+        ("\u{903}\u{308}\u{1F1E6}", &["\u{903}\u{308}", "\u{1F1E6}"]),
+        ("\u{903}\u{378}", &["\u{903}", "\u{378}"]),
+        ("\u{903}\u{308}\u{378}", &["\u{903}\u{308}", "\u{378}"]),
+        ("\u{1100}\u{20}", &["\u{1100}", "\u{20}"]),
+        ("\u{1100}\u{308}\u{20}", &["\u{1100}\u{308}", "\u{20}"]),
+        ("\u{1100}\u{D}", &["\u{1100}", "\u{D}"]),
+        ("\u{1100}\u{308}\u{D}", &["\u{1100}\u{308}", "\u{D}"]),
+        ("\u{1100}\u{A}", &["\u{1100}", "\u{A}"]),
+        ("\u{1100}\u{308}\u{A}", &["\u{1100}\u{308}", "\u{A}"]),
+        ("\u{1100}\u{1}", &["\u{1100}", "\u{1}"]),
+        ("\u{1100}\u{308}\u{1}", &["\u{1100}\u{308}", "\u{1}"]),
+        ("\u{1100}\u{300}", &["\u{1100}\u{300}"]),
+        ("\u{1100}\u{308}\u{300}", &["\u{1100}\u{308}\u{300}"]),
+        ("\u{1100}\u{1100}", &["\u{1100}\u{1100}"]),
+        ("\u{1100}\u{308}\u{1100}", &["\u{1100}\u{308}", "\u{1100}"]),
+        ("\u{1100}\u{1160}", &["\u{1100}\u{1160}"]),
+        ("\u{1100}\u{308}\u{1160}", &["\u{1100}\u{308}", "\u{1160}"]),
+        ("\u{1100}\u{11A8}", &["\u{1100}", "\u{11A8}"]),
+        ("\u{1100}\u{308}\u{11A8}", &["\u{1100}\u{308}", "\u{11A8}"]),
+        ("\u{1100}\u{AC00}", &["\u{1100}\u{AC00}"]),
+        ("\u{1100}\u{308}\u{AC00}", &["\u{1100}\u{308}", "\u{AC00}"]),
+        ("\u{1100}\u{AC01}", &["\u{1100}\u{AC01}"]),
+        ("\u{1100}\u{308}\u{AC01}", &["\u{1100}\u{308}", "\u{AC01}"]),
+        ("\u{1100}\u{1F1E6}", &["\u{1100}", "\u{1F1E6}"]),
+        ("\u{1100}\u{308}\u{1F1E6}", &["\u{1100}\u{308}", "\u{1F1E6}"]),
+        ("\u{1100}\u{378}", &["\u{1100}", "\u{378}"]),
+        ("\u{1100}\u{308}\u{378}", &["\u{1100}\u{308}", "\u{378}"]),
+        ("\u{1160}\u{20}", &["\u{1160}", "\u{20}"]),
+        ("\u{1160}\u{308}\u{20}", &["\u{1160}\u{308}", "\u{20}"]),
+        ("\u{1160}\u{D}", &["\u{1160}", "\u{D}"]),
+        ("\u{1160}\u{308}\u{D}", &["\u{1160}\u{308}", "\u{D}"]),
+        ("\u{1160}\u{A}", &["\u{1160}", "\u{A}"]),
+        ("\u{1160}\u{308}\u{A}", &["\u{1160}\u{308}", "\u{A}"]),
+        ("\u{1160}\u{1}", &["\u{1160}", "\u{1}"]),
+        ("\u{1160}\u{308}\u{1}", &["\u{1160}\u{308}", "\u{1}"]),
+        ("\u{1160}\u{300}", &["\u{1160}\u{300}"]),
+        ("\u{1160}\u{308}\u{300}", &["\u{1160}\u{308}\u{300}"]),
+        ("\u{1160}\u{1100}", &["\u{1160}", "\u{1100}"]),
+        ("\u{1160}\u{308}\u{1100}", &["\u{1160}\u{308}", "\u{1100}"]),
+        ("\u{1160}\u{1160}", &["\u{1160}\u{1160}"]),
+        ("\u{1160}\u{308}\u{1160}", &["\u{1160}\u{308}", "\u{1160}"]),
+        ("\u{1160}\u{11A8}", &["\u{1160}\u{11A8}"]),
+        ("\u{1160}\u{308}\u{11A8}", &["\u{1160}\u{308}", "\u{11A8}"]),
+        ("\u{1160}\u{AC00}", &["\u{1160}", "\u{AC00}"]),
+        ("\u{1160}\u{308}\u{AC00}", &["\u{1160}\u{308}", "\u{AC00}"]),
+        ("\u{1160}\u{AC01}", &["\u{1160}", "\u{AC01}"]),
+        ("\u{1160}\u{308}\u{AC01}", &["\u{1160}\u{308}", "\u{AC01}"]),
+        ("\u{1160}\u{1F1E6}", &["\u{1160}", "\u{1F1E6}"]),
+        ("\u{1160}\u{308}\u{1F1E6}", &["\u{1160}\u{308}", "\u{1F1E6}"]),
+        ("\u{1160}\u{378}", &["\u{1160}", "\u{378}"]),
+        ("\u{1160}\u{308}\u{378}", &["\u{1160}\u{308}", "\u{378}"]),
+        ("\u{11A8}\u{20}", &["\u{11A8}", "\u{20}"]),
+        ("\u{11A8}\u{308}\u{20}", &["\u{11A8}\u{308}", "\u{20}"]),
+        ("\u{11A8}\u{D}", &["\u{11A8}", "\u{D}"]),
+        ("\u{11A8}\u{308}\u{D}", &["\u{11A8}\u{308}", "\u{D}"]),
+        ("\u{11A8}\u{A}", &["\u{11A8}", "\u{A}"]),
+        ("\u{11A8}\u{308}\u{A}", &["\u{11A8}\u{308}", "\u{A}"]),
+        ("\u{11A8}\u{1}", &["\u{11A8}", "\u{1}"]),
+        ("\u{11A8}\u{308}\u{1}", &["\u{11A8}\u{308}", "\u{1}"]),
+        ("\u{11A8}\u{300}", &["\u{11A8}\u{300}"]),
+        ("\u{11A8}\u{308}\u{300}", &["\u{11A8}\u{308}\u{300}"]),
+        ("\u{11A8}\u{1100}", &["\u{11A8}", "\u{1100}"]),
+        ("\u{11A8}\u{308}\u{1100}", &["\u{11A8}\u{308}", "\u{1100}"]),
+        ("\u{11A8}\u{1160}", &["\u{11A8}", "\u{1160}"]),
+        ("\u{11A8}\u{308}\u{1160}", &["\u{11A8}\u{308}", "\u{1160}"]),
+        ("\u{11A8}\u{11A8}", &["\u{11A8}\u{11A8}"]),
+        ("\u{11A8}\u{308}\u{11A8}", &["\u{11A8}\u{308}", "\u{11A8}"]),
+        ("\u{11A8}\u{AC00}", &["\u{11A8}", "\u{AC00}"]),
+        ("\u{11A8}\u{308}\u{AC00}", &["\u{11A8}\u{308}", "\u{AC00}"]),
+        ("\u{11A8}\u{AC01}", &["\u{11A8}", "\u{AC01}"]),
+        ("\u{11A8}\u{308}\u{AC01}", &["\u{11A8}\u{308}", "\u{AC01}"]),
+        ("\u{11A8}\u{1F1E6}", &["\u{11A8}", "\u{1F1E6}"]),
+        ("\u{11A8}\u{308}\u{1F1E6}", &["\u{11A8}\u{308}", "\u{1F1E6}"]),
+        ("\u{11A8}\u{378}", &["\u{11A8}", "\u{378}"]),
+        ("\u{11A8}\u{308}\u{378}", &["\u{11A8}\u{308}", "\u{378}"]),
+        ("\u{AC00}\u{20}", &["\u{AC00}", "\u{20}"]),
+        ("\u{AC00}\u{308}\u{20}", &["\u{AC00}\u{308}", "\u{20}"]),
+        ("\u{AC00}\u{D}", &["\u{AC00}", "\u{D}"]),
+        ("\u{AC00}\u{308}\u{D}", &["\u{AC00}\u{308}", "\u{D}"]),
+        ("\u{AC00}\u{A}", &["\u{AC00}", "\u{A}"]),
+        ("\u{AC00}\u{308}\u{A}", &["\u{AC00}\u{308}", "\u{A}"]),
+        ("\u{AC00}\u{1}", &["\u{AC00}", "\u{1}"]),
+        ("\u{AC00}\u{308}\u{1}", &["\u{AC00}\u{308}", "\u{1}"]),
+        ("\u{AC00}\u{300}", &["\u{AC00}\u{300}"]),
+        ("\u{AC00}\u{308}\u{300}", &["\u{AC00}\u{308}\u{300}"]),
+        ("\u{AC00}\u{1100}", &["\u{AC00}", "\u{1100}"]),
+        ("\u{AC00}\u{308}\u{1100}", &["\u{AC00}\u{308}", "\u{1100}"]),
+        ("\u{AC00}\u{1160}", &["\u{AC00}\u{1160}"]),
+        ("\u{AC00}\u{308}\u{1160}", &["\u{AC00}\u{308}", "\u{1160}"]),
+        ("\u{AC00}\u{11A8}", &["\u{AC00}\u{11A8}"]),
+        ("\u{AC00}\u{308}\u{11A8}", &["\u{AC00}\u{308}", "\u{11A8}"]),
+        ("\u{AC00}\u{AC00}", &["\u{AC00}", "\u{AC00}"]),
+        ("\u{AC00}\u{308}\u{AC00}", &["\u{AC00}\u{308}", "\u{AC00}"]),
+        ("\u{AC00}\u{AC01}", &["\u{AC00}", "\u{AC01}"]),
+        ("\u{AC00}\u{308}\u{AC01}", &["\u{AC00}\u{308}", "\u{AC01}"]),
+        ("\u{AC00}\u{1F1E6}", &["\u{AC00}", "\u{1F1E6}"]),
+        ("\u{AC00}\u{308}\u{1F1E6}", &["\u{AC00}\u{308}", "\u{1F1E6}"]),
+        ("\u{AC00}\u{378}", &["\u{AC00}", "\u{378}"]),
+        ("\u{AC00}\u{308}\u{378}", &["\u{AC00}\u{308}", "\u{378}"]),
+        ("\u{AC01}\u{20}", &["\u{AC01}", "\u{20}"]),
+        ("\u{AC01}\u{308}\u{20}", &["\u{AC01}\u{308}", "\u{20}"]),
+        ("\u{AC01}\u{D}", &["\u{AC01}", "\u{D}"]),
+        ("\u{AC01}\u{308}\u{D}", &["\u{AC01}\u{308}", "\u{D}"]),
+        ("\u{AC01}\u{A}", &["\u{AC01}", "\u{A}"]),
+        ("\u{AC01}\u{308}\u{A}", &["\u{AC01}\u{308}", "\u{A}"]),
+        ("\u{AC01}\u{1}", &["\u{AC01}", "\u{1}"]),
+        ("\u{AC01}\u{308}\u{1}", &["\u{AC01}\u{308}", "\u{1}"]),
+        ("\u{AC01}\u{300}", &["\u{AC01}\u{300}"]),
+        ("\u{AC01}\u{308}\u{300}", &["\u{AC01}\u{308}\u{300}"]),
+        ("\u{AC01}\u{1100}", &["\u{AC01}", "\u{1100}"]),
+        ("\u{AC01}\u{308}\u{1100}", &["\u{AC01}\u{308}", "\u{1100}"]),
+        ("\u{AC01}\u{1160}", &["\u{AC01}", "\u{1160}"]),
+        ("\u{AC01}\u{308}\u{1160}", &["\u{AC01}\u{308}", "\u{1160}"]),
+        ("\u{AC01}\u{11A8}", &["\u{AC01}\u{11A8}"]),
+        ("\u{AC01}\u{308}\u{11A8}", &["\u{AC01}\u{308}", "\u{11A8}"]),
+        ("\u{AC01}\u{AC00}", &["\u{AC01}", "\u{AC00}"]),
+        ("\u{AC01}\u{308}\u{AC00}", &["\u{AC01}\u{308}", "\u{AC00}"]),
+        ("\u{AC01}\u{AC01}", &["\u{AC01}", "\u{AC01}"]),
+        ("\u{AC01}\u{308}\u{AC01}", &["\u{AC01}\u{308}", "\u{AC01}"]),
+        ("\u{AC01}\u{1F1E6}", &["\u{AC01}", "\u{1F1E6}"]),
+        ("\u{AC01}\u{308}\u{1F1E6}", &["\u{AC01}\u{308}", "\u{1F1E6}"]),
+        ("\u{AC01}\u{378}", &["\u{AC01}", "\u{378}"]),
+        ("\u{AC01}\u{308}\u{378}", &["\u{AC01}\u{308}", "\u{378}"]),
+        ("\u{1F1E6}\u{20}", &["\u{1F1E6}", "\u{20}"]),
+        ("\u{1F1E6}\u{308}\u{20}", &["\u{1F1E6}\u{308}", "\u{20}"]),
+        ("\u{1F1E6}\u{D}", &["\u{1F1E6}", "\u{D}"]),
+        ("\u{1F1E6}\u{308}\u{D}", &["\u{1F1E6}\u{308}", "\u{D}"]),
+        ("\u{1F1E6}\u{A}", &["\u{1F1E6}", "\u{A}"]),
+        ("\u{1F1E6}\u{308}\u{A}", &["\u{1F1E6}\u{308}", "\u{A}"]),
+        ("\u{1F1E6}\u{1}", &["\u{1F1E6}", "\u{1}"]),
+        ("\u{1F1E6}\u{308}\u{1}", &["\u{1F1E6}\u{308}", "\u{1}"]),
+        ("\u{1F1E6}\u{300}", &["\u{1F1E6}\u{300}"]),
+        ("\u{1F1E6}\u{308}\u{300}", &["\u{1F1E6}\u{308}\u{300}"]),
+        ("\u{1F1E6}\u{1100}", &["\u{1F1E6}", "\u{1100}"]),
+        ("\u{1F1E6}\u{308}\u{1100}", &["\u{1F1E6}\u{308}", "\u{1100}"]),
+        ("\u{1F1E6}\u{1160}", &["\u{1F1E6}", "\u{1160}"]),
+        ("\u{1F1E6}\u{308}\u{1160}", &["\u{1F1E6}\u{308}", "\u{1160}"]),
+        ("\u{1F1E6}\u{11A8}", &["\u{1F1E6}", "\u{11A8}"]),
+        ("\u{1F1E6}\u{308}\u{11A8}", &["\u{1F1E6}\u{308}", "\u{11A8}"]),
+        ("\u{1F1E6}\u{AC00}", &["\u{1F1E6}", "\u{AC00}"]),
+        ("\u{1F1E6}\u{308}\u{AC00}", &["\u{1F1E6}\u{308}", "\u{AC00}"]),
+        ("\u{1F1E6}\u{AC01}", &["\u{1F1E6}", "\u{AC01}"]),
+        ("\u{1F1E6}\u{308}\u{AC01}", &["\u{1F1E6}\u{308}", "\u{AC01}"]),
+        ("\u{1F1E6}\u{1F1E6}", &["\u{1F1E6}\u{1F1E6}"]),
+        ("\u{1F1E6}\u{308}\u{1F1E6}", &["\u{1F1E6}\u{308}", "\u{1F1E6}"]),
+        ("\u{1F1E6}\u{378}", &["\u{1F1E6}", "\u{378}"]),
+        ("\u{1F1E6}\u{308}\u{378}", &["\u{1F1E6}\u{308}", "\u{378}"]),
+        ("\u{378}\u{20}", &["\u{378}", "\u{20}"]),
+        ("\u{378}\u{308}\u{20}", &["\u{378}\u{308}", "\u{20}"]),
+        ("\u{378}\u{D}", &["\u{378}", "\u{D}"]),
+        ("\u{378}\u{308}\u{D}", &["\u{378}\u{308}", "\u{D}"]),
+        ("\u{378}\u{A}", &["\u{378}", "\u{A}"]),
+        ("\u{378}\u{308}\u{A}", &["\u{378}\u{308}", "\u{A}"]),
+        ("\u{378}\u{1}", &["\u{378}", "\u{1}"]),
+        ("\u{378}\u{308}\u{1}", &["\u{378}\u{308}", "\u{1}"]),
+        ("\u{378}\u{300}", &["\u{378}\u{300}"]),
+        ("\u{378}\u{308}\u{300}", &["\u{378}\u{308}\u{300}"]),
+        ("\u{378}\u{1100}", &["\u{378}", "\u{1100}"]),
+        ("\u{378}\u{308}\u{1100}", &["\u{378}\u{308}", "\u{1100}"]),
+        ("\u{378}\u{1160}", &["\u{378}", "\u{1160}"]),
+        ("\u{378}\u{308}\u{1160}", &["\u{378}\u{308}", "\u{1160}"]),
+        ("\u{378}\u{11A8}", &["\u{378}", "\u{11A8}"]),
+        ("\u{378}\u{308}\u{11A8}", &["\u{378}\u{308}", "\u{11A8}"]),
+        ("\u{378}\u{AC00}", &["\u{378}", "\u{AC00}"]),
+        ("\u{378}\u{308}\u{AC00}", &["\u{378}\u{308}", "\u{AC00}"]),
+        ("\u{378}\u{AC01}", &["\u{378}", "\u{AC01}"]),
+        ("\u{378}\u{308}\u{AC01}", &["\u{378}\u{308}", "\u{AC01}"]),
+        ("\u{378}\u{1F1E6}", &["\u{378}", "\u{1F1E6}"]),
+        ("\u{378}\u{308}\u{1F1E6}", &["\u{378}\u{308}", "\u{1F1E6}"]),
+        ("\u{378}\u{378}", &["\u{378}", "\u{378}"]),
+        ("\u{378}\u{308}\u{378}", &["\u{378}\u{308}", "\u{378}"]),
+        ("\u{61}\u{1F1E6}\u{62}", &["\u{61}", "\u{1F1E6}", "\u{62}"]),
+        ("\u{1F1F7}\u{1F1FA}", &["\u{1F1F7}\u{1F1FA}"]),
+        ("\u{1F1F7}\u{1F1FA}\u{1F1F8}", &["\u{1F1F7}\u{1F1FA}\u{1F1F8}"]),
+        ("\u{1F1F7}\u{1F1FA}\u{1F1F8}\u{1F1EA}",
+        &["\u{1F1F7}\u{1F1FA}\u{1F1F8}\u{1F1EA}"]),
+        ("\u{1F1F7}\u{1F1FA}\u{200B}\u{1F1F8}\u{1F1EA}",
+         &["\u{1F1F7}\u{1F1FA}", "\u{200B}", "\u{1F1F8}\u{1F1EA}"]),
+        ("\u{1F1E6}\u{1F1E7}\u{1F1E8}", &["\u{1F1E6}\u{1F1E7}\u{1F1E8}"]),
+        ("\u{1F1E6}\u{200D}\u{1F1E7}\u{1F1E8}", &["\u{1F1E6}\u{200D}",
+         "\u{1F1E7}\u{1F1E8}"]),
+        ("\u{1F1E6}\u{1F1E7}\u{200D}\u{1F1E8}",
+         &["\u{1F1E6}\u{1F1E7}\u{200D}", "\u{1F1E8}"]),
+        ("\u{20}\u{200D}\u{646}", &["\u{20}\u{200D}", "\u{646}"]),
+        ("\u{646}\u{200D}\u{20}", &["\u{646}\u{200D}", "\u{20}"]),
+    ];
+
+    let test_diff: [(_, &[_], &[_]); 23] = [
+        ("\u{20}\u{903}", &["\u{20}\u{903}"], &["\u{20}", "\u{903}"]), ("\u{20}\u{308}\u{903}",
+        &["\u{20}\u{308}\u{903}"], &["\u{20}\u{308}", "\u{903}"]), ("\u{D}\u{308}\u{903}",
+        &["\u{D}", "\u{308}\u{903}"], &["\u{D}", "\u{308}", "\u{903}"]), ("\u{A}\u{308}\u{903}",
+        &["\u{A}", "\u{308}\u{903}"], &["\u{A}", "\u{308}", "\u{903}"]), ("\u{1}\u{308}\u{903}",
+        &["\u{1}", "\u{308}\u{903}"], &["\u{1}", "\u{308}", "\u{903}"]), ("\u{300}\u{903}",
+        &["\u{300}\u{903}"], &["\u{300}", "\u{903}"]), ("\u{300}\u{308}\u{903}",
+        &["\u{300}\u{308}\u{903}"], &["\u{300}\u{308}", "\u{903}"]), ("\u{903}\u{903}",
+        &["\u{903}\u{903}"], &["\u{903}", "\u{903}"]), ("\u{903}\u{308}\u{903}",
+        &["\u{903}\u{308}\u{903}"], &["\u{903}\u{308}", "\u{903}"]), ("\u{1100}\u{903}",
+        &["\u{1100}\u{903}"], &["\u{1100}", "\u{903}"]), ("\u{1100}\u{308}\u{903}",
+        &["\u{1100}\u{308}\u{903}"], &["\u{1100}\u{308}", "\u{903}"]), ("\u{1160}\u{903}",
+        &["\u{1160}\u{903}"], &["\u{1160}", "\u{903}"]), ("\u{1160}\u{308}\u{903}",
+        &["\u{1160}\u{308}\u{903}"], &["\u{1160}\u{308}", "\u{903}"]), ("\u{11A8}\u{903}",
+        &["\u{11A8}\u{903}"], &["\u{11A8}", "\u{903}"]), ("\u{11A8}\u{308}\u{903}",
+        &["\u{11A8}\u{308}\u{903}"], &["\u{11A8}\u{308}", "\u{903}"]), ("\u{AC00}\u{903}",
+        &["\u{AC00}\u{903}"], &["\u{AC00}", "\u{903}"]), ("\u{AC00}\u{308}\u{903}",
+        &["\u{AC00}\u{308}\u{903}"], &["\u{AC00}\u{308}", "\u{903}"]), ("\u{AC01}\u{903}",
+        &["\u{AC01}\u{903}"], &["\u{AC01}", "\u{903}"]), ("\u{AC01}\u{308}\u{903}",
+        &["\u{AC01}\u{308}\u{903}"], &["\u{AC01}\u{308}", "\u{903}"]), ("\u{1F1E6}\u{903}",
+        &["\u{1F1E6}\u{903}"], &["\u{1F1E6}", "\u{903}"]), ("\u{1F1E6}\u{308}\u{903}",
+        &["\u{1F1E6}\u{308}\u{903}"], &["\u{1F1E6}\u{308}", "\u{903}"]), ("\u{378}\u{903}",
+        &["\u{378}\u{903}"], &["\u{378}", "\u{903}"]), ("\u{378}\u{308}\u{903}",
+        &["\u{378}\u{308}\u{903}"], &["\u{378}\u{308}", "\u{903}"]),
+    ];
+
+    for &(s, g) in &test_same[..] {
+        // test forward iterator
+        assert!(order::equals(s.graphemes(true), g.iter().cloned()));
+        assert!(order::equals(s.graphemes(false), g.iter().cloned()));
+
+        // test reverse iterator
+        assert!(order::equals(s.graphemes(true).rev(), g.iter().rev().cloned()));
+        assert!(order::equals(s.graphemes(false).rev(), g.iter().rev().cloned()));
+    }
+
+    for &(s, gt, gf) in &test_diff {
+        // test forward iterator
+        assert!(order::equals(s.graphemes(true), gt.iter().cloned()));
+        assert!(order::equals(s.graphemes(false), gf.iter().cloned()));
+
+        // test reverse iterator
+        assert!(order::equals(s.graphemes(true).rev(), gt.iter().rev().cloned()));
+        assert!(order::equals(s.graphemes(false).rev(), gf.iter().rev().cloned()));
+    }
+
+    // test the indices iterators
+    let s = "a̐éö̲\r\n";
+    let gr_inds = s.grapheme_indices(true).collect::<Vec<(usize, &str)>>();
+    let b: &[_] = &[(0, "a̐"), (3, "é"), (6, "ö̲"), (11, "\r\n")];
+    assert_eq!(gr_inds, b);
+    let gr_inds = s.grapheme_indices(true).rev().collect::<Vec<(usize, &str)>>();
+    let b: &[_] = &[(11, "\r\n"), (6, "ö̲"), (3, "é"), (0, "a̐")];
+    assert_eq!(gr_inds, b);
+    let mut gr_inds_iter = s.grapheme_indices(true);
+    {
+        let gr_inds = gr_inds_iter.by_ref();
+        let e1 = gr_inds.size_hint();
+        assert_eq!(e1, (1, Some(13)));
+        let c = gr_inds.count();
+        assert_eq!(c, 4);
+    }
+    let e2 = gr_inds_iter.size_hint();
+    assert_eq!(e2, (0, Some(0)));
+
+    // make sure the reverse iterator does the right thing with "\n" at beginning of string
+    let s = "\n\r\n\r";
+    let gr = s.graphemes(true).rev().collect::<Vec<&str>>();
+    let b: &[_] = &["\r", "\r\n", "\n"];
+    assert_eq!(gr, b);
+}
+
+#[test]
+fn test_split_strator() {
+    fn t(s: &str, sep: &str, u: &[&str]) {
+        let v: Vec<&str> = s.split_str(sep).collect();
+        assert_eq!(v, u);
+    }
+    t("--1233345--", "12345", &["--1233345--"]);
+    t("abc::hello::there", "::", &["abc", "hello", "there"]);
+    t("::hello::there", "::", &["", "hello", "there"]);
+    t("hello::there::", "::", &["hello", "there", ""]);
+    t("::hello::there::", "::", &["", "hello", "there", ""]);
+    t("ประเทศไทย中华Việt Nam", "中华", &["ประเทศไทย", "Việt Nam"]);
+    t("zzXXXzzYYYzz", "zz", &["", "XXX", "YYY", ""]);
+    t("zzXXXzYYYz", "XXX", &["zz", "zYYYz"]);
+    t(".XXX.YYY.", ".", &["", "XXX", "YYY", ""]);
+    t("", ".", &[""]);
+    t("zz", "zz", &["",""]);
+    t("ok", "z", &["ok"]);
+    t("zzz", "zz", &["","z"]);
+    t("zzzzz", "zz", &["","","z"]);
+}
+
+#[test]
+fn test_str_default() {
+    use std::default::Default;
+
+    fn t<S: Default + Str>() {
+        let s: S = Default::default();
+        assert_eq!(s.as_slice(), "");
+    }
+
+    t::<&str>();
+    t::<String>();
+}
+
+#[test]
+fn test_str_container() {
+    fn sum_len(v: &[&str]) -> usize {
+        v.iter().map(|x| x.len()).sum()
+    }
+
+    let s = String::from_str("01234");
+    assert_eq!(5, sum_len(&["012", "", "34"]));
+    assert_eq!(5, sum_len(&[&String::from_str("01"),
+                            &String::from_str("2"),
+                            &String::from_str("34"),
+                            &String::from_str("")]));
+    assert_eq!(5, sum_len(&[&s]));
+}
+
+#[test]
+fn test_str_from_utf8() {
+    let xs = b"hello";
+    assert_eq!(from_utf8(xs), Ok("hello"));
+
+    let xs = "ศไทย中华Việt Nam".as_bytes();
+    assert_eq!(from_utf8(xs), Ok("ศไทย中华Việt Nam"));
+
+    let xs = b"hello\xFF";
+    assert_eq!(from_utf8(xs), Err(Utf8Error::TooShort));
+}
+
+mod bench {
+    use test::{Bencher, black_box};
+
+    #[bench]
+    fn char_iterator(b: &mut Bencher) {
+        let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
+
+        b.iter(|| s.chars().count());
+    }
+
+    #[bench]
+    fn char_iterator_for(b: &mut Bencher) {
+        let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
+
+        b.iter(|| {
+            for ch in s.chars() { black_box(ch); }
+        });
+    }
+
+    #[bench]
+    fn char_iterator_ascii(b: &mut Bencher) {
+        let s = "Mary had a little lamb, Little lamb
+        Mary had a little lamb, Little lamb
+        Mary had a little lamb, Little lamb
+        Mary had a little lamb, Little lamb
+        Mary had a little lamb, Little lamb
+        Mary had a little lamb, Little lamb";
+
+        b.iter(|| s.chars().count());
+    }
+
+    #[bench]
+    fn char_iterator_rev(b: &mut Bencher) {
+        let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
+
+        b.iter(|| s.chars().rev().count());
+    }
+
+    #[bench]
+    fn char_iterator_rev_for(b: &mut Bencher) {
+        let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
+
+        b.iter(|| {
+            for ch in s.chars().rev() { black_box(ch); }
+        });
+    }
+
+    #[bench]
+    fn char_indicesator(b: &mut Bencher) {
+        let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
+        let len = s.chars().count();
+
+        b.iter(|| assert_eq!(s.char_indices().count(), len));
+    }
+
+    #[bench]
+    fn char_indicesator_rev(b: &mut Bencher) {
+        let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
+        let len = s.chars().count();
+
+        b.iter(|| assert_eq!(s.char_indices().rev().count(), len));
+    }
+
+    #[bench]
+    fn split_unicode_ascii(b: &mut Bencher) {
+        let s = "ประเทศไทย中华Việt Namประเทศไทย中华Việt Nam";
+
+        b.iter(|| assert_eq!(s.split('V').count(), 3));
+    }
+
+    #[bench]
+    fn split_ascii(b: &mut Bencher) {
+        let s = "Mary had a little lamb, Little lamb, little-lamb.";
+        let len = s.split(' ').count();
+
+        b.iter(|| assert_eq!(s.split(' ').count(), len));
+    }
+
+    #[bench]
+    fn split_extern_fn(b: &mut Bencher) {
+        let s = "Mary had a little lamb, Little lamb, little-lamb.";
+        let len = s.split(' ').count();
+        fn pred(c: char) -> bool { c == ' ' }
+
+        b.iter(|| assert_eq!(s.split(pred).count(), len));
+    }
+
+    #[bench]
+    fn split_closure(b: &mut Bencher) {
+        let s = "Mary had a little lamb, Little lamb, little-lamb.";
+        let len = s.split(' ').count();
+
+        b.iter(|| assert_eq!(s.split(|c: char| c == ' ').count(), len));
+    }
+
+    #[bench]
+    fn split_slice(b: &mut Bencher) {
+        let s = "Mary had a little lamb, Little lamb, little-lamb.";
+        let len = s.split(' ').count();
+
+        let c: &[char] = &[' '];
+        b.iter(|| assert_eq!(s.split(c).count(), len));
+    }
+
+    #[bench]
+    fn bench_connect(b: &mut Bencher) {
+        let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
+        let sep = "→";
+        let v = vec![s, s, s, s, s, s, s, s, s, s];
+        b.iter(|| {
+            assert_eq!(v.connect(sep).len(), s.len() * 10 + sep.len() * 9);
+        })
+    }
+
+    #[bench]
+    fn bench_contains_short_short(b: &mut Bencher) {
+        let haystack = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
+        let needle = "sit";
+
+        b.iter(|| {
+            assert!(haystack.contains(needle));
+        })
+    }
+
+    #[bench]
+    fn bench_contains_short_long(b: &mut Bencher) {
+        let haystack = "\
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse quis lorem sit amet dolor \
+ultricies condimentum. Praesent iaculis purus elit, ac malesuada quam malesuada in. Duis sed orci \
+eros. Suspendisse sit amet magna mollis, mollis nunc luctus, imperdiet mi. Integer fringilla non \
+sem ut lacinia. Fusce varius tortor a risus porttitor hendrerit. Morbi mauris dui, ultricies nec \
+tempus vel, gravida nec quam.
+
+In est dui, tincidunt sed tempus interdum, adipiscing laoreet ante. Etiam tempor, tellus quis \
+sagittis interdum, nulla purus mattis sem, quis auctor erat odio ac tellus. In nec nunc sit amet \
+diam volutpat molestie at sed ipsum. Vestibulum laoreet consequat vulputate. Integer accumsan \
+lorem ac dignissim placerat. Suspendisse convallis faucibus lorem. Aliquam erat volutpat. In vel \
+eleifend felis. Sed suscipit nulla lorem, sed mollis est sollicitudin et. Nam fermentum egestas \
+interdum. Curabitur ut nisi justo.
+
+Sed sollicitudin ipsum tellus, ut condimentum leo eleifend nec. Cras ut velit ante. Phasellus nec \
+mollis odio. Mauris molestie erat in arcu mattis, at aliquet dolor vehicula. Quisque malesuada \
+lectus sit amet nisi pretium, a condimentum ipsum porta. Morbi at dapibus diam. Praesent egestas \
+est sed risus elementum, eu rutrum metus ultrices. Etiam fermentum consectetur magna, id rutrum \
+felis accumsan a. Aliquam ut pellentesque libero. Sed mi nulla, lobortis eu tortor id, suscipit \
+ultricies neque. Morbi iaculis sit amet risus at iaculis. Praesent eget ligula quis turpis \
+feugiat suscipit vel non arcu. Interdum et malesuada fames ac ante ipsum primis in faucibus. \
+Aliquam sit amet placerat lorem.
+
+Cras a lacus vel ante posuere elementum. Nunc est leo, bibendum ut facilisis vel, bibendum at \
+mauris. Nullam adipiscing diam vel odio ornare, luctus adipiscing mi luctus. Nulla facilisi. \
+Mauris adipiscing bibendum neque, quis adipiscing lectus tempus et. Sed feugiat erat et nisl \
+lobortis pharetra. Donec vitae erat enim. Nullam sit amet felis et quam lacinia tincidunt. Aliquam \
+suscipit dapibus urna. Sed volutpat urna in magna pulvinar volutpat. Phasellus nec tellus ac diam \
+cursus accumsan.
+
+Nam lectus enim, dapibus non nisi tempor, consectetur convallis massa. Maecenas eleifend dictum \
+feugiat. Etiam quis mauris vel risus luctus mattis a a nunc. Nullam orci quam, imperdiet id \
+vehicula in, porttitor ut nibh. Duis sagittis adipiscing nisl vitae congue. Donec mollis risus eu \
+leo suscipit, varius porttitor nulla porta. Pellentesque ut sem nec nisi euismod vehicula. Nulla \
+malesuada sollicitudin quam eu fermentum.";
+        let needle = "english";
+
+        b.iter(|| {
+            assert!(!haystack.contains(needle));
+        })
+    }
+
+    #[bench]
+    fn bench_contains_bad_naive(b: &mut Bencher) {
+        let haystack = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
+        let needle = "aaaaaaaab";
+
+        b.iter(|| {
+            assert!(!haystack.contains(needle));
+        })
+    }
+
+    #[bench]
+    fn bench_contains_equal(b: &mut Bencher) {
+        let haystack = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
+        let needle = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
+
+        b.iter(|| {
+            assert!(haystack.contains(needle));
+        })
+    }
+}
diff --git a/src/libcollectionstest/string.rs b/src/libcollectionstest/string.rs
new file mode 100644 (file)
index 0000000..4768d5e
--- /dev/null
@@ -0,0 +1,453 @@
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::borrow::IntoCow;
+use std::iter::repeat;
+use std::str::Utf8Error;
+use std::string::{CowString, as_string};
+
+use test::Bencher;
+
+#[test]
+fn test_as_string() {
+    let x = "foo";
+    assert_eq!(x, &**as_string(x));
+}
+
+#[test]
+fn test_from_str() {
+  let owned: Option<::std::string::String> = "string".parse().ok();
+  assert_eq!(owned.as_ref().map(|s| &**s), Some("string"));
+}
+
+#[test]
+fn test_unsized_to_string() {
+    let s: &str = "abc";
+    let _: String = (*s).to_string();
+}
+
+#[test]
+fn test_from_utf8() {
+    let xs = b"hello".to_vec();
+    assert_eq!(String::from_utf8(xs).unwrap(),
+               String::from_str("hello"));
+
+    let xs = "ศไทย中华Việt Nam".as_bytes().to_vec();
+    assert_eq!(String::from_utf8(xs).unwrap(),
+               String::from_str("ศไทย中华Việt Nam"));
+
+    let xs = b"hello\xFF".to_vec();
+    let err = String::from_utf8(xs).err().unwrap();
+    assert_eq!(err.utf8_error(), Utf8Error::TooShort);
+    assert_eq!(err.into_bytes(), b"hello\xff".to_vec());
+}
+
+#[test]
+fn test_from_utf8_lossy() {
+    let xs = b"hello";
+    let ys: CowString = "hello".into_cow();
+    assert_eq!(String::from_utf8_lossy(xs), ys);
+
+    let xs = "ศไทย中华Việt Nam".as_bytes();
+    let ys: CowString = "ศไทย中华Việt Nam".into_cow();
+    assert_eq!(String::from_utf8_lossy(xs), ys);
+
+    let xs = b"Hello\xC2 There\xFF Goodbye";
+    assert_eq!(String::from_utf8_lossy(xs),
+               String::from_str("Hello\u{FFFD} There\u{FFFD} Goodbye").into_cow());
+
+    let xs = b"Hello\xC0\x80 There\xE6\x83 Goodbye";
+    assert_eq!(String::from_utf8_lossy(xs),
+               String::from_str("Hello\u{FFFD}\u{FFFD} There\u{FFFD} Goodbye").into_cow());
+
+    let xs = b"\xF5foo\xF5\x80bar";
+    assert_eq!(String::from_utf8_lossy(xs),
+               String::from_str("\u{FFFD}foo\u{FFFD}\u{FFFD}bar").into_cow());
+
+    let xs = b"\xF1foo\xF1\x80bar\xF1\x80\x80baz";
+    assert_eq!(String::from_utf8_lossy(xs),
+               String::from_str("\u{FFFD}foo\u{FFFD}bar\u{FFFD}baz").into_cow());
+
+    let xs = b"\xF4foo\xF4\x80bar\xF4\xBFbaz";
+    assert_eq!(String::from_utf8_lossy(xs),
+               String::from_str("\u{FFFD}foo\u{FFFD}bar\u{FFFD}\u{FFFD}baz").into_cow());
+
+    let xs = b"\xF0\x80\x80\x80foo\xF0\x90\x80\x80bar";
+    assert_eq!(String::from_utf8_lossy(xs), String::from_str("\u{FFFD}\u{FFFD}\u{FFFD}\u{FFFD}\
+                                           foo\u{10000}bar").into_cow());
+
+    // surrogates
+    let xs = b"\xED\xA0\x80foo\xED\xBF\xBFbar";
+    assert_eq!(String::from_utf8_lossy(xs), String::from_str("\u{FFFD}\u{FFFD}\u{FFFD}foo\
+                                           \u{FFFD}\u{FFFD}\u{FFFD}bar").into_cow());
+}
+
+#[test]
+fn test_from_utf16() {
+    let pairs =
+        [(String::from_str("𐍅𐌿𐌻𐍆𐌹𐌻𐌰\n"),
+          vec![0xd800, 0xdf45, 0xd800, 0xdf3f,
+            0xd800, 0xdf3b, 0xd800, 0xdf46,
+            0xd800, 0xdf39, 0xd800, 0xdf3b,
+            0xd800, 0xdf30, 0x000a]),
+
+         (String::from_str("𐐒𐑉𐐮𐑀𐐲𐑋 𐐏𐐲𐑍\n"),
+          vec![0xd801, 0xdc12, 0xd801,
+            0xdc49, 0xd801, 0xdc2e, 0xd801,
+            0xdc40, 0xd801, 0xdc32, 0xd801,
+            0xdc4b, 0x0020, 0xd801, 0xdc0f,
+            0xd801, 0xdc32, 0xd801, 0xdc4d,
+            0x000a]),
+
+         (String::from_str("𐌀𐌖𐌋𐌄𐌑𐌉·𐌌𐌄𐌕𐌄𐌋𐌉𐌑\n"),
+          vec![0xd800, 0xdf00, 0xd800, 0xdf16,
+            0xd800, 0xdf0b, 0xd800, 0xdf04,
+            0xd800, 0xdf11, 0xd800, 0xdf09,
+            0x00b7, 0xd800, 0xdf0c, 0xd800,
+            0xdf04, 0xd800, 0xdf15, 0xd800,
+            0xdf04, 0xd800, 0xdf0b, 0xd800,
+            0xdf09, 0xd800, 0xdf11, 0x000a ]),
+
+         (String::from_str("𐒋𐒘𐒈𐒑𐒛𐒒 𐒕𐒓 𐒈𐒚𐒍 𐒏𐒜𐒒𐒖𐒆 𐒕𐒆\n"),
+          vec![0xd801, 0xdc8b, 0xd801, 0xdc98,
+            0xd801, 0xdc88, 0xd801, 0xdc91,
+            0xd801, 0xdc9b, 0xd801, 0xdc92,
+            0x0020, 0xd801, 0xdc95, 0xd801,
+            0xdc93, 0x0020, 0xd801, 0xdc88,
+            0xd801, 0xdc9a, 0xd801, 0xdc8d,
+            0x0020, 0xd801, 0xdc8f, 0xd801,
+            0xdc9c, 0xd801, 0xdc92, 0xd801,
+            0xdc96, 0xd801, 0xdc86, 0x0020,
+            0xd801, 0xdc95, 0xd801, 0xdc86,
+            0x000a ]),
+         // Issue #12318, even-numbered non-BMP planes
+         (String::from_str("\u{20000}"),
+          vec![0xD840, 0xDC00])];
+
+    for p in &pairs {
+        let (s, u) = (*p).clone();
+        let s_as_utf16 = s.utf16_units().collect::<Vec<u16>>();
+        let u_as_string = String::from_utf16(&u).unwrap();
+
+        assert!(::unicode::str::is_utf16(&u));
+        assert_eq!(s_as_utf16, u);
+
+        assert_eq!(u_as_string, s);
+        assert_eq!(String::from_utf16_lossy(&u), s);
+
+        assert_eq!(String::from_utf16(&s_as_utf16).unwrap(), s);
+        assert_eq!(u_as_string.utf16_units().collect::<Vec<u16>>(), u);
+    }
+}
+
+#[test]
+fn test_utf16_invalid() {
+    // completely positive cases tested above.
+    // lead + eof
+    assert!(String::from_utf16(&[0xD800]).is_err());
+    // lead + lead
+    assert!(String::from_utf16(&[0xD800, 0xD800]).is_err());
+
+    // isolated trail
+    assert!(String::from_utf16(&[0x0061, 0xDC00]).is_err());
+
+    // general
+    assert!(String::from_utf16(&[0xD800, 0xd801, 0xdc8b, 0xD800]).is_err());
+}
+
+#[test]
+fn test_from_utf16_lossy() {
+    // completely positive cases tested above.
+    // lead + eof
+    assert_eq!(String::from_utf16_lossy(&[0xD800]), String::from_str("\u{FFFD}"));
+    // lead + lead
+    assert_eq!(String::from_utf16_lossy(&[0xD800, 0xD800]),
+               String::from_str("\u{FFFD}\u{FFFD}"));
+
+    // isolated trail
+    assert_eq!(String::from_utf16_lossy(&[0x0061, 0xDC00]), String::from_str("a\u{FFFD}"));
+
+    // general
+    assert_eq!(String::from_utf16_lossy(&[0xD800, 0xd801, 0xdc8b, 0xD800]),
+               String::from_str("\u{FFFD}𐒋\u{FFFD}"));
+}
+
+#[test]
+fn test_push_bytes() {
+    let mut s = String::from_str("ABC");
+    unsafe {
+        let mv = s.as_mut_vec();
+        mv.push_all(&[b'D']);
+    }
+    assert_eq!(s, "ABCD");
+}
+
+#[test]
+fn test_push_str() {
+    let mut s = String::new();
+    s.push_str("");
+    assert_eq!(&s[0..], "");
+    s.push_str("abc");
+    assert_eq!(&s[0..], "abc");
+    s.push_str("ประเทศไทย中华Việt Nam");
+    assert_eq!(&s[0..], "abcประเทศไทย中华Việt Nam");
+}
+
+#[test]
+fn test_push() {
+    let mut data = String::from_str("ประเทศไทย中");
+    data.push('华');
+    data.push('b'); // 1 byte
+    data.push('¢'); // 2 byte
+    data.push('€'); // 3 byte
+    data.push('𤭢'); // 4 byte
+    assert_eq!(data, "ประเทศไทย中华b¢€𤭢");
+}
+
+#[test]
+fn test_pop() {
+    let mut data = String::from_str("ประเทศไทย中华b¢€𤭢");
+    assert_eq!(data.pop().unwrap(), '𤭢'); // 4 bytes
+    assert_eq!(data.pop().unwrap(), '€'); // 3 bytes
+    assert_eq!(data.pop().unwrap(), '¢'); // 2 bytes
+    assert_eq!(data.pop().unwrap(), 'b'); // 1 bytes
+    assert_eq!(data.pop().unwrap(), '华');
+    assert_eq!(data, "ประเทศไทย中");
+}
+
+#[test]
+fn test_str_truncate() {
+    let mut s = String::from_str("12345");
+    s.truncate(5);
+    assert_eq!(s, "12345");
+    s.truncate(3);
+    assert_eq!(s, "123");
+    s.truncate(0);
+    assert_eq!(s, "");
+
+    let mut s = String::from_str("12345");
+    let p = s.as_ptr();
+    s.truncate(3);
+    s.push_str("6");
+    let p_ = s.as_ptr();
+    assert_eq!(p_, p);
+}
+
+#[test]
+#[should_panic]
+fn test_str_truncate_invalid_len() {
+    let mut s = String::from_str("12345");
+    s.truncate(6);
+}
+
+#[test]
+#[should_panic]
+fn test_str_truncate_split_codepoint() {
+    let mut s = String::from_str("\u{FC}"); // ü
+    s.truncate(1);
+}
+
+#[test]
+fn test_str_clear() {
+    let mut s = String::from_str("12345");
+    s.clear();
+    assert_eq!(s.len(), 0);
+    assert_eq!(s, "");
+}
+
+#[test]
+fn test_str_add() {
+    let a = String::from_str("12345");
+    let b = a + "2";
+    let b = b + "2";
+    assert_eq!(b.len(), 7);
+    assert_eq!(b, "1234522");
+}
+
+#[test]
+fn remove() {
+    let mut s = "ศไทย中华Việt Nam; foobar".to_string();;
+    assert_eq!(s.remove(0), 'ศ');
+    assert_eq!(s.len(), 33);
+    assert_eq!(s, "ไทย中华Việt Nam; foobar");
+    assert_eq!(s.remove(17), 'ệ');
+    assert_eq!(s, "ไทย中华Vit Nam; foobar");
+}
+
+#[test] #[should_panic]
+fn remove_bad() {
+    "ศ".to_string().remove(1);
+}
+
+#[test]
+fn insert() {
+    let mut s = "foobar".to_string();
+    s.insert(0, 'ệ');
+    assert_eq!(s, "ệfoobar");
+    s.insert(6, 'ย');
+    assert_eq!(s, "ệfooยbar");
+}
+
+#[test] #[should_panic] fn insert_bad1() { "".to_string().insert(1, 't'); }
+#[test] #[should_panic] fn insert_bad2() { "ệ".to_string().insert(1, 't'); }
+
+#[test]
+fn test_slicing() {
+    let s = "foobar".to_string();
+    assert_eq!("foobar", &s[..]);
+    assert_eq!("foo", &s[..3]);
+    assert_eq!("bar", &s[3..]);
+    assert_eq!("oob", &s[1..4]);
+}
+
+#[test]
+fn test_simple_types() {
+    assert_eq!(1.to_string(), "1");
+    assert_eq!((-1).to_string(), "-1");
+    assert_eq!(200.to_string(), "200");
+    assert_eq!(2.to_string(), "2");
+    assert_eq!(true.to_string(), "true");
+    assert_eq!(false.to_string(), "false");
+    assert_eq!(("hi".to_string()).to_string(), "hi");
+}
+
+#[test]
+fn test_vectors() {
+    let x: Vec<i32> = vec![];
+    assert_eq!(format!("{:?}", x), "[]");
+    assert_eq!(format!("{:?}", vec![1]), "[1]");
+    assert_eq!(format!("{:?}", vec![1, 2, 3]), "[1, 2, 3]");
+    assert!(format!("{:?}", vec![vec![], vec![1], vec![1, 1]]) ==
+           "[[], [1], [1, 1]]");
+}
+
+#[test]
+fn test_from_iterator() {
+    let s = "ศไทย中华Việt Nam".to_string();
+    let t = "ศไทย中华";
+    let u = "Việt Nam";
+
+    let a: String = s.chars().collect();
+    assert_eq!(s, a);
+
+    let mut b = t.to_string();
+    b.extend(u.chars());
+    assert_eq!(s, b);
+
+    let c: String = vec![t, u].into_iter().collect();
+    assert_eq!(s, c);
+
+    let mut d = t.to_string();
+    d.extend(vec![u].into_iter());
+    assert_eq!(s, d);
+}
+
+#[bench]
+fn bench_with_capacity(b: &mut Bencher) {
+    b.iter(|| {
+        String::with_capacity(100)
+    });
+}
+
+#[bench]
+fn bench_push_str(b: &mut Bencher) {
+    let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
+    b.iter(|| {
+        let mut r = String::new();
+        r.push_str(s);
+    });
+}
+
+const REPETITIONS: u64 = 10_000;
+
+#[bench]
+fn bench_push_str_one_byte(b: &mut Bencher) {
+    b.bytes = REPETITIONS;
+    b.iter(|| {
+        let mut r = String::new();
+        for _ in 0..REPETITIONS {
+            r.push_str("a")
+        }
+    });
+}
+
+#[bench]
+fn bench_push_char_one_byte(b: &mut Bencher) {
+    b.bytes = REPETITIONS;
+    b.iter(|| {
+        let mut r = String::new();
+        for _ in 0..REPETITIONS {
+            r.push('a')
+        }
+    });
+}
+
+#[bench]
+fn bench_push_char_two_bytes(b: &mut Bencher) {
+    b.bytes = REPETITIONS * 2;
+    b.iter(|| {
+        let mut r = String::new();
+        for _ in 0..REPETITIONS {
+            r.push('â')
+        }
+    });
+}
+
+#[bench]
+fn from_utf8_lossy_100_ascii(b: &mut Bencher) {
+    let s = b"Hello there, the quick brown fox jumped over the lazy dog! \
+              Lorem ipsum dolor sit amet, consectetur. ";
+
+    assert_eq!(100, s.len());
+    b.iter(|| {
+        let _ = String::from_utf8_lossy(s);
+    });
+}
+
+#[bench]
+fn from_utf8_lossy_100_multibyte(b: &mut Bencher) {
+    let s = "𐌀𐌖𐌋𐌄𐌑𐌉ปรدولة الكويتทศไทย中华𐍅𐌿𐌻𐍆𐌹𐌻𐌰".as_bytes();
+    assert_eq!(100, s.len());
+    b.iter(|| {
+        let _ = String::from_utf8_lossy(s);
+    });
+}
+
+#[bench]
+fn from_utf8_lossy_invalid(b: &mut Bencher) {
+    let s = b"Hello\xC0\x80 There\xE6\x83 Goodbye";
+    b.iter(|| {
+        let _ = String::from_utf8_lossy(s);
+    });
+}
+
+#[bench]
+fn from_utf8_lossy_100_invalid(b: &mut Bencher) {
+    let s = repeat(0xf5).take(100).collect::<Vec<_>>();
+    b.iter(|| {
+        let _ = String::from_utf8_lossy(&s);
+    });
+}
+
+#[bench]
+fn bench_exact_size_shrink_to_fit(b: &mut Bencher) {
+    let s = "Hello there, the quick brown fox jumped over the lazy dog! \
+             Lorem ipsum dolor sit amet, consectetur. ";
+    // ensure our operation produces an exact-size string before we benchmark it
+    let mut r = String::with_capacity(s.len());
+    r.push_str(s);
+    assert_eq!(r.len(), r.capacity());
+    b.iter(|| {
+        let mut r = String::with_capacity(s.len());
+        r.push_str(s);
+        r.shrink_to_fit();
+        r
+    });
+}
diff --git a/src/libcollectionstest/vec.rs b/src/libcollectionstest/vec.rs
new file mode 100644 (file)
index 0000000..2923bea
--- /dev/null
@@ -0,0 +1,994 @@
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::iter::{FromIterator, repeat};
+use std::mem::size_of;
+use std::vec::as_vec;
+
+use test::Bencher;
+
+struct DropCounter<'a> {
+    count: &'a mut u32
+}
+
+#[unsafe_destructor]
+impl<'a> Drop for DropCounter<'a> {
+    fn drop(&mut self) {
+        *self.count += 1;
+    }
+}
+
+#[test]
+fn test_as_vec() {
+    let xs = [1u8, 2u8, 3u8];
+    assert_eq!(&**as_vec(&xs), xs);
+}
+
+#[test]
+fn test_as_vec_dtor() {
+    let (mut count_x, mut count_y) = (0, 0);
+    {
+        let xs = &[DropCounter { count: &mut count_x }, DropCounter { count: &mut count_y }];
+        assert_eq!(as_vec(xs).len(), 2);
+    }
+    assert_eq!(count_x, 1);
+    assert_eq!(count_y, 1);
+}
+
+#[test]
+fn test_small_vec_struct() {
+    assert!(size_of::<Vec<u8>>() == size_of::<usize>() * 3);
+}
+
+#[test]
+fn test_double_drop() {
+    struct TwoVec<T> {
+        x: Vec<T>,
+        y: Vec<T>
+    }
+
+    let (mut count_x, mut count_y) = (0, 0);
+    {
+        let mut tv = TwoVec {
+            x: Vec::new(),
+            y: Vec::new()
+        };
+        tv.x.push(DropCounter {count: &mut count_x});
+        tv.y.push(DropCounter {count: &mut count_y});
+
+        // If Vec had a drop flag, here is where it would be zeroed.
+        // Instead, it should rely on its internal state to prevent
+        // doing anything significant when dropped multiple times.
+        drop(tv.x);
+
+        // Here tv goes out of scope, tv.y should be dropped, but not tv.x.
+    }
+
+    assert_eq!(count_x, 1);
+    assert_eq!(count_y, 1);
+}
+
+#[test]
+fn test_reserve() {
+    let mut v = Vec::new();
+    assert_eq!(v.capacity(), 0);
+
+    v.reserve(2);
+    assert!(v.capacity() >= 2);
+
+    for i in 0..16 {
+        v.push(i);
+    }
+
+    assert!(v.capacity() >= 16);
+    v.reserve(16);
+    assert!(v.capacity() >= 32);
+
+    v.push(16);
+
+    v.reserve(16);
+    assert!(v.capacity() >= 33)
+}
+
+#[test]
+fn test_extend() {
+    let mut v = Vec::new();
+    let mut w = Vec::new();
+
+    v.extend(0..3);
+    for i in 0..3 { w.push(i) }
+
+    assert_eq!(v, w);
+
+    v.extend(3..10);
+    for i in 3..10 { w.push(i) }
+
+    assert_eq!(v, w);
+}
+
+#[test]
+fn test_slice_from_mut() {
+    let mut values = vec![1, 2, 3, 4, 5];
+    {
+        let slice = &mut values[2 ..];
+        assert!(slice == [3, 4, 5]);
+        for p in slice {
+            *p += 2;
+        }
+    }
+
+    assert!(values == [1, 2, 5, 6, 7]);
+}
+
+#[test]
+fn test_slice_to_mut() {
+    let mut values = vec![1, 2, 3, 4, 5];
+    {
+        let slice = &mut values[.. 2];
+        assert!(slice == [1, 2]);
+        for p in slice {
+            *p += 1;
+        }
+    }
+
+    assert!(values == [2, 3, 3, 4, 5]);
+}
+
+#[test]
+fn test_split_at_mut() {
+    let mut values = vec![1, 2, 3, 4, 5];
+    {
+        let (left, right) = values.split_at_mut(2);
+        {
+            let left: &[_] = left;
+            assert!(&left[..left.len()] == &[1, 2]);
+        }
+        for p in left {
+            *p += 1;
+        }
+
+        {
+            let right: &[_] = right;
+            assert!(&right[..right.len()] == &[3, 4, 5]);
+        }
+        for p in right {
+            *p += 2;
+        }
+    }
+
+    assert_eq!(values, [2, 3, 5, 6, 7]);
+}
+
+#[test]
+fn test_clone() {
+    let v: Vec<i32> = vec![];
+    let w = vec!(1, 2, 3);
+
+    assert_eq!(v, v.clone());
+
+    let z = w.clone();
+    assert_eq!(w, z);
+    // they should be disjoint in memory.
+    assert!(w.as_ptr() != z.as_ptr())
+}
+
+#[test]
+fn test_clone_from() {
+    let mut v = vec!();
+    let three: Vec<Box<_>> = vec!(box 1, box 2, box 3);
+    let two: Vec<Box<_>> = vec!(box 4, box 5);
+    // zero, long
+    v.clone_from(&three);
+    assert_eq!(v, three);
+
+    // equal
+    v.clone_from(&three);
+    assert_eq!(v, three);
+
+    // long, short
+    v.clone_from(&two);
+    assert_eq!(v, two);
+
+    // short, long
+    v.clone_from(&three);
+    assert_eq!(v, three)
+}
+
+#[test]
+fn test_retain() {
+    let mut vec = vec![1, 2, 3, 4];
+    vec.retain(|&x| x % 2 == 0);
+    assert_eq!(vec, [2, 4]);
+}
+
+#[test]
+fn zero_sized_values() {
+    let mut v = Vec::new();
+    assert_eq!(v.len(), 0);
+    v.push(());
+    assert_eq!(v.len(), 1);
+    v.push(());
+    assert_eq!(v.len(), 2);
+    assert_eq!(v.pop(), Some(()));
+    assert_eq!(v.pop(), Some(()));
+    assert_eq!(v.pop(), None);
+
+    assert_eq!(v.iter().count(), 0);
+    v.push(());
+    assert_eq!(v.iter().count(), 1);
+    v.push(());
+    assert_eq!(v.iter().count(), 2);
+
+    for &() in &v {}
+
+    assert_eq!(v.iter_mut().count(), 2);
+    v.push(());
+    assert_eq!(v.iter_mut().count(), 3);
+    v.push(());
+    assert_eq!(v.iter_mut().count(), 4);
+
+    for &mut () in &mut v {}
+    unsafe { v.set_len(0); }
+    assert_eq!(v.iter_mut().count(), 0);
+}
+
+#[test]
+fn test_partition() {
+    assert_eq!(vec![].into_iter().partition(|x: &i32| *x < 3), (vec![], vec![]));
+    assert_eq!(vec![1, 2, 3].into_iter().partition(|x| *x < 4), (vec![1, 2, 3], vec![]));
+    assert_eq!(vec![1, 2, 3].into_iter().partition(|x| *x < 2), (vec![1], vec![2, 3]));
+    assert_eq!(vec![1, 2, 3].into_iter().partition(|x| *x < 0), (vec![], vec![1, 2, 3]));
+}
+
+#[test]
+fn test_zip_unzip() {
+    let z1 = vec![(1, 4), (2, 5), (3, 6)];
+
+    let (left, right): (Vec<_>, Vec<_>) = z1.iter().cloned().unzip();
+
+    assert_eq!((1, 4), (left[0], right[0]));
+    assert_eq!((2, 5), (left[1], right[1]));
+    assert_eq!((3, 6), (left[2], right[2]));
+}
+
+#[test]
+fn test_unsafe_ptrs() {
+    unsafe {
+        // Test on-stack copy-from-buf.
+        let a = [1, 2, 3];
+        let ptr = a.as_ptr();
+        let b = Vec::from_raw_buf(ptr, 3);
+        assert_eq!(b, [1, 2, 3]);
+
+        // Test on-heap copy-from-buf.
+        let c = vec![1, 2, 3, 4, 5];
+        let ptr = c.as_ptr();
+        let d = Vec::from_raw_buf(ptr, 5);
+        assert_eq!(d, [1, 2, 3, 4, 5]);
+    }
+}
+
+#[test]
+fn test_vec_truncate_drop() {
+    static mut drops: u32 = 0;
+    struct Elem(i32);
+    impl Drop for Elem {
+        fn drop(&mut self) {
+            unsafe { drops += 1; }
+        }
+    }
+
+    let mut v = vec![Elem(1), Elem(2), Elem(3), Elem(4), Elem(5)];
+    assert_eq!(unsafe { drops }, 0);
+    v.truncate(3);
+    assert_eq!(unsafe { drops }, 2);
+    v.truncate(0);
+    assert_eq!(unsafe { drops }, 5);
+}
+
+#[test]
+#[should_panic]
+fn test_vec_truncate_fail() {
+    struct BadElem(i32);
+    impl Drop for BadElem {
+        fn drop(&mut self) {
+            let BadElem(ref mut x) = *self;
+            if *x == 0xbadbeef {
+                panic!("BadElem panic: 0xbadbeef")
+            }
+        }
+    }
+
+    let mut v = vec![BadElem(1), BadElem(2), BadElem(0xbadbeef), BadElem(4)];
+    v.truncate(0);
+}
+
+#[test]
+fn test_index() {
+    let vec = vec![1, 2, 3];
+    assert!(vec[1] == 2);
+}
+
+#[test]
+#[should_panic]
+fn test_index_out_of_bounds() {
+    let vec = vec![1, 2, 3];
+    let _ = vec[3];
+}
+
+#[test]
+#[should_panic]
+fn test_slice_out_of_bounds_1() {
+    let x = vec![1, 2, 3, 4, 5];
+    &x[-1..];
+}
+
+#[test]
+#[should_panic]
+fn test_slice_out_of_bounds_2() {
+    let x = vec![1, 2, 3, 4, 5];
+    &x[..6];
+}
+
+#[test]
+#[should_panic]
+fn test_slice_out_of_bounds_3() {
+    let x = vec![1, 2, 3, 4, 5];
+    &x[-1..4];
+}
+
+#[test]
+#[should_panic]
+fn test_slice_out_of_bounds_4() {
+    let x = vec![1, 2, 3, 4, 5];
+    &x[1..6];
+}
+
+#[test]
+#[should_panic]
+fn test_slice_out_of_bounds_5() {
+    let x = vec![1, 2, 3, 4, 5];
+    &x[3..2];
+}
+
+#[test]
+#[should_panic]
+fn test_swap_remove_empty() {
+    let mut vec= Vec::<i32>::new();
+    vec.swap_remove(0);
+}
+
+#[test]
+fn test_move_iter_unwrap() {
+    let mut vec = Vec::with_capacity(7);
+    vec.push(1);
+    vec.push(2);
+    let ptr = vec.as_ptr();
+    vec = vec.into_iter().into_inner();
+    assert_eq!(vec.as_ptr(), ptr);
+    assert_eq!(vec.capacity(), 7);
+    assert_eq!(vec.len(), 0);
+}
+
+#[test]
+#[should_panic]
+fn test_map_in_place_incompatible_types_fail() {
+    let v = vec![0, 1, 2];
+    v.map_in_place(|_| ());
+}
+
+#[test]
+fn test_map_in_place() {
+    let v = vec![0, 1, 2];
+    assert_eq!(v.map_in_place(|i: u32| i as i32 - 1), [-1, 0, 1]);
+}
+
+#[test]
+fn test_map_in_place_zero_sized() {
+    let v = vec![(), ()];
+    #[derive(PartialEq, Debug)]
+    struct ZeroSized;
+    assert_eq!(v.map_in_place(|_| ZeroSized), [ZeroSized, ZeroSized]);
+}
+
+#[test]
+fn test_map_in_place_zero_drop_count() {
+    use std::sync::atomic::{AtomicUsize, Ordering, ATOMIC_USIZE_INIT};
+
+    #[derive(Clone, PartialEq, Debug)]
+    struct Nothing;
+    impl Drop for Nothing { fn drop(&mut self) { } }
+
+    #[derive(Clone, PartialEq, Debug)]
+    struct ZeroSized;
+    impl Drop for ZeroSized {
+        fn drop(&mut self) {
+            DROP_COUNTER.fetch_add(1, Ordering::Relaxed);
+        }
+    }
+    const NUM_ELEMENTS: usize = 2;
+    static DROP_COUNTER: AtomicUsize = ATOMIC_USIZE_INIT;
+
+    let v = repeat(Nothing).take(NUM_ELEMENTS).collect::<Vec<_>>();
+
+    DROP_COUNTER.store(0, Ordering::Relaxed);
+
+    let v = v.map_in_place(|_| ZeroSized);
+    assert_eq!(DROP_COUNTER.load(Ordering::Relaxed), 0);
+    drop(v);
+    assert_eq!(DROP_COUNTER.load(Ordering::Relaxed), NUM_ELEMENTS);
+}
+
+#[test]
+fn test_move_items() {
+    let vec = vec![1, 2, 3];
+    let mut vec2 = vec![];
+    for i in vec {
+        vec2.push(i);
+    }
+    assert_eq!(vec2, [1, 2, 3]);
+}
+
+#[test]
+fn test_move_items_reverse() {
+    let vec = vec![1, 2, 3];
+    let mut vec2 = vec![];
+    for i in vec.into_iter().rev() {
+        vec2.push(i);
+    }
+    assert_eq!(vec2, [3, 2, 1]);
+}
+
+#[test]
+fn test_move_items_zero_sized() {
+    let vec = vec![(), (), ()];
+    let mut vec2 = vec![];
+    for i in vec {
+        vec2.push(i);
+    }
+    assert_eq!(vec2, [(), (), ()]);
+}
+
+#[test]
+fn test_drain_items() {
+    let mut vec = vec![1, 2, 3];
+    let mut vec2 = vec![];
+    for i in vec.drain() {
+        vec2.push(i);
+    }
+    assert_eq!(vec, []);
+    assert_eq!(vec2, [ 1, 2, 3 ]);
+}
+
+#[test]
+fn test_drain_items_reverse() {
+    let mut vec = vec![1, 2, 3];
+    let mut vec2 = vec![];
+    for i in vec.drain().rev() {
+        vec2.push(i);
+    }
+    assert_eq!(vec, []);
+    assert_eq!(vec2, [3, 2, 1]);
+}
+
+#[test]
+fn test_drain_items_zero_sized() {
+    let mut vec = vec![(), (), ()];
+    let mut vec2 = vec![];
+    for i in vec.drain() {
+        vec2.push(i);
+    }
+    assert_eq!(vec, []);
+    assert_eq!(vec2, [(), (), ()]);
+}
+
+#[test]
+fn test_into_boxed_slice() {
+    let xs = vec![1, 2, 3];
+    let ys = xs.into_boxed_slice();
+    assert_eq!(&*ys, [1, 2, 3]);
+}
+
+#[test]
+fn test_append() {
+    let mut vec = vec![1, 2, 3];
+    let mut vec2 = vec![4, 5, 6];
+    vec.append(&mut vec2);
+    assert_eq!(vec, [1, 2, 3, 4, 5, 6]);
+    assert_eq!(vec2, []);
+}
+
+#[test]
+fn test_split_off() {
+    let mut vec = vec![1, 2, 3, 4, 5, 6];
+    let vec2 = vec.split_off(4);
+    assert_eq!(vec, [1, 2, 3, 4]);
+    assert_eq!(vec2, [5, 6]);
+}
+
+#[bench]
+fn bench_new(b: &mut Bencher) {
+    b.iter(|| {
+        let v: Vec<u32> = Vec::new();
+        assert_eq!(v.len(), 0);
+        assert_eq!(v.capacity(), 0);
+    })
+}
+
+fn do_bench_with_capacity(b: &mut Bencher, src_len: usize) {
+    b.bytes = src_len as u64;
+
+    b.iter(|| {
+        let v: Vec<u32> = Vec::with_capacity(src_len);
+        assert_eq!(v.len(), 0);
+        assert_eq!(v.capacity(), src_len);
+    })
+}
+
+#[bench]
+fn bench_with_capacity_0000(b: &mut Bencher) {
+    do_bench_with_capacity(b, 0)
+}
+
+#[bench]
+fn bench_with_capacity_0010(b: &mut Bencher) {
+    do_bench_with_capacity(b, 10)
+}
+
+#[bench]
+fn bench_with_capacity_0100(b: &mut Bencher) {
+    do_bench_with_capacity(b, 100)
+}
+
+#[bench]
+fn bench_with_capacity_1000(b: &mut Bencher) {
+    do_bench_with_capacity(b, 1000)
+}
+
+fn do_bench_from_fn(b: &mut Bencher, src_len: usize) {
+    b.bytes = src_len as u64;
+
+    b.iter(|| {
+        let dst = (0..src_len).collect::<Vec<_>>();
+        assert_eq!(dst.len(), src_len);
+        assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
+    })
+}
+
+#[bench]
+fn bench_from_fn_0000(b: &mut Bencher) {
+    do_bench_from_fn(b, 0)
+}
+
+#[bench]
+fn bench_from_fn_0010(b: &mut Bencher) {
+    do_bench_from_fn(b, 10)
+}
+
+#[bench]
+fn bench_from_fn_0100(b: &mut Bencher) {
+    do_bench_from_fn(b, 100)
+}
+
+#[bench]
+fn bench_from_fn_1000(b: &mut Bencher) {
+    do_bench_from_fn(b, 1000)
+}
+
+fn do_bench_from_elem(b: &mut Bencher, src_len: usize) {
+    b.bytes = src_len as u64;
+
+    b.iter(|| {
+        let dst: Vec<usize> = repeat(5).take(src_len).collect();
+        assert_eq!(dst.len(), src_len);
+        assert!(dst.iter().all(|x| *x == 5));
+    })
+}
+
+#[bench]
+fn bench_from_elem_0000(b: &mut Bencher) {
+    do_bench_from_elem(b, 0)
+}
+
+#[bench]
+fn bench_from_elem_0010(b: &mut Bencher) {
+    do_bench_from_elem(b, 10)
+}
+
+#[bench]
+fn bench_from_elem_0100(b: &mut Bencher) {
+    do_bench_from_elem(b, 100)
+}
+
+#[bench]
+fn bench_from_elem_1000(b: &mut Bencher) {
+    do_bench_from_elem(b, 1000)
+}
+
+fn do_bench_from_slice(b: &mut Bencher, src_len: usize) {
+    let src: Vec<_> = FromIterator::from_iter(0..src_len);
+
+    b.bytes = src_len as u64;
+
+    b.iter(|| {
+        let dst = src.clone()[..].to_vec();
+        assert_eq!(dst.len(), src_len);
+        assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
+    });
+}
+
+#[bench]
+fn bench_from_slice_0000(b: &mut Bencher) {
+    do_bench_from_slice(b, 0)
+}
+
+#[bench]
+fn bench_from_slice_0010(b: &mut Bencher) {
+    do_bench_from_slice(b, 10)
+}
+
+#[bench]
+fn bench_from_slice_0100(b: &mut Bencher) {
+    do_bench_from_slice(b, 100)
+}
+
+#[bench]
+fn bench_from_slice_1000(b: &mut Bencher) {
+    do_bench_from_slice(b, 1000)
+}
+
+fn do_bench_from_iter(b: &mut Bencher, src_len: usize) {
+    let src: Vec<_> = FromIterator::from_iter(0..src_len);
+
+    b.bytes = src_len as u64;
+
+    b.iter(|| {
+        let dst: Vec<_> = FromIterator::from_iter(src.clone().into_iter());
+        assert_eq!(dst.len(), src_len);
+        assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
+    });
+}
+
+#[bench]
+fn bench_from_iter_0000(b: &mut Bencher) {
+    do_bench_from_iter(b, 0)
+}
+
+#[bench]
+fn bench_from_iter_0010(b: &mut Bencher) {
+    do_bench_from_iter(b, 10)
+}
+
+#[bench]
+fn bench_from_iter_0100(b: &mut Bencher) {
+    do_bench_from_iter(b, 100)
+}
+
+#[bench]
+fn bench_from_iter_1000(b: &mut Bencher) {
+    do_bench_from_iter(b, 1000)
+}
+
+fn do_bench_extend(b: &mut Bencher, dst_len: usize, src_len: usize) {
+    let dst: Vec<_> = FromIterator::from_iter(0..dst_len);
+    let src: Vec<_> = FromIterator::from_iter(dst_len..dst_len + src_len);
+
+    b.bytes = src_len as u64;
+
+    b.iter(|| {
+        let mut dst = dst.clone();
+        dst.extend(src.clone().into_iter());
+        assert_eq!(dst.len(), dst_len + src_len);
+        assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
+    });
+}
+
+#[bench]
+fn bench_extend_0000_0000(b: &mut Bencher) {
+    do_bench_extend(b, 0, 0)
+}
+
+#[bench]
+fn bench_extend_0000_0010(b: &mut Bencher) {
+    do_bench_extend(b, 0, 10)
+}
+
+#[bench]
+fn bench_extend_0000_0100(b: &mut Bencher) {
+    do_bench_extend(b, 0, 100)
+}
+
+#[bench]
+fn bench_extend_0000_1000(b: &mut Bencher) {
+    do_bench_extend(b, 0, 1000)
+}
+
+#[bench]
+fn bench_extend_0010_0010(b: &mut Bencher) {
+    do_bench_extend(b, 10, 10)
+}
+
+#[bench]
+fn bench_extend_0100_0100(b: &mut Bencher) {
+    do_bench_extend(b, 100, 100)
+}
+
+#[bench]
+fn bench_extend_1000_1000(b: &mut Bencher) {
+    do_bench_extend(b, 1000, 1000)
+}
+
+fn do_bench_push_all(b: &mut Bencher, dst_len: usize, src_len: usize) {
+    let dst: Vec<_> = FromIterator::from_iter(0..dst_len);
+    let src: Vec<_> = FromIterator::from_iter(dst_len..dst_len + src_len);
+
+    b.bytes = src_len as u64;
+
+    b.iter(|| {
+        let mut dst = dst.clone();
+        dst.push_all(&src);
+        assert_eq!(dst.len(), dst_len + src_len);
+        assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
+    });
+}
+
+#[bench]
+fn bench_push_all_0000_0000(b: &mut Bencher) {
+    do_bench_push_all(b, 0, 0)
+}
+
+#[bench]
+fn bench_push_all_0000_0010(b: &mut Bencher) {
+    do_bench_push_all(b, 0, 10)
+}
+
+#[bench]
+fn bench_push_all_0000_0100(b: &mut Bencher) {
+    do_bench_push_all(b, 0, 100)
+}
+
+#[bench]
+fn bench_push_all_0000_1000(b: &mut Bencher) {
+    do_bench_push_all(b, 0, 1000)
+}
+
+#[bench]
+fn bench_push_all_0010_0010(b: &mut Bencher) {
+    do_bench_push_all(b, 10, 10)
+}
+
+#[bench]
+fn bench_push_all_0100_0100(b: &mut Bencher) {
+    do_bench_push_all(b, 100, 100)
+}
+
+#[bench]
+fn bench_push_all_1000_1000(b: &mut Bencher) {
+    do_bench_push_all(b, 1000, 1000)
+}
+
+fn do_bench_push_all_move(b: &mut Bencher, dst_len: usize, src_len: usize) {
+    let dst: Vec<_> = FromIterator::from_iter(0..dst_len);
+    let src: Vec<_> = FromIterator::from_iter(dst_len..dst_len + src_len);
+
+    b.bytes = src_len as u64;
+
+    b.iter(|| {
+        let mut dst = dst.clone();
+        dst.extend(src.clone().into_iter());
+        assert_eq!(dst.len(), dst_len + src_len);
+        assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
+    });
+}
+
+#[bench]
+fn bench_push_all_move_0000_0000(b: &mut Bencher) {
+    do_bench_push_all_move(b, 0, 0)
+}
+
+#[bench]
+fn bench_push_all_move_0000_0010(b: &mut Bencher) {
+    do_bench_push_all_move(b, 0, 10)
+}
+
+#[bench]
+fn bench_push_all_move_0000_0100(b: &mut Bencher) {
+    do_bench_push_all_move(b, 0, 100)
+}
+
+#[bench]
+fn bench_push_all_move_0000_1000(b: &mut Bencher) {
+    do_bench_push_all_move(b, 0, 1000)
+}
+
+#[bench]
+fn bench_push_all_move_0010_0010(b: &mut Bencher) {
+    do_bench_push_all_move(b, 10, 10)
+}
+
+#[bench]
+fn bench_push_all_move_0100_0100(b: &mut Bencher) {
+    do_bench_push_all_move(b, 100, 100)
+}
+
+#[bench]
+fn bench_push_all_move_1000_1000(b: &mut Bencher) {
+    do_bench_push_all_move(b, 1000, 1000)
+}
+
+fn do_bench_clone(b: &mut Bencher, src_len: usize) {
+    let src: Vec<usize> = FromIterator::from_iter(0..src_len);
+
+    b.bytes = src_len as u64;
+
+    b.iter(|| {
+        let dst = src.clone();
+        assert_eq!(dst.len(), src_len);
+        assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
+    });
+}
+
+#[bench]
+fn bench_clone_0000(b: &mut Bencher) {
+    do_bench_clone(b, 0)
+}
+
+#[bench]
+fn bench_clone_0010(b: &mut Bencher) {
+    do_bench_clone(b, 10)
+}
+
+#[bench]
+fn bench_clone_0100(b: &mut Bencher) {
+    do_bench_clone(b, 100)
+}
+
+#[bench]
+fn bench_clone_1000(b: &mut Bencher) {
+    do_bench_clone(b, 1000)
+}
+
+fn do_bench_clone_from(b: &mut Bencher, times: usize, dst_len: usize, src_len: usize) {
+    let dst: Vec<_> = FromIterator::from_iter(0..src_len);
+    let src: Vec<_> = FromIterator::from_iter(dst_len..dst_len + src_len);
+
+    b.bytes = (times * src_len) as u64;
+
+    b.iter(|| {
+        let mut dst = dst.clone();
+
+        for _ in 0..times {
+            dst.clone_from(&src);
+
+            assert_eq!(dst.len(), src_len);
+            assert!(dst.iter().enumerate().all(|(i, x)| dst_len + i == *x));
+        }
+    });
+}
+
+#[bench]
+fn bench_clone_from_01_0000_0000(b: &mut Bencher) {
+    do_bench_clone_from(b, 1, 0, 0)
+}
+
+#[bench]
+fn bench_clone_from_01_0000_0010(b: &mut Bencher) {
+    do_bench_clone_from(b, 1, 0, 10)
+}
+
+#[bench]
+fn bench_clone_from_01_0000_0100(b: &mut Bencher) {
+    do_bench_clone_from(b, 1, 0, 100)
+}
+
+#[bench]
+fn bench_clone_from_01_0000_1000(b: &mut Bencher) {
+    do_bench_clone_from(b, 1, 0, 1000)
+}
+
+#[bench]
+fn bench_clone_from_01_0010_0010(b: &mut Bencher) {
+    do_bench_clone_from(b, 1, 10, 10)
+}
+
+#[bench]
+fn bench_clone_from_01_0100_0100(b: &mut Bencher) {
+    do_bench_clone_from(b, 1, 100, 100)
+}
+
+#[bench]
+fn bench_clone_from_01_1000_1000(b: &mut Bencher) {
+    do_bench_clone_from(b, 1, 1000, 1000)
+}
+
+#[bench]
+fn bench_clone_from_01_0010_0100(b: &mut Bencher) {
+    do_bench_clone_from(b, 1, 10, 100)
+}
+
+#[bench]
+fn bench_clone_from_01_0100_1000(b: &mut Bencher) {
+    do_bench_clone_from(b, 1, 100, 1000)
+}
+
+#[bench]
+fn bench_clone_from_01_0010_0000(b: &mut Bencher) {
+    do_bench_clone_from(b, 1, 10, 0)
+}
+
+#[bench]
+fn bench_clone_from_01_0100_0010(b: &mut Bencher) {
+    do_bench_clone_from(b, 1, 100, 10)
+}
+
+#[bench]
+fn bench_clone_from_01_1000_0100(b: &mut Bencher) {
+    do_bench_clone_from(b, 1, 1000, 100)
+}
+
+#[bench]
+fn bench_clone_from_10_0000_0000(b: &mut Bencher) {
+    do_bench_clone_from(b, 10, 0, 0)
+}
+
+#[bench]
+fn bench_clone_from_10_0000_0010(b: &mut Bencher) {
+    do_bench_clone_from(b, 10, 0, 10)
+}
+
+#[bench]
+fn bench_clone_from_10_0000_0100(b: &mut Bencher) {
+    do_bench_clone_from(b, 10, 0, 100)
+}
+
+#[bench]
+fn bench_clone_from_10_0000_1000(b: &mut Bencher) {
+    do_bench_clone_from(b, 10, 0, 1000)
+}
+
+#[bench]
+fn bench_clone_from_10_0010_0010(b: &mut Bencher) {
+    do_bench_clone_from(b, 10, 10, 10)
+}
+
+#[bench]
+fn bench_clone_from_10_0100_0100(b: &mut Bencher) {
+    do_bench_clone_from(b, 10, 100, 100)
+}
+
+#[bench]
+fn bench_clone_from_10_1000_1000(b: &mut Bencher) {
+    do_bench_clone_from(b, 10, 1000, 1000)
+}
+
+#[bench]
+fn bench_clone_from_10_0010_0100(b: &mut Bencher) {
+    do_bench_clone_from(b, 10, 10, 100)
+}
+
+#[bench]
+fn bench_clone_from_10_0100_1000(b: &mut Bencher) {
+    do_bench_clone_from(b, 10, 100, 1000)
+}
+
+#[bench]
+fn bench_clone_from_10_0010_0000(b: &mut Bencher) {
+    do_bench_clone_from(b, 10, 10, 0)
+}
+
+#[bench]
+fn bench_clone_from_10_0100_0010(b: &mut Bencher) {
+    do_bench_clone_from(b, 10, 100, 10)
+}
+
+#[bench]
+fn bench_clone_from_10_1000_0100(b: &mut Bencher) {
+    do_bench_clone_from(b, 10, 1000, 100)
+}
diff --git a/src/libcollectionstest/vec_deque.rs b/src/libcollectionstest/vec_deque.rs
new file mode 100644 (file)
index 0000000..ba2ed36
--- /dev/null
@@ -0,0 +1,1150 @@
+// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::collections::VecDeque;
+use std::fmt::Debug;
+use std::hash::{SipHasher, self};
+
+use test;
+
+use self::Taggy::*;
+use self::Taggypar::*;
+
+#[test]
+#[allow(deprecated)]
+fn test_simple() {
+    let mut d = VecDeque::new();
+    assert_eq!(d.len(), 0);
+    d.push_front(17);
+    d.push_front(42);
+    d.push_back(137);
+    assert_eq!(d.len(), 3);
+    d.push_back(137);
+    assert_eq!(d.len(), 4);
+    assert_eq!(*d.front().unwrap(), 42);
+    assert_eq!(*d.back().unwrap(), 137);
+    let mut i = d.pop_front();
+    assert_eq!(i, Some(42));
+    i = d.pop_back();
+    assert_eq!(i, Some(137));
+    i = d.pop_back();
+    assert_eq!(i, Some(137));
+    i = d.pop_back();
+    assert_eq!(i, Some(17));
+    assert_eq!(d.len(), 0);
+    d.push_back(3);
+    assert_eq!(d.len(), 1);
+    d.push_front(2);
+    assert_eq!(d.len(), 2);
+    d.push_back(4);
+    assert_eq!(d.len(), 3);
+    d.push_front(1);
+    assert_eq!(d.len(), 4);
+    debug!("{}", d[0]);
+    debug!("{}", d[1]);
+    debug!("{}", d[2]);
+    debug!("{}", d[3]);
+    assert_eq!(d[0], 1);
+    assert_eq!(d[1], 2);
+    assert_eq!(d[2], 3);
+    assert_eq!(d[3], 4);
+}
+
+#[cfg(test)]
+fn test_parameterized<T:Clone + PartialEq + Debug>(a: T, b: T, c: T, d: T) {
+    let mut deq = VecDeque::new();
+    assert_eq!(deq.len(), 0);
+    deq.push_front(a.clone());
+    deq.push_front(b.clone());
+    deq.push_back(c.clone());
+    assert_eq!(deq.len(), 3);
+    deq.push_back(d.clone());
+    assert_eq!(deq.len(), 4);
+    assert_eq!((*deq.front().unwrap()).clone(), b.clone());
+    assert_eq!((*deq.back().unwrap()).clone(), d.clone());
+    assert_eq!(deq.pop_front().unwrap(), b.clone());
+    assert_eq!(deq.pop_back().unwrap(), d.clone());
+    assert_eq!(deq.pop_back().unwrap(), c.clone());
+    assert_eq!(deq.pop_back().unwrap(), a.clone());
+    assert_eq!(deq.len(), 0);
+    deq.push_back(c.clone());
+    assert_eq!(deq.len(), 1);
+    deq.push_front(b.clone());
+    assert_eq!(deq.len(), 2);
+    deq.push_back(d.clone());
+    assert_eq!(deq.len(), 3);
+    deq.push_front(a.clone());
+    assert_eq!(deq.len(), 4);
+    assert_eq!(deq[0].clone(), a.clone());
+    assert_eq!(deq[1].clone(), b.clone());
+    assert_eq!(deq[2].clone(), c.clone());
+    assert_eq!(deq[3].clone(), d.clone());
+}
+
+#[test]
+fn test_push_front_grow() {
+    let mut deq = VecDeque::new();
+    for i in 0..66 {
+        deq.push_front(i);
+    }
+    assert_eq!(deq.len(), 66);
+
+    for i in 0..66 {
+        assert_eq!(deq[i], 65 - i);
+    }
+
+    let mut deq = VecDeque::new();
+    for i in 0..66 {
+        deq.push_back(i);
+    }
+
+    for i in 0..66 {
+        assert_eq!(deq[i], i);
+    }
+}
+
+#[test]
+fn test_index() {
+    let mut deq = VecDeque::new();
+    for i in 1..4 {
+        deq.push_front(i);
+    }
+    assert_eq!(deq[1], 2);
+}
+
+#[test]
+#[should_panic]
+fn test_index_out_of_bounds() {
+    let mut deq = VecDeque::new();
+    for i in 1..4 {
+        deq.push_front(i);
+    }
+    deq[3];
+}
+
+#[bench]
+fn bench_new(b: &mut test::Bencher) {
+    b.iter(|| {
+        let ring: VecDeque<i32> = VecDeque::new();
+        test::black_box(ring);
+    })
+}
+
+// FIXME(japaric) privacy
+/*
+#[bench]
+fn bench_push_back_100(b: &mut test::Bencher) {
+    let mut deq = VecDeque::with_capacity(101);
+    b.iter(|| {
+        for i in 0..100 {
+            deq.push_back(i);
+        }
+        deq.head = 0;
+        deq.tail = 0;
+    })
+}
+*/
+
+// FIXME(japaric) privacy
+/*
+#[bench]
+fn bench_push_front_100(b: &mut test::Bencher) {
+    let mut deq = VecDeque::with_capacity(101);
+    b.iter(|| {
+        for i in 0..100 {
+            deq.push_front(i);
+        }
+        deq.head = 0;
+        deq.tail = 0;
+    })
+}
+*/
+
+// FIXME(japaric) privacy
+/*
+#[bench]
+fn bench_pop_back_100(b: &mut test::Bencher) {
+    let mut deq= VecDeque::<i32>::with_capacity(101);
+
+    b.iter(|| {
+        deq.head = 100;
+        deq.tail = 0;
+        while !deq.is_empty() {
+            test::black_box(deq.pop_back());
+        }
+    })
+}
+*/
+
+// FIXME(japaric) privacy
+/*
+#[bench]
+fn bench_pop_front_100(b: &mut test::Bencher) {
+    let mut deq = VecDeque::<i32>::with_capacity(101);
+
+    b.iter(|| {
+        deq.head = 100;
+        deq.tail = 0;
+        while !deq.is_empty() {
+            test::black_box(deq.pop_front());
+        }
+    })
+}
+*/
+
+#[bench]
+fn bench_grow_1025(b: &mut test::Bencher) {
+    b.iter(|| {
+        let mut deq = VecDeque::new();
+        for i in 0..1025 {
+            deq.push_front(i);
+        }
+        test::black_box(deq);
+    })
+}
+
+#[bench]
+fn bench_iter_1000(b: &mut test::Bencher) {
+    let ring: VecDeque<_> = (0..1000).collect();
+
+    b.iter(|| {
+        let mut sum = 0;
+        for &i in &ring {
+            sum += i;
+        }
+        test::black_box(sum);
+    })
+}
+
+#[bench]
+fn bench_mut_iter_1000(b: &mut test::Bencher) {
+    let mut ring: VecDeque<_> = (0..1000).collect();
+
+    b.iter(|| {
+        let mut sum = 0;
+        for i in &mut ring {
+            sum += *i;
+        }
+        test::black_box(sum);
+    })
+}
+
+#[derive(Clone, PartialEq, Debug)]
+enum Taggy {
+    One(i32),
+    Two(i32, i32),
+    Three(i32, i32, i32),
+}
+
+#[derive(Clone, PartialEq, Debug)]
+enum Taggypar<T> {
+    Onepar(T),
+    Twopar(T, T),
+    Threepar(T, T, T),
+}
+
+#[derive(Clone, PartialEq, Debug)]
+struct RecCy {
+    x: i32,
+    y: i32,
+    t: Taggy
+}
+
+#[test]
+fn test_param_int() {
+    test_parameterized::<i32>(5, 72, 64, 175);
+}
+
+#[test]
+fn test_param_taggy() {
+    test_parameterized::<Taggy>(One(1), Two(1, 2), Three(1, 2, 3), Two(17, 42));
+}
+
+#[test]
+fn test_param_taggypar() {
+    test_parameterized::<Taggypar<i32>>(Onepar::<i32>(1),
+                                        Twopar::<i32>(1, 2),
+                                        Threepar::<i32>(1, 2, 3),
+                                        Twopar::<i32>(17, 42));
+}
+
+#[test]
+fn test_param_reccy() {
+    let reccy1 = RecCy { x: 1, y: 2, t: One(1) };
+    let reccy2 = RecCy { x: 345, y: 2, t: Two(1, 2) };
+    let reccy3 = RecCy { x: 1, y: 777, t: Three(1, 2, 3) };
+    let reccy4 = RecCy { x: 19, y: 252, t: Two(17, 42) };
+    test_parameterized::<RecCy>(reccy1, reccy2, reccy3, reccy4);
+}
+
+#[test]
+fn test_with_capacity() {
+    let mut d = VecDeque::with_capacity(0);
+    d.push_back(1);
+    assert_eq!(d.len(), 1);
+    let mut d = VecDeque::with_capacity(50);
+    d.push_back(1);
+    assert_eq!(d.len(), 1);
+}
+
+#[test]
+fn test_with_capacity_non_power_two() {
+    let mut d3 = VecDeque::with_capacity(3);
+    d3.push_back(1);
+
+    // X = None, | = lo
+    // [|1, X, X]
+    assert_eq!(d3.pop_front(), Some(1));
+    // [X, |X, X]
+    assert_eq!(d3.front(), None);
+
+    // [X, |3, X]
+    d3.push_back(3);
+    // [X, |3, 6]
+    d3.push_back(6);
+    // [X, X, |6]
+    assert_eq!(d3.pop_front(), Some(3));
+
+    // Pushing the lo past half way point to trigger
+    // the 'B' scenario for growth
+    // [9, X, |6]
+    d3.push_back(9);
+    // [9, 12, |6]
+    d3.push_back(12);
+
+    d3.push_back(15);
+    // There used to be a bug here about how the
+    // VecDeque made growth assumptions about the
+    // underlying Vec which didn't hold and lead
+    // to corruption.
+    // (Vec grows to next power of two)
+    //good- [9, 12, 15, X, X, X, X, |6]
+    //bug-  [15, 12, X, X, X, |6, X, X]
+    assert_eq!(d3.pop_front(), Some(6));
+
+    // Which leads us to the following state which
+    // would be a failure case.
+    //bug-  [15, 12, X, X, X, X, |X, X]
+    assert_eq!(d3.front(), Some(&9));
+}
+
+#[test]
+fn test_reserve_exact() {
+    let mut d = VecDeque::new();
+    d.push_back(0);
+    d.reserve_exact(50);
+    assert!(d.capacity() >= 51);
+}
+
+#[test]
+fn test_reserve() {
+    let mut d = VecDeque::new();
+    d.push_back(0);
+    d.reserve(50);
+    assert!(d.capacity() >= 51);
+}
+
+#[test]
+fn test_swap() {
+    let mut d: VecDeque<_> = (0..5).collect();
+    d.pop_front();
+    d.swap(0, 3);
+    assert_eq!(d.iter().cloned().collect::<Vec<_>>(), [4, 2, 3, 1]);
+}
+
+#[test]
+fn test_iter() {
+    let mut d = VecDeque::new();
+    assert_eq!(d.iter().next(), None);
+    assert_eq!(d.iter().size_hint(), (0, Some(0)));
+
+    for i in 0..5 {
+        d.push_back(i);
+    }
+    {
+        let b: &[_] = &[&0,&1,&2,&3,&4];
+        assert_eq!(d.iter().collect::<Vec<_>>(), b);
+    }
+
+    for i in 6..9 {
+        d.push_front(i);
+    }
+    {
+        let b: &[_] = &[&8,&7,&6,&0,&1,&2,&3,&4];
+        assert_eq!(d.iter().collect::<Vec<_>>(), b);
+    }
+
+    let mut it = d.iter();
+    let mut len = d.len();
+    loop {
+        match it.next() {
+            None => break,
+            _ => { len -= 1; assert_eq!(it.size_hint(), (len, Some(len))) }
+        }
+    }
+}
+
+#[test]
+fn test_rev_iter() {
+    let mut d = VecDeque::new();
+    assert_eq!(d.iter().rev().next(), None);
+
+    for i in 0..5 {
+        d.push_back(i);
+    }
+    {
+        let b: &[_] = &[&4,&3,&2,&1,&0];
+        assert_eq!(d.iter().rev().collect::<Vec<_>>(), b);
+    }
+
+    for i in 6..9 {
+        d.push_front(i);
+    }
+    let b: &[_] = &[&4,&3,&2,&1,&0,&6,&7,&8];
+    assert_eq!(d.iter().rev().collect::<Vec<_>>(), b);
+}
+
+#[test]
+fn test_mut_rev_iter_wrap() {
+    let mut d = VecDeque::with_capacity(3);
+    assert!(d.iter_mut().rev().next().is_none());
+
+    d.push_back(1);
+    d.push_back(2);
+    d.push_back(3);
+    assert_eq!(d.pop_front(), Some(1));
+    d.push_back(4);
+
+    assert_eq!(d.iter_mut().rev().cloned().collect::<Vec<_>>(),
+               vec![4, 3, 2]);
+}
+
+#[test]
+fn test_mut_iter() {
+    let mut d = VecDeque::new();
+    assert!(d.iter_mut().next().is_none());
+
+    for i in 0..3 {
+        d.push_front(i);
+    }
+
+    for (i, elt) in d.iter_mut().enumerate() {
+        assert_eq!(*elt, 2 - i);
+        *elt = i;
+    }
+
+    {
+        let mut it = d.iter_mut();
+        assert_eq!(*it.next().unwrap(), 0);
+        assert_eq!(*it.next().unwrap(), 1);
+        assert_eq!(*it.next().unwrap(), 2);
+        assert!(it.next().is_none());
+    }
+}
+
+#[test]
+fn test_mut_rev_iter() {
+    let mut d = VecDeque::new();
+    assert!(d.iter_mut().rev().next().is_none());
+
+    for i in 0..3 {
+        d.push_front(i);
+    }
+
+    for (i, elt) in d.iter_mut().rev().enumerate() {
+        assert_eq!(*elt, i);
+        *elt = i;
+    }
+
+    {
+        let mut it = d.iter_mut().rev();
+        assert_eq!(*it.next().unwrap(), 0);
+        assert_eq!(*it.next().unwrap(), 1);
+        assert_eq!(*it.next().unwrap(), 2);
+        assert!(it.next().is_none());
+    }
+}
+
+#[test]
+fn test_into_iter() {
+
+    // Empty iter
+    {
+        let d: VecDeque<i32> = VecDeque::new();
+        let mut iter = d.into_iter();
+
+        assert_eq!(iter.size_hint(), (0, Some(0)));
+        assert_eq!(iter.next(), None);
+        assert_eq!(iter.size_hint(), (0, Some(0)));
+    }
+
+    // simple iter
+    {
+        let mut d = VecDeque::new();
+        for i in 0..5 {
+            d.push_back(i);
+        }
+
+        let b = vec![0,1,2,3,4];
+        assert_eq!(d.into_iter().collect::<Vec<_>>(), b);
+    }
+
+    // wrapped iter
+    {
+        let mut d = VecDeque::new();
+        for i in 0..5 {
+            d.push_back(i);
+        }
+        for i in 6..9 {
+            d.push_front(i);
+        }
+
+        let b = vec![8,7,6,0,1,2,3,4];
+        assert_eq!(d.into_iter().collect::<Vec<_>>(), b);
+    }
+
+    // partially used
+    {
+        let mut d = VecDeque::new();
+        for i in 0..5 {
+            d.push_back(i);
+        }
+        for i in 6..9 {
+            d.push_front(i);
+        }
+
+        let mut it = d.into_iter();
+        assert_eq!(it.size_hint(), (8, Some(8)));
+        assert_eq!(it.next(), Some(8));
+        assert_eq!(it.size_hint(), (7, Some(7)));
+        assert_eq!(it.next_back(), Some(4));
+        assert_eq!(it.size_hint(), (6, Some(6)));
+        assert_eq!(it.next(), Some(7));
+        assert_eq!(it.size_hint(), (5, Some(5)));
+    }
+}
+
+#[test]
+fn test_drain() {
+
+    // Empty iter
+    {
+        let mut d: VecDeque<i32> = VecDeque::new();
+
+        {
+            let mut iter = d.drain();
+
+            assert_eq!(iter.size_hint(), (0, Some(0)));
+            assert_eq!(iter.next(), None);
+            assert_eq!(iter.size_hint(), (0, Some(0)));
+        }
+
+        assert!(d.is_empty());
+    }
+
+    // simple iter
+    {
+        let mut d = VecDeque::new();
+        for i in 0..5 {
+            d.push_back(i);
+        }
+
+        assert_eq!(d.drain().collect::<Vec<_>>(), [0, 1, 2, 3, 4]);
+        assert!(d.is_empty());
+    }
+
+    // wrapped iter
+    {
+        let mut d = VecDeque::new();
+        for i in 0..5 {
+            d.push_back(i);
+        }
+        for i in 6..9 {
+            d.push_front(i);
+        }
+
+        assert_eq!(d.drain().collect::<Vec<_>>(), [8,7,6,0,1,2,3,4]);
+        assert!(d.is_empty());
+    }
+
+    // partially used
+    {
+        let mut d: VecDeque<_> = VecDeque::new();
+        for i in 0..5 {
+            d.push_back(i);
+        }
+        for i in 6..9 {
+            d.push_front(i);
+        }
+
+        {
+            let mut it = d.drain();
+            assert_eq!(it.size_hint(), (8, Some(8)));
+            assert_eq!(it.next(), Some(8));
+            assert_eq!(it.size_hint(), (7, Some(7)));
+            assert_eq!(it.next_back(), Some(4));
+            assert_eq!(it.size_hint(), (6, Some(6)));
+            assert_eq!(it.next(), Some(7));
+            assert_eq!(it.size_hint(), (5, Some(5)));
+        }
+        assert!(d.is_empty());
+    }
+}
+
+#[test]
+fn test_from_iter() {
+    use std::iter;
+
+    let v = vec!(1,2,3,4,5,6,7);
+    let deq: VecDeque<_> = v.iter().cloned().collect();
+    let u: Vec<_> = deq.iter().cloned().collect();
+    assert_eq!(u, v);
+
+    let seq = iter::count(0, 2).take(256);
+    let deq: VecDeque<_> = seq.collect();
+    for (i, &x) in deq.iter().enumerate() {
+        assert_eq!(2*i, x);
+    }
+    assert_eq!(deq.len(), 256);
+}
+
+#[test]
+fn test_clone() {
+    let mut d = VecDeque::new();
+    d.push_front(17);
+    d.push_front(42);
+    d.push_back(137);
+    d.push_back(137);
+    assert_eq!(d.len(), 4);
+    let mut e = d.clone();
+    assert_eq!(e.len(), 4);
+    while !d.is_empty() {
+        assert_eq!(d.pop_back(), e.pop_back());
+    }
+    assert_eq!(d.len(), 0);
+    assert_eq!(e.len(), 0);
+}
+
+#[test]
+fn test_eq() {
+    let mut d = VecDeque::new();
+    assert!(d == VecDeque::with_capacity(0));
+    d.push_front(137);
+    d.push_front(17);
+    d.push_front(42);
+    d.push_back(137);
+    let mut e = VecDeque::with_capacity(0);
+    e.push_back(42);
+    e.push_back(17);
+    e.push_back(137);
+    e.push_back(137);
+    assert!(&e == &d);
+    e.pop_back();
+    e.push_back(0);
+    assert!(e != d);
+    e.clear();
+    assert!(e == VecDeque::new());
+}
+
+#[test]
+fn test_hash() {
+  let mut x = VecDeque::new();
+  let mut y = VecDeque::new();
+
+  x.push_back(1);
+  x.push_back(2);
+  x.push_back(3);
+
+  y.push_back(0);
+  y.push_back(1);
+  y.pop_front();
+  y.push_back(2);
+  y.push_back(3);
+
+  assert!(hash::hash::<_, SipHasher>(&x) == hash::hash::<_, SipHasher>(&y));
+}
+
+#[test]
+fn test_ord() {
+    let x = VecDeque::new();
+    let mut y = VecDeque::new();
+    y.push_back(1);
+    y.push_back(2);
+    y.push_back(3);
+    assert!(x < y);
+    assert!(y > x);
+    assert!(x <= x);
+    assert!(x >= x);
+}
+
+#[test]
+fn test_show() {
+    let ringbuf: VecDeque<_> = (0..10).collect();
+    assert_eq!(format!("{:?}", ringbuf), "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]");
+
+    let ringbuf: VecDeque<_> = vec!["just", "one", "test", "more"].iter()
+                                                                    .cloned()
+                                                                    .collect();
+    assert_eq!(format!("{:?}", ringbuf), "[\"just\", \"one\", \"test\", \"more\"]");
+}
+
+#[test]
+fn test_drop() {
+    static mut drops: i32 = 0;
+    struct Elem;
+    impl Drop for Elem {
+        fn drop(&mut self) {
+            unsafe { drops += 1; }
+        }
+    }
+
+    let mut ring = VecDeque::new();
+    ring.push_back(Elem);
+    ring.push_front(Elem);
+    ring.push_back(Elem);
+    ring.push_front(Elem);
+    drop(ring);
+
+    assert_eq!(unsafe {drops}, 4);
+}
+
+#[test]
+fn test_drop_with_pop() {
+    static mut drops: i32 = 0;
+    struct Elem;
+    impl Drop for Elem {
+        fn drop(&mut self) {
+            unsafe { drops += 1; }
+        }
+    }
+
+    let mut ring = VecDeque::new();
+    ring.push_back(Elem);
+    ring.push_front(Elem);
+    ring.push_back(Elem);
+    ring.push_front(Elem);
+
+    drop(ring.pop_back());
+    drop(ring.pop_front());
+    assert_eq!(unsafe {drops}, 2);
+
+    drop(ring);
+    assert_eq!(unsafe {drops}, 4);
+}
+
+#[test]
+fn test_drop_clear() {
+    static mut drops: i32 = 0;
+    struct Elem;
+    impl Drop for Elem {
+        fn drop(&mut self) {
+            unsafe { drops += 1; }
+        }
+    }
+
+    let mut ring = VecDeque::new();
+    ring.push_back(Elem);
+    ring.push_front(Elem);
+    ring.push_back(Elem);
+    ring.push_front(Elem);
+    ring.clear();
+    assert_eq!(unsafe {drops}, 4);
+
+    drop(ring);
+    assert_eq!(unsafe {drops}, 4);
+}
+
+#[test]
+fn test_reserve_grow() {
+    // test growth path A
+    // [T o o H] -> [T o o H . . . . ]
+    let mut ring = VecDeque::with_capacity(4);
+    for i in 0..3 {
+        ring.push_back(i);
+    }
+    ring.reserve(7);
+    for i in 0..3 {
+        assert_eq!(ring.pop_front(), Some(i));
+    }
+
+    // test growth path B
+    // [H T o o] -> [. T o o H . . . ]
+    let mut ring = VecDeque::with_capacity(4);
+    for i in 0..1 {
+        ring.push_back(i);
+        assert_eq!(ring.pop_front(), Some(i));
+    }
+    for i in 0..3 {
+        ring.push_back(i);
+    }
+    ring.reserve(7);
+    for i in 0..3 {
+        assert_eq!(ring.pop_front(), Some(i));
+    }
+
+    // test growth path C
+    // [o o H T] -> [o o H . . . . T ]
+    let mut ring = VecDeque::with_capacity(4);
+    for i in 0..3 {
+        ring.push_back(i);
+        assert_eq!(ring.pop_front(), Some(i));
+    }
+    for i in 0..3 {
+        ring.push_back(i);
+    }
+    ring.reserve(7);
+    for i in 0..3 {
+        assert_eq!(ring.pop_front(), Some(i));
+    }
+}
+
+#[test]
+fn test_get() {
+    let mut ring = VecDeque::new();
+    ring.push_back(0);
+    assert_eq!(ring.get(0), Some(&0));
+    assert_eq!(ring.get(1), None);
+
+    ring.push_back(1);
+    assert_eq!(ring.get(0), Some(&0));
+    assert_eq!(ring.get(1), Some(&1));
+    assert_eq!(ring.get(2), None);
+
+    ring.push_back(2);
+    assert_eq!(ring.get(0), Some(&0));
+    assert_eq!(ring.get(1), Some(&1));
+    assert_eq!(ring.get(2), Some(&2));
+    assert_eq!(ring.get(3), None);
+
+    assert_eq!(ring.pop_front(), Some(0));
+    assert_eq!(ring.get(0), Some(&1));
+    assert_eq!(ring.get(1), Some(&2));
+    assert_eq!(ring.get(2), None);
+
+    assert_eq!(ring.pop_front(), Some(1));
+    assert_eq!(ring.get(0), Some(&2));
+    assert_eq!(ring.get(1), None);
+
+    assert_eq!(ring.pop_front(), Some(2));
+    assert_eq!(ring.get(0), None);
+    assert_eq!(ring.get(1), None);
+}
+
+#[test]
+fn test_get_mut() {
+    let mut ring = VecDeque::new();
+    for i in 0..3 {
+        ring.push_back(i);
+    }
+
+    match ring.get_mut(1) {
+        Some(x) => *x = -1,
+        None => ()
+    };
+
+    assert_eq!(ring.get_mut(0), Some(&mut 0));
+    assert_eq!(ring.get_mut(1), Some(&mut -1));
+    assert_eq!(ring.get_mut(2), Some(&mut 2));
+    assert_eq!(ring.get_mut(3), None);
+
+    assert_eq!(ring.pop_front(), Some(0));
+    assert_eq!(ring.get_mut(0), Some(&mut -1));
+    assert_eq!(ring.get_mut(1), Some(&mut 2));
+    assert_eq!(ring.get_mut(2), None);
+}
+
+// FIXME(japaric) privacy
+/*
+#[test]
+fn test_swap_front_back_remove() {
+    fn test(back: bool) {
+        // This test checks that every single combination of tail position and length is tested.
+        // Capacity 15 should be large enough to cover every case.
+        let mut tester = VecDeque::with_capacity(15);
+        let usable_cap = tester.capacity();
+        let final_len = usable_cap / 2;
+
+        for len in 0..final_len {
+            let expected = if back {
+                (0..len).collect()
+            } else {
+                (0..len).rev().collect()
+            };
+            for tail_pos in 0..usable_cap {
+                tester.tail = tail_pos;
+                tester.head = tail_pos;
+                if back {
+                    for i in 0..len * 2 {
+                        tester.push_front(i);
+                    }
+                    for i in 0..len {
+                        assert_eq!(tester.swap_back_remove(i), Some(len * 2 - 1 - i));
+                    }
+                } else {
+                    for i in 0..len * 2 {
+                        tester.push_back(i);
+                    }
+                    for i in 0..len {
+                        let idx = tester.len() - 1 - i;
+                        assert_eq!(tester.swap_front_remove(idx), Some(len * 2 - 1 - i));
+                    }
+                }
+                assert!(tester.tail < tester.cap);
+                assert!(tester.head < tester.cap);
+                assert_eq!(tester, expected);
+            }
+        }
+    }
+    test(true);
+    test(false);
+}
+*/
+
+// FIXME(japaric) privacy
+/*
+#[test]
+fn test_insert() {
+    // This test checks that every single combination of tail position, length, and
+    // insertion position is tested. Capacity 15 should be large enough to cover every case.
+
+    let mut tester = VecDeque::with_capacity(15);
+    // can't guarantee we got 15, so have to get what we got.
+    // 15 would be great, but we will definitely get 2^k - 1, for k >= 4, or else
+    // this test isn't covering what it wants to
+    let cap = tester.capacity();
+
+
+    // len is the length *after* insertion
+    for len in 1..cap {
+        // 0, 1, 2, .., len - 1
+        let expected = iter::count(0, 1).take(len).collect();
+        for tail_pos in 0..cap {
+            for to_insert in 0..len {
+                tester.tail = tail_pos;
+                tester.head = tail_pos;
+                for i in 0..len {
+                    if i != to_insert {
+                        tester.push_back(i);
+                    }
+                }
+                tester.insert(to_insert, to_insert);
+                assert!(tester.tail < tester.cap);
+                assert!(tester.head < tester.cap);
+                assert_eq!(tester, expected);
+            }
+        }
+    }
+}
+*/
+
+// FIXME(japaric) privacy
+/*
+#[test]
+fn test_remove() {
+    // This test checks that every single combination of tail position, length, and
+    // removal position is tested. Capacity 15 should be large enough to cover every case.
+
+    let mut tester = VecDeque::with_capacity(15);
+    // can't guarantee we got 15, so have to get what we got.
+    // 15 would be great, but we will definitely get 2^k - 1, for k >= 4, or else
+    // this test isn't covering what it wants to
+    let cap = tester.capacity();
+
+    // len is the length *after* removal
+    for len in 0..cap - 1 {
+        // 0, 1, 2, .., len - 1
+        let expected = iter::count(0, 1).take(len).collect();
+        for tail_pos in 0..cap {
+            for to_remove in 0..len + 1 {
+                tester.tail = tail_pos;
+                tester.head = tail_pos;
+                for i in 0..len {
+                    if i == to_remove {
+                        tester.push_back(1234);
+                    }
+                    tester.push_back(i);
+                }
+                if to_remove == len {
+                    tester.push_back(1234);
+                }
+                tester.remove(to_remove);
+                assert!(tester.tail < tester.cap);
+                assert!(tester.head < tester.cap);
+                assert_eq!(tester, expected);
+            }
+        }
+    }
+}
+*/
+
+// FIXME(japaric) privacy
+/*
+#[test]
+fn test_shrink_to_fit() {
+    // This test checks that every single combination of head and tail position,
+    // is tested. Capacity 15 should be large enough to cover every case.
+
+    let mut tester = VecDeque::with_capacity(15);
+    // can't guarantee we got 15, so have to get what we got.
+    // 15 would be great, but we will definitely get 2^k - 1, for k >= 4, or else
+    // this test isn't covering what it wants to
+    let cap = tester.capacity();
+    tester.reserve(63);
+    let max_cap = tester.capacity();
+
+    for len in 0..cap + 1 {
+        // 0, 1, 2, .., len - 1
+        let expected = iter::count(0, 1).take(len).collect();
+        for tail_pos in 0..max_cap + 1 {
+            tester.tail = tail_pos;
+            tester.head = tail_pos;
+            tester.reserve(63);
+            for i in 0..len {
+                tester.push_back(i);
+            }
+            tester.shrink_to_fit();
+            assert!(tester.capacity() <= cap);
+            assert!(tester.tail < tester.cap);
+            assert!(tester.head < tester.cap);
+            assert_eq!(tester, expected);
+        }
+    }
+}
+*/
+
+#[test]
+fn test_front() {
+    let mut ring = VecDeque::new();
+    ring.push_back(10);
+    ring.push_back(20);
+    assert_eq!(ring.front(), Some(&10));
+    ring.pop_front();
+    assert_eq!(ring.front(), Some(&20));
+    ring.pop_front();
+    assert_eq!(ring.front(), None);
+}
+
+#[test]
+fn test_as_slices() {
+    let mut ring: VecDeque<i32> = VecDeque::with_capacity(127);
+    let cap = ring.capacity() as i32;
+    let first = cap/2;
+    let last  = cap - first;
+    for i in 0..first {
+        ring.push_back(i);
+
+        let (left, right) = ring.as_slices();
+        let expected: Vec<_> = (0..i+1).collect();
+        assert_eq!(left, expected);
+        assert_eq!(right, []);
+    }
+
+    for j in -last..0 {
+        ring.push_front(j);
+        let (left, right) = ring.as_slices();
+        let expected_left: Vec<_> = (-last..j+1).rev().collect();
+        let expected_right: Vec<_> = (0..first).collect();
+        assert_eq!(left, expected_left);
+        assert_eq!(right, expected_right);
+    }
+
+    assert_eq!(ring.len() as i32, cap);
+    assert_eq!(ring.capacity() as i32, cap);
+}
+
+#[test]
+fn test_as_mut_slices() {
+    let mut ring: VecDeque<i32> = VecDeque::with_capacity(127);
+    let cap = ring.capacity() as i32;
+    let first = cap/2;
+    let last  = cap - first;
+    for i in 0..first {
+        ring.push_back(i);
+
+        let (left, right) = ring.as_mut_slices();
+        let expected: Vec<_> = (0..i+1).collect();
+        assert_eq!(left, expected);
+        assert_eq!(right, []);
+    }
+
+    for j in -last..0 {
+        ring.push_front(j);
+        let (left, right) = ring.as_mut_slices();
+        let expected_left: Vec<_> = (-last..j+1).rev().collect();
+        let expected_right: Vec<_> = (0..first).collect();
+        assert_eq!(left, expected_left);
+        assert_eq!(right, expected_right);
+    }
+
+    assert_eq!(ring.len() as i32, cap);
+    assert_eq!(ring.capacity() as i32, cap);
+}
+
+// FIXME(japaric) privacy
+/*
+#[test]
+fn test_split_off() {
+    // This test checks that every single combination of tail position, length, and
+    // split position is tested. Capacity 15 should be large enough to cover every case.
+
+    let mut tester = VecDeque::with_capacity(15);
+    // can't guarantee we got 15, so have to get what we got.
+    // 15 would be great, but we will definitely get 2^k - 1, for k >= 4, or else
+    // this test isn't covering what it wants to
+    let cap = tester.capacity();
+
+    // len is the length *before* splitting
+    for len in 0..cap {
+        // index to split at
+        for at in 0..len + 1 {
+            // 0, 1, 2, .., at - 1 (may be empty)
+            let expected_self = iter::count(0, 1).take(at).collect();
+            // at, at + 1, .., len - 1 (may be empty)
+            let expected_other = iter::count(at, 1).take(len - at).collect();
+
+            for tail_pos in 0..cap {
+                tester.tail = tail_pos;
+                tester.head = tail_pos;
+                for i in 0..len {
+                    tester.push_back(i);
+                }
+                let result = tester.split_off(at);
+                assert!(tester.tail < tester.cap);
+                assert!(tester.head < tester.cap);
+                assert!(result.tail < result.cap);
+                assert!(result.head < result.cap);
+                assert_eq!(tester, expected_self);
+                assert_eq!(result, expected_other);
+            }
+        }
+    }
+}
+*/
+
+#[test]
+fn test_append() {
+    let mut a: VecDeque<_> = vec![1, 2, 3].into_iter().collect();
+    let mut b: VecDeque<_> = vec![4, 5, 6].into_iter().collect();
+
+    // normal append
+    a.append(&mut b);
+    assert_eq!(a.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
+    assert_eq!(b.iter().cloned().collect::<Vec<_>>(), []);
+
+    // append nothing to something
+    a.append(&mut b);
+    assert_eq!(a.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
+    assert_eq!(b.iter().cloned().collect::<Vec<_>>(), []);
+
+    // append something to nothing
+    b.append(&mut a);
+    assert_eq!(b.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
+    assert_eq!(a.iter().cloned().collect::<Vec<_>>(), []);
+}
diff --git a/src/libcollectionstest/vec_map.rs b/src/libcollectionstest/vec_map.rs
new file mode 100644 (file)
index 0000000..112b4c0
--- /dev/null
@@ -0,0 +1,510 @@
+// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::collections::VecMap;
+use std::collections::vec_map::Entry::{Occupied, Vacant};
+use std::hash::{SipHasher, hash};
+
+#[test]
+fn test_get_mut() {
+    let mut m = VecMap::new();
+    assert!(m.insert(1, 12).is_none());
+    assert!(m.insert(2, 8).is_none());
+    assert!(m.insert(5, 14).is_none());
+    let new = 100;
+    match m.get_mut(&5) {
+        None => panic!(), Some(x) => *x = new
+    }
+    assert_eq!(m.get(&5), Some(&new));
+}
+
+#[test]
+fn test_len() {
+    let mut map = VecMap::new();
+    assert_eq!(map.len(), 0);
+    assert!(map.is_empty());
+    assert!(map.insert(5, 20).is_none());
+    assert_eq!(map.len(), 1);
+    assert!(!map.is_empty());
+    assert!(map.insert(11, 12).is_none());
+    assert_eq!(map.len(), 2);
+    assert!(!map.is_empty());
+    assert!(map.insert(14, 22).is_none());
+    assert_eq!(map.len(), 3);
+    assert!(!map.is_empty());
+}
+
+#[test]
+fn test_clear() {
+    let mut map = VecMap::new();
+    assert!(map.insert(5, 20).is_none());
+    assert!(map.insert(11, 12).is_none());
+    assert!(map.insert(14, 22).is_none());
+    map.clear();
+    assert!(map.is_empty());
+    assert!(map.get(&5).is_none());
+    assert!(map.get(&11).is_none());
+    assert!(map.get(&14).is_none());
+}
+
+#[test]
+fn test_insert() {
+    let mut m = VecMap::new();
+    assert_eq!(m.insert(1, 2), None);
+    assert_eq!(m.insert(1, 3), Some(2));
+    assert_eq!(m.insert(1, 4), Some(3));
+}
+
+#[test]
+fn test_remove() {
+    let mut m = VecMap::new();
+    m.insert(1, 2);
+    assert_eq!(m.remove(&1), Some(2));
+    assert_eq!(m.remove(&1), None);
+}
+
+#[test]
+fn test_keys() {
+    let mut map = VecMap::new();
+    map.insert(1, 'a');
+    map.insert(2, 'b');
+    map.insert(3, 'c');
+    let keys: Vec<_> = map.keys().collect();
+    assert_eq!(keys.len(), 3);
+    assert!(keys.contains(&1));
+    assert!(keys.contains(&2));
+    assert!(keys.contains(&3));
+}
+
+#[test]
+fn test_values() {
+    let mut map = VecMap::new();
+    map.insert(1, 'a');
+    map.insert(2, 'b');
+    map.insert(3, 'c');
+    let values: Vec<_> = map.values().cloned().collect();
+    assert_eq!(values.len(), 3);
+    assert!(values.contains(&'a'));
+    assert!(values.contains(&'b'));
+    assert!(values.contains(&'c'));
+}
+
+#[test]
+fn test_iterator() {
+    let mut m = VecMap::new();
+
+    assert!(m.insert(0, 1).is_none());
+    assert!(m.insert(1, 2).is_none());
+    assert!(m.insert(3, 5).is_none());
+    assert!(m.insert(6, 10).is_none());
+    assert!(m.insert(10, 11).is_none());
+
+    let mut it = m.iter();
+    assert_eq!(it.size_hint(), (0, Some(11)));
+    assert_eq!(it.next().unwrap(), (0, &1));
+    assert_eq!(it.size_hint(), (0, Some(10)));
+    assert_eq!(it.next().unwrap(), (1, &2));
+    assert_eq!(it.size_hint(), (0, Some(9)));
+    assert_eq!(it.next().unwrap(), (3, &5));
+    assert_eq!(it.size_hint(), (0, Some(7)));
+    assert_eq!(it.next().unwrap(), (6, &10));
+    assert_eq!(it.size_hint(), (0, Some(4)));
+    assert_eq!(it.next().unwrap(), (10, &11));
+    assert_eq!(it.size_hint(), (0, Some(0)));
+    assert!(it.next().is_none());
+}
+
+#[test]
+fn test_iterator_size_hints() {
+    let mut m = VecMap::new();
+
+    assert!(m.insert(0, 1).is_none());
+    assert!(m.insert(1, 2).is_none());
+    assert!(m.insert(3, 5).is_none());
+    assert!(m.insert(6, 10).is_none());
+    assert!(m.insert(10, 11).is_none());
+
+    assert_eq!(m.iter().size_hint(), (0, Some(11)));
+    assert_eq!(m.iter().rev().size_hint(), (0, Some(11)));
+    assert_eq!(m.iter_mut().size_hint(), (0, Some(11)));
+    assert_eq!(m.iter_mut().rev().size_hint(), (0, Some(11)));
+}
+
+#[test]
+fn test_mut_iterator() {
+    let mut m = VecMap::new();
+
+    assert!(m.insert(0, 1).is_none());
+    assert!(m.insert(1, 2).is_none());
+    assert!(m.insert(3, 5).is_none());
+    assert!(m.insert(6, 10).is_none());
+    assert!(m.insert(10, 11).is_none());
+
+    for (k, v) in &mut m {
+        *v += k as isize;
+    }
+
+    let mut it = m.iter();
+    assert_eq!(it.next().unwrap(), (0, &1));
+    assert_eq!(it.next().unwrap(), (1, &3));
+    assert_eq!(it.next().unwrap(), (3, &8));
+    assert_eq!(it.next().unwrap(), (6, &16));
+    assert_eq!(it.next().unwrap(), (10, &21));
+    assert!(it.next().is_none());
+}
+
+#[test]
+fn test_rev_iterator() {
+    let mut m = VecMap::new();
+
+    assert!(m.insert(0, 1).is_none());
+    assert!(m.insert(1, 2).is_none());
+    assert!(m.insert(3, 5).is_none());
+    assert!(m.insert(6, 10).is_none());
+    assert!(m.insert(10, 11).is_none());
+
+    let mut it = m.iter().rev();
+    assert_eq!(it.next().unwrap(), (10, &11));
+    assert_eq!(it.next().unwrap(), (6, &10));
+    assert_eq!(it.next().unwrap(), (3, &5));
+    assert_eq!(it.next().unwrap(), (1, &2));
+    assert_eq!(it.next().unwrap(), (0, &1));
+    assert!(it.next().is_none());
+}
+
+#[test]
+fn test_mut_rev_iterator() {
+    let mut m = VecMap::new();
+
+    assert!(m.insert(0, 1).is_none());
+    assert!(m.insert(1, 2).is_none());
+    assert!(m.insert(3, 5).is_none());
+    assert!(m.insert(6, 10).is_none());
+    assert!(m.insert(10, 11).is_none());
+
+    for (k, v) in m.iter_mut().rev() {
+        *v += k as isize;
+    }
+
+    let mut it = m.iter();
+    assert_eq!(it.next().unwrap(), (0, &1));
+    assert_eq!(it.next().unwrap(), (1, &3));
+    assert_eq!(it.next().unwrap(), (3, &8));
+    assert_eq!(it.next().unwrap(), (6, &16));
+    assert_eq!(it.next().unwrap(), (10, &21));
+    assert!(it.next().is_none());
+}
+
+#[test]
+fn test_move_iter() {
+    let mut m: VecMap<Box<_>> = VecMap::new();
+    m.insert(1, box 2);
+    let mut called = false;
+    for (k, v) in m {
+        assert!(!called);
+        called = true;
+        assert_eq!(k, 1);
+        assert_eq!(v, box 2);
+    }
+    assert!(called);
+}
+
+#[test]
+fn test_drain_iterator() {
+    let mut map = VecMap::new();
+    map.insert(1, "a");
+    map.insert(3, "c");
+    map.insert(2, "b");
+
+    let vec: Vec<_> = map.drain().collect();
+
+    assert_eq!(vec, [(1, "a"), (2, "b"), (3, "c")]);
+    assert_eq!(map.len(), 0);
+}
+
+#[test]
+fn test_append() {
+    let mut a = VecMap::new();
+    a.insert(1, "a");
+    a.insert(2, "b");
+    a.insert(3, "c");
+
+    let mut b = VecMap::new();
+    b.insert(3, "d");  // Overwrite element from a
+    b.insert(4, "e");
+    b.insert(5, "f");
+
+    a.append(&mut b);
+
+    assert_eq!(a.len(), 5);
+    assert_eq!(b.len(), 0);
+    // Capacity shouldn't change for possible reuse
+    assert!(b.capacity() >= 4);
+
+    assert_eq!(a[1], "a");
+    assert_eq!(a[2], "b");
+    assert_eq!(a[3], "d");
+    assert_eq!(a[4], "e");
+    assert_eq!(a[5], "f");
+}
+
+#[test]
+fn test_split_off() {
+    // Split within the key range
+    let mut a = VecMap::new();
+    a.insert(1, "a");
+    a.insert(2, "b");
+    a.insert(3, "c");
+    a.insert(4, "d");
+
+    let b = a.split_off(3);
+
+    assert_eq!(a.len(), 2);
+    assert_eq!(b.len(), 2);
+
+    assert_eq!(a[1], "a");
+    assert_eq!(a[2], "b");
+
+    assert_eq!(b[3], "c");
+    assert_eq!(b[4], "d");
+
+    // Split at 0
+    a.clear();
+    a.insert(1, "a");
+    a.insert(2, "b");
+    a.insert(3, "c");
+    a.insert(4, "d");
+
+    let b = a.split_off(0);
+
+    assert_eq!(a.len(), 0);
+    assert_eq!(b.len(), 4);
+    assert_eq!(b[1], "a");
+    assert_eq!(b[2], "b");
+    assert_eq!(b[3], "c");
+    assert_eq!(b[4], "d");
+
+    // Split behind max_key
+    a.clear();
+    a.insert(1, "a");
+    a.insert(2, "b");
+    a.insert(3, "c");
+    a.insert(4, "d");
+
+    let b = a.split_off(5);
+
+    assert_eq!(a.len(), 4);
+    assert_eq!(b.len(), 0);
+    assert_eq!(a[1], "a");
+    assert_eq!(a[2], "b");
+    assert_eq!(a[3], "c");
+    assert_eq!(a[4], "d");
+}
+
+#[test]
+fn test_show() {
+    let mut map = VecMap::new();
+    let empty = VecMap::<i32>::new();
+
+    map.insert(1, 2);
+    map.insert(3, 4);
+
+    let map_str = format!("{:?}", map);
+    assert!(map_str == "{1: 2, 3: 4}" || map_str == "{3: 4, 1: 2}");
+    assert_eq!(format!("{:?}", empty), "{}");
+}
+
+#[test]
+fn test_clone() {
+    let mut a = VecMap::new();
+
+    a.insert(1, 'x');
+    a.insert(4, 'y');
+    a.insert(6, 'z');
+
+    assert!(a.clone() == a);
+}
+
+#[test]
+fn test_eq() {
+    let mut a = VecMap::new();
+    let mut b = VecMap::new();
+
+    assert!(a == b);
+    assert!(a.insert(0, 5).is_none());
+    assert!(a != b);
+    assert!(b.insert(0, 4).is_none());
+    assert!(a != b);
+    assert!(a.insert(5, 19).is_none());
+    assert!(a != b);
+    assert!(!b.insert(0, 5).is_none());
+    assert!(a != b);
+    assert!(b.insert(5, 19).is_none());
+    assert!(a == b);
+
+    a = VecMap::new();
+    b = VecMap::with_capacity(1);
+    assert!(a == b);
+}
+
+#[test]
+fn test_lt() {
+    let mut a = VecMap::new();
+    let mut b = VecMap::new();
+
+    assert!(!(a < b) && !(b < a));
+    assert!(b.insert(2, 5).is_none());
+    assert!(a < b);
+    assert!(a.insert(2, 7).is_none());
+    assert!(!(a < b) && b < a);
+    assert!(b.insert(1, 0).is_none());
+    assert!(b < a);
+    assert!(a.insert(0, 6).is_none());
+    assert!(a < b);
+    assert!(a.insert(6, 2).is_none());
+    assert!(a < b && !(b < a));
+}
+
+#[test]
+fn test_ord() {
+    let mut a = VecMap::new();
+    let mut b = VecMap::new();
+
+    assert!(a <= b && a >= b);
+    assert!(a.insert(1, 1).is_none());
+    assert!(a > b && a >= b);
+    assert!(b < a && b <= a);
+    assert!(b.insert(2, 2).is_none());
+    assert!(b > a && b >= a);
+    assert!(a < b && a <= b);
+}
+
+#[test]
+fn test_hash() {
+    let mut x = VecMap::new();
+    let mut y = VecMap::new();
+
+    assert!(hash::<_, SipHasher>(&x) == hash::<_, SipHasher>(&y));
+    x.insert(1, 'a');
+    x.insert(2, 'b');
+    x.insert(3, 'c');
+
+    y.insert(3, 'c');
+    y.insert(2, 'b');
+    y.insert(1, 'a');
+
+    assert!(hash::<_, SipHasher>(&x) == hash::<_, SipHasher>(&y));
+
+    x.insert(1000, 'd');
+    x.remove(&1000);
+
+    assert!(hash::<_, SipHasher>(&x) == hash::<_, SipHasher>(&y));
+}
+
+#[test]
+fn test_from_iter() {
+    let xs = vec![(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e')];
+
+    let map: VecMap<_> = xs.iter().cloned().collect();
+
+    for &(k, v) in &xs {
+        assert_eq!(map.get(&k), Some(&v));
+    }
+}
+
+#[test]
+fn test_index() {
+    let mut map = VecMap::new();
+
+    map.insert(1, 2);
+    map.insert(2, 1);
+    map.insert(3, 4);
+
+    assert_eq!(map[3], 4);
+}
+
+#[test]
+#[should_panic]
+fn test_index_nonexistent() {
+    let mut map = VecMap::new();
+
+    map.insert(1, 2);
+    map.insert(2, 1);
+    map.insert(3, 4);
+
+    map[4];
+}
+
+#[test]
+fn test_entry(){
+    let xs = [(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)];
+
+    let mut map: VecMap<_> = xs.iter().cloned().collect();
+
+    // Existing key (insert)
+    match map.entry(1) {
+        Vacant(_) => unreachable!(),
+        Occupied(mut view) => {
+            assert_eq!(view.get(), &10);
+            assert_eq!(view.insert(100), 10);
+        }
+    }
+    assert_eq!(map.get(&1).unwrap(), &100);
+    assert_eq!(map.len(), 6);
+
+
+    // Existing key (update)
+    match map.entry(2) {
+        Vacant(_) => unreachable!(),
+        Occupied(mut view) => {
+            let v = view.get_mut();
+            *v *= 10;
+        }
+    }
+    assert_eq!(map.get(&2).unwrap(), &200);
+    assert_eq!(map.len(), 6);
+
+    // Existing key (take)
+    match map.entry(3) {
+        Vacant(_) => unreachable!(),
+        Occupied(view) => {
+            assert_eq!(view.remove(), 30);
+        }
+    }
+    assert_eq!(map.get(&3), None);
+    assert_eq!(map.len(), 5);
+
+
+    // Inexistent key (insert)
+    match map.entry(10) {
+        Occupied(_) => unreachable!(),
+        Vacant(view) => {
+            assert_eq!(*view.insert(1000), 1000);
+        }
+    }
+    assert_eq!(map.get(&10).unwrap(), &1000);
+    assert_eq!(map.len(), 6);
+}
+
+mod bench {
+    use std::collections::VecMap;
+
+    map_insert_rand_bench!{insert_rand_100,    100,    VecMap}
+    map_insert_rand_bench!{insert_rand_10_000, 10_000, VecMap}
+
+    map_insert_seq_bench!{insert_seq_100,    100,    VecMap}
+    map_insert_seq_bench!{insert_seq_10_000, 10_000, VecMap}
+
+    map_find_rand_bench!{find_rand_100,    100,    VecMap}
+    map_find_rand_bench!{find_rand_10_000, 10_000, VecMap}
+
+    map_find_seq_bench!{find_seq_100,    100,    VecMap}
+    map_find_seq_bench!{find_seq_10_000, 10_000, VecMap}
+}