| use std::cmp::Ordering::{Equal, Greater, Less}; | |
| use std::convert::identity; | |
| use std::rc::Rc; | |
| use std::{fmt, panic}; | |
| 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[..]; | |
| 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!(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_split_first() { | |
| let mut a = vec![11]; | |
| let b: &[i32] = &[]; | |
| assert!(b.split_first().is_none()); | |
| assert_eq!(a.split_first(), Some((&11, b))); | |
| a = vec![11, 12]; | |
| let b: &[i32] = &[12]; | |
| assert_eq!(a.split_first(), Some((&11, b))); | |
| } | |
| #[test] | |
| fn test_split_first_mut() { | |
| let mut a = vec![11]; | |
| let b: &mut [i32] = &mut []; | |
| assert!(b.split_first_mut().is_none()); | |
| assert!(a.split_first_mut() == Some((&mut 11, b))); | |
| a = vec![11, 12]; | |
| let b: &mut [_] = &mut [12]; | |
| assert!(a.split_first_mut() == Some((&mut 11, b))); | |
| } | |
| #[test] | |
| fn test_split_last() { | |
| let mut a = vec![11]; | |
| let b: &[i32] = &[]; | |
| assert!(b.split_last().is_none()); | |
| assert_eq!(a.split_last(), Some((&11, b))); | |
| a = vec![11, 12]; | |
| let b: &[_] = &[11]; | |
| assert_eq!(a.split_last(), Some((&12, b))); | |
| } | |
| #[test] | |
| fn test_split_last_mut() { | |
| let mut a = vec![11]; | |
| let b: &mut [i32] = &mut []; | |
| assert!(b.split_last_mut().is_none()); | |
| assert!(a.split_last_mut() == Some((&mut 11, b))); | |
| a = vec![11, 12]; | |
| let b: &mut [_] = &mut [11]; | |
| assert!(a.split_last_mut() == Some((&mut 12, b))); | |
| } | |
| #[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::new(0)); | |
| v.push(Box::new(0)); | |
| v.push(Box::new(0)); | |
| 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::new(6), Box::new(5), Box::new(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::new(6), Box::new(5), Box::new(4)]; | |
| v.clear(); | |
| assert_eq!(v.len(), 0); | |
| // If the unsafe block didn't drop things properly, we blow up here. | |
| } | |
| #[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_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()); | |
| // check the 1-byte-types path | |
| let mut v = (-50..51i8).collect::<Vec<_>>(); | |
| v.reverse(); | |
| assert_eq!(v, (-50..51i8).rev().collect::<Vec<_>>()); | |
| // check the 2-byte-types path | |
| let mut v = (-50..51i16).collect::<Vec<_>>(); | |
| v.reverse(); | |
| assert_eq!(v, (-50..51i16).rev().collect::<Vec<_>>()); | |
| } | |
| #[test] | |
| fn test_rotate_left() { | |
| let expected: Vec<_> = (0..13).collect(); | |
| let mut v = Vec::new(); | |
| // no-ops | |
| v.clone_from(&expected); | |
| v.rotate_left(0); | |
| assert_eq!(v, expected); | |
| v.rotate_left(expected.len()); | |
| assert_eq!(v, expected); | |
| let mut zst_array = [(), (), ()]; | |
| zst_array.rotate_left(2); | |
| // happy path | |
| v = (5..13).chain(0..5).collect(); | |
| v.rotate_left(8); | |
| assert_eq!(v, expected); | |
| let expected: Vec<_> = (0..1000).collect(); | |
| // small rotations in large slice, uses ptr::copy | |
| v = (2..1000).chain(0..2).collect(); | |
| v.rotate_left(998); | |
| assert_eq!(v, expected); | |
| v = (998..1000).chain(0..998).collect(); | |
| v.rotate_left(2); | |
| assert_eq!(v, expected); | |
| // non-small prime rotation, has a few rounds of swapping | |
| v = (389..1000).chain(0..389).collect(); | |
| v.rotate_left(1000 - 389); | |
| assert_eq!(v, expected); | |
| } | |
| #[test] | |
| fn test_rotate_right() { | |
| let expected: Vec<_> = (0..13).collect(); | |
| let mut v = Vec::new(); | |
| // no-ops | |
| v.clone_from(&expected); | |
| v.rotate_right(0); | |
| assert_eq!(v, expected); | |
| v.rotate_right(expected.len()); | |
| assert_eq!(v, expected); | |
| let mut zst_array = [(), (), ()]; | |
| zst_array.rotate_right(2); | |
| // happy path | |
| v = (5..13).chain(0..5).collect(); | |
| v.rotate_right(5); | |
| assert_eq!(v, expected); | |
| let expected: Vec<_> = (0..1000).collect(); | |
| // small rotations in large slice, uses ptr::copy | |
| v = (2..1000).chain(0..2).collect(); | |
| v.rotate_right(2); | |
| assert_eq!(v, expected); | |
| v = (998..1000).chain(0..998).collect(); | |
| v.rotate_right(998); | |
| assert_eq!(v, expected); | |
| // non-small prime rotation, has a few rounds of swapping | |
| v = (389..1000).chain(0..389).collect(); | |
| v.rotate_right(389); | |
| assert_eq!(v, expected); | |
| } | |
| #[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.join(&0), [1, 0, 2, 3]); | |
| let v: &[&[_]] = &[&[1], &[2], &[3]]; | |
| assert_eq!(v.join(&0), [1, 0, 2, 0, 3]); | |
| } | |
| #[test] | |
| fn test_join() { | |
| let v: [Vec<i32>; 0] = []; | |
| assert_eq!(v.join(&0), []); | |
| assert_eq!([vec![1], vec![2, 3]].join(&0), [1, 0, 2, 3]); | |
| assert_eq!([vec![1], vec![2], vec![3]].join(&0), [1, 0, 2, 0, 3]); | |
| let v: [&[_]; 2] = [&[1], &[2, 3]]; | |
| assert_eq!(v.join(&0), [1, 0, 2, 3]); | |
| let v: [&[_]; 3] = [&[1], &[2], &[3]]; | |
| assert_eq!(v.join(&0), [1, 0, 2, 0, 3]); | |
| } | |
| #[test] | |
| fn test_join_nocopy() { | |
| let v: [String; 0] = []; | |
| assert_eq!(v.join(","), ""); | |
| assert_eq!(["a".to_string(), "ab".into()].join(","), "a,ab"); | |
| assert_eq!(["a".to_string(), "ab".into(), "abc".into()].join(","), "a,ab,abc"); | |
| assert_eq!(["a".to_string(), "ab".into(), "".into()].join(","), "a,ab,"); | |
| } | |
| #[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[1..3]; | |
| assert_eq!(v.len(), 2); | |
| assert_eq!(v[0], 2); | |
| assert_eq!(v[1], 3); | |
| } | |
| macro_rules! assert_order { | |
| (Greater, $a:expr, $b:expr) => { | |
| assert_eq!($a.cmp($b), Greater); | |
| assert!($a > $b); | |
| }; | |
| (Less, $a:expr, $b:expr) => { | |
| assert_eq!($a.cmp($b), Less); | |
| assert!($a < $b); | |
| }; | |
| (Equal, $a:expr, $b:expr) => { | |
| assert_eq!($a.cmp($b), Equal); | |
| assert_eq!($a, $b); | |
| }; | |
| } | |
| #[test] | |
| fn test_total_ord_u8() { | |
| let c = &[1u8, 2, 3]; | |
| assert_order!(Greater, &[1u8, 2, 3, 4][..], &c[..]); | |
| let c = &[1u8, 2, 3, 4]; | |
| assert_order!(Less, &[1u8, 2, 3][..], &c[..]); | |
| let c = &[1u8, 2, 3, 6]; | |
| assert_order!(Equal, &[1u8, 2, 3, 6][..], &c[..]); | |
| let c = &[1u8, 2, 3, 4, 5, 6]; | |
| assert_order!(Less, &[1u8, 2, 3, 4, 5, 5, 5, 5][..], &c[..]); | |
| let c = &[1u8, 2, 3, 4]; | |
| assert_order!(Greater, &[2u8, 2][..], &c[..]); | |
| } | |
| #[test] | |
| fn test_total_ord_i32() { | |
| let c = &[1, 2, 3]; | |
| assert_order!(Greater, &[1, 2, 3, 4][..], &c[..]); | |
| let c = &[1, 2, 3, 4]; | |
| assert_order!(Less, &[1, 2, 3][..], &c[..]); | |
| let c = &[1, 2, 3, 6]; | |
| assert_order!(Equal, &[1, 2, 3, 6][..], &c[..]); | |
| let c = &[1, 2, 3, 4, 5, 6]; | |
| assert_order!(Less, &[1, 2, 3, 4, 5, 5, 5, 5][..], &c[..]); | |
| let c = &[1, 2, 3, 4]; | |
| assert_order!(Greater, &[2, 2][..], &c[..]); | |
| } | |
| #[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_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_as_slice() { | |
| let xs = [1, 2, 5, 10, 11]; | |
| let mut iter = xs.iter(); | |
| assert_eq!(iter.as_slice(), &[1, 2, 5, 10, 11]); | |
| iter.next(); | |
| assert_eq!(iter.as_slice(), &[2, 5, 10, 11]); | |
| } | |
| #[test] | |
| fn test_iter_as_ref() { | |
| let xs = [1, 2, 5, 10, 11]; | |
| let mut iter = xs.iter(); | |
| assert_eq!(iter.as_ref(), &[1, 2, 5, 10, 11]); | |
| iter.next(); | |
| assert_eq!(iter.as_ref(), &[2, 5, 10, 11]); | |
| } | |
| #[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_iter_is_empty() { | |
| let xs = [1, 2, 5, 10, 11]; | |
| for i in 0..xs.len() { | |
| for j in i..xs.len() { | |
| assert_eq!(xs[i..j].iter().is_empty(), xs[i..j].is_empty()); | |
| } | |
| } | |
| } | |
| #[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_split_iterator() { | |
| 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_split_iterator_inclusive() { | |
| let xs = &[1, 2, 3, 4, 5]; | |
| let splits: &[&[_]] = &[&[1, 2], &[3, 4], &[5]]; | |
| assert_eq!(xs.split_inclusive(|x| *x % 2 == 0).collect::<Vec<_>>(), splits); | |
| let splits: &[&[_]] = &[&[1], &[2, 3, 4, 5]]; | |
| assert_eq!(xs.split_inclusive(|x| *x == 1).collect::<Vec<_>>(), splits); | |
| let splits: &[&[_]] = &[&[1, 2, 3, 4, 5]]; | |
| assert_eq!(xs.split_inclusive(|x| *x == 5).collect::<Vec<_>>(), splits); | |
| let splits: &[&[_]] = &[&[1, 2, 3, 4, 5]]; | |
| assert_eq!(xs.split_inclusive(|x| *x == 10).collect::<Vec<_>>(), splits); | |
| let splits: &[&[_]] = &[&[1], &[2], &[3], &[4], &[5]]; | |
| assert_eq!(xs.split_inclusive(|_| true).collect::<Vec<&[i32]>>(), splits); | |
| let xs: &[i32] = &[]; | |
| let splits: &[&[i32]] = &[]; | |
| assert_eq!(xs.split_inclusive(|x| *x == 5).collect::<Vec<&[i32]>>(), splits); | |
| } | |
| #[test] | |
| fn test_split_iterator_inclusive_reverse() { | |
| let xs = &[1, 2, 3, 4, 5]; | |
| let splits: &[&[_]] = &[&[5], &[3, 4], &[1, 2]]; | |
| assert_eq!(xs.split_inclusive(|x| *x % 2 == 0).rev().collect::<Vec<_>>(), splits); | |
| let splits: &[&[_]] = &[&[2, 3, 4, 5], &[1]]; | |
| assert_eq!(xs.split_inclusive(|x| *x == 1).rev().collect::<Vec<_>>(), splits); | |
| let splits: &[&[_]] = &[&[1, 2, 3, 4, 5]]; | |
| assert_eq!(xs.split_inclusive(|x| *x == 5).rev().collect::<Vec<_>>(), splits); | |
| let splits: &[&[_]] = &[&[1, 2, 3, 4, 5]]; | |
| assert_eq!(xs.split_inclusive(|x| *x == 10).rev().collect::<Vec<_>>(), splits); | |
| let splits: &[&[_]] = &[&[5], &[4], &[3], &[2], &[1]]; | |
| assert_eq!(xs.split_inclusive(|_| true).rev().collect::<Vec<_>>(), splits); | |
| let xs: &[i32] = &[]; | |
| let splits: &[&[i32]] = &[]; | |
| assert_eq!(xs.split_inclusive(|x| *x == 5).rev().collect::<Vec<_>>(), splits); | |
| } | |
| #[test] | |
| fn test_split_iterator_mut_inclusive() { | |
| let xs = &mut [1, 2, 3, 4, 5]; | |
| let splits: &[&[_]] = &[&[1, 2], &[3, 4], &[5]]; | |
| assert_eq!(xs.split_inclusive_mut(|x| *x % 2 == 0).collect::<Vec<_>>(), splits); | |
| let splits: &[&[_]] = &[&[1], &[2, 3, 4, 5]]; | |
| assert_eq!(xs.split_inclusive_mut(|x| *x == 1).collect::<Vec<_>>(), splits); | |
| let splits: &[&[_]] = &[&[1, 2, 3, 4, 5]]; | |
| assert_eq!(xs.split_inclusive_mut(|x| *x == 5).collect::<Vec<_>>(), splits); | |
| let splits: &[&[_]] = &[&[1, 2, 3, 4, 5]]; | |
| assert_eq!(xs.split_inclusive_mut(|x| *x == 10).collect::<Vec<_>>(), splits); | |
| let splits: &[&[_]] = &[&[1], &[2], &[3], &[4], &[5]]; | |
| assert_eq!(xs.split_inclusive_mut(|_| true).collect::<Vec<_>>(), splits); | |
| let xs: &mut [i32] = &mut []; | |
| let splits: &[&[i32]] = &[]; | |
| assert_eq!(xs.split_inclusive_mut(|x| *x == 5).collect::<Vec<_>>(), splits); | |
| } | |
| #[test] | |
| fn test_split_iterator_mut_inclusive_reverse() { | |
| let xs = &mut [1, 2, 3, 4, 5]; | |
| let splits: &[&[_]] = &[&[5], &[3, 4], &[1, 2]]; | |
| assert_eq!(xs.split_inclusive_mut(|x| *x % 2 == 0).rev().collect::<Vec<_>>(), splits); | |
| let splits: &[&[_]] = &[&[2, 3, 4, 5], &[1]]; | |
| assert_eq!(xs.split_inclusive_mut(|x| *x == 1).rev().collect::<Vec<_>>(), splits); | |
| let splits: &[&[_]] = &[&[1, 2, 3, 4, 5]]; | |
| assert_eq!(xs.split_inclusive_mut(|x| *x == 5).rev().collect::<Vec<_>>(), splits); | |
| let splits: &[&[_]] = &[&[1, 2, 3, 4, 5]]; | |
| assert_eq!(xs.split_inclusive_mut(|x| *x == 10).rev().collect::<Vec<_>>(), splits); | |
| let splits: &[&[_]] = &[&[5], &[4], &[3], &[2], &[1]]; | |
| assert_eq!(xs.split_inclusive_mut(|_| true).rev().collect::<Vec<_>>(), splits); | |
| let xs: &mut [i32] = &mut []; | |
| let splits: &[&[i32]] = &[]; | |
| assert_eq!(xs.split_inclusive_mut(|x| *x == 5).rev().collect::<Vec<_>>(), splits); | |
| } | |
| #[test] | |
| fn test_splitn_iterator() { | |
| let xs = &[1, 2, 3, 4, 5]; | |
| let splits: &[&[_]] = &[&[1, 2, 3, 4, 5]]; | |
| assert_eq!(xs.splitn(1, |x| *x % 2 == 0).collect::<Vec<_>>(), splits); | |
| let splits: &[&[_]] = &[&[1], &[3, 4, 5]]; | |
| assert_eq!(xs.splitn(2, |x| *x % 2 == 0).collect::<Vec<_>>(), splits); | |
| let splits: &[&[_]] = &[&[], &[], &[], &[4, 5]]; | |
| assert_eq!(xs.splitn(4, |_| true).collect::<Vec<_>>(), splits); | |
| let xs: &[i32] = &[]; | |
| let splits: &[&[i32]] = &[&[]]; | |
| assert_eq!(xs.splitn(2, |x| *x == 5).collect::<Vec<_>>(), splits); | |
| } | |
| #[test] | |
| fn test_splitn_iterator_mut() { | |
| let xs = &mut [1, 2, 3, 4, 5]; | |
| let splits: &[&mut [_]] = &[&mut [1, 2, 3, 4, 5]]; | |
| assert_eq!(xs.splitn_mut(1, |x| *x % 2 == 0).collect::<Vec<_>>(), splits); | |
| let splits: &[&mut [_]] = &[&mut [1], &mut [3, 4, 5]]; | |
| assert_eq!(xs.splitn_mut(2, |x| *x % 2 == 0).collect::<Vec<_>>(), splits); | |
| let splits: &[&mut [_]] = &[&mut [], &mut [], &mut [], &mut [4, 5]]; | |
| assert_eq!(xs.splitn_mut(4, |_| true).collect::<Vec<_>>(), splits); | |
| let xs: &mut [i32] = &mut []; | |
| let splits: &[&mut [i32]] = &[&mut []]; | |
| assert_eq!(xs.splitn_mut(2, |x| *x == 5).collect::<Vec<_>>(), splits); | |
| } | |
| #[test] | |
| fn test_rsplit_iterator() { | |
| 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_rsplitn_iterator() { | |
| let xs = &[1, 2, 3, 4, 5]; | |
| let splits: &[&[_]] = &[&[1, 2, 3, 4, 5]]; | |
| assert_eq!(xs.rsplitn(1, |x| *x % 2 == 0).collect::<Vec<_>>(), splits); | |
| let splits: &[&[_]] = &[&[5], &[1, 2, 3]]; | |
| assert_eq!(xs.rsplitn(2, |x| *x % 2 == 0).collect::<Vec<_>>(), splits); | |
| let splits: &[&[_]] = &[&[], &[], &[], &[1, 2]]; | |
| assert_eq!(xs.rsplitn(4, |_| true).collect::<Vec<_>>(), splits); | |
| let xs: &[i32] = &[]; | |
| let splits: &[&[i32]] = &[&[]]; | |
| assert_eq!(xs.rsplitn(2, |x| *x == 5).collect::<Vec<&[i32]>>(), splits); | |
| assert!(xs.rsplitn(0, |x| *x % 2 == 0).next().is_none()); | |
| } | |
| #[test] | |
| fn test_split_iterators_size_hint() { | |
| #[derive(Copy, Clone)] | |
| enum Bounds { | |
| Lower, | |
| Upper, | |
| } | |
| fn assert_tight_size_hints(mut it: impl Iterator, which: Bounds, ctx: impl fmt::Display) { | |
| match which { | |
| Bounds::Lower => { | |
| let mut lower_bounds = vec![it.size_hint().0]; | |
| while let Some(_) = it.next() { | |
| lower_bounds.push(it.size_hint().0); | |
| } | |
| let target: Vec<_> = (0..lower_bounds.len()).rev().collect(); | |
| assert_eq!(lower_bounds, target, "lower bounds incorrect or not tight: {}", ctx); | |
| } | |
| Bounds::Upper => { | |
| let mut upper_bounds = vec![it.size_hint().1]; | |
| while let Some(_) = it.next() { | |
| upper_bounds.push(it.size_hint().1); | |
| } | |
| let target: Vec<_> = (0..upper_bounds.len()).map(Some).rev().collect(); | |
| assert_eq!(upper_bounds, target, "upper bounds incorrect or not tight: {}", ctx); | |
| } | |
| } | |
| } | |
| for len in 0..=2 { | |
| let mut v: Vec<u8> = (0..len).collect(); | |
| // p: predicate, b: bound selection | |
| for (p, b) in [ | |
| // with a predicate always returning false, the split*-iterators | |
| // become maximally short, so the size_hint lower bounds are tight | |
| ((|_| false) as fn(&_) -> _, Bounds::Lower), | |
| // with a predicate always returning true, the split*-iterators | |
| // become maximally long, so the size_hint upper bounds are tight | |
| ((|_| true) as fn(&_) -> _, Bounds::Upper), | |
| ] { | |
| use assert_tight_size_hints as a; | |
| use format_args as f; | |
| a(v.split(p), b, "split"); | |
| a(v.split_mut(p), b, "split_mut"); | |
| a(v.split_inclusive(p), b, "split_inclusive"); | |
| a(v.split_inclusive_mut(p), b, "split_inclusive_mut"); | |
| a(v.rsplit(p), b, "rsplit"); | |
| a(v.rsplit_mut(p), b, "rsplit_mut"); | |
| for n in 0..=3 { | |
| a(v.splitn(n, p), b, f!("splitn, n = {n}")); | |
| a(v.splitn_mut(n, p), b, f!("splitn_mut, n = {n}")); | |
| a(v.rsplitn(n, p), b, f!("rsplitn, n = {n}")); | |
| a(v.rsplitn_mut(n, p), b, f!("rsplitn_mut, n = {n}")); | |
| } | |
| } | |
| } | |
| } | |
| #[test] | |
| fn test_windows_iterator() { | |
| 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); | |
| } | |
| #[test] | |
| #[should_panic] | |
| fn test_windows_iterator_0() { | |
| let v = &[1, 2, 3, 4]; | |
| let _it = v.windows(0); | |
| } | |
| #[test] | |
| fn test_chunks_iterator() { | |
| 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); | |
| } | |
| #[test] | |
| #[should_panic] | |
| fn test_chunks_iterator_0() { | |
| let v = &[1, 2, 3, 4]; | |
| let _it = v.chunks(0); | |
| } | |
| #[test] | |
| fn test_chunks_exact_iterator() { | |
| let v = &[1, 2, 3, 4, 5]; | |
| assert_eq!(v.chunks_exact(2).len(), 2); | |
| let chunks: &[&[_]] = &[&[1, 2], &[3, 4]]; | |
| assert_eq!(v.chunks_exact(2).collect::<Vec<_>>(), chunks); | |
| let chunks: &[&[_]] = &[&[1, 2, 3]]; | |
| assert_eq!(v.chunks_exact(3).collect::<Vec<_>>(), chunks); | |
| let chunks: &[&[_]] = &[]; | |
| assert_eq!(v.chunks_exact(6).collect::<Vec<_>>(), chunks); | |
| let chunks: &[&[_]] = &[&[3, 4], &[1, 2]]; | |
| assert_eq!(v.chunks_exact(2).rev().collect::<Vec<_>>(), chunks); | |
| } | |
| #[test] | |
| #[should_panic] | |
| fn test_chunks_exact_iterator_0() { | |
| let v = &[1, 2, 3, 4]; | |
| let _it = v.chunks_exact(0); | |
| } | |
| #[test] | |
| fn test_rchunks_iterator() { | |
| let v = &[1, 2, 3, 4, 5]; | |
| assert_eq!(v.rchunks(2).len(), 3); | |
| let chunks: &[&[_]] = &[&[4, 5], &[2, 3], &[1]]; | |
| assert_eq!(v.rchunks(2).collect::<Vec<_>>(), chunks); | |
| let chunks: &[&[_]] = &[&[3, 4, 5], &[1, 2]]; | |
| assert_eq!(v.rchunks(3).collect::<Vec<_>>(), chunks); | |
| let chunks: &[&[_]] = &[&[1, 2, 3, 4, 5]]; | |
| assert_eq!(v.rchunks(6).collect::<Vec<_>>(), chunks); | |
| let chunks: &[&[_]] = &[&[1], &[2, 3], &[4, 5]]; | |
| assert_eq!(v.rchunks(2).rev().collect::<Vec<_>>(), chunks); | |
| } | |
| #[test] | |
| #[should_panic] | |
| fn test_rchunks_iterator_0() { | |
| let v = &[1, 2, 3, 4]; | |
| let _it = v.rchunks(0); | |
| } | |
| #[test] | |
| fn test_rchunks_exact_iterator() { | |
| let v = &[1, 2, 3, 4, 5]; | |
| assert_eq!(v.rchunks_exact(2).len(), 2); | |
| let chunks: &[&[_]] = &[&[4, 5], &[2, 3]]; | |
| assert_eq!(v.rchunks_exact(2).collect::<Vec<_>>(), chunks); | |
| let chunks: &[&[_]] = &[&[3, 4, 5]]; | |
| assert_eq!(v.rchunks_exact(3).collect::<Vec<_>>(), chunks); | |
| let chunks: &[&[_]] = &[]; | |
| assert_eq!(v.rchunks_exact(6).collect::<Vec<_>>(), chunks); | |
| let chunks: &[&[_]] = &[&[2, 3], &[4, 5]]; | |
| assert_eq!(v.rchunks_exact(2).rev().collect::<Vec<_>>(), chunks); | |
| } | |
| #[test] | |
| #[should_panic] | |
| fn test_rchunks_exact_iterator_0() { | |
| let v = &[1, 2, 3, 4]; | |
| let _it = v.rchunks_exact(0); | |
| } | |
| #[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] | |
| #[should_panic] | |
| fn test_overflow_does_not_cause_segfault() { | |
| let mut v = vec![]; | |
| v.reserve_exact(!0); | |
| 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(!0); | |
| v.push(Rc::new(2)); | |
| } | |
| #[test] | |
| fn test_mut_split_at() { | |
| let mut values = [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!(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_split_iterator() { | |
| 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_split_iterator_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(3).len(), 3); | |
| 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_eq!(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_eq!(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_chunks_exact() { | |
| let mut v = [0, 1, 2, 3, 4, 5, 6]; | |
| assert_eq!(v.chunks_exact_mut(3).len(), 2); | |
| for (i, chunk) in v.chunks_exact_mut(3).enumerate() { | |
| for x in chunk { | |
| *x = i as u8; | |
| } | |
| } | |
| let result = [0, 0, 0, 1, 1, 1, 6]; | |
| assert_eq!(v, result); | |
| } | |
| #[test] | |
| fn test_mut_chunks_exact_rev() { | |
| let mut v = [0, 1, 2, 3, 4, 5, 6]; | |
| for (i, chunk) in v.chunks_exact_mut(3).rev().enumerate() { | |
| for x in chunk { | |
| *x = i as u8; | |
| } | |
| } | |
| let result = [1, 1, 1, 0, 0, 0, 6]; | |
| assert_eq!(v, result); | |
| } | |
| #[test] | |
| #[should_panic] | |
| fn test_mut_chunks_exact_0() { | |
| let mut v = [1, 2, 3, 4]; | |
| let _it = v.chunks_exact_mut(0); | |
| } | |
| #[test] | |
| fn test_mut_rchunks() { | |
| let mut v = [0, 1, 2, 3, 4, 5, 6]; | |
| assert_eq!(v.rchunks_mut(3).len(), 3); | |
| for (i, chunk) in v.rchunks_mut(3).enumerate() { | |
| for x in chunk { | |
| *x = i as u8; | |
| } | |
| } | |
| let result = [2, 1, 1, 1, 0, 0, 0]; | |
| assert_eq!(v, result); | |
| } | |
| #[test] | |
| fn test_mut_rchunks_rev() { | |
| let mut v = [0, 1, 2, 3, 4, 5, 6]; | |
| for (i, chunk) in v.rchunks_mut(3).rev().enumerate() { | |
| for x in chunk { | |
| *x = i as u8; | |
| } | |
| } | |
| let result = [0, 1, 1, 1, 2, 2, 2]; | |
| assert_eq!(v, result); | |
| } | |
| #[test] | |
| #[should_panic] | |
| fn test_mut_rchunks_0() { | |
| let mut v = [1, 2, 3, 4]; | |
| let _it = v.rchunks_mut(0); | |
| } | |
| #[test] | |
| fn test_mut_rchunks_exact() { | |
| let mut v = [0, 1, 2, 3, 4, 5, 6]; | |
| assert_eq!(v.rchunks_exact_mut(3).len(), 2); | |
| for (i, chunk) in v.rchunks_exact_mut(3).enumerate() { | |
| for x in chunk { | |
| *x = i as u8; | |
| } | |
| } | |
| let result = [0, 1, 1, 1, 0, 0, 0]; | |
| assert_eq!(v, result); | |
| } | |
| #[test] | |
| fn test_mut_rchunks_exact_rev() { | |
| let mut v = [0, 1, 2, 3, 4, 5, 6]; | |
| for (i, chunk) in v.rchunks_exact_mut(3).rev().enumerate() { | |
| for x in chunk { | |
| *x = i as u8; | |
| } | |
| } | |
| let result = [0, 0, 0, 0, 1, 1, 1]; | |
| assert_eq!(v, result); | |
| } | |
| #[test] | |
| #[should_panic] | |
| fn test_mut_rchunks_exact_0() { | |
| let mut v = [1, 2, 3, 4]; | |
| let _it = v.rchunks_exact_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::new([1, 2, 3]); | |
| let ys = xs.to_vec(); | |
| assert_eq!(ys, [1, 2, 3]); | |
| } | |
| #[test] | |
| fn test_in_place_iterator_specialization() { | |
| let src: Box<[usize]> = Box::new([1, 2, 3]); | |
| let src_ptr = src.as_ptr(); | |
| let sink: Box<_> = src.into_vec().into_iter().map(std::convert::identity).collect(); | |
| let sink_ptr = sink.as_ptr(); | |
| assert_eq!(src_ptr, sink_ptr); | |
| } | |
| #[test] | |
| fn test_box_slice_clone() { | |
| let data = vec![vec![0, 1], vec![0], vec![1]]; | |
| let data2 = data.clone().into_boxed_slice().clone().to_vec(); | |
| assert_eq!(data, data2); | |
| } | |
| #[test] | |
| #[allow(unused_must_use)] // here, we care about the side effects of `.clone()` | |
| #[cfg_attr(not(panic = "unwind"), ignore = "test requires unwinding support")] | |
| fn test_box_slice_clone_panics() { | |
| use std::sync::Arc; | |
| use std::sync::atomic::{AtomicUsize, Ordering}; | |
| struct Canary { | |
| count: Arc<AtomicUsize>, | |
| panics: bool, | |
| } | |
| impl Drop for Canary { | |
| fn drop(&mut self) { | |
| self.count.fetch_add(1, Ordering::SeqCst); | |
| } | |
| } | |
| impl Clone for Canary { | |
| fn clone(&self) -> Self { | |
| if self.panics { | |
| panic!() | |
| } | |
| Canary { count: self.count.clone(), panics: self.panics } | |
| } | |
| } | |
| let drop_count = Arc::new(AtomicUsize::new(0)); | |
| let canary = Canary { count: drop_count.clone(), panics: false }; | |
| let panic = Canary { count: drop_count.clone(), panics: true }; | |
| std::panic::catch_unwind(move || { | |
| // When xs is dropped, +5. | |
| let xs = | |
| vec![canary.clone(), canary.clone(), canary.clone(), panic, canary].into_boxed_slice(); | |
| // When panic is cloned, +3. | |
| xs.clone(); | |
| }) | |
| .unwrap_err(); | |
| // Total = 8 | |
| assert_eq!(drop_count.load(Ordering::SeqCst), 8); | |
| } | |
| #[test] | |
| fn test_copy_from_slice() { | |
| let src = [0, 1, 2, 3, 4, 5]; | |
| let mut dst = [0; 6]; | |
| dst.copy_from_slice(&src); | |
| assert_eq!(src, dst) | |
| } | |
| #[test] | |
| #[should_panic(expected = "source slice length (4) does not match destination slice length (5)")] | |
| fn test_copy_from_slice_dst_longer() { | |
| let src = [0, 1, 2, 3]; | |
| let mut dst = [0; 5]; | |
| dst.copy_from_slice(&src); | |
| } | |
| #[test] | |
| #[should_panic(expected = "source slice length (4) does not match destination slice length (3)")] | |
| fn test_copy_from_slice_dst_shorter() { | |
| let src = [0, 1, 2, 3]; | |
| let mut dst = [0; 3]; | |
| dst.copy_from_slice(&src); | |
| } | |
| #[test] | |
| fn repeat_generic_slice() { | |
| assert_eq!([1, 2].repeat(2), vec![1, 2, 1, 2]); | |
| assert_eq!([1, 2, 3, 4].repeat(0), vec![]); | |
| assert_eq!([1, 2, 3, 4].repeat(1), vec![1, 2, 3, 4]); | |
| assert_eq!([1, 2, 3, 4].repeat(3), vec![1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]); | |
| } | |
| #[test] | |
| #[allow(unreachable_patterns)] | |
| fn subslice_patterns() { | |
| // This test comprehensively checks the passing static and dynamic semantics | |
| // of subslice patterns `..`, `x @ ..`, `ref x @ ..`, and `ref mut @ ..` | |
| // in slice patterns `[$($pat), $(,)?]` . | |
| #[derive(PartialEq, Debug, Clone)] | |
| struct N(u8); | |
| macro_rules! n { | |
| ($($e:expr),* $(,)?) => { | |
| [$(N($e)),*] | |
| } | |
| } | |
| macro_rules! c { | |
| ($inp:expr, $typ:ty, $out:expr $(,)?) => { | |
| assert_eq!($out, identity::<$typ>($inp)) | |
| }; | |
| } | |
| macro_rules! m { | |
| ($e:expr, $p:pat => $b:expr) => { | |
| match $e { | |
| $p => $b, | |
| _ => panic!(), | |
| } | |
| }; | |
| } | |
| // == Slices == | |
| // Matching slices using `ref` patterns: | |
| let mut v = vec![N(0), N(1), N(2), N(3), N(4)]; | |
| let mut vc = (0..=4).collect::<Vec<u8>>(); | |
| let [..] = v[..]; // Always matches. | |
| m!(v[..], [N(0), ref sub @ .., N(4)] => c!(sub, &[N], n![1, 2, 3])); | |
| m!(v[..], [N(0), ref sub @ ..] => c!(sub, &[N], n![1, 2, 3, 4])); | |
| m!(v[..], [ref sub @ .., N(4)] => c!(sub, &[N], n![0, 1, 2, 3])); | |
| m!(v[..], [ref sub @ .., _, _, _, _, _] => c!(sub, &[N], &n![] as &[N])); | |
| m!(v[..], [_, _, _, _, _, ref sub @ ..] => c!(sub, &[N], &n![] as &[N])); | |
| m!(vc[..], [x, .., y] => c!((x, y), (u8, u8), (0, 4))); | |
| // Matching slices using `ref mut` patterns: | |
| let [..] = v[..]; // Always matches. | |
| m!(v[..], [N(0), ref mut sub @ .., N(4)] => c!(sub, &mut [N], n![1, 2, 3])); | |
| m!(v[..], [N(0), ref mut sub @ ..] => c!(sub, &mut [N], n![1, 2, 3, 4])); | |
| m!(v[..], [ref mut sub @ .., N(4)] => c!(sub, &mut [N], n![0, 1, 2, 3])); | |
| m!(v[..], [ref mut sub @ .., _, _, _, _, _] => c!(sub, &mut [N], &mut n![] as &mut [N])); | |
| m!(v[..], [_, _, _, _, _, ref mut sub @ ..] => c!(sub, &mut [N], &mut n![] as &mut [N])); | |
| m!(vc[..], [x, .., y] => c!((x, y), (u8, u8), (0, 4))); | |
| // Matching slices using default binding modes (&): | |
| let [..] = &v[..]; // Always matches. | |
| m!(&v[..], [N(0), sub @ .., N(4)] => c!(sub, &[N], n![1, 2, 3])); | |
| m!(&v[..], [N(0), sub @ ..] => c!(sub, &[N], n![1, 2, 3, 4])); | |
| m!(&v[..], [sub @ .., N(4)] => c!(sub, &[N], n![0, 1, 2, 3])); | |
| m!(&v[..], [sub @ .., _, _, _, _, _] => c!(sub, &[N], &n![] as &[N])); | |
| m!(&v[..], [_, _, _, _, _, sub @ ..] => c!(sub, &[N], &n![] as &[N])); | |
| m!(&vc[..], [x, .., y] => c!((x, y), (&u8, &u8), (&0, &4))); | |
| // Matching slices using default binding modes (&mut): | |
| let [..] = &mut v[..]; // Always matches. | |
| m!(&mut v[..], [N(0), sub @ .., N(4)] => c!(sub, &mut [N], n![1, 2, 3])); | |
| m!(&mut v[..], [N(0), sub @ ..] => c!(sub, &mut [N], n![1, 2, 3, 4])); | |
| m!(&mut v[..], [sub @ .., N(4)] => c!(sub, &mut [N], n![0, 1, 2, 3])); | |
| m!(&mut v[..], [sub @ .., _, _, _, _, _] => c!(sub, &mut [N], &mut n![] as &mut [N])); | |
| m!(&mut v[..], [_, _, _, _, _, sub @ ..] => c!(sub, &mut [N], &mut n![] as &mut [N])); | |
| m!(&mut vc[..], [x, .., y] => c!((x, y), (&mut u8, &mut u8), (&mut 0, &mut 4))); | |
| // == Arrays == | |
| let mut v = n![0, 1, 2, 3, 4]; | |
| let vc = [0, 1, 2, 3, 4]; | |
| // Matching arrays by value: | |
| m!(v.clone(), [N(0), sub @ .., N(4)] => c!(sub, [N; 3], n![1, 2, 3])); | |
| m!(v.clone(), [N(0), sub @ ..] => c!(sub, [N; 4], n![1, 2, 3, 4])); | |
| m!(v.clone(), [sub @ .., N(4)] => c!(sub, [N; 4], n![0, 1, 2, 3])); | |
| m!(v.clone(), [sub @ .., _, _, _, _, _] => c!(sub, [N; 0], n![] as [N; 0])); | |
| m!(v.clone(), [_, _, _, _, _, sub @ ..] => c!(sub, [N; 0], n![] as [N; 0])); | |
| m!(v.clone(), [x, .., y] => c!((x, y), (N, N), (N(0), N(4)))); | |
| m!(v.clone(), [..] => ()); | |
| // Matching arrays by ref patterns: | |
| m!(v, [N(0), ref sub @ .., N(4)] => c!(sub, &[N; 3], &n![1, 2, 3])); | |
| m!(v, [N(0), ref sub @ ..] => c!(sub, &[N; 4], &n![1, 2, 3, 4])); | |
| m!(v, [ref sub @ .., N(4)] => c!(sub, &[N; 4], &n![0, 1, 2, 3])); | |
| m!(v, [ref sub @ .., _, _, _, _, _] => c!(sub, &[N; 0], &n![] as &[N; 0])); | |
| m!(v, [_, _, _, _, _, ref sub @ ..] => c!(sub, &[N; 0], &n![] as &[N; 0])); | |
| m!(vc, [x, .., y] => c!((x, y), (u8, u8), (0, 4))); | |
| // Matching arrays by ref mut patterns: | |
| m!(v, [N(0), ref mut sub @ .., N(4)] => c!(sub, &mut [N; 3], &mut n![1, 2, 3])); | |
| m!(v, [N(0), ref mut sub @ ..] => c!(sub, &mut [N; 4], &mut n![1, 2, 3, 4])); | |
| m!(v, [ref mut sub @ .., N(4)] => c!(sub, &mut [N; 4], &mut n![0, 1, 2, 3])); | |
| m!(v, [ref mut sub @ .., _, _, _, _, _] => c!(sub, &mut [N; 0], &mut n![] as &mut [N; 0])); | |
| m!(v, [_, _, _, _, _, ref mut sub @ ..] => c!(sub, &mut [N; 0], &mut n![] as &mut [N; 0])); | |
| // Matching arrays by default binding modes (&): | |
| m!(&v, [N(0), sub @ .., N(4)] => c!(sub, &[N; 3], &n![1, 2, 3])); | |
| m!(&v, [N(0), sub @ ..] => c!(sub, &[N; 4], &n![1, 2, 3, 4])); | |
| m!(&v, [sub @ .., N(4)] => c!(sub, &[N; 4], &n![0, 1, 2, 3])); | |
| m!(&v, [sub @ .., _, _, _, _, _] => c!(sub, &[N; 0], &n![] as &[N; 0])); | |
| m!(&v, [_, _, _, _, _, sub @ ..] => c!(sub, &[N; 0], &n![] as &[N; 0])); | |
| m!(&v, [..] => ()); | |
| m!(&v, [x, .., y] => c!((x, y), (&N, &N), (&N(0), &N(4)))); | |
| // Matching arrays by default binding modes (&mut): | |
| m!(&mut v, [N(0), sub @ .., N(4)] => c!(sub, &mut [N; 3], &mut n![1, 2, 3])); | |
| m!(&mut v, [N(0), sub @ ..] => c!(sub, &mut [N; 4], &mut n![1, 2, 3, 4])); | |
| m!(&mut v, [sub @ .., N(4)] => c!(sub, &mut [N; 4], &mut n![0, 1, 2, 3])); | |
| m!(&mut v, [sub @ .., _, _, _, _, _] => c!(sub, &mut [N; 0], &mut n![] as &[N; 0])); | |
| m!(&mut v, [_, _, _, _, _, sub @ ..] => c!(sub, &mut [N; 0], &mut n![] as &[N; 0])); | |
| m!(&mut v, [..] => ()); | |
| m!(&mut v, [x, .., y] => c!((x, y), (&mut N, &mut N), (&mut N(0), &mut N(4)))); | |
| } | |
| #[test] | |
| fn test_chunk_by() { | |
| let slice = &[1, 1, 1, 3, 3, 2, 2, 2, 1, 0]; | |
| let mut iter = slice.chunk_by(|a, b| a == b); | |
| assert_eq!(iter.next(), Some(&[1, 1, 1][..])); | |
| assert_eq!(iter.next(), Some(&[3, 3][..])); | |
| assert_eq!(iter.next(), Some(&[2, 2, 2][..])); | |
| assert_eq!(iter.next(), Some(&[1][..])); | |
| assert_eq!(iter.next(), Some(&[0][..])); | |
| assert_eq!(iter.next(), None); | |
| let mut iter = slice.chunk_by(|a, b| a == b); | |
| assert_eq!(iter.next_back(), Some(&[0][..])); | |
| assert_eq!(iter.next_back(), Some(&[1][..])); | |
| assert_eq!(iter.next_back(), Some(&[2, 2, 2][..])); | |
| assert_eq!(iter.next_back(), Some(&[3, 3][..])); | |
| assert_eq!(iter.next_back(), Some(&[1, 1, 1][..])); | |
| assert_eq!(iter.next_back(), None); | |
| let mut iter = slice.chunk_by(|a, b| a == b); | |
| assert_eq!(iter.next(), Some(&[1, 1, 1][..])); | |
| assert_eq!(iter.next_back(), Some(&[0][..])); | |
| assert_eq!(iter.next(), Some(&[3, 3][..])); | |
| assert_eq!(iter.next_back(), Some(&[1][..])); | |
| assert_eq!(iter.next(), Some(&[2, 2, 2][..])); | |
| assert_eq!(iter.next_back(), None); | |
| let mut iter = slice.chunk_by(|a, b| a == b); | |
| assert_eq!(iter.next(), Some(&[1, 1, 1][..])); | |
| assert_eq!(iter.next(), Some(&[3, 3][..])); | |
| let mut iter_clone = iter.clone(); | |
| assert_eq!(iter.next(), Some(&[2, 2, 2][..])); | |
| assert_eq!(iter.next(), Some(&[1][..])); | |
| assert_eq!(iter.next(), Some(&[0][..])); | |
| assert_eq!(iter.next(), None); | |
| assert_eq!(iter_clone.next(), Some(&[2, 2, 2][..])); | |
| assert_eq!(iter_clone.next(), Some(&[1][..])); | |
| assert_eq!(iter_clone.next(), Some(&[0][..])); | |
| assert_eq!(iter_clone.next(), None); | |
| } | |
| #[test] | |
| fn test_chunk_by_mut() { | |
| let slice = &mut [1, 1, 1, 3, 3, 2, 2, 2, 1, 0]; | |
| let mut iter = slice.chunk_by_mut(|a, b| a == b); | |
| assert_eq!(iter.next(), Some(&mut [1, 1, 1][..])); | |
| assert_eq!(iter.next(), Some(&mut [3, 3][..])); | |
| assert_eq!(iter.next(), Some(&mut [2, 2, 2][..])); | |
| assert_eq!(iter.next(), Some(&mut [1][..])); | |
| assert_eq!(iter.next(), Some(&mut [0][..])); | |
| assert_eq!(iter.next(), None); | |
| let mut iter = slice.chunk_by_mut(|a, b| a == b); | |
| assert_eq!(iter.next_back(), Some(&mut [0][..])); | |
| assert_eq!(iter.next_back(), Some(&mut [1][..])); | |
| assert_eq!(iter.next_back(), Some(&mut [2, 2, 2][..])); | |
| assert_eq!(iter.next_back(), Some(&mut [3, 3][..])); | |
| assert_eq!(iter.next_back(), Some(&mut [1, 1, 1][..])); | |
| assert_eq!(iter.next_back(), None); | |
| let mut iter = slice.chunk_by_mut(|a, b| a == b); | |
| assert_eq!(iter.next(), Some(&mut [1, 1, 1][..])); | |
| assert_eq!(iter.next_back(), Some(&mut [0][..])); | |
| assert_eq!(iter.next(), Some(&mut [3, 3][..])); | |
| assert_eq!(iter.next_back(), Some(&mut [1][..])); | |
| assert_eq!(iter.next(), Some(&mut [2, 2, 2][..])); | |
| assert_eq!(iter.next_back(), None); | |
| } |