use crate::{
context::Context,
space::{Space, SpaceId, SpaceType},
value::{
Renameable,
varnode::{Varnode, VarnodeId},
},
};
pub struct TestContext {
pub ctx: Context<'static>,
pub reg_space: SpaceId,
pub r0: VarnodeId,
pub r1: VarnodeId,
pub r2: VarnodeId,
pub r3: VarnodeId,
pub r0_lo32: VarnodeId, pub r0_lo16: VarnodeId, pub r0_byte0: VarnodeId, pub r0_byte1: VarnodeId, pub r0_byte2: VarnodeId, pub r0_byte3: VarnodeId, }
impl TestContext {
pub fn new() -> Self {
let mut ctx = Context::new();
let mut reg_space_def = Space::new(Some("register"), 1, 4);
reg_space_def.ty = SpaceType::Register;
let reg_space = ctx.shared.spaces.push(reg_space_def);
ctx.shared
.named_spaces
.insert(Box::from("register"), reg_space);
let make = |ctx: &mut Context<'static>, offset: i64, size: usize, name: &'static str| {
Varnode::make(ctx, offset, size, reg_space)
.with_name(name.into())
.expect("register names are unique")
.id
};
let r0 = make(&mut ctx, 0, 8, "r0");
let r1 = make(&mut ctx, 8, 8, "r1");
let r2 = make(&mut ctx, 16, 8, "r2");
let r3 = make(&mut ctx, 24, 8, "r3");
let r0_lo32 = make(&mut ctx, 0, 4, "r0_lo32");
let r0_lo16 = make(&mut ctx, 0, 2, "r0_lo16");
let r0_byte0 = make(&mut ctx, 0, 1, "r0_byte0");
let r0_byte1 = make(&mut ctx, 1, 1, "r0_byte1");
let r0_byte2 = make(&mut ctx, 2, 1, "r0_byte2");
let r0_byte3 = make(&mut ctx, 3, 1, "r0_byte3");
Self {
ctx,
reg_space,
r0,
r1,
r2,
r3,
r0_lo32,
r0_lo16,
r0_byte0,
r0_byte1,
r0_byte2,
r0_byte3,
}
}
pub fn assume_libs<I, S>(&mut self, libs: I) -> &mut Self
where
I: IntoIterator<Item = S>,
S: Into<String>,
{
self.ctx
.set_linked_libraries(libs.into_iter().map(Into::into).collect());
self
}
}
pub fn image_binary(
image: crate::memory_image::MemoryImage,
) -> std::sync::Arc<dyn wazabin_binary::BinaryFormat> {
std::sync::Arc::new(image)
}
impl Default for TestContext {
fn default() -> Self {
Self::new()
}
}