use mmap_vecdeque::{MmapVecDeque, MmapVecDequeError};
use tempfile::TempDir;
#[test]
fn test_basic_ops() -> Result<(), MmapVecDequeError> {
let tmp = TempDir::new()?;
let path = tmp.path();
let mut dq = MmapVecDeque::<u64>::open_or_create(path, None)?;
assert!(dq.is_empty());
dq.push_back(10)?;
dq.push_back(20)?;
dq.push_back(30)?;
assert_eq!(dq.len(), 3);
dq.commit()?; assert_eq!(dq.len(), 3);
assert_eq!(dq.front(), Some(10));
assert_eq!(dq.back(), Some(30));
dq.push_front(5)?;
dq.commit()?;
assert_eq!(dq.len(), 4);
assert_eq!(dq.front(), Some(5));
assert_eq!(dq.back(), Some(30));
let val = dq.pop_front()?;
dq.commit()?;
assert_eq!(val, Some(5));
assert_eq!(dq.front(), Some(10));
assert_eq!(dq.back(), Some(30));
let val = dq.pop_back()?;
dq.commit()?;
assert_eq!(val, Some(30));
assert_eq!(dq.len(), 2);
dq.clear()?;
dq.commit()?;
assert!(dq.is_empty());
Ok(())
}
#[test]
fn test_iteration() -> Result<(), MmapVecDequeError> {
let tmp = TempDir::new()?;
let path = tmp.path();
let mut dq = MmapVecDeque::<u32>::open_or_create(path, None)?;
for i in 0..100 {
dq.push_back(i)?;
}
dq.commit()?;
let collected: Vec<u32> = dq.iter().collect();
assert_eq!(collected, (0..100).collect::<Vec<u32>>());
for val in dq.iter_mut() {
*val += 1;
}
dq.commit()?;
let collected: Vec<u32> = dq.iter().collect();
assert_eq!(collected, (1..101).collect::<Vec<u32>>());
Ok(())
}
#[test]
fn test_large_insertions() -> Result<(), MmapVecDequeError> {
let tmp = TempDir::new()?;
let path = tmp.path();
let mut dq = MmapVecDeque::<u64>::open_or_create(path, Some(10000))?;
for i in 0..100_000 {
dq.push_back(i)?;
}
assert_eq!(dq.len(), 100_000);
dq.commit()?;
for (i, val) in dq.iter().enumerate() {
assert_eq!(val, i as u64);
}
for i in 0..50_000 {
let front_val = dq.pop_front()?.unwrap();
assert_eq!(front_val, i as u64);
}
dq.commit()?;
assert_eq!(dq.len(), 50_000);
assert_eq!(dq.front(), Some(50_000));
assert_eq!(dq.back(), Some(99_999));
for i in (0..50_000).rev() {
dq.push_front(i + 1_000_000)?;
}
dq.commit()?;
assert_eq!(dq.len(), 100_000);
let front_val = dq.front().unwrap();
let back_val = dq.back().unwrap();
assert_eq!(front_val, 1_000_000);
assert_eq!(back_val, 99_999);
{
let mut iter = dq.iter();
for i in 0..50_000 {
let val = iter.next().unwrap();
assert_eq!(val, 1_000_000 + i as u64);
}
for i in 50_000..100_000 {
let val = iter.next().unwrap();
assert_eq!(val, i as u64);
}
}
dq.clear()?;
dq.commit()?;
assert!(dq.is_empty());
Ok(())
}
#[test]
fn test_push_front_many() -> Result<(), MmapVecDequeError> {
let tmp = TempDir::new()?;
let path = tmp.path();
let mut dq = MmapVecDeque::<i64>::open_or_create(path, None)?;
for i in 0..100 {
dq.push_front(-((i + 1) as i64))?;
}
dq.commit()?;
assert_eq!(dq.len(), 100);
assert_eq!(dq.front(), Some(-100));
assert_eq!(dq.back(), Some(-1));
let collected: Vec<_> = dq.iter().collect();
for (i, &val) in collected.iter().enumerate() {
assert_eq!(val, -((100 - i) as i64));
}
Ok(())
}