use crate::generic::{RingBuf, RingBufError};
use std::sync::{Arc, Mutex};
use std::thread;
#[test]
fn test_push_pop_alternating_pattern() {
let mut buf: RingBuf<i32, 32, true> = RingBuf::new(4);
for i in 0..100 {
buf.push(i);
assert_eq!(buf.pop().unwrap(), i);
assert!(buf.is_empty());
}
}
#[test]
fn test_push_pop_stress_wrapping() {
let mut buf: RingBuf<i32, 64, true> = RingBuf::new(8);
for cycle in 0..50 {
for i in 0..8 {
buf.push(cycle * 100 + i);
}
for i in 0..4 {
assert_eq!(buf.pop().unwrap(), cycle * 100 + i);
}
}
}
#[test]
fn test_overwrite_mode_exact_capacity() {
let mut buf: RingBuf<i32, 32, true> = RingBuf::new(4);
for i in 0..4 {
assert_eq!(buf.push(i), None);
}
assert!(buf.is_full());
for i in 4..20 {
let overwritten = buf.push(i);
assert_eq!(overwritten, Some(i - 4));
assert_eq!(buf.len(), 4);
assert!(buf.is_full());
}
assert_eq!(buf.pop().unwrap(), 16);
assert_eq!(buf.pop().unwrap(), 17);
assert_eq!(buf.pop().unwrap(), 18);
assert_eq!(buf.pop().unwrap(), 19);
}
#[test]
fn test_non_overwrite_mode_exactly_full() {
let mut buf: RingBuf<i32, 32, false> = RingBuf::new(8);
for i in 0..8 {
assert!(buf.push(i).is_ok());
}
assert!(buf.is_full());
assert_eq!(buf.len(), 8);
assert_eq!(buf.push(99), Err(RingBufError::Full(99)));
assert_eq!(buf.len(), 8);
assert_eq!(buf.pop().unwrap(), 0);
assert!(!buf.is_full());
assert!(buf.push(99).is_ok());
for i in 1..8 {
assert_eq!(buf.pop().unwrap(), i);
}
assert_eq!(buf.pop().unwrap(), 99);
}
#[test]
fn test_pop_until_empty_with_refill() {
let mut buf: RingBuf<i32, 32, true> = RingBuf::new(16);
for round in 0..10 {
for i in 0..16 {
buf.push(round * 100 + i);
}
for i in 0..16 {
assert_eq!(buf.pop().unwrap(), round * 100 + i);
}
assert!(buf.is_empty());
assert_eq!(buf.len(), 0);
}
}
#[test]
fn test_peek_consistency_during_operations() {
let mut buf: RingBuf<i32, 32, true> = RingBuf::new(8);
assert_eq!(buf.peek(), None);
buf.push(10);
assert_eq!(buf.peek(), Some(&10));
assert_eq!(buf.len(), 1);
buf.push(20);
buf.push(30);
assert_eq!(buf.peek(), Some(&10));
buf.pop().unwrap();
assert_eq!(buf.peek(), Some(&20));
buf.pop().unwrap();
assert_eq!(buf.peek(), Some(&30));
buf.pop().unwrap();
assert_eq!(buf.peek(), None);
}
#[test]
fn test_clear_with_various_states() {
let mut buf: RingBuf<i32, 32, true> = RingBuf::new(8);
buf.clear();
assert!(buf.is_empty());
buf.push(1);
buf.push(2);
buf.push(3);
buf.clear();
assert!(buf.is_empty());
for i in 0..8 {
buf.push(i);
}
assert!(buf.is_full());
buf.clear();
assert!(buf.is_empty());
buf.push(100);
assert_eq!(buf.pop().unwrap(), 100);
}
#[test]
fn test_push_slice_larger_than_capacity() {
let mut buf: RingBuf<i32, 64, true> = RingBuf::new(8);
let large_data: Vec<i32> = (0..20).collect();
let pushed = buf.push_slice(&large_data);
assert_eq!(pushed, 20);
assert_eq!(buf.len(), 8);
for i in 0..8 {
assert_eq!(buf.pop().unwrap(), 12 + i);
}
}
#[test]
fn test_push_slice_exact_capacity() {
let mut buf: RingBuf<i32, 64, true> = RingBuf::new(8);
let data: Vec<i32> = (0..8).collect();
let pushed = buf.push_slice(&data);
assert_eq!(pushed, 8);
assert!(buf.is_full());
assert_eq!(buf.len(), 8);
for i in 0..8 {
assert_eq!(buf.pop().unwrap(), i);
}
}
#[test]
fn test_push_slice_partial_overwrite() {
let mut buf: RingBuf<i32, 64, true> = RingBuf::new(8);
for i in 0..8 {
buf.push(i * 10);
}
let data = [100, 101, 102, 103, 104];
buf.push_slice(&data);
assert_eq!(buf.len(), 8);
assert_eq!(buf.pop().unwrap(), 50);
assert_eq!(buf.pop().unwrap(), 60);
assert_eq!(buf.pop().unwrap(), 70);
assert_eq!(buf.pop().unwrap(), 100);
assert_eq!(buf.pop().unwrap(), 101);
assert_eq!(buf.pop().unwrap(), 102);
assert_eq!(buf.pop().unwrap(), 103);
assert_eq!(buf.pop().unwrap(), 104);
}
#[test]
fn test_push_slice_non_overwrite_partial_fill() {
let mut buf: RingBuf<i32, 64, false> = RingBuf::new(8);
buf.push(1).unwrap();
buf.push(2).unwrap();
let data = [10, 20, 30, 40, 50, 60, 70, 80, 90];
let pushed = buf.push_slice(&data);
assert_eq!(pushed, 6);
assert!(buf.is_full());
assert_eq!(buf.len(), 8);
assert_eq!(buf.pop().unwrap(), 1);
assert_eq!(buf.pop().unwrap(), 2);
for i in 0..6 {
assert_eq!(buf.pop().unwrap(), (i + 1) * 10);
}
}
#[test]
fn test_pop_slice_exact_available() {
let mut buf: RingBuf<i32, 64, true> = RingBuf::new(16);
for i in 0..10 {
buf.push(i);
}
let mut dest = [0i32; 10];
let popped = buf.pop_slice(&mut dest);
assert_eq!(popped, 10);
assert_eq!(dest, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
assert!(buf.is_empty());
}
#[test]
fn test_pop_slice_more_than_available() {
let mut buf: RingBuf<i32, 64, true> = RingBuf::new(16);
for i in 0..5 {
buf.push(i);
}
let mut dest = [0i32; 10];
let popped = buf.pop_slice(&mut dest);
assert_eq!(popped, 5);
assert_eq!(&dest[..5], &[0, 1, 2, 3, 4]);
assert_eq!(&dest[5..], &[0, 0, 0, 0, 0]);
assert!(buf.is_empty());
}
#[test]
fn test_pop_slice_wrapped_data() {
let mut buf: RingBuf<i32, 64, true> = RingBuf::new(8);
for i in 0..12 {
buf.push(i);
}
let mut dest = [0i32; 8];
let popped = buf.pop_slice(&mut dest);
assert_eq!(popped, 8);
assert_eq!(dest, [4, 5, 6, 7, 8, 9, 10, 11]);
}
#[test]
fn test_as_slices_after_wrapping() {
let mut buf: RingBuf<i32, 64, true> = RingBuf::new(8);
for i in 0..10 {
buf.push(i);
}
buf.pop().unwrap(); buf.pop().unwrap();
let (first, second) = buf.as_slices();
let mut all_data = Vec::new();
all_data.extend_from_slice(first);
all_data.extend_from_slice(second);
assert_eq!(all_data.len(), 6);
assert_eq!(all_data, vec![4, 5, 6, 7, 8, 9]);
}
#[test]
fn test_as_slices_full_buffer() {
let mut buf: RingBuf<i32, 64, true> = RingBuf::new(8);
for i in 0..8 {
buf.push(i);
}
let (first, second) = buf.as_slices();
assert_eq!(first.len() + second.len(), 8);
let mut all_data = Vec::new();
all_data.extend_from_slice(first);
all_data.extend_from_slice(second);
assert_eq!(all_data, vec![0, 1, 2, 3, 4, 5, 6, 7]);
}
#[test]
fn test_as_mut_slices_and_modify() {
let mut buf: RingBuf<i32, 64, true> = RingBuf::new(8);
for i in 0..8 {
buf.push(i);
}
{
let (first, second) = buf.as_mut_slices();
for x in first.iter_mut() {
*x *= 100;
}
for x in second.iter_mut() {
*x *= 100;
}
}
for i in 0..8 {
assert_eq!(buf.pop().unwrap(), i * 100);
}
}
#[test]
fn test_iter_chaining_and_filtering() {
let mut buf: RingBuf<i32, 64, true> = RingBuf::new(16);
for i in 0..10 {
buf.push(i);
}
let result: Vec<i32> = buf
.iter()
.filter(|&&x| x % 2 == 0)
.map(|&x| x * 10)
.collect();
assert_eq!(result, vec![0, 20, 40, 60, 80]);
}
#[test]
fn test_iter_with_wrapped_buffer() {
let mut buf: RingBuf<i32, 64, true> = RingBuf::new(8);
for i in 0..15 {
buf.push(i);
}
let values: Vec<i32> = buf.iter().copied().collect();
assert_eq!(values, vec![7, 8, 9, 10, 11, 12, 13, 14]);
}
#[test]
fn test_iter_mut_with_complex_modifications() {
let mut buf: RingBuf<i32, 64, true> = RingBuf::new(16);
for i in 0..10 {
buf.push(i);
}
for (idx, x) in buf.iter_mut().enumerate() {
if idx % 2 == 0 {
*x *= 2;
} else {
*x += 100;
}
}
let values: Vec<i32> = buf.iter().copied().collect();
assert_eq!(values, vec![0, 101, 4, 103, 8, 105, 12, 107, 16, 109]);
}
#[test]
fn test_iter_size_hints() {
let mut buf: RingBuf<i32, 64, true> = RingBuf::new(16);
for i in 0..8 {
buf.push(i);
}
let mut iter = buf.iter();
assert_eq!(iter.len(), 8);
iter.next();
assert_eq!(iter.len(), 7);
iter.next();
iter.next();
assert_eq!(iter.len(), 5);
}
#[test]
fn test_iter_double_ended_complex() {
let mut buf: RingBuf<i32, 64, true> = RingBuf::new(16);
for i in 0..10 {
buf.push(i * 10);
}
let mut iter = buf.iter();
let mut collected = Vec::new();
collected.push(*iter.next().unwrap()); collected.push(*iter.next_back().unwrap()); collected.push(*iter.next().unwrap()); collected.push(*iter.next_back().unwrap()); collected.push(*iter.next().unwrap());
assert_eq!(collected, vec![0, 90, 10, 80, 20]);
assert_eq!(iter.len(), 5); }
#[test]
fn test_iter_mut_double_ended_modifications() {
let mut buf: RingBuf<i32, 64, true> = RingBuf::new(16);
for i in 1..=6 {
buf.push(i);
}
let mut iter = buf.iter_mut();
if let Some(x) = iter.next() {
*x = 100;
}
if let Some(x) = iter.next_back() {
*x = 200;
}
drop(iter);
let values: Vec<i32> = buf.iter().copied().collect();
assert_eq!(values, vec![100, 2, 3, 4, 5, 200]);
}
#[test]
fn test_iter_exhaust_from_both_ends() {
let mut buf: RingBuf<i32, 64, true> = RingBuf::new(8);
for i in 0..6 {
buf.push(i);
}
let mut iter = buf.iter();
assert_eq!(iter.next(), Some(&0));
assert_eq!(iter.next_back(), Some(&5));
assert_eq!(iter.next(), Some(&1));
assert_eq!(iter.next_back(), Some(&4));
assert_eq!(iter.next(), Some(&2));
assert_eq!(iter.next_back(), Some(&3));
assert_eq!(iter.next(), None);
assert_eq!(iter.next_back(), None);
}
#[test]
fn test_iter_collect_to_various_collections() {
let mut buf: RingBuf<i32, 64, true> = RingBuf::new(16);
for i in 0..8 {
buf.push(i);
}
let vec: Vec<i32> = buf.iter().copied().collect();
assert_eq!(vec.len(), 8);
let deque: std::collections::VecDeque<i32> = buf.iter().copied().collect();
assert_eq!(deque.len(), 8);
let filtered: Vec<i32> = buf.iter().copied().filter(|&x| x > 3).collect();
assert_eq!(filtered, vec![4, 5, 6, 7]);
}
#[test]
fn test_concurrent_writers_overwrite_mode() {
let buf = Arc::new(Mutex::new(RingBuf::<u64, 256, true>::new(64)));
let mut handles = vec![];
for thread_id in 0..8 {
let buf_clone = Arc::clone(&buf);
let handle = thread::spawn(move || {
for i in 0..50 {
let value = (thread_id as u64) * 1000 + i;
buf_clone.lock().unwrap().push(value);
}
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
let buf = buf.lock().unwrap();
assert_eq!(buf.len(), 64);
}
#[test]
fn test_concurrent_readers_and_writers() {
let buf = Arc::new(Mutex::new(RingBuf::<i32, 128, true>::new(64)));
let mut handles = vec![];
for thread_id in 0..4 {
let buf_clone = Arc::clone(&buf);
let handle = thread::spawn(move || {
for i in 0..100 {
buf_clone.lock().unwrap().push(thread_id * 1000 + i);
thread::sleep(std::time::Duration::from_micros(1));
}
});
handles.push(handle);
}
for _ in 0..4 {
let buf_clone = Arc::clone(&buf);
let handle = thread::spawn(move || {
for _ in 0..50 {
if buf_clone.lock().unwrap().pop().is_ok() {}
thread::sleep(std::time::Duration::from_micros(1));
}
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
let buf = buf.lock().unwrap();
assert!(buf.len() <= 64);
}
#[test]
fn test_concurrent_push_slice_operations() {
let buf = Arc::new(Mutex::new(RingBuf::<i32, 256, true>::new(128)));
let mut handles = vec![];
for thread_id in 0..4 {
let buf_clone = Arc::clone(&buf);
let handle = thread::spawn(move || {
let data: Vec<i32> = ((thread_id * 100)..(thread_id * 100 + 20)).collect();
for _ in 0..10 {
buf_clone.lock().unwrap().push_slice(&data);
thread::sleep(std::time::Duration::from_micros(10));
}
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
let buf = buf.lock().unwrap();
assert_eq!(buf.len(), 128); }
#[test]
fn test_concurrent_non_overwrite_mode() {
let buf = Arc::new(Mutex::new(RingBuf::<i32, 128, false>::new(64)));
let mut handles = vec![];
let success_count = Arc::new(Mutex::new(0));
for thread_id in 0..8 {
let buf_clone = Arc::clone(&buf);
let count_clone = Arc::clone(&success_count);
let handle = thread::spawn(move || {
let mut local_success = 0;
for i in 0..50 {
if buf_clone.lock().unwrap().push(thread_id * 1000 + i).is_ok() {
local_success += 1;
}
}
*count_clone.lock().unwrap() += local_success;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
let buf = buf.lock().unwrap();
let success = *success_count.lock().unwrap();
assert_eq!(buf.len(), success.min(64));
assert!(success <= 64); }
#[test]
fn test_stress_alternating_push_pop_multithread() {
let buf = Arc::new(Mutex::new(RingBuf::<u64, 128, true>::new(32)));
let mut handles = vec![];
for thread_id in 0..4 {
let buf_clone = Arc::clone(&buf);
let handle = thread::spawn(move || {
for i in 0..200 {
let mut guard = buf_clone.lock().unwrap();
guard.push((thread_id as u64) * 10000 + i);
if i % 3 == 0 {
guard.pop().ok();
}
}
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
let buf = buf.lock().unwrap();
assert!(buf.len() <= 32);
}
#[test]
fn test_string_type_operations() {
let mut buf: RingBuf<String, 64, true> = RingBuf::new(8);
buf.push("Hello".to_string());
buf.push("World".to_string());
buf.push("Rust".to_string());
buf.push("Ring".to_string());
buf.push("Buffer".to_string());
assert_eq!(buf.len(), 5);
assert_eq!(buf.pop().unwrap(), "Hello");
assert_eq!(buf.pop().unwrap(), "World");
for i in 0..10 {
buf.push(format!("Item_{}", i));
}
assert_eq!(buf.len(), 8);
}
#[test]
fn test_vec_type_operations() {
let mut buf: RingBuf<Vec<i32>, 64, true> = RingBuf::new(4);
buf.push(vec![1, 2, 3]);
buf.push(vec![4, 5, 6]);
buf.push(vec![7, 8, 9]);
let first = buf.pop().unwrap();
assert_eq!(first, vec![1, 2, 3]);
buf.push(vec![]);
let second = buf.pop().unwrap();
assert_eq!(second, vec![4, 5, 6]);
let third = buf.pop().unwrap();
assert_eq!(third, vec![7, 8, 9]);
let empty = buf.pop().unwrap();
assert_eq!(empty, vec![]);
}
#[derive(Debug, Clone, PartialEq)]
struct TestStruct {
id: u32,
name: String,
data: Vec<i32>,
}
#[test]
fn test_custom_struct_type() {
let mut buf: RingBuf<TestStruct, 64, true> = RingBuf::new(8);
buf.push(TestStruct {
id: 1,
name: "Alice".to_string(),
data: vec![10, 20, 30],
});
buf.push(TestStruct {
id: 2,
name: "Bob".to_string(),
data: vec![40, 50],
});
assert_eq!(buf.len(), 2);
let first = buf.pop().unwrap();
assert_eq!(first.id, 1);
assert_eq!(first.name, "Alice");
assert_eq!(first.data, vec![10, 20, 30]);
}
#[test]
fn test_option_type() {
let mut buf: RingBuf<Option<i32>, 64, true> = RingBuf::new(8);
buf.push(Some(42));
buf.push(None);
buf.push(Some(100));
buf.push(None);
assert_eq!(buf.pop().unwrap(), Some(42));
assert_eq!(buf.pop().unwrap(), None);
assert_eq!(buf.pop().unwrap(), Some(100));
assert_eq!(buf.pop().unwrap(), None);
}
#[test]
fn test_result_type() {
let mut buf: RingBuf<Result<i32, String>, 64, true> = RingBuf::new(8);
buf.push(Ok(42));
buf.push(Err("error".to_string()));
buf.push(Ok(100));
assert_eq!(buf.pop().unwrap(), Ok(42));
assert_eq!(buf.pop().unwrap(), Err("error".to_string()));
assert_eq!(buf.pop().unwrap(), Ok(100));
}
#[test]
fn test_tuple_type() {
let mut buf: RingBuf<(i32, String, bool), 64, true> = RingBuf::new(8);
buf.push((1, "one".to_string(), true));
buf.push((2, "two".to_string(), false));
buf.push((3, "three".to_string(), true));
let (num, text, flag) = buf.pop().unwrap();
assert_eq!(num, 1);
assert_eq!(text, "one");
assert_eq!(flag, true);
}
#[test]
fn test_nested_complex_type() {
let mut buf: RingBuf<Vec<Option<String>>, 64, true> = RingBuf::new(4);
buf.push(vec![Some("a".to_string()), None, Some("b".to_string())]);
buf.push(vec![None, None]);
buf.push(vec![Some("c".to_string())]);
let first = buf.pop().unwrap();
assert_eq!(first.len(), 3);
assert_eq!(first[0], Some("a".to_string()));
assert_eq!(first[1], None);
}
#[test]
fn test_large_struct_overwrite() {
#[derive(Clone, Debug)]
struct LargeStruct {
data: [u64; 100],
}
let mut buf: RingBuf<LargeStruct, 32, true> = RingBuf::new(4);
for i in 0..10 {
let mut s = LargeStruct { data: [0; 100] };
s.data[0] = i;
buf.push(s);
}
assert_eq!(buf.len(), 4);
for expected in 6..10 {
let s = buf.pop().unwrap();
assert_eq!(s.data[0], expected);
}
}
#[test]
fn test_capacity_power_of_two_rounding() {
let buf: RingBuf<i32, 64, true> = RingBuf::new(1);
assert_eq!(buf.capacity(), 1);
let buf: RingBuf<i32, 64, true> = RingBuf::new(2);
assert_eq!(buf.capacity(), 2);
let buf: RingBuf<i32, 64, true> = RingBuf::new(3);
assert_eq!(buf.capacity(), 4);
let buf: RingBuf<i32, 64, true> = RingBuf::new(7);
assert_eq!(buf.capacity(), 8);
let buf: RingBuf<i32, 64, true> = RingBuf::new(15);
assert_eq!(buf.capacity(), 16);
let buf: RingBuf<i32, 64, true> = RingBuf::new(100);
assert_eq!(buf.capacity(), 128);
let buf: RingBuf<i32, 64, true> = RingBuf::new(1000);
assert_eq!(buf.capacity(), 1024);
}
#[test]
fn test_stack_allocation_threshold() {
let buf: RingBuf<i32, 64, true> = RingBuf::new(32);
assert_eq!(buf.capacity(), 32);
let buf: RingBuf<i32, 64, true> = RingBuf::new(128);
assert_eq!(buf.capacity(), 128);
let buf: RingBuf<i32, 256, true> = RingBuf::new(200);
assert_eq!(buf.capacity(), 256);
}
#[test]
fn test_minimum_capacity() {
let mut buf: RingBuf<i32, 32, true> = RingBuf::new(1);
assert_eq!(buf.capacity(), 1);
buf.push(42);
assert!(buf.is_full());
assert_eq!(buf.len(), 1);
assert_eq!(buf.push(99), Some(42));
assert_eq!(buf.pop().unwrap(), 99);
}
#[test]
fn test_very_large_capacity() {
let buf: RingBuf<i32, 128, true> = RingBuf::new(8192);
assert_eq!(buf.capacity(), 8192);
let buf: RingBuf<u8, 128, true> = RingBuf::new(65536);
assert_eq!(buf.capacity(), 65536);
}
#[test]
fn test_wrapping_index_overflow() {
let mut buf: RingBuf<u64, 64, true> = RingBuf::new(8);
for i in 0..10000u64 {
buf.push(i);
if i % 2 == 0 {
buf.pop().ok();
}
}
assert!(buf.len() <= 8);
}
#[test]
fn test_peek_does_not_modify_buffer() {
let mut buf: RingBuf<i32, 32, true> = RingBuf::new(8);
for i in 0..5 {
buf.push(i);
}
let initial_len = buf.len();
for _ in 0..10 {
assert_eq!(buf.peek(), Some(&0));
assert_eq!(buf.len(), initial_len);
}
assert_eq!(buf.pop().unwrap(), 0);
assert_eq!(buf.len(), initial_len - 1);
}
#[test]
fn test_as_slices_does_not_modify_buffer() {
let mut buf: RingBuf<i32, 32, true> = RingBuf::new(8);
for i in 0..5 {
buf.push(i);
}
let initial_len = buf.len();
for _ in 0..10 {
let (first, second) = buf.as_slices();
let total = first.len() + second.len();
assert_eq!(total, initial_len);
assert_eq!(buf.len(), initial_len);
}
}
#[test]
fn test_multiple_clear_operations() {
let mut buf: RingBuf<i32, 32, true> = RingBuf::new(8);
for round in 0..5 {
for i in 0..8 {
buf.push(round * 100 + i);
}
assert_eq!(buf.len(), 8);
buf.clear();
assert!(buf.is_empty());
assert_eq!(buf.len(), 0);
}
}
#[test]
fn test_push_slice_wrapping_multiple_times() {
let mut buf: RingBuf<i32, 128, true> = RingBuf::new(16);
let data1: Vec<i32> = (0..16).collect();
buf.push_slice(&data1);
assert_eq!(buf.len(), 16);
let data2: Vec<i32> = (100..140).collect(); let pushed = buf.push_slice(&data2);
assert_eq!(pushed, 40);
assert_eq!(buf.len(), 16);
for i in 0..16 {
assert_eq!(buf.pop().unwrap(), 124 + i);
}
}
#[test]
fn test_non_overwrite_mode_error_recovery() {
let mut buf: RingBuf<i32, 32, false> = RingBuf::new(4);
for i in 0..4 {
assert!(buf.push(i).is_ok());
}
for i in 10..20 {
let result = buf.push(i);
assert!(result.is_err());
if let Err(RingBufError::Full(val)) = result {
assert_eq!(val, i); }
}
assert_eq!(buf.len(), 4);
for i in 0..4 {
assert_eq!(buf.pop().unwrap(), i);
}
}
#[test]
fn test_empty_pop_error() {
let mut buf: RingBuf<i32, 32, true> = RingBuf::new(8);
let result = buf.pop();
assert!(result.is_err());
assert!(matches!(result, Err(RingBufError::Empty)));
buf.push(42);
assert_eq!(buf.pop().unwrap(), 42);
let result = buf.pop();
assert!(matches!(result, Err(RingBufError::Empty)));
}
#[test]
fn test_iterator_on_empty_buffer() {
let buf: RingBuf<i32, 32, true> = RingBuf::new(8);
assert_eq!(buf.iter().count(), 0);
assert_eq!(buf.iter().len(), 0);
assert_eq!(buf.iter().next(), None);
assert_eq!(buf.iter().next_back(), None);
let (first, second) = buf.as_slices();
assert_eq!(first.len(), 0);
assert_eq!(second.len(), 0);
}
#[test]
fn test_mixed_operations_sequence() {
let mut buf: RingBuf<i32, 64, true> = RingBuf::new(16);
for i in 0..10 {
buf.push(i);
}
for _ in 0..5 {
buf.pop().unwrap();
}
let slice = [100, 101, 102, 103, 104];
buf.push_slice(&slice);
for x in buf.iter_mut() {
*x *= 2;
}
let mut dest = [0i32; 5];
buf.pop_slice(&mut dest);
assert!(buf.len() > 0);
buf.clear();
assert!(buf.is_empty());
}