tempo_tapper 0.5.5

terminal tempo tapper (archive)
// tempo: terminal tempo tapper (tests)
// copyright (C) 2022-2023 Nissa <and-nissa@protonmail.com>
// licensed under MIT OR Apache-2.0

mod ringbuf {
    use crate::ringbuf::{Idx, RingBuf};

    #[test]
    fn push_pop() {
        const CAP: usize = 8;
        let mut buf: RingBuf<i32, CAP> = RingBuf::new();

        for i in 0..CAP {
            buf.try_push(i as _).unwrap();
        }
        assert_eq!(buf, [0, 1, 2, 3, 4, 5, 6, 7]);
        assert_eq!(buf.try_push(24), None);

        assert_eq!(buf.pop(), Some(0));
        assert_eq!(buf.pop(), Some(1));
        assert_eq!(buf.pop(), Some(2));
        assert_eq!(buf, [3, 4, 5, 6, 7]);
    }

    #[test]
    fn push_clobber() {
        const CAP: usize = 8;
        let mut buf: RingBuf<i32, CAP> = RingBuf::new();

        for i in 0..CAP {
            buf.push(i as _);
        }
        assert_eq!(buf, [0, 1, 2, 3, 4, 5, 6, 7]);

        buf.push(24);
        assert_eq!(buf, [1, 2, 3, 4, 5, 6, 7, 24]);
    }

    #[test]
    fn overflow() {
        const CAP: usize = 8;
        let mut buf: RingBuf<usize, CAP> = RingBuf::new();

        for _ in 0..Idx::MAX {
            buf.try_push(4).unwrap();
            buf.try_push(9).unwrap();
            buf.try_push(16).unwrap();
            assert_eq!(buf.pop(), Some(4));
            assert_eq!(buf.pop(), Some(9));
            assert_eq!(buf.pop(), Some(16));
        }
        assert_eq!(buf, []);
    }

    #[test]
    fn clear() {
        const CAP: usize = 8;
        let mut buf: RingBuf<usize, CAP> = RingBuf::new();

        for i in 0..100 {
            buf.push(i);
            buf.push(i * 2);
            buf.push(i * 3);
            buf.pop().unwrap();
        }
        assert!(!buf.is_empty());
        buf.clear();
        assert!(buf.is_empty());
        assert_eq!(buf, []);
        assert_eq!(buf.pop(), None);
    }

    #[test]
    fn from_iter() {
        const CAP: usize = 8;
        let iter = [1, 2, 3, 4, 5, 6, 7, 8];
        let buf: RingBuf<usize, CAP> = RingBuf::from_iter(iter);
        assert!(buf.is_full());
        assert_eq!(buf, iter);
    }

    #[test]
    #[should_panic]
    fn from_iter_excess() {
        const CAP: usize = 8;
        let _: RingBuf<usize, CAP> = RingBuf::from_iter([1, 2, 3, 4, 5, 6, 7, 8, 9]);
    }

    #[test]
    fn truncate_front() {
        const CAP: usize = 8;
        let mut buf: RingBuf<usize, CAP> = RingBuf::from_iter([1, 2, 3, 4, 5, 6, 7, 8]);
        buf.truncate_front(4);
        assert_eq!(buf, [1, 2, 3, 4]);
        buf.truncate_front(100);
        assert_eq!(buf, [1, 2, 3, 4]);
    }

    #[test]
    fn truncate_back() {
        const CAP: usize = 8;
        let mut buf: RingBuf<usize, CAP> = RingBuf::from_iter([1, 2, 3, 4, 5, 6, 7, 8]);
        buf.truncate_back(4);
        assert_eq!(buf, [5, 6, 7, 8]);
        buf.truncate_back(100);
        assert_eq!(buf, [5, 6, 7, 8]);
    }

    #[test]
    fn double_ended_iter() {
        const CAP: usize = 8;
        let buf: RingBuf<usize, CAP> = RingBuf::from_iter([1, 2, 3, 4, 5, 6]);
        let mut iter = buf.iter();
        assert_eq!(Some(&1), iter.next());
        assert_eq!(Some(&6), iter.next_back());
        assert_eq!(Some(&5), iter.next_back());
        assert_eq!(Some(&2), iter.next());
        assert_eq!(Some(&3), iter.next());
        assert_eq!(Some(&4), iter.next());
        assert_eq!(None, iter.next());
        assert_eq!(None, iter.next_back());
    }

    #[test]
    fn double_ended_iter_overflow() {
        const CAP: usize = 8;
        let mut buf: RingBuf<Idx, CAP> = RingBuf::new();
        for i in 0..Idx::MAX {
            buf.try_push(i).unwrap();
            assert_eq!(buf.pop(), Some(i));
        }
        for x in [1, 2, 3, 4, 5, 6] {
            buf.try_push(x).unwrap();
        }
        let mut iter = buf.iter();
        assert_eq!(Some(&1), iter.next());
        assert_eq!(Some(&6), iter.next_back());
        assert_eq!(Some(&5), iter.next_back());
        assert_eq!(Some(&2), iter.next());
        assert_eq!(Some(&3), iter.next());
        assert_eq!(Some(&4), iter.next());
        assert_eq!(None, iter.next());
        assert_eq!(None, iter.next_back());
    }
}