use neo_devpack_solidity::runtime::execution::ExecutionContext;
use neo_devpack_solidity::runtime::RuntimeConfig;
#[test]
fn cat_concatenates_bytes() {
let code = [0x0C, 0x02, b'a', b'b', 0x0C, 0x02, b'c', b'd', 0x8B, 0x40];
let mut ctx = ExecutionContext::new(&RuntimeConfig::default()).expect("context init");
ctx.initialize(&code, &[]).expect("init");
while !ctx.step().expect("step").halted {}
assert_eq!(ctx.return_data(), b"abcd");
}
#[test]
fn left_and_right_slice() {
let code = [
0x0C, 0x05, b'h', b'e', b'l', b'l', b'o', 0x12, 0x8D, 0x13, 0x8E, ];
let mut ctx = ExecutionContext::new(&RuntimeConfig::default()).expect("context init");
ctx.initialize(&code, &[]).expect("init");
let mut err = None;
loop {
match ctx.step() {
Ok(step) => {
if step.halted {
break;
}
}
Err(e) => {
err = Some(e);
break;
}
}
}
assert!(
err.is_some(),
"RIGHT beyond length should error due to bounds"
);
}
#[test]
fn substr_extracts_segment() {
let code = [
0x0C, 0x05, b'h', b'e', b'l', b'l', b'o', 0x11, 0x13, 0x8C, 0x40,
];
let mut ctx = ExecutionContext::new(&RuntimeConfig::default()).expect("context init");
ctx.initialize(&code, &[]).expect("init");
while !ctx.step().expect("step").halted {}
assert_eq!(ctx.return_data(), b"ell");
}
#[test]
fn newbuffer_allocates_zeroed_bytes() {
let code = [0x13, 0x88, 0x40];
let mut ctx = ExecutionContext::new(&RuntimeConfig::default()).expect("context init");
ctx.initialize(&code, &[]).expect("init");
while !ctx.step().expect("step").halted {}
assert_eq!(ctx.return_data(), vec![0u8; 3]);
}
#[test]
fn memcpy_copies_slice_into_destination() {
let code = [
0x14, 0x88, 0x4A, 0x11, 0x0C, 0x04, b'a', b'b', b'c', b'd', 0x10, 0x12, 0x89, 0x40, ];
let mut ctx = ExecutionContext::new(&RuntimeConfig::default()).expect("context init");
ctx.initialize(&code, &[]).expect("init");
while !ctx.step().expect("step").halted {}
assert_eq!(ctx.return_data(), vec![0, b'a', b'b', 0]);
}