arae 0.2.0

Cursed data structures
Documentation
use arae::{Bounded, CurVec, CursedExt, Sequence};

#[test]
#[should_panic]
fn test_new_empty() {
    CurVec::<u8>::new_with_default(0);
}

#[test]
#[should_panic]
fn test_from_empty_vec() {
    let _: CurVec<u8> = vec![].into();
}

#[test]
fn test_new_with_default() {
    let vec = CurVec::<u8>::new_with_default(1);
    assert_eq!(vec.as_slice(), &[0][..]);
}

#[test]
fn test_clone() {
    let vec: CurVec<_> = vec![1, 2, 3].into();
    let vec_clone = vec.clone();
    assert_eq!(vec, vec_clone);
}

#[test]
fn test_get() {
    let vec: CurVec<_> = vec![1, 2, 3].into();
    assert_eq!(vec.len(), 3);

    let cursor = vec.head();

    assert_eq!(*vec.get(cursor), 1);

    let cursor = vec.next(cursor).unwrap();
    assert_eq!(*vec.get(cursor), 2);

    let cursor = vec.next(cursor).unwrap();
    assert_eq!(*vec.get(cursor), 3);

    assert_eq!(vec.next(cursor), None);
}

#[test]
fn test_get_mut() {
    let mut vec: CurVec<_> = vec![1, 2, 3].into();
    *vec.get_mut(vec.head()) = 2;
    assert_eq!(vec, vec![2, 2, 3].into());
}

#[test]
fn test_at_invalid() {
    let vec: CurVec<_> = vec![1].into();
    assert_eq!(vec.at(1), None);
}

#[test]
fn test_iter() {
    let vec: CurVec<_> = vec![1, 2].into();
    let mut vec_iter = vec.iter();

    let (_, cursor) = vec_iter.next().unwrap();
    assert_eq!(*vec.get(cursor), 1);
    assert_eq!(vec.offset(cursor), 0);

    let (_, cursor) = vec_iter.next().unwrap();
    assert_eq!(*vec.get(cursor), 2);
    assert_eq!(vec.offset(cursor), 1);
    assert!(vec.is_tail(cursor));

    assert_eq!(vec_iter.next(), None);
}

#[test]
fn test_iter_single_elem() {
    let vec: CurVec<_> = vec![1].into();
    let mut vec_iter = vec.iter();

    let (_, cursor) = vec_iter.next().unwrap();
    assert_eq!(*vec.get(cursor), 1);
    assert!(vec.is_head(cursor));
    assert!(vec.is_tail(cursor));

    assert_eq!(vec_iter.next(), None);
}

#[test]
fn test_iter_at() {
    let vec: CurVec<_> = vec![1, 2].into();
    let mut vec_iter = vec.iter_at(vec.at(1).unwrap());

    let (_, cursor) = vec_iter.next().unwrap();
    assert_eq!(*vec.get(cursor), 2);
    assert_eq!(vec.offset(cursor), 1);
    assert!(vec.is_tail(cursor));

    assert_eq!(vec_iter.next(), None);
}

#[test]
fn test_wrapping_iter() {
    let vec: CurVec<_> = vec![1, 2].into();
    let mut vec_iter = vec.wrapping_iter();

    let (_, cursor) = vec_iter.next().unwrap();
    assert_eq!(*vec.get(cursor), 1);
    assert_eq!(vec.offset(cursor), 0);

    let (_, cursor) = vec_iter.next().unwrap();
    assert_eq!(*vec.get(cursor), 2);
    assert_eq!(vec.offset(cursor), 1);
    assert!(vec.is_tail(cursor));

    let (_, cursor) = vec_iter.next().unwrap();
    assert_eq!(vec.offset(cursor), 0);
}

#[test]
fn test_wrapping_iter_at() {
    let vec: CurVec<_> = vec![1, 2].into();
    let mut vec_iter = vec.wrapping_iter_at(vec.at(1).unwrap());

    let (_, cursor) = vec_iter.next().unwrap();
    assert_eq!(*vec.get(cursor), 2);
    assert_eq!(vec.offset(cursor), 1);
    assert!(vec.is_tail(cursor));

    let (_, cursor) = vec_iter.next().unwrap();
    assert_eq!(*vec.get(cursor), 1);
    assert_eq!(vec.offset(cursor), 0);
}