use ese_core::{EseHeader, EsePage};
fn header_buf_with_page_size(raw_page_size: u32) -> Vec<u8> {
let mut buf = vec![0u8; 4096];
buf[4..8].copy_from_slice(&0x89AB_CDEF_u32.to_le_bytes());
buf[236..240].copy_from_slice(&raw_page_size.to_le_bytes());
buf
}
#[test]
fn page_size_1_is_rejected() {
let buf = header_buf_with_page_size(1);
let result = EseHeader::from_bytes(&buf);
assert!(
result.is_err(),
"page_size=1 must be rejected; EseDatabase using it as a slice multiplier would misbehave"
);
}
#[test]
fn page_size_33000_is_rejected() {
let buf = header_buf_with_page_size(33000);
let result = EseHeader::from_bytes(&buf);
assert!(result.is_err(), "page_size=33000 must be rejected (> 32768)");
}
#[test]
fn page_size_5000_is_rejected() {
let buf = header_buf_with_page_size(5000);
let result = EseHeader::from_bytes(&buf);
assert!(result.is_err(), "page_size=5000 must be rejected (not in valid set)");
}
#[test]
fn page_size_4096_is_accepted() {
let buf = header_buf_with_page_size(4096);
let result = EseHeader::from_bytes(&buf);
assert!(result.is_ok(), "page_size=4096 must be accepted");
assert_eq!(result.unwrap().page_size, 4096);
}
#[test]
fn page_size_8192_is_accepted() {
let buf = header_buf_with_page_size(8192);
let result = EseHeader::from_bytes(&buf);
assert!(result.is_ok(), "page_size=8192 must be accepted");
assert_eq!(result.unwrap().page_size, 8192);
}
#[test]
fn page_size_16384_is_accepted() {
let buf = header_buf_with_page_size(16384);
let result = EseHeader::from_bytes(&buf);
assert!(result.is_ok(), "page_size=16384 must be accepted");
assert_eq!(result.unwrap().page_size, 16384);
}
#[test]
fn page_size_32768_is_accepted() {
let buf = header_buf_with_page_size(32768);
let result = EseHeader::from_bytes(&buf);
assert!(result.is_ok(), "page_size=32768 must be accepted");
assert_eq!(result.unwrap().page_size, 32768);
}
#[test]
fn page_size_zero_defaults_to_4096() {
let buf = header_buf_with_page_size(0);
let result = EseHeader::from_bytes(&buf);
assert!(result.is_ok(), "page_size=0 must be accepted (means 4096)");
assert_eq!(result.unwrap().page_size, 4096);
}
fn make_page_with_out_of_bounds_tag(page_size: usize) -> EsePage {
let mut data = vec![0u8; page_size];
let tag_count: u16 = 2;
data[0x22..0x24].copy_from_slice(&tag_count.to_le_bytes());
data[0x24..0x28].copy_from_slice(&ese_core::PAGE_FLAG_LEAF.to_le_bytes());
let tag0: u32 = 40u32;
let pos0 = page_size - 4;
data[pos0..pos0 + 4].copy_from_slice(&tag0.to_le_bytes());
let offset: u32 = 100;
let size: u32 = 4000; let tag1: u32 = (size & 0x1FFF) | ((offset & 0x1FFF) << 16);
let pos1 = page_size - 8;
data[pos1..pos1 + 4].copy_from_slice(&tag1.to_le_bytes());
EsePage { page_number: 1, data }
}
#[test]
fn tags_with_out_of_bounds_offset_returns_err() {
let page = make_page_with_out_of_bounds_tag(4096);
let result = page.tags();
assert!(
result.is_err(),
"tags() must return Err when tag offset+size ({}) > page_size ({})",
100 + 4000,
4096
);
}
fn make_page_with_high_size_bits(page_size: usize, true_size: usize) -> EsePage {
let mut data = vec![0u8; page_size];
let tag_count: u16 = 1;
data[0x22..0x24].copy_from_slice(&tag_count.to_le_bytes());
data[0x24..0x28].copy_from_slice(&ese_core::PAGE_FLAG_LEAF.to_le_bytes());
let size_word = u32::try_from(true_size | 0x4000).expect("size within u32");
let tag0: u32 = size_word; let pos = page_size - 4;
data[pos..pos + 4].copy_from_slice(&tag0.to_le_bytes());
EsePage { page_number: 1, data }
}
#[test]
fn tags_strips_high_bits_from_size_word_returns_13bit_size() {
let true_size: usize = 16;
let page = make_page_with_high_size_bits(4096, true_size);
let tags = page.tags().expect("tags must succeed — no out-of-bounds");
assert_eq!(
tags[0].1 as usize,
true_size,
"size must be the 13-bit cb_ value (0x1FFF mask), not the full 15-bit word"
);
}
#[test]
fn tags_strips_high_bits_from_offset_word_returns_13bit_offset() {
let mut data = vec![0u8; 4096];
let tag_count: u16 = 1;
data[0x22..0x24].copy_from_slice(&tag_count.to_le_bytes());
data[0x24..0x28].copy_from_slice(&ese_core::PAGE_FLAG_LEAF.to_le_bytes());
let tag0: u32 = 4u32 | ((10u32 | 0x2000u32) << 16);
let pos = 4096 - 4;
data[pos..pos + 4].copy_from_slice(&tag0.to_le_bytes());
let page = EsePage { page_number: 1, data };
let tags = page.tags().expect("tags must succeed");
assert_eq!(
tags[0].0 as usize,
10,
"offset must be the 13-bit ib_ value (0x1FFF mask), stripping flag bits"
);
}