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());
}
}