use picoring::ring::PicoRing;
use picoring::MirrorBuffer;
#[test]
fn test_hardware_mirroring() {
let ps = picoring::system::get_page_size();
let mut buffer = MirrorBuffer::new(ps)
.expect("Failed to create MirrorBuffer. Ensure you have necessary OS permissions.");
let slice = buffer.as_mut_slice();
assert_eq!(
slice.len(),
2 * ps,
"Virtual address space should be twice the physical size"
);
slice[0] = 42;
assert_eq!(
slice[ps], 42,
"Mirroring failed: Index {} does not match index 0",
ps
);
slice[ps + 1] = 99;
assert_eq!(
slice[1], 99,
"Mirroring failed: Write to mirrored area did not update original area"
);
}
#[test]
fn test_pico_ring_basic_logic() {
let mut ring = PicoRing::<u32>::with_capacity(10).expect("Failed to create PicoRing");
assert!(ring.is_empty());
assert!(!ring.is_full());
let cap = ring.capacity();
for i in 0..cap - 1 {
assert!(ring.push(i as u32), "Failed to push item {}", i);
}
assert!(ring.is_full());
assert!(!ring.push(99));
for i in 0..cap - 1 {
assert_eq!(ring.pop(), Some(i as u32));
}
assert!(ring.is_empty());
assert_eq!(ring.pop(), None);
}
#[test]
fn test_pico_ring_wrap_around_with_mirroring() {
let mut ring = PicoRing::<u8>::with_capacity(4096).expect("Failed to create PicoRing");
let cap = ring.capacity();
for _ in 0..cap - 1 {
ring.push(0);
}
for _ in 0..5 {
ring.pop();
}
let data = [1, 2, 3, 4, 5];
assert!(
ring.push_slice(&data),
"Failed to push slice across boundary"
);
for _ in 0..cap - 6 {
ring.pop();
}
assert_eq!(ring.pop(), Some(1));
assert_eq!(ring.pop(), Some(2));
assert_eq!(ring.pop(), Some(3));
assert_eq!(ring.pop(), Some(4));
assert_eq!(ring.pop(), Some(5));
}
#[test]
fn test_pico_ring_static_capacity() {
let ps = picoring::system::get_page_size();
let mut ring = PicoRing::<u8, 4096>::new().expect("Failed to create static PicoRing");
assert_eq!(ring.capacity(), ps);
ring.push(10);
assert_eq!(ring.pop(), Some(10));
}