use mmap_vecdeque::{MmapVecDeque, MmapVecDequeError};
use tempfile::TempDir;
#[test]
fn test_type_mismatch() -> Result<(), MmapVecDequeError> {
let tmp = TempDir::new()?;
let path = tmp.path();
let mut dq_u64 = MmapVecDeque::<u64>::open_or_create(path, None)?;
dq_u64.push_back(42)?;
dq_u64.commit()?;
drop(dq_u64);
let result = MmapVecDeque::<u32>::open_or_create(path, None);
assert!(result.is_err(), "Expected error due to type mismatch");
Ok(())
}
#[test]
fn test_persistence_across_open() -> Result<(), MmapVecDequeError> {
let tmp = TempDir::new()?;
let path = tmp.path();
{
let mut dq = MmapVecDeque::<u64>::open_or_create(path, None)?;
dq.push_back(100)?;
dq.push_back(200)?;
dq.push_front(50)?;
dq.commit()?;
}
let dq = MmapVecDeque::<u64>::open_or_create(path, None)?;
assert_eq!(dq.len(), 3);
assert_eq!(dq.front(), Some(50));
assert_eq!(dq.back(), Some(200));
Ok(())
}
#[test]
fn test_zero_sized_type_fails() {
let tmp = TempDir::new().unwrap();
let path = tmp.path();
let result = MmapVecDeque::<()>::open_or_create(path, None);
assert!(result.is_err(), "Zero-sized type should not be supported");
}
#[test]
fn test_mixed_operations() -> Result<(), MmapVecDequeError> {
let tmp = TempDir::new()?;
let path = tmp.path();
let mut dq = MmapVecDeque::<i32>::open_or_create(path, Some(50))?;
for i in 0..50 {
dq.push_back(i)?;
dq.push_front(-i)?;
}
dq.commit()?;
assert_eq!(dq.len(), 100);
assert_eq!(dq.front(), Some(-49));
assert_eq!(dq.back(), Some(49));
for _ in 0..10 {
dq.pop_front()?;
dq.pop_back()?;
}
dq.commit()?;
assert_eq!(dq.len(), 80);
let collected: Vec<i32> = dq.iter().collect();
assert_eq!(collected.len(), 80);
assert_eq!(collected.first(), Some(&-39));
assert_eq!(collected.last(), Some(&39));
Ok(())
}
#[test]
fn test_clear_then_reuse() -> Result<(), MmapVecDequeError> {
let tmp = TempDir::new()?;
let path = tmp.path();
let mut dq = MmapVecDeque::<u8>::open_or_create(path, None)?;
dq.push_back(10)?;
dq.push_back(20)?;
dq.commit()?;
assert_eq!(dq.len(), 2);
dq.clear()?;
dq.commit()?;
assert_eq!(dq.len(), 0);
dq.push_front(99)?;
dq.push_back(100)?;
dq.commit()?;
assert_eq!(dq.len(), 2);
assert_eq!(dq.front(), Some(99));
assert_eq!(dq.back(), Some(100));
Ok(())
}
#[test]
fn test_multiple_reopen_cycles() -> Result<(), MmapVecDequeError> {
let tmp = TempDir::new()?;
let path = tmp.path();
{
let mut dq = MmapVecDeque::<u64>::open_or_create(path, None)?;
for i in 0..50 {
dq.push_back(i)?;
}
dq.commit()?;
}
{
let dq = MmapVecDeque::<u64>::open_or_create(path, None)?;
assert_eq!(dq.len(), 50);
let collected: Vec<u64> = dq.iter().collect();
assert_eq!(collected, (0..50).collect::<Vec<_>>());
}
{
let mut dq = MmapVecDeque::<u64>::open_or_create(path, None)?;
for _ in 0..10 {
dq.pop_front()?;
}
dq.commit()?;
}
{
let dq = MmapVecDeque::<u64>::open_or_create(path, None)?;
assert_eq!(dq.len(), 40);
let collected: Vec<u64> = dq.iter().collect();
assert_eq!(collected, (10..50).collect::<Vec<_>>());
}
{
let mut dq = MmapVecDeque::<u64>::open_or_create(path, None)?;
for i in 100..110 {
dq.push_front(i)?;
}
dq.commit()?;
}
{
let dq = MmapVecDeque::<u64>::open_or_create(path, None)?;
assert_eq!(dq.len(), 50);
let collected: Vec<u64> = dq.iter().collect();
let mut expected = (100..110).rev().collect::<Vec<u64>>();
expected.extend(10..50);
assert_eq!(collected, expected);
}
{
let mut dq = MmapVecDeque::<u64>::open_or_create(path, None)?;
dq.clear()?;
dq.commit()?;
}
{
let mut dq = MmapVecDeque::<u64>::open_or_create(path, None)?;
assert_eq!(dq.len(), 0);
for i in 1000..1020 {
dq.push_back(i).unwrap();
}
dq.commit()?;
}
{
let dq = MmapVecDeque::<u64>::open_or_create(path, None)?;
assert_eq!(dq.len(), 20);
let collected: Vec<u64> = dq.iter().collect();
assert_eq!(collected, (1000..1020).collect::<Vec<_>>());
}
Ok(())
}