mod common;
use idakit::prelude::*;
use idakit_sys::BADADDR;
#[test]
fn data() {
common::with_canonical_db(run);
}
fn run(idb: &mut Database) {
let entry = idb.functions().next().expect("a function").address();
let raw = idb.bytes(entry, 1);
assert!(!raw.is_empty(), "the entry byte should be readable");
assert!(
idb.read_u8(entry) == Some(raw[0]),
"read_u8 should match the raw image byte"
);
assert!(idb.read_u16(entry).is_some());
assert!(idb.read_u32(entry).is_some());
assert!(idb.read_u64(entry).is_some());
let unmapped = Address::new_const(BADADDR - 1);
assert!(idb.read_u8(unmapped).is_none());
assert!(idb.read_u32(unmapped).is_none());
assert!(idb.read_u64(unmapped).is_none());
assert!(idb.read_pointer(unmapped).is_none());
let _ = idb.read_pointer(entry);
let listed = idb
.strings()
.find(|s| s.char_width() == 1 && s.text().is_some_and(|t| !t.is_empty()))
.map(|s| (s.address(), s.text().expect("has text")));
if let Some((address, text)) = listed {
let read = idb
.read_string(address)
.expect("a listed string address should read back a string");
assert!(
read == text,
"read_string {read:?} != listed text {text:?} at {address:#x}"
);
println!("read_string at {address:#x}: {read:?}");
} else {
println!("read_string: no 1-byte string in the list to cross-check");
}
println!("data OK: typed integer/pointer/string reads verified");
}