use crate::{
internal::ValidateCompact,
support::{ItemIndex, alloc::Global, item_set::ItemSet},
};
fn nondet_index_below(n: u32) -> u32 {
let k: u32 = soteria::nondet_bytes();
soteria::assume(k < n);
k
}
#[soteria::test]
fn item_set_insert_assigns_dense_indexes() {
let mut set: ItemSet<u32, Global> = ItemSet::new();
let a = set.assert_can_grow().insert(10);
let b = set.assert_can_grow().insert(20);
let c = set.assert_can_grow().insert(30);
soteria::assert(a.as_u32() == 0, "first insert lands at index 0");
soteria::assert(b.as_u32() == 1, "second insert lands at index 1");
soteria::assert(c.as_u32() == 2, "third insert lands at index 2");
soteria::assert(set.len() == 3, "three inserts give len 3");
set.validate(ValidateCompact::Compact).expect("a hole-free set is compact");
}
#[soteria::test]
fn item_set_remove_then_insert_reuses_freed_slot() {
let mut set: ItemSet<u32, Global> = ItemSet::new();
set.assert_can_grow().insert(10);
set.assert_can_grow().insert(20);
set.assert_can_grow().insert(30);
set.validate(ValidateCompact::Compact).expect("fresh set is compact");
let k = nondet_index_below(3);
let removed = set.remove(ItemIndex::new(k));
soteria::assert(removed.is_some(), "removed an occupied slot");
soteria::assert(set.len() == 2, "remove decrements len");
set.validate(ValidateCompact::NonCompact)
.expect("one hole is a well-formed non-compact set");
let reused = set.assert_can_grow().insert(99);
soteria::assert(reused == ItemIndex::new(k), "freed slot k is reused");
soteria::assert(set.len() == 3, "reinsert restores len");
soteria::assert(
set.get(ItemIndex::new(k)) == Some(&99),
"the reused slot holds the new value",
);
set.validate(ValidateCompact::Compact)
.expect("hole is filled, set is compact again");
}