immutable-seq 0.1.2

Immutable sequence data structure
Documentation
#[macro_use]
extern crate immutable_seq;

use immutable_seq::Seq;

#[test]
fn test_iter_empty() {
    let result: Vec<u32> = Seq::empty().iter().map(|x| *x).collect();
    let expected: Vec<u32> = vec![];
    assert_eq!(result, expected);
}

#[test]
fn test_empty_is_empty() {
    assert!(Seq::<u32>::empty().is_empty());
}

#[test]
fn test_empty_len() {
    assert_eq!(Seq::<u32>::empty().len(), 0);
}

#[test]
fn test_iter_singleton() {
    let result: Vec<u32> = Seq::singleton(42).iter().map(|x| *x).collect();
    let expected: Vec<u32> = vec![42];
    assert_eq!(result, expected);
}

#[test]
fn test_singleton_not_is_empty() {
    assert!(! Seq::singleton(7u32).is_empty());
}

#[test]
fn test_singleton_len() {
    assert_eq!(Seq::singleton(7u32).len(), 1);
}

#[test]
fn test_iter_push_front() {
    let mut seq: Seq<u32> = Seq::empty();
    for i in 0..20 {
        seq = seq.push_front(i);
    }
    let result: Vec<u32> = seq.iter().map(|x| *x).collect();
    let mut expected: Vec<u32> = (0..20).into_iter().collect();
    expected.reverse();
    assert_eq!(result, expected);
}

#[test]
fn test_iter_push_back() {
    let mut seq: Seq<u32> = Seq::empty();
    for i in 0..20 {
        seq = seq.push_back(i);
    }
    let result: Vec<u32> = seq.iter().map(|x| *x).collect();
    let expected: Vec<u32> = (0..20).into_iter().collect();
    assert_eq!(result, expected);
}

#[test]
fn test_vec_macro() {
    let seq: Seq<u32> = seq![0,1,2,3,4,5,6,7,8,9];
    let result: Vec<u32> = seq.iter().map(|x| *x).collect();
    let expected: Vec<u32> = vec![0,1,2,3,4,5,6,7,8,9];
    assert_eq!(result, expected);
}

#[test]
fn test_iter_append() {
    let mut xs: Seq<u32> = Seq::empty();
    let mut ys: Seq<u32> = Seq::empty();
    for i in 0..20 {
        xs = xs.push_back(i);
        ys = ys.push_back(20 + i);
    }
    let seq = xs.append(&ys);
    let result: Vec<u32> = seq.iter().map(|x| *x).collect();
    let expected: Vec<u32> = (0..40).into_iter().collect();
    assert_eq!(result, expected);
}

#[test]
fn test_front_empty() {
    assert_eq!(Seq::<u32>::empty().front(), None);
}

#[test]
fn test_front_nonempty() {
    let seq: Seq<u32> = seq![0,1,2,3,4,5,6,7,8,9];
    assert_eq!(seq.front().map(|x| *x),Some(0));
}

#[test]
fn test_front_pop_front() {
    let mut seq: Seq<u32> = seq![0,1,2,3,4,5,6,7,8,9];
    let mut vec: Vec<u32> = vec![];
    loop {
        if let Some(front) = seq.front() {
            vec.push(*front);
        } else {
            break;
        }
        seq = seq.pop_front();
    }
    assert_eq!(vec,vec![0,1,2,3,4,5,6,7,8,9]);
}

#[test]
fn test_back_empty() {
    assert_eq!(Seq::<u32>::empty().back(), None);
}

#[test]
fn test_back_nonempty() {
    let seq: Seq<u32> = seq![0,1,2,3,4,5,6,7,8,9];
    assert_eq!(seq.back().map(|x| *x),Some(9));
}

#[test]
fn test_back_pop_back() {
    let mut seq: Seq<u32> = seq![0,1,2,3,4,5,6,7,8,9];
    let mut vec: Vec<u32> = vec![];
    loop {
        if let Some(back) = seq.back() {
            vec.push(*back);
        } else {
            break;
        }
        seq = seq.pop_back();
    }
    assert_eq!(vec,vec![9,8,7,6,5,4,3,2,1,0]);
}

#[test]
fn test_get_empty() {
    let seq: Seq<u32> = seq![];
    assert_eq!(seq.get(0), None);
    assert_eq!(seq.get(1), None);
}

#[test]
fn test_get_nonempty() {
    let seq: Seq<usize> = seq![0,1,2,3,4,5,6,7,8,9];
    for i in 0..seq.len() {
        assert_eq!(seq.get(i),Some(&i))
    }
}

#[test]
fn test_get_out_of_bounds() {
    let seq: Seq<u32> = seq![0,1,2,3,4,5,6,7,8,9];
    assert_eq!(seq.get(10),None)
}

#[test]
fn test_index() {
    let seq: Seq<usize> = seq![0,1,2,3,4,5,6,7,8,9];
    for i in 0..seq.len() {
        assert_eq!(seq[i],i)
    }
}

#[test]
#[should_panic]
fn test_index_out_of_bounds() {
    let seq: Seq<u32> = seq![0,1,2,3,4,5,6,7,8,9];
    seq[10];
}

#[test]
fn test_split_empty() {
    let seq: Seq<usize> = Seq::empty();
    assert!(seq.split(0).0.is_empty());
    assert!(seq.split(0).1.is_empty());
    assert!(seq.split(1).0.is_empty());
    assert!(seq.split(1).1.is_empty());
}

#[test]
fn test_split_singleton() {
    let seq: Seq<usize> = Seq::singleton(42);
    assert_eq!(seq.split(0).0.len(), 0);
    assert_eq!(seq.split(0).1.len(), 1);
    assert_eq!(seq.split(1).0.len(), 1);
    assert_eq!(seq.split(1).1.len(), 0);
}

#[test]
fn test_split() {
    let n = 10;
    let seq: Seq<usize> = (0..n).into_iter().collect();
    for i in 0..n {
        let (before, after) = seq.split(i);
        let before:Vec<usize> = before.iter().map(|x| *x).collect();
        let before_expected:Vec<usize> = (0..i).into_iter().collect();
        let after:Vec<usize> = after.iter().map(|x| *x).collect();
        let after_expected:Vec<usize> = (i..n).into_iter().collect();
        assert_eq!(before, before_expected);
        assert_eq!(after, after_expected);
    }
}

#[test]
fn test_truncate() {
    let n = 10;
    let seq: Seq<usize> = (0..n).into_iter().collect();
    for i in 0..n {
        let res:Vec<usize> = seq.truncate(i).iter().map(|x| *x).collect();
        let expected:Vec<usize> = (0..i).into_iter().collect();
        assert_eq!(res, expected);
    }
}

#[test]
fn test_skip() {
    let n = 10;
    let seq: Seq<usize> = (0..n).into_iter().collect();
    for i in 0..n {
        let res:Vec<usize> = seq.skip(i).iter().map(|x| *x).collect();
        let expected:Vec<usize> = (i..n).into_iter().collect();
        assert_eq!(res, expected);
    }
}

#[test]
fn test_remove() {
    let n = 10;
    let seq: Seq<usize> = (0..n).into_iter().collect();
    for i in 0..n {
        let res:Vec<usize> = seq.remove(i).iter().map(|x| *x).collect();
        let expected:Vec<usize> = (0..n).into_iter().filter(|&j| {j != i}).collect();
        assert_eq!(res, expected);
    }
}

#[test]
fn test_insert() {
    let n = 10;
    let seq: Seq<usize> = (0..n).into_iter().collect();
    for i in 0..n {
        let res:Vec<usize> = seq.insert(i,n).iter().map(|x| *x).collect();
        let mut expected:Vec<usize> = (0..n).into_iter().collect();
        expected.insert(i,n);
        assert_eq!(res, expected);
    }
}

#[test]
fn test_adjust() {
    let n = 10;
    let seq: Seq<usize> = (0..n).into_iter().collect();
    for i in 0..n {
        println!("{}",i);
        let res:Vec<usize> = seq.adjust(i,|x| x+1).iter().map(|x| *x).collect();
        let mut expected:Vec<usize> = (0..n).into_iter().collect();
        expected[i] += 1;
        assert_eq!(res, expected);
    }
}

#[test]
fn test_update() {
    let n = 10;
    let seq: Seq<usize> = (0..n).into_iter().collect();
    for i in 0..n {
        println!("{}",i);
        let res:Vec<usize> = seq.update(i,n).iter().map(|x| *x).collect();
        let mut expected:Vec<usize> = (0..n).into_iter().collect();
        expected[i] = n;
        assert_eq!(res, expected);
    }
}