use rawdb::Database;
use tempfile::TempDir;
use vecdb::{ReadableVec, Result, StoredVec, Version};
const PER_PAGE_U32: usize = 16 * 1024 / size_of::<u32>();
fn setup_db() -> Result<(Database, TempDir)> {
let temp = TempDir::new()?;
let db = Database::open(temp.path())?;
Ok((db, temp))
}
fn test_small_write_raw_survives_reopen<V>() -> Result<()>
where
V: StoredVec<I = usize, T = u32>,
{
let (db, _tmp) = setup_db()?;
let options = (&db, "vec", Version::TWO).into();
let values: Vec<u32> = (0..100).collect();
{
let mut vec: V = V::forced_import_with(options)?;
for &v in &values {
vec.push(v);
}
vec.write()?;
assert_eq!(vec.stored_len(), 100);
assert_eq!(vec.collect(), values);
}
{
let vec: V = V::forced_import_with(options)?;
assert_eq!(vec.stored_len(), 100);
assert_eq!(vec.collect(), values);
assert_eq!(vec.collect_range(0, 1), vec![0]);
assert_eq!(vec.collect_range(50, 53), vec![50, 51, 52]);
assert_eq!(vec.collect_range(99, 100), vec![99]);
}
Ok(())
}
fn test_fast_append_multiple_small_writes<V>() -> Result<()>
where
V: StoredVec<I = usize, T = u32>,
{
let (db, _tmp) = setup_db()?;
let options = (&db, "vec", Version::TWO).into();
let mut vec: V = V::forced_import_with(options)?;
for v in 0..10u32 {
vec.push(v);
}
vec.write()?;
assert_eq!(vec.stored_len(), 10);
for v in 10..20u32 {
vec.push(v);
}
vec.write()?;
assert_eq!(vec.stored_len(), 20);
assert_eq!(vec.collect(), (0..20).collect::<Vec<u32>>());
for v in 20..30u32 {
vec.push(v);
}
vec.write()?;
assert_eq!(vec.stored_len(), 30);
assert_eq!(vec.collect(), (0..30).collect::<Vec<u32>>());
assert_eq!(vec.collect_range(5, 15), (5..15).collect::<Vec<u32>>());
assert_eq!(vec.collect_range(15, 25), (15..25).collect::<Vec<u32>>());
Ok(())
}
fn test_fast_append_survives_reopen<V>() -> Result<()>
where
V: StoredVec<I = usize, T = u32>,
{
let (db, _tmp) = setup_db()?;
let options = (&db, "vec", Version::TWO).into();
{
let mut vec: V = V::forced_import_with(options)?;
for v in 0..50u32 {
vec.push(v);
}
vec.write()?;
for v in 50..100u32 {
vec.push(v);
}
vec.write()?;
assert_eq!(vec.collect(), (0..100).collect::<Vec<u32>>());
}
{
let vec: V = V::forced_import_with(options)?;
assert_eq!(vec.stored_len(), 100);
assert_eq!(vec.collect(), (0..100).collect::<Vec<u32>>());
}
{
let mut vec: V = V::forced_import_with(options)?;
for v in 100..150u32 {
vec.push(v);
}
vec.write()?;
assert_eq!(vec.collect(), (0..150).collect::<Vec<u32>>());
}
{
let vec: V = V::forced_import_with(options)?;
assert_eq!(vec.collect(), (0..150).collect::<Vec<u32>>());
}
Ok(())
}
fn test_full_page_compressed_partial_raw<V>() -> Result<()>
where
V: StoredVec<I = usize, T = u32>,
{
let (db, _tmp) = setup_db()?;
let options = (&db, "vec", Version::TWO).into();
let count = PER_PAGE_U32 + 100;
let values: Vec<u32> = (0..count as u32).collect();
{
let mut vec: V = V::forced_import_with(options)?;
for &v in &values {
vec.push(v);
}
vec.write()?;
assert_eq!(vec.stored_len(), count);
assert_eq!(vec.collect(), values);
let b = PER_PAGE_U32;
assert_eq!(
vec.collect_range(b - 2, b + 2),
vec![(b - 2) as u32, (b - 1) as u32, b as u32, (b + 1) as u32]
);
}
{
let vec: V = V::forced_import_with(options)?;
assert_eq!(vec.stored_len(), count);
assert_eq!(vec.collect(), values);
}
Ok(())
}
fn test_exact_page_boundary<V>() -> Result<()>
where
V: StoredVec<I = usize, T = u32>,
{
let (db, _tmp) = setup_db()?;
let options = (&db, "vec", Version::TWO).into();
let count = PER_PAGE_U32;
let values: Vec<u32> = (0..count as u32).collect();
{
let mut vec: V = V::forced_import_with(options)?;
for &v in &values {
vec.push(v);
}
vec.write()?;
assert_eq!(vec.stored_len(), count);
assert_eq!(vec.collect(), values);
}
{
let vec: V = V::forced_import_with(options)?;
assert_eq!(vec.stored_len(), count);
assert_eq!(vec.collect(), values);
}
{
let mut vec: V = V::forced_import_with(options)?;
for v in count as u32..(count + 5) as u32 {
vec.push(v);
}
vec.write()?;
assert_eq!(vec.collect(), (0..(count + 5) as u32).collect::<Vec<u32>>());
}
{
let vec: V = V::forced_import_with(options)?;
assert_eq!(vec.collect(), (0..(count + 5) as u32).collect::<Vec<u32>>());
}
Ok(())
}
fn test_fast_append_overflow<V>() -> Result<()>
where
V: StoredVec<I = usize, T = u32>,
{
let (db, _tmp) = setup_db()?;
let options = (&db, "vec", Version::TWO).into();
let mut vec: V = V::forced_import_with(options)?;
let initial = PER_PAGE_U32 - 10;
for v in 0..initial as u32 {
vec.push(v);
}
vec.write()?;
assert_eq!(vec.stored_len(), initial);
for v in initial as u32..(initial + 20) as u32 {
vec.push(v);
}
vec.write()?;
let total = initial + 20;
let expected: Vec<u32> = (0..total as u32).collect();
assert_eq!(vec.stored_len(), total);
assert_eq!(vec.collect(), expected);
let b = PER_PAGE_U32;
assert_eq!(
vec.collect_range(b - 2, b + 2),
vec![(b - 2) as u32, (b - 1) as u32, b as u32, (b + 1) as u32]
);
Ok(())
}
fn test_fast_append_fills_exactly<V>() -> Result<()>
where
V: StoredVec<I = usize, T = u32>,
{
let (db, _tmp) = setup_db()?;
let options = (&db, "vec", Version::TWO).into();
let mut vec: V = V::forced_import_with(options)?;
let initial = PER_PAGE_U32 - 10;
for v in 0..initial as u32 {
vec.push(v);
}
vec.write()?;
for v in initial as u32..PER_PAGE_U32 as u32 {
vec.push(v);
}
vec.write()?;
assert_eq!(vec.stored_len(), PER_PAGE_U32);
assert_eq!(
vec.collect(),
(0..PER_PAGE_U32 as u32).collect::<Vec<u32>>()
);
for v in PER_PAGE_U32 as u32..(PER_PAGE_U32 + 5) as u32 {
vec.push(v);
}
vec.write()?;
assert_eq!(
vec.collect(),
(0..(PER_PAGE_U32 + 5) as u32).collect::<Vec<u32>>()
);
Ok(())
}
fn test_incremental_growth_across_pages<V>() -> Result<()>
where
V: StoredVec<I = usize, T = u32>,
{
let (db, _tmp) = setup_db()?;
let options = (&db, "vec", Version::TWO).into();
let mut vec: V = V::forced_import_with(options)?;
let chunk_size = 1000;
let total_target = PER_PAGE_U32 * 2 + 500;
let num_chunks = total_target.div_ceil(chunk_size);
let total = num_chunks * chunk_size;
for chunk_i in 0..num_chunks {
let start = chunk_i * chunk_size;
for v in start..(start + chunk_size) {
vec.push(v as u32);
}
vec.write()?;
let expected: Vec<u32> = (0..(start + chunk_size) as u32).collect();
assert_eq!(vec.collect(), expected, "Mismatch after chunk {}", chunk_i);
}
assert_eq!(vec.collect(), (0..total as u32).collect::<Vec<u32>>());
assert_eq!(vec.collect_range(0, 10), (0..10).collect::<Vec<u32>>());
assert_eq!(
vec.collect_range(PER_PAGE_U32 - 5, PER_PAGE_U32 + 5),
((PER_PAGE_U32 - 5) as u32..(PER_PAGE_U32 + 5) as u32).collect::<Vec<u32>>()
);
assert_eq!(
vec.collect_range(PER_PAGE_U32 * 2 - 5, PER_PAGE_U32 * 2 + 5),
((PER_PAGE_U32 * 2 - 5) as u32..(PER_PAGE_U32 * 2 + 5) as u32).collect::<Vec<u32>>()
);
Ok(())
}
fn test_truncate_into_raw_page<V>() -> Result<()>
where
V: StoredVec<I = usize, T = u32>,
{
let (db, _tmp) = setup_db()?;
let options = (&db, "vec", Version::TWO).into();
{
let mut vec: V = V::forced_import_with(options)?;
let count = PER_PAGE_U32 + 500;
for v in 0..count as u32 {
vec.push(v);
}
vec.write()?;
let truncate_to = PER_PAGE_U32 + 200;
vec.truncate_if_needed(truncate_to)?;
vec.write()?;
assert_eq!(vec.collect(), (0..truncate_to as u32).collect::<Vec<u32>>());
}
{
let vec: V = V::forced_import_with(options)?;
let truncate_to = PER_PAGE_U32 + 200;
assert_eq!(vec.stored_len(), truncate_to);
assert_eq!(vec.collect(), (0..truncate_to as u32).collect::<Vec<u32>>());
}
{
let mut vec: V = V::forced_import_with(options)?;
let truncate_to = PER_PAGE_U32 + 200;
for v in truncate_to as u32..(truncate_to + 50) as u32 {
vec.push(v);
}
vec.write()?;
assert_eq!(
vec.collect(),
(0..(truncate_to + 50) as u32).collect::<Vec<u32>>()
);
}
Ok(())
}
fn test_truncate_to_page_boundary<V>() -> Result<()>
where
V: StoredVec<I = usize, T = u32>,
{
let (db, _tmp) = setup_db()?;
let options = (&db, "vec", Version::TWO).into();
{
let mut vec: V = V::forced_import_with(options)?;
let count = PER_PAGE_U32 + 500;
for v in 0..count as u32 {
vec.push(v);
}
vec.write()?;
vec.truncate_if_needed(PER_PAGE_U32)?;
vec.write()?;
assert_eq!(
vec.collect(),
(0..PER_PAGE_U32 as u32).collect::<Vec<u32>>()
);
}
{
let vec: V = V::forced_import_with(options)?;
assert_eq!(vec.stored_len(), PER_PAGE_U32);
assert_eq!(
vec.collect(),
(0..PER_PAGE_U32 as u32).collect::<Vec<u32>>()
);
}
{
let mut vec: V = V::forced_import_with(options)?;
for v in PER_PAGE_U32 as u32..(PER_PAGE_U32 + 10) as u32 {
vec.push(v);
}
vec.write()?;
assert_eq!(
vec.collect(),
(0..(PER_PAGE_U32 + 10) as u32).collect::<Vec<u32>>()
);
}
Ok(())
}
fn test_truncate_into_compressed_page<V>() -> Result<()>
where
V: StoredVec<I = usize, T = u32>,
{
let (db, _tmp) = setup_db()?;
let options = (&db, "vec", Version::TWO).into();
{
let mut vec: V = V::forced_import_with(options)?;
let count = PER_PAGE_U32 + 500;
for v in 0..count as u32 {
vec.push(v);
}
vec.write()?;
let truncate_to = PER_PAGE_U32 / 2;
vec.truncate_if_needed(truncate_to)?;
vec.write()?;
assert_eq!(vec.collect(), (0..truncate_to as u32).collect::<Vec<u32>>());
}
{
let vec: V = V::forced_import_with(options)?;
let truncate_to = PER_PAGE_U32 / 2;
assert_eq!(vec.stored_len(), truncate_to);
assert_eq!(vec.collect(), (0..truncate_to as u32).collect::<Vec<u32>>());
}
{
let mut vec: V = V::forced_import_with(options)?;
let truncate_to = PER_PAGE_U32 / 2;
for v in truncate_to as u32..(truncate_to + 100) as u32 {
vec.push(v);
}
vec.write()?;
assert_eq!(
vec.collect(),
(0..(truncate_to + 100) as u32).collect::<Vec<u32>>()
);
}
Ok(())
}
fn test_reset_clears_raw_pages<V>() -> Result<()>
where
V: StoredVec<I = usize, T = u32>,
{
let (db, _tmp) = setup_db()?;
let options = (&db, "vec", Version::TWO).into();
let mut vec: V = V::forced_import_with(options)?;
for v in 0..100u32 {
vec.push(v);
}
vec.write()?;
assert_eq!(vec.stored_len(), 100);
vec.reset()?;
assert_eq!(vec.stored_len(), 0);
assert_eq!(vec.len(), 0);
assert!(vec.collect().is_empty());
for v in 1000..1050u32 {
vec.push(v);
}
vec.write()?;
assert_eq!(vec.collect(), (1000..1050).collect::<Vec<u32>>());
Ok(())
}
fn test_reset_after_multi_page<V>() -> Result<()>
where
V: StoredVec<I = usize, T = u32>,
{
let (db, _tmp) = setup_db()?;
let options = (&db, "vec", Version::TWO).into();
{
let mut vec: V = V::forced_import_with(options)?;
let count = PER_PAGE_U32 + 200;
for v in 0..count as u32 {
vec.push(v);
}
vec.write()?;
vec.reset()?;
assert_eq!(vec.len(), 0);
assert!(vec.collect().is_empty());
for v in 0..50u32 {
vec.push(v);
}
vec.write()?;
assert_eq!(vec.collect(), (0..50).collect::<Vec<u32>>());
}
{
let vec: V = V::forced_import_with(options)?;
assert_eq!(vec.collect(), (0..50).collect::<Vec<u32>>());
}
Ok(())
}
fn test_read_spanning_compressed_and_raw<V>() -> Result<()>
where
V: StoredVec<I = usize, T = u32>,
{
let (db, _tmp) = setup_db()?;
let options = (&db, "vec", Version::TWO).into();
let mut vec: V = V::forced_import_with(options)?;
let count = PER_PAGE_U32 + 200;
for v in 0..count as u32 {
vec.push(v);
}
vec.write()?;
let from = PER_PAGE_U32 - 50;
let to = PER_PAGE_U32 + 50;
assert_eq!(
vec.collect_range(from, to),
(from as u32..to as u32).collect::<Vec<u32>>()
);
assert_eq!(vec.collect_range(0, 100), (0..100).collect::<Vec<u32>>());
assert_eq!(
vec.collect_range(PER_PAGE_U32, PER_PAGE_U32 + 100),
(PER_PAGE_U32 as u32..(PER_PAGE_U32 + 100) as u32).collect::<Vec<u32>>()
);
assert_eq!(vec.collect(), (0..count as u32).collect::<Vec<u32>>());
Ok(())
}
fn test_multiple_pages_with_raw_tail<V>() -> Result<()>
where
V: StoredVec<I = usize, T = u32>,
{
let (db, _tmp) = setup_db()?;
let options = (&db, "vec", Version::TWO).into();
let mut vec: V = V::forced_import_with(options)?;
let count = PER_PAGE_U32 * 3 + 777;
for v in 0..count as u32 {
vec.push(v);
}
vec.write()?;
assert_eq!(vec.stored_len(), count);
for page in 0..4 {
let start = page * PER_PAGE_U32;
let end = (start + 10).min(count);
let result = vec.collect_range(start, end);
let expected: Vec<u32> = (start as u32..end as u32).collect();
assert_eq!(result, expected, "Page {} read mismatch", page);
}
for boundary_page in 1..=3 {
let mid = boundary_page * PER_PAGE_U32;
let from = mid - 5;
let to = (mid + 5).min(count);
assert_eq!(
vec.collect_range(from, to),
(from as u32..to as u32).collect::<Vec<u32>>(),
"Boundary {} read mismatch",
boundary_page
);
}
assert_eq!(vec.collect(), (0..count as u32).collect::<Vec<u32>>());
Ok(())
}
fn test_write_reopen_append_cycle<V>() -> Result<()>
where
V: StoredVec<I = usize, T = u32>,
{
let (db, _tmp) = setup_db()?;
let options = (&db, "vec", Version::TWO).into();
let mut total = 0u32;
for cycle in 0..20u32 {
let mut vec: V = V::forced_import_with(options)?;
let count = 100 + cycle * 50;
for _ in 0..count {
vec.push(total);
total += 1;
}
vec.write()?;
assert_eq!(
vec.collect(),
(0..total).collect::<Vec<u32>>(),
"Cycle {}",
cycle
);
}
{
let vec: V = V::forced_import_with(options)?;
assert_eq!(vec.stored_len(), total as usize);
assert_eq!(vec.collect(), (0..total).collect::<Vec<u32>>());
}
Ok(())
}
fn test_write_reopen_cycle_crossing_pages<V>() -> Result<()>
where
V: StoredVec<I = usize, T = u32>,
{
let (db, _tmp) = setup_db()?;
let options = (&db, "vec", Version::TWO).into();
let chunk = PER_PAGE_U32 / 3 + 7;
let mut total = 0u32;
for cycle in 0..10u32 {
let mut vec: V = V::forced_import_with(options)?;
for _ in 0..chunk {
vec.push(total);
total += 1;
}
vec.write()?;
assert_eq!(
vec.collect(),
(0..total).collect::<Vec<u32>>(),
"Cycle {} (total={})",
cycle,
total
);
}
{
let vec: V = V::forced_import_with(options)?;
assert_eq!(vec.collect(), (0..total).collect::<Vec<u32>>());
}
Ok(())
}
fn test_noop_write_on_raw_page<V>() -> Result<()>
where
V: StoredVec<I = usize, T = u32>,
{
let (db, _tmp) = setup_db()?;
let options = (&db, "vec", Version::TWO).into();
let mut vec: V = V::forced_import_with(options)?;
for v in 0..50u32 {
vec.push(v);
}
vec.write()?;
let changed = vec.write()?;
assert!(!changed);
assert_eq!(vec.collect(), (0..50).collect::<Vec<u32>>());
Ok(())
}
fn test_noop_write_after_multi_page<V>() -> Result<()>
where
V: StoredVec<I = usize, T = u32>,
{
let (db, _tmp) = setup_db()?;
let options = (&db, "vec", Version::TWO).into();
let mut vec: V = V::forced_import_with(options)?;
let count = PER_PAGE_U32 + 100;
for v in 0..count as u32 {
vec.push(v);
}
vec.write()?;
let changed = vec.write()?;
assert!(!changed);
assert_eq!(vec.collect(), (0..count as u32).collect::<Vec<u32>>());
Ok(())
}
fn test_fold_over_mixed_pages<V>() -> Result<()>
where
V: StoredVec<I = usize, T = u32>,
{
let (db, _tmp) = setup_db()?;
let options = (&db, "vec", Version::TWO).into();
let mut vec: V = V::forced_import_with(options)?;
let count = PER_PAGE_U32 + 500;
for v in 0..count as u32 {
vec.push(v);
}
vec.write()?;
let expected_sum: u64 = (0..count as u64).sum();
let mut actual_sum = 0u64;
vec.for_each(|v: u32| actual_sum += v as u64);
assert_eq!(actual_sum, expected_sum);
let from = PER_PAGE_U32 - 100;
let to = PER_PAGE_U32 + 100;
let range_sum = vec.fold_range_at(from, to, 0u64, |acc, v: u32| acc + v as u64);
let expected_range_sum: u64 = (from as u64..to as u64).sum();
assert_eq!(range_sum, expected_range_sum);
Ok(())
}
fn test_pushed_and_stored_raw_page<V>() -> Result<()>
where
V: StoredVec<I = usize, T = u32>,
{
let (db, _tmp) = setup_db()?;
let options = (&db, "vec", Version::TWO).into();
let mut vec: V = V::forced_import_with(options)?;
for v in 0..100u32 {
vec.push(v);
}
vec.write()?;
for v in 100..150u32 {
vec.push(v);
}
assert_eq!(vec.stored_len(), 100);
assert_eq!(vec.pushed_len(), 50);
assert_eq!(vec.len(), 150);
assert_eq!(vec.collect_range(90, 110), (90..110).collect::<Vec<u32>>());
assert_eq!(vec.collect(), (0..150).collect::<Vec<u32>>());
vec.write()?;
assert_eq!(vec.stored_len(), 150);
assert_eq!(vec.pushed_len(), 0);
assert_eq!(vec.collect(), (0..150).collect::<Vec<u32>>());
Ok(())
}
fn test_pushed_and_stored_mixed_pages<V>() -> Result<()>
where
V: StoredVec<I = usize, T = u32>,
{
let (db, _tmp) = setup_db()?;
let options = (&db, "vec", Version::TWO).into();
let mut vec: V = V::forced_import_with(options)?;
let count = PER_PAGE_U32 + 100;
for v in 0..count as u32 {
vec.push(v);
}
vec.write()?;
for v in count as u32..(count + 50) as u32 {
vec.push(v);
}
assert_eq!(vec.stored_len(), count);
assert_eq!(vec.pushed_len(), 50);
assert_eq!(vec.len(), count + 50);
assert_eq!(
vec.collect_range(count - 10, count + 10),
((count - 10) as u32..(count + 10) as u32).collect::<Vec<u32>>()
);
let from = PER_PAGE_U32 - 5;
let to = count + 5;
assert_eq!(
vec.collect_range(from, to),
(from as u32..to as u32).collect::<Vec<u32>>()
);
Ok(())
}
fn test_single_value_writes<V>() -> Result<()>
where
V: StoredVec<I = usize, T = u32>,
{
let (db, _tmp) = setup_db()?;
let options = (&db, "vec", Version::TWO).into();
let mut vec: V = V::forced_import_with(options)?;
for v in 0..50u32 {
vec.push(v);
vec.write()?;
}
assert_eq!(vec.stored_len(), 50);
assert_eq!(vec.collect(), (0..50).collect::<Vec<u32>>());
drop(vec);
let vec: V = V::forced_import_with(options)?;
assert_eq!(vec.collect(), (0..50).collect::<Vec<u32>>());
Ok(())
}
fn test_truncate_to_zero_then_rebuild<V>() -> Result<()>
where
V: StoredVec<I = usize, T = u32>,
{
let (db, _tmp) = setup_db()?;
let options = (&db, "vec", Version::TWO).into();
{
let mut vec: V = V::forced_import_with(options)?;
let count = PER_PAGE_U32 + 100;
for v in 0..count as u32 {
vec.push(v);
}
vec.write()?;
vec.truncate_if_needed(0)?;
assert_eq!(vec.len(), 0);
for v in 5000..5100u32 {
vec.push(v);
}
vec.write()?;
assert_eq!(vec.collect(), (5000..5100).collect::<Vec<u32>>());
}
{
let vec: V = V::forced_import_with(options)?;
assert_eq!(vec.collect(), (5000..5100).collect::<Vec<u32>>());
}
Ok(())
}
fn test_read_only_clone_mixed_pages<V>() -> Result<()>
where
V: StoredVec<I = usize, T = u32>,
{
let (db, _tmp) = setup_db()?;
let options = (&db, "vec", Version::TWO).into();
let mut vec: V = V::forced_import_with(options)?;
let count = PER_PAGE_U32 + 200;
for v in 0..count as u32 {
vec.push(v);
}
vec.write()?;
let ro = vec.read_only_clone();
assert_eq!(ro.collect(), (0..count as u32).collect::<Vec<u32>>());
let b = PER_PAGE_U32;
assert_eq!(
ro.collect_range(b - 5, b + 5),
((b - 5) as u32..(b + 5) as u32).collect::<Vec<u32>>()
);
Ok(())
}
#[cfg(feature = "pco")]
mod pco {
use super::*;
use vecdb::PcoVec;
type V = PcoVec<usize, u32>;
#[test]
fn small_write_raw_survives_reopen() -> Result<()> {
test_small_write_raw_survives_reopen::<V>()
}
#[test]
fn fast_append_multiple_small_writes() -> Result<()> {
test_fast_append_multiple_small_writes::<V>()
}
#[test]
fn fast_append_survives_reopen() -> Result<()> {
test_fast_append_survives_reopen::<V>()
}
#[test]
fn full_page_compressed_partial_raw() -> Result<()> {
test_full_page_compressed_partial_raw::<V>()
}
#[test]
fn exact_page_boundary() -> Result<()> {
test_exact_page_boundary::<V>()
}
#[test]
fn fast_append_overflow() -> Result<()> {
test_fast_append_overflow::<V>()
}
#[test]
fn fast_append_fills_exactly() -> Result<()> {
test_fast_append_fills_exactly::<V>()
}
#[test]
fn incremental_growth_across_pages() -> Result<()> {
test_incremental_growth_across_pages::<V>()
}
#[test]
fn truncate_into_raw_page() -> Result<()> {
test_truncate_into_raw_page::<V>()
}
#[test]
fn truncate_to_page_boundary() -> Result<()> {
test_truncate_to_page_boundary::<V>()
}
#[test]
fn truncate_into_compressed_page() -> Result<()> {
test_truncate_into_compressed_page::<V>()
}
#[test]
fn reset_clears_raw_pages() -> Result<()> {
test_reset_clears_raw_pages::<V>()
}
#[test]
fn reset_after_multi_page() -> Result<()> {
test_reset_after_multi_page::<V>()
}
#[test]
fn read_spanning_compressed_and_raw() -> Result<()> {
test_read_spanning_compressed_and_raw::<V>()
}
#[test]
fn multiple_pages_with_raw_tail() -> Result<()> {
test_multiple_pages_with_raw_tail::<V>()
}
#[test]
fn write_reopen_append_cycle() -> Result<()> {
test_write_reopen_append_cycle::<V>()
}
#[test]
fn write_reopen_cycle_crossing_pages() -> Result<()> {
test_write_reopen_cycle_crossing_pages::<V>()
}
#[test]
fn noop_write_on_raw_page() -> Result<()> {
test_noop_write_on_raw_page::<V>()
}
#[test]
fn noop_write_after_multi_page() -> Result<()> {
test_noop_write_after_multi_page::<V>()
}
#[test]
fn fold_over_mixed_pages() -> Result<()> {
test_fold_over_mixed_pages::<V>()
}
#[test]
fn pushed_and_stored_raw_page() -> Result<()> {
test_pushed_and_stored_raw_page::<V>()
}
#[test]
fn pushed_and_stored_mixed_pages() -> Result<()> {
test_pushed_and_stored_mixed_pages::<V>()
}
#[test]
fn single_value_writes() -> Result<()> {
test_single_value_writes::<V>()
}
#[test]
fn truncate_to_zero_then_rebuild() -> Result<()> {
test_truncate_to_zero_then_rebuild::<V>()
}
#[test]
fn read_only_clone_mixed_pages() -> Result<()> {
test_read_only_clone_mixed_pages::<V>()
}
}
#[cfg(feature = "lz4")]
mod lz4 {
use super::*;
use vecdb::LZ4Vec;
type V = LZ4Vec<usize, u32>;
#[test]
fn small_write_raw_survives_reopen() -> Result<()> {
test_small_write_raw_survives_reopen::<V>()
}
#[test]
fn fast_append_multiple_small_writes() -> Result<()> {
test_fast_append_multiple_small_writes::<V>()
}
#[test]
fn fast_append_survives_reopen() -> Result<()> {
test_fast_append_survives_reopen::<V>()
}
#[test]
fn full_page_compressed_partial_raw() -> Result<()> {
test_full_page_compressed_partial_raw::<V>()
}
#[test]
fn exact_page_boundary() -> Result<()> {
test_exact_page_boundary::<V>()
}
#[test]
fn fast_append_overflow() -> Result<()> {
test_fast_append_overflow::<V>()
}
#[test]
fn fast_append_fills_exactly() -> Result<()> {
test_fast_append_fills_exactly::<V>()
}
#[test]
fn incremental_growth_across_pages() -> Result<()> {
test_incremental_growth_across_pages::<V>()
}
#[test]
fn truncate_into_raw_page() -> Result<()> {
test_truncate_into_raw_page::<V>()
}
#[test]
fn truncate_to_page_boundary() -> Result<()> {
test_truncate_to_page_boundary::<V>()
}
#[test]
fn truncate_into_compressed_page() -> Result<()> {
test_truncate_into_compressed_page::<V>()
}
#[test]
fn reset_clears_raw_pages() -> Result<()> {
test_reset_clears_raw_pages::<V>()
}
#[test]
fn reset_after_multi_page() -> Result<()> {
test_reset_after_multi_page::<V>()
}
#[test]
fn read_spanning_compressed_and_raw() -> Result<()> {
test_read_spanning_compressed_and_raw::<V>()
}
#[test]
fn multiple_pages_with_raw_tail() -> Result<()> {
test_multiple_pages_with_raw_tail::<V>()
}
#[test]
fn write_reopen_append_cycle() -> Result<()> {
test_write_reopen_append_cycle::<V>()
}
#[test]
fn write_reopen_cycle_crossing_pages() -> Result<()> {
test_write_reopen_cycle_crossing_pages::<V>()
}
#[test]
fn noop_write_on_raw_page() -> Result<()> {
test_noop_write_on_raw_page::<V>()
}
#[test]
fn noop_write_after_multi_page() -> Result<()> {
test_noop_write_after_multi_page::<V>()
}
#[test]
fn fold_over_mixed_pages() -> Result<()> {
test_fold_over_mixed_pages::<V>()
}
#[test]
fn pushed_and_stored_raw_page() -> Result<()> {
test_pushed_and_stored_raw_page::<V>()
}
#[test]
fn pushed_and_stored_mixed_pages() -> Result<()> {
test_pushed_and_stored_mixed_pages::<V>()
}
#[test]
fn single_value_writes() -> Result<()> {
test_single_value_writes::<V>()
}
#[test]
fn truncate_to_zero_then_rebuild() -> Result<()> {
test_truncate_to_zero_then_rebuild::<V>()
}
#[test]
fn read_only_clone_mixed_pages() -> Result<()> {
test_read_only_clone_mixed_pages::<V>()
}
}
#[cfg(feature = "zstd")]
mod zstd {
use super::*;
use vecdb::ZstdVec;
type V = ZstdVec<usize, u32>;
#[test]
fn small_write_raw_survives_reopen() -> Result<()> {
test_small_write_raw_survives_reopen::<V>()
}
#[test]
fn fast_append_multiple_small_writes() -> Result<()> {
test_fast_append_multiple_small_writes::<V>()
}
#[test]
fn fast_append_survives_reopen() -> Result<()> {
test_fast_append_survives_reopen::<V>()
}
#[test]
fn full_page_compressed_partial_raw() -> Result<()> {
test_full_page_compressed_partial_raw::<V>()
}
#[test]
fn exact_page_boundary() -> Result<()> {
test_exact_page_boundary::<V>()
}
#[test]
fn fast_append_overflow() -> Result<()> {
test_fast_append_overflow::<V>()
}
#[test]
fn fast_append_fills_exactly() -> Result<()> {
test_fast_append_fills_exactly::<V>()
}
#[test]
fn incremental_growth_across_pages() -> Result<()> {
test_incremental_growth_across_pages::<V>()
}
#[test]
fn truncate_into_raw_page() -> Result<()> {
test_truncate_into_raw_page::<V>()
}
#[test]
fn truncate_to_page_boundary() -> Result<()> {
test_truncate_to_page_boundary::<V>()
}
#[test]
fn truncate_into_compressed_page() -> Result<()> {
test_truncate_into_compressed_page::<V>()
}
#[test]
fn reset_clears_raw_pages() -> Result<()> {
test_reset_clears_raw_pages::<V>()
}
#[test]
fn reset_after_multi_page() -> Result<()> {
test_reset_after_multi_page::<V>()
}
#[test]
fn read_spanning_compressed_and_raw() -> Result<()> {
test_read_spanning_compressed_and_raw::<V>()
}
#[test]
fn multiple_pages_with_raw_tail() -> Result<()> {
test_multiple_pages_with_raw_tail::<V>()
}
#[test]
fn write_reopen_append_cycle() -> Result<()> {
test_write_reopen_append_cycle::<V>()
}
#[test]
fn write_reopen_cycle_crossing_pages() -> Result<()> {
test_write_reopen_cycle_crossing_pages::<V>()
}
#[test]
fn noop_write_on_raw_page() -> Result<()> {
test_noop_write_on_raw_page::<V>()
}
#[test]
fn noop_write_after_multi_page() -> Result<()> {
test_noop_write_after_multi_page::<V>()
}
#[test]
fn fold_over_mixed_pages() -> Result<()> {
test_fold_over_mixed_pages::<V>()
}
#[test]
fn pushed_and_stored_raw_page() -> Result<()> {
test_pushed_and_stored_raw_page::<V>()
}
#[test]
fn pushed_and_stored_mixed_pages() -> Result<()> {
test_pushed_and_stored_mixed_pages::<V>()
}
#[test]
fn single_value_writes() -> Result<()> {
test_single_value_writes::<V>()
}
#[test]
fn truncate_to_zero_then_rebuild() -> Result<()> {
test_truncate_to_zero_then_rebuild::<V>()
}
#[test]
fn read_only_clone_mixed_pages() -> Result<()> {
test_read_only_clone_mixed_pages::<V>()
}
}