statiki 0.5.1

Static friendly data structures
Documentation
use core::fmt::Write;
use core::sync::atomic::{AtomicUsize, Ordering};

use statiki::Array;

#[test]
fn test_array_iterator() {
    let mut array = Array::<usize, 512>::new();

    for idx in 1..=500 {
        assert!(array.push(idx).is_none());
    }

    for (idx, elem) in array.into_iter().enumerate() {
        assert_eq!(idx + 1, elem);
    }
}

#[test]
fn test_array_destructor() {
    static COUNT: AtomicUsize = AtomicUsize::new(0);
    #[derive(Default)]
    struct Lolka {
    }

    impl Drop for Lolka {
        fn drop(&mut self) {
            COUNT.fetch_add(1, Ordering::Relaxed);
        }
    }

    Array::<Lolka, 512>::new();

    assert_eq!(COUNT.load(Ordering::Relaxed), 0);

    let mut array = Array::<Lolka, 512>::new();
    array.resize_default(500);
    assert_eq!(array.len(), 500);
    array.truncate(400);
    assert_eq!(array.len(), 400);
    assert_eq!(COUNT.load(Ordering::Relaxed), 100);

    let mut idx = 0;
    for _elem in array {
        idx += 1;
    }
    assert_eq!(idx, 400);

    assert_eq!(COUNT.load(Ordering::Relaxed), 500);
}

#[cfg(feature = "std")]
#[test]
fn test_array_write() {
    use std::io::Write;

    const SIZE: usize = 100;
    let mut array = Array::<_, 512>::new();
    let data = [0u8; SIZE];

    let full_write_num = array.capacity() / SIZE;

    for idx in 0..full_write_num {
        let res = array.write(&data).expect("To successfully write");
        assert_eq!(res, SIZE);
        assert_eq!(array.len(), (idx+1) * SIZE);
    }

    let res = array.write(&data).expect("To successfully write");
    assert_eq!(res, array.capacity() - full_write_num * SIZE);
    assert_eq!(array.len(), array.capacity());

    let res = array.write(&data).expect("To successfully write");
    assert_eq!(res, 0);
}

#[test]
fn test_array_clone() {
    let mut array = Array::<_, 512>::new();
    for idx in 0..array.capacity() {
        assert!(array.push(idx).is_none());
    }

    let mut cloned = array.clone();
    assert_eq!(cloned.len(), array.len());
    assert_eq!(cloned, array);
    assert_eq!(cloned, array.as_slice());

    for idx in (0..array.capacity()).rev() {
        assert_eq!(idx, cloned.pop().unwrap());
    }
}

#[test]
fn test_array() {
    let mut array = Array::<_, 512>::new();
    assert_eq!(array.capacity(), 512);
    assert!(array.is_empty());
    assert_eq!(format!("{:?}", &array), "[]");

    assert!(array.push(15).is_none());
    assert!(!array.is_empty());

    let elem = array.pop().expect("To get value");
    assert_eq!(15, elem);
    assert!(array.pop().is_none());

    for idx in 0..array.capacity() {
        assert!(array.push(idx).is_none());
    }

    assert!(array.push(500).is_some());

    for idx in (0..array.capacity()).rev() {
        let elem = array.pop().expect("To get value");
        assert_eq!(idx, elem);
    }

    assert!(array.pop().is_none());
    array.clear();

    let mut expected_format = String::new();
    let _ = write!(&mut expected_format, "[");
    for idx in 0..array.capacity() {
        assert!(array.push(idx).is_none());
        let _ = write!(&mut expected_format, "{}, ", idx);
    }
    expected_format.pop();
    expected_format.pop();
    let _ = write!(&mut expected_format, "]");

    assert_eq!(format!("{:?}", &array), expected_format);

    array.resize(array.capacity() / 2, 1);
    assert_eq!(array.len(), array.capacity() / 2);

    array.clear();
    assert!(array.is_empty());
    assert!(array.pop().is_none());

    array.resize(array.capacity(), 1);
    assert_eq!(array.len(), array.capacity());

    for _ in 0..array.capacity() {
        let item = array.pop().expect("To get value");
        assert_eq!(item, 1);
    }

    assert!(array.is_empty());
    assert!(array.pop().is_none());

    array.resize_default(array.capacity() / 2);
    assert_eq!(array.len(), array.capacity() / 2);

    for _ in 0..array.capacity() / 2 {
        let item = array.pop().expect("To get value");
        assert_eq!(item, 0);
    }

    assert!(array.is_empty());
    assert!(array.pop().is_none());
}