extern crate test;
extern crate itertools;
use itertools::Itertools;
use itertools::Stride;
use itertools::StrideMut;
#[test]
fn mut_stride() {
let mut xs = vec![1i, 1, 1, 1, 1, 1];
for x in StrideMut::from_slice(xs.as_mut_slice(), 2) {
*x = 0i;
}
assert_eq!(xs, vec![0i, 1, 0, 1, 0, 1]);
}
#[test]
fn mut_stride_compose() {
let mut xs = vec![1i, 1, 1, 1, 1, 1, 1, 1, 1, 1];
{
let iter1 = StrideMut::from_slice(xs.as_mut_slice(), 2);
let mut iter2 = StrideMut::from_stride(iter1, 3);
for x in iter2 {
*x = 0i;
}
}
assert_eq!(xs, vec![0i, 1, 1, 1, 1, 1, 0, 1, 1, 1]);
}
#[test]
fn stride_uneven() {
let xs = &[7i, 9, 8];
let mut it = Stride::from_slice(xs, 2);
assert!(it.size_hint() == (2, Some(2)));
assert!(*it.next().unwrap() == 7);
assert!(*it.next().unwrap() == 8);
assert!(it.len() == 0);
assert!(it.next().is_none());
let xs = &[7i, 9, 8, 10];
let mut it = Stride::from_slice(xs.slice_from(1), 2);
assert!(it.size_hint() == (2, Some(2)));
assert!(*it.next().unwrap() == 9);
assert!(*it.next().unwrap() == 10);
assert!(it.len() == 0);
assert!(it.next().is_none());
}
#[test]
fn stride_compose() {
let xs = &[1i, 2, 3, 4, 5, 6, 7, 8, 9];
let odds = Stride::from_slice(xs, 2);
let it = Stride::from_stride(odds, 2);
let ans: Vec<int> = it.map(|&x| x).collect();
assert_eq!(ans, vec![1i, 5, 9]);
let xs = &[1i, 2, 3, 4, 5, 6, 7, 8, 9];
let evens = Stride::from_slice(xs.slice_from(1), 2);
let it = Stride::from_stride(evens, 2);
let ans: Vec<int> = it.map(|&x| x).collect();
assert_eq!(ans, vec![2i, 6]);
let xs = &[1i, 2, 3, 4, 5, 6, 7, 8, 9];
let evens = Stride::from_slice(xs.slice_from(1), 2);
let it = Stride::from_stride(evens, 1);
let ans: Vec<int> = it.map(|&x| x).collect();
assert_eq!(ans, vec![2i, 4, 6, 8]);
let xs = &[1i, 2, 3, 4, 5, 6, 7, 8, 9];
let mut odds = Stride::from_slice(xs, 2);
odds.swap_ends();
let it = Stride::from_stride(odds, 2);
let ans: Vec<int> = it.map(|&x| x).collect();
assert_eq!(ans, vec![9i, 5, 1]);
let xs = &[1i, 2, 3];
let every = Stride::from_slice(xs, 1);
assert_eq!(every.len(), 3);
let odds = Stride::from_stride(every, 2);
assert_eq!(odds.len(), 2);
let v = odds.cloned().collect::<Vec<int>>();
assert_eq!(v, vec![1i, 3i]);
let xs = &[1i, 2, 3, 4, 5, 6, 7, 8, 9];
let evens = Stride::from_slice(xs.slice_from(1), 2);
let it = Stride::from_stride(evens, -2);
let ans: Vec<int> = it.map(|&x| x).collect();
assert_eq!(ans, vec![8i, 4]);
}
#[test]
fn from_stride_empty()
{
let xs = &[1i, 2, 3, 4, 5, 6, 7, 8, 9];
let mut odds = Stride::from_slice(xs, 2);
odds.drain();
assert!(odds.len() == 0);
assert!(odds.next().is_none());
let mut it = Stride::from_stride(odds, 2);
assert!(it.len() == 0);
assert!(it.next().is_none());
}
#[test]
fn stride() {
let xs: &[u8] = &[];
let mut it = Stride::from_slice(xs, 1);
assert!(it.size_hint() == (0, Some(0)));
assert!(it.next().is_none());
let xs = &[7i, 9, 8, 10];
let mut it = Stride::from_slice(xs, 2);
assert!(it.size_hint() == (2, Some(2)));
assert!(*it.next().unwrap() == 7);
assert!(*it.next().unwrap() == 8);
assert!(it.next().is_none());
let mut it = Stride::from_slice(xs, 2).rev();
assert!(it.size_hint() == (2, Some(2)));
assert!(*it.next().unwrap() == 8);
assert!(*it.next().unwrap() == 7);
assert!(it.next().is_none());
let xs = &[7i, 9, 8, 10];
let mut it = Stride::from_slice(xs, 1);
assert!(it.size_hint() == (4, Some(4)));
assert!(*it.next().unwrap() == 7);
assert!(*it.next().unwrap() == 9);
assert!(*it.next().unwrap() == 8);
assert!(*it.next().unwrap() == 10);
assert!(it.len() == 0);
assert!(it.next().is_none());
let mut it = Stride::from_slice(xs, 1).rev();
assert!(it.size_hint() == (4, Some(4)));
assert!(*it.next().unwrap() == 10);
assert!(*it.next().unwrap() == 8);
assert!(*it.next().unwrap() == 9);
assert!(*it.next().unwrap() == 7);
assert!(it.next().is_none());
let mut it = Stride::from_slice(xs, 2);
it.swap_ends();
assert!(it.size_hint() == (2, Some(2)));
assert!(*it.next().unwrap() == 8);
assert!(*it.next().unwrap() == 7);
assert!(it.next().is_none());
let mut it = Stride::from_slice(xs, -2);
assert_eq!(it.size_hint(), (2, Some(2)));
assert_eq!(*it.next().unwrap(), 10);
assert_eq!(*it.next().unwrap(), 9);
assert_eq!(it.next(), None);
}
#[test]
fn stride_index() {
let xs = &[7i, 9, 8, 10];
let it = Stride::from_slice(xs, 2);
assert_eq!(it[0], 7);
assert_eq!(it[1], 8);
}
#[test]
#[should_fail]
fn stride_index_fail() {
let xs = &[7i, 9, 8, 10];
let it = Stride::from_slice(xs, 2);
let _ = it[2];
}