cyclic_data_types 0.2.3

Cyclic data types are series of structs, enums, types and functions to create a series of fast data types.
Documentation
mod len {
    use std::cmp::min;

    use crate::stack::Stack;

    const SIZE: usize = 5;

    #[test]
    fn empty() {
        let list: Stack<SIZE, i64, false>  = Stack::default();

        assert_eq!(list.len(), 0);
    }
    
    #[test]
    fn partial_size_push() {
        let mut list: Stack<SIZE, i64, false>  = Stack::default();

        for i in 0..5 {
            assert!(list.push(i).is_ok());
            assert_eq!(list.len(), (i + 1) as usize);
        }
    }
    
    #[test]
    fn overflow_push() {
        let mut list: Stack<SIZE, i64, true>  = Stack::default();

        for i in 0..10 {
            assert!(list.push(i).is_ok());

            assert_eq!(list.len(), min(i as usize + 1, SIZE));
        }
    }
}

mod push {
    use crate::{stack::Stack, error::Error, list::List};

    const SIZE: usize = 5;

    #[test]
    fn empty(){
        let mut list: Stack<SIZE, i64, false> = Stack::default();

        let expect = vec![].try_into().unwrap();
        assert_eq!(list, expect);

        assert!(list.push(1).is_ok());
        let expect = vec![1].try_into().unwrap();
        assert_eq!(list, expect);
    }

    #[test]
    fn fill(){
        let mut list: Stack<SIZE, i64, false> = Stack::default();

        let expect = vec![].try_into().unwrap();
        assert_eq!(list, expect);

        assert!(list.push(1).is_ok());
        let expect =  vec![1].try_into().unwrap();
        assert_eq!(list, expect);

        assert!(list.push(2).is_ok());
        let expect = vec![1, 2].try_into().unwrap();
        assert_eq!(list, expect);

        assert!(list.push(3).is_ok());
        let expect = vec![1,2,3].try_into().unwrap();
        assert_eq!(list, expect);
        
        assert!(list.push(4).is_ok());
        let expect = vec![1, 2, 3, 4].try_into().unwrap();
        assert_eq!(list, expect);

        assert!(list.push(5).is_ok());
        let expect = vec![1, 2, 3, 4, 5].try_into().unwrap();
        assert_eq!(list, expect);
    }

    #[test]
    fn overflow(){
        let mut stack: Stack<SIZE, i64, true> = Stack::default();
        
        
        assert!(stack.push(1).is_ok());

        
        assert!(stack.push(2).is_ok());

        
        assert!(stack.push(3).is_ok());

        
        assert!(stack.push(4).is_ok());

        
        assert!(stack.push(5).is_ok());

        assert!(stack.push(6).is_ok());
        let expect = [2,3,4,5,6].try_into().unwrap();
        assert_eq!(stack, expect);
    }

    #[test]
    fn no_overflow(){
        let mut list: List<SIZE, i64, false> = vec![1,2,3,4,5].try_into().unwrap();

        assert_eq!(Err(Error::Overflow), list.push_back(10 as i64));
    }
}

mod peek {
    use crate::stack::Stack;

    const SIZE: usize = 5;

    #[test]
    fn empty() {
        let stack: Stack<SIZE, i64, false> = Stack::default();

        assert_eq!(stack.peek(), None)
    }

    #[test]
    fn partially_filled() {
        let stack: Stack<SIZE, i64, false> = vec![1,2,3].try_into().unwrap();

        assert_eq!(stack.peek(), Some(&3));
    }

    #[test]
    fn filled() {
        let stack: Stack<SIZE, i64, false> = vec![1,2,3,4,5].try_into().unwrap();

        assert_eq!(stack.peek(), Some(&5));
    }

    #[test]
    fn overflow() {
        let mut stack: Stack<SIZE, i64, true> = vec![1,2,3,4,5].try_into().unwrap();

        assert!(stack.push(6).is_ok());

        assert_eq!(stack.peek(), Some(&6));
    }
}

mod pop {
    use crate::stack::Stack;

    const SIZE: usize = 5;

    #[test]
    fn empty() {
        let mut stack: Stack<SIZE, i64, false> = Stack::default();

        assert_eq!(stack.pop(), None)
    }

    #[test]
    fn partially_filled() {
        let mut stack: Stack<SIZE, i64, false> = vec![1,2,3].try_into().unwrap();

        assert_eq!(stack.pop(), Some(3));
    }

    #[test]
    fn filled() {
        let mut stack: Stack<SIZE, i64, false> = vec![1,2,3,4,5].try_into().unwrap();

        assert_eq!(stack.pop(), Some(5));
    }

    #[test]
    fn overflow() {
        let mut stack: Stack<SIZE, i64, true> = vec![1,2,3,4,5].try_into().unwrap();

        assert!(stack.push(6).is_ok());

        assert_eq!(stack.pop(), Some(6));
    }
}

mod read {
    use crate::{stack::Stack, error::Error};

    const SIZE: usize = 5;
    #[test]
    fn empty() {
        let stack: Stack<SIZE, i64, false> = Stack::default();

        assert_eq!(Err(Error::IndexOutOfRange), stack.read(0));
        assert_eq!(Err(Error::IndexOutOfRange), stack.read(1));
        assert_eq!(Err(Error::IndexOutOfRange), stack.read(2));
    }

    #[test]
    fn partially_filled() {
        let stack: Stack<SIZE, i64, false> = vec![1,2,3].try_into().unwrap();

        assert_eq!(Ok(&3), stack.read(0));
        assert_eq!(Ok(&2), stack.read(1));
        assert_eq!(Ok(&1), stack.read(2));
        assert_eq!(Err(Error::IndexOutOfRange), stack.read(3));
    }

    #[test]
    fn filled() {
        let stack: Stack<SIZE, i64, false> = vec![1,2,3,4,5].try_into().unwrap();

        assert_eq!(Ok(&5), stack.read(0));
        assert_eq!(Ok(&4), stack.read(1));
        assert_eq!(Ok(&3), stack.read(2));
        assert_eq!(Ok(&2), stack.read(3));
        assert_eq!(Ok(&1), stack.read(4));

        assert_eq!(Err(Error::IndexOutOfRange), stack.read(5));
    }

    #[test]
    fn overflow() {
        let mut stack: Stack<SIZE, i64, true> = vec![1,2,3,4,5].try_into().unwrap();

        assert!(stack.push(6).is_ok());

        assert_eq!(Ok(&6), stack.read(0));
        assert_eq!(Ok(&5), stack.read(1));
        assert_eq!(Ok(&4), stack.read(2));
        assert_eq!(Ok(&3), stack.read(3));
        assert_eq!(Ok(&2), stack.read(4));
        
        assert_eq!(Err(Error::IndexOutOfRange), stack.read(5));
    }
}

mod display {
    use crate::stack::Stack;

    const SIZE: usize = 5;

    #[test]
    fn empty(){
        let list: Stack<SIZE, i64, false> = Stack::default();

        let actual = list.to_string();

        assert_eq!(actual, "[]");
    }
    #[test]
    fn one_element(){
        let list: Stack<SIZE, i64, false> = Stack::try_from(vec![1]).unwrap();

        let actual = list.to_string();

        assert_eq!(actual, "[1]");
    }

    #[test]
    fn partially_filled(){
        let list: Stack<SIZE, i64, false> = Stack::try_from(vec![1,2,3]).unwrap();

        let actual = list.to_string();

        assert_eq!(actual, "[1, 2, 3]");
    }

    #[test]
    fn filled(){
        let list: Stack<SIZE, i64, false> = Stack::try_from(vec![1,2,3,4,5]).unwrap();

        let actual = list.to_string();

        assert_eq!(actual, "[1, 2, 3, 4, 5]");
    }

    #[test]
    fn overflow(){
        let list: Stack<SIZE, i64, true> = Stack::try_from(vec![1,2,3,4,5, 6]).unwrap();

        let actual = list.to_string();

        assert_eq!(actual, "[2, 3, 4, 5, 6]");
    }
}

mod debug {
    use crate::stack::Stack;

    const SIZE: usize = 5;

    #[test]
    fn empty(){
        let list: Stack<SIZE, i64, false> = Stack::default();

        let actual = format!("{list:?}");

        assert_eq!("Stack { : List { : CyclicList { list: [None, None, None, None, None], start: 0, end: 0, size: 0 } } }", actual)
    }

    #[test]
    fn partially_filled(){
        let list: Stack<SIZE, i64, false> = Stack::try_from(vec![1,2,3]).unwrap();

        let actual = format!("{list:?}");

        assert_eq!("Stack { : List { : CyclicList { list: [Some(1), Some(2), Some(3), None, None], start: 0, end: 2, size: 3 } } }", actual);
    }

    #[test]
    fn filled(){
        let list: Stack<SIZE, i64, false> = Stack::try_from(vec![1,2,3,4,5]).unwrap();

        let actual = format!("{list:?}");

        assert_eq!("Stack { : List { : CyclicList { list: [Some(1), Some(2), Some(3), Some(4), Some(5)], start: 0, end: 4, size: 5 } } }", actual);
    }

    #[test]
    fn overflow(){
        let mut list: Stack<SIZE, i64, true> = Stack::try_from(vec![1,2,3,4,5]).unwrap();

        assert!(list.push(6).is_ok());
        let actual = format!("{list:?}");
        assert_eq!("Stack { : List { : CyclicList { list: [Some(6), Some(2), Some(3), Some(4), Some(5)], start: 1, end: 0, size: 5 } } }", actual)
    }
}