array-linked-list 0.2.2

A data structure, which combines the advantages of dynamic arrays and linked lists
Documentation
use array_linked_list::ArrayLinkedList;

#[test]
fn push_front_fill() {
    let mut array = ArrayLinkedList::new();
    for i in 0..10 {
        array.push_front(i);
    }

    assert_eq!(array.len(), 10);
    assert!(array.capacity() >= 10);

    for (i, element) in array.iter().rev().enumerate() {
        assert_eq!(*element, i);
    }
}

#[test]
fn push_front_fill_with_capacity() {
    let mut array = ArrayLinkedList::with_capacity(10);

    assert_eq!(array.len(), 0);
    assert_eq!(array.capacity(), 10);

    for i in 0..10 {
        array.push_front(i);
    }

    assert_eq!(array.len(), 10);
    assert_eq!(array.capacity(), 10);

    array.push_front(10);

    assert_eq!(array.len(), 11);
    assert!(array.capacity() >= 11);

    for (i, element) in array.iter().rev().enumerate() {
        assert_eq!(*element, i);
    }
}

#[test]
fn push_back_fill() {
    let mut array = ArrayLinkedList::new();
    for i in 0..10 {
        array.push_back(i);
    }

    assert_eq!(array.len(), 10);
    assert!(array.capacity() >= 10);

    for (i, element) in array.iter().enumerate() {
        assert_eq!(*element, i);
    }
}

#[test]
fn push_back_fill_with_capacity() {
    let mut array = ArrayLinkedList::with_capacity(10);

    assert_eq!(array.len(), 0);
    assert_eq!(array.capacity(), 10);

    for i in 0..10 {
        array.push_back(i);
    }

    assert_eq!(array.len(), 10);
    assert_eq!(array.capacity(), 10);

    array.push_back(10);

    assert_eq!(array.len(), 11);
    assert!(array.capacity() >= 11);

    for (i, element) in array.iter().enumerate() {
        assert_eq!(*element, i);
    }
}

#[test]
fn remove() {
    let mut array = ArrayLinkedList::new();
    for i in 0..10 {
        array.push_front(i);
    }

    for i in 0..5 {
        let index = i * 2 + 1;
        assert_eq!(array.remove(index).unwrap(), index);
        assert!(array.remove(index).is_none());
    }

    assert!(array.len() == 5);

    for (i, element) in array.iter().rev().enumerate() {
        assert_eq!(*element, i * 2);
    }

    for (i, element) in array.iter().enumerate() {
        assert_eq!(*element, 8 - i * 2);
    }
}

#[test]
fn replace_front() {
    let mut array = ArrayLinkedList::new();
    for i in 0..10 {
        array.push_front(i);
    }

    for i in 0..5 {
        let index = i * 2 + 1;
        let value = i * 2 + 10;
        assert_eq!(array.replace_front(index, value).unwrap(), index);
        assert_eq!(array.replace_front(index, value).unwrap(), value);
    }

    assert!(array.len() == 10);

    for (i, element) in array.iter().rev().enumerate() {
        assert_eq!(*element, i * 2);
    }
}

#[test]
fn replace_back() {
    let mut array = ArrayLinkedList::new();
    for i in 0..10 {
        array.push_back(i);
    }

    for i in 0..5 {
        let index = i * 2 + 1;
        let value = i * 2 + 10;
        assert_eq!(array.replace_back(index, value).unwrap(), index);
        assert_eq!(array.replace_back(index, value).unwrap(), value);
    }

    assert!(array.len() == 10);

    for (i, element) in array.iter().enumerate() {
        assert_eq!(*element, i * 2);
    }
}

#[test]
fn pop_front() {
    let mut array = ArrayLinkedList::new();
    for i in 0..10 {
        array.push_front(i);
    }

    while let Some(element) = array.pop_front() {
        assert_eq!(element, array.len());
    }

    assert!(array.is_empty());
}

#[test]
fn pop_back() {
    let mut array = ArrayLinkedList::new();
    for i in 0..10 {
        array.push_back(i);
    }

    while let Some(element) = array.pop_back() {
        assert_eq!(element, array.len());
    }

    assert!(array.is_empty());
}