sliding_windows 3.0.1

a non-copying implementation of a sliding windows iterator adaptor
Documentation
use super::*;

#[test]
fn sliding_windows_1() {
    fn test_window_correctness_with_storage(mut storage: Storage<u32>) {
        let expected: &[&[u32]] = &[&[0, 1, 2], &[1, 2, 3], &[2, 3, 4]];

        {
            let windowed_iter = Adaptor::new(0..5, &mut storage);
            let output: Vec<Vec<u32>> = windowed_iter
                .map(|x| x.into_iter().map(|&x| x).collect())
                .collect();
            assert_eq!(output, expected);
        }
    }

    let middle_alloc: Storage<u32> = Storage::new(3);
    let small_alloc: Storage<u32> = Storage::from_vec(vec![1u32; 1], 3);
    let exact_alloc: Storage<u32> = Storage::from_vec(vec![1u32; 3], 3);
    let big_alloc: Storage<u32> = Storage::from_vec(vec![1u32, 100], 3);

    test_window_correctness_with_storage(middle_alloc);
    test_window_correctness_with_storage(small_alloc);
    test_window_correctness_with_storage(exact_alloc);
    test_window_correctness_with_storage(big_alloc);
}

#[test]
fn sliding_windows_2() {
    let it = 0..5;
    let mut storage: Storage<u32> = Storage::new(3);
    let windowed_iter = Adaptor::new(it, &mut storage);

    for mut window in windowed_iter {
        let mut iter_mut = window.iter_mut();
        let element_0 = iter_mut.next().unwrap();
        let mut element_1 = iter_mut.next().unwrap();
        *element_1 = 0u32;
        assert_eq!(*element_0, 0);
    }
}

#[test]
#[should_panic]
fn sliding_windows_3() {
    let it = 0..5;
    let mut storage: Storage<u32> = Storage::new(3);
    let mut windowed_iter = Adaptor::new(it, &mut storage);

    let _a = windowed_iter.next();
    let _b = windowed_iter.next();
}

#[test]
fn sliding_windows_4() {
    let mut storage1: Storage<u32> = Storage::new(3);
    let iter1 = Adaptor::new(0..5, &mut storage1);

    let mut storage2: Storage<u32> = Storage::new(5);
    let iter2 = Adaptor::new(0..5, &mut storage2);

    let mut storage3: Storage<u32> = Storage::new(6);
    let iter3 = Adaptor::new(0..5, &mut storage3);

    let mut storage4: Storage<u32> = Storage::new(6);
    let iter4 = Adaptor::new(42..42, &mut storage4);

    let mut storage5: Storage<u32> = Storage::new(6);
    let iter5 = Adaptor::new(42.., &mut storage5);

    assert_eq!(iter1.size_hint(), (3, Some(3)));
    assert_eq!(iter2.size_hint(), (1, Some(1)));
    assert_eq!(iter3.size_hint(), (1, Some(1)));
    assert_eq!(iter4.size_hint(), (0, Some(0)));
    assert_eq!(iter5.size_hint().1, None);
}

#[test]
fn sliding_windows_5() {
    let range = 0..5;
    let mut storage: Storage<u32> = Storage::new(0);
    let mut iter = Adaptor::new(range, &mut storage);

    assert!(iter.next().is_none());
    assert!(iter.next().is_none());
}

#[test]
fn sliding_windows_6() {
    let storage0: Storage<u32> = Storage::new(0);
    let storage0: Vec<u32> = storage0.into();
    assert_eq!(storage0.capacity(), 0);

    let storage1: Storage<u32> = Storage::new(12);
    let storage1: Vec<u32> = storage1.into();
    assert_eq!(storage1.capacity(), 12);

    let storage2: Storage<u32> = Storage::new(20);
    let storage2: Vec<u32> = storage2.into();
    assert_eq!(storage2.capacity(), 20);
}