mod fixtures;
use ese_core::EseDatabase;
#[test]
fn walk_leaf_root_returns_root_page() {
let leaf = fixtures::make_leaf_page_with_records(0, &[]);
let header = fixtures::make_ese_header_page();
let tmp = fixtures::write_ese_file(&[header, leaf]);
let db = EseDatabase::open(tmp.path()).expect("open");
let leaves = db.walk_leaf_pages(1).expect("walk");
assert_eq!(leaves, vec![1u32]);
}
#[test]
fn walk_two_level_btree_returns_leaf_pages_not_root() {
let header = fixtures::make_ese_header_page();
let parent = fixtures::make_parent_page_with_children(&[1, 2]); let leaf_a = fixtures::make_leaf_page_with_records(0, &[]);
let leaf_b = fixtures::make_leaf_page_with_records(0, &[]);
let tmp = fixtures::write_ese_file(&[header, parent, leaf_a, leaf_b]);
let db = EseDatabase::open(tmp.path()).expect("open");
let mut leaves = db.walk_leaf_pages(1).expect("walk");
leaves.sort_unstable();
assert_eq!(leaves, vec![2u32, 3u32], "both leaf pages returned");
assert!(!leaves.contains(&1), "root page must not be in result");
}
#[test]
fn walk_branch_child_ref_is_trailing_u32_after_key_prefix() {
let header = fixtures::make_ese_header_page();
let key_prefix = b"\x00\x07KEYPRE\x00\x00"; let parent = fixtures::make_parent_page_with_prefixed_children(key_prefix, &[1, 2]);
let leaf_a = fixtures::make_leaf_page_with_records(0, &[]);
let leaf_b = fixtures::make_leaf_page_with_records(0, &[]);
let tmp = fixtures::write_ese_file(&[header, parent, leaf_a, leaf_b]);
let db = EseDatabase::open(tmp.path()).expect("open");
let mut leaves = db.walk_leaf_pages(1).expect("walk");
leaves.sort_unstable();
assert_eq!(
leaves,
vec![2u32, 3u32],
"child page number must come from the trailing 4 bytes, not the key prefix"
);
}
#[test]
fn walk_branch_child_ref_exactly_four_bytes_no_panic() {
let header = fixtures::make_ese_header_page();
let parent = fixtures::make_parent_page_with_prefixed_children(&[], &[1]); let leaf_a = fixtures::make_leaf_page_with_records(0, &[]);
let tmp = fixtures::write_ese_file(&[header, parent, leaf_a]);
let db = EseDatabase::open(tmp.path()).expect("open");
let leaves = db.walk_leaf_pages(1).expect("walk");
assert_eq!(leaves, vec![2u32]);
}
#[test]
fn walk_nonexistent_page_returns_err() {
let header = fixtures::make_ese_header_page();
let tmp = fixtures::write_ese_file(&[header]);
let db = EseDatabase::open(tmp.path()).expect("open");
assert!(db.walk_leaf_pages(5).is_err());
}