#![allow(clippy::unwrap_used, clippy::expect_used)]
use sqlite_core::{Database, Value};
const NEMETZ_0C_01: &[u8] = include_bytes!("../../tests/data/nemetz/0C/0C-01.db");
#[test]
fn reconstructs_freeblock_clobbered_rows_of_0c_01() {
let db = Database::open(NEMETZ_0C_01.to_vec()).expect("open 0C-01");
let page = db.raw_page(2).expect("page 2 in range");
let recovered = db.reconstruct_freeblock_records(&page);
let want = vec![
Value::Integer(20005),
Value::Integer(3_780_322_152),
Value::Integer(3_909_007_646),
Value::Integer(120_462_986),
Value::Integer(1_290_558_629),
];
assert!(
recovered.iter().any(|c| c.values == want),
"freeblock reconstruction must recover row 20005 from page 2; got {:?}",
recovered.iter().map(|c| &c.values).collect::<Vec<_>>()
);
assert!(
recovered.len() >= 5,
"expected >=5 freeblock reconstructions on 0C-01 page 2, got {}",
recovered.len()
);
assert!(
recovered.iter().all(|c| c.rowid == 0),
"freeblock-reconstructed rowid must be unknown (0)"
);
assert!(
recovered.iter().all(|c| c.confidence <= 0.5),
"freeblock reconstruction must be confidence-graded low"
);
}
#[test]
fn reconstruct_freeblock_records_is_bounded_and_safe() {
let db = Database::open(NEMETZ_0C_01.to_vec()).expect("open");
assert!(db.reconstruct_freeblock_records(&[0x05u8; 4096]).is_empty());
assert!(db.reconstruct_freeblock_records(&[]).is_empty());
let mut leaf = vec![0u8; 4096];
leaf[0] = 0x0d; assert!(db.reconstruct_freeblock_records(&leaf).is_empty());
}