use crate::maps::mem64::Permission;
use crate::tests::helpers;
use crate::*;
#[test]
fn test_scasb() {
helpers::setup();
let mut emu = emu64();
let code_addr = 0x400000;
emu.maps
.create_map("code", code_addr, 0x1000, Permission::READ_WRITE_EXECUTE);
emu.maps
.create_map("stack", 0x0, 0x10000, Permission::READ_WRITE);
let string_addr = 0x500000;
emu.maps
.create_map("data", string_addr, 0x1000, Permission::READ_WRITE);
let s = b"Hello World\0";
emu.maps.write_bytes(string_addr, s);
let mut code_builder: Vec<u8> = Vec::new();
code_builder.extend_from_slice(&[0x48, 0xbf]);
code_builder.extend_from_slice(&string_addr.to_le_bytes());
code_builder.extend_from_slice(&[0xb0, 0x57]);
code_builder.extend_from_slice(&[0x48, 0xc7, 0xc1, 0x14, 0x00, 0x00, 0x00]);
code_builder.extend_from_slice(&[0xf2, 0xae]);
code_builder.extend_from_slice(&[0x74, 0x07]);
code_builder.extend_from_slice(&[0x48, 0xc7, 0xc3, 0x00, 0x00, 0x00, 0x00]);
code_builder.push(0xc3);
code_builder.extend_from_slice(&[0x48, 0xc7, 0xc3, 0x01, 0x00, 0x00, 0x00]);
code_builder.push(0xc3);
emu.maps.write_bytes(code_addr, &code_builder);
emu.regs_mut().rip = code_addr;
emu.regs_mut().rsp = 0x8000;
emu.set_verbose(3);
let _ = emu.run_until_ret();
assert_eq!(emu.regs().rbx, 1, "SCASB failed to find 'W'");
assert_eq!(
emu.regs().rdi,
string_addr + 7,
"RDI failed to update correctly"
);
}