use crate::storage::page::Page;
use crate::storage::slotted_page::SlottedPage;
#[test]
fn slotted_page_insert_delete_compact_reuse() {
let mut page = Page::new(1);
let mut slotted = SlottedPage::init(&mut page);
let s1 = slotted.insert(b"alpha").expect("insert alpha");
let s2 = slotted.insert(b"beta").expect("insert beta");
let s3 = slotted.insert(b"gamma").expect("insert gamma");
assert_eq!(slotted.get(s1), Some(&b"alpha"[..]));
assert_eq!(slotted.get(s2), Some(&b"beta"[..]));
assert_eq!(slotted.get(s3), Some(&b"gamma"[..]));
assert!(slotted.delete(s2));
assert_eq!(slotted.get(s2), None);
slotted.compact();
let s4 = slotted.insert(b"delta").expect("insert delta");
assert_eq!(s4, s2, "deleted slot should be reused");
assert_eq!(slotted.get(s4), Some(&b"delta"[..]));
}
#[test]
fn slotted_page_fills_until_full() {
let mut page = Page::new(2);
let mut slotted = SlottedPage::init(&mut page);
let payload = vec![0xAB; 128];
let mut inserted = 0;
while slotted.insert(&payload).is_some() {
inserted += 1;
}
assert!(inserted > 0);
assert!(slotted.free_space() < payload.len() + 4);
}
#[test]
fn slotted_page_update_moves_record_when_growing() {
let mut page = Page::new(3);
let mut slotted = SlottedPage::init(&mut page);
let slot = slotted.insert(b"tiny").expect("insert");
assert!(slotted.update(slot, b"this-is-a-larger-record"));
assert_eq!(slotted.get(slot), Some(&b"this-is-a-larger-record"[..]));
}
#[test]
fn slotted_page_invalid_slot_returns_none_or_false() {
let mut page = Page::new(4);
let mut slotted = SlottedPage::init(&mut page);
assert_eq!(slotted.get(1000), None);
assert!(!slotted.delete(1000));
assert!(!slotted.update(1000, b"x"));
}