use neo_devpack_solidity::runtime::execution::ExecutionContext;
use neo_devpack_solidity::runtime::RuntimeConfig;
#[test]
fn pack_and_pickitem_returns_expected_element() {
let code = [0x11, 0x12, 0x13, 0x13, 0xC0, 0x11, 0xCE, 0x40];
let mut ctx = ExecutionContext::new(&RuntimeConfig::default()).expect("context init");
ctx.initialize(&code, &[]).expect("init");
while !ctx.step().expect("step").halted {}
let expected = (2i64).to_le_bytes().to_vec();
assert_eq!(
ctx.return_data(),
expected,
"PICKITEM should fetch array element at index 1"
);
}
#[test]
fn newarray_and_setitem_store_and_load() {
let code = [0x12, 0xC3, 0x4A, 0x10, 0x15, 0xD0, 0x10, 0xCE, 0x40];
let mut ctx = ExecutionContext::new(&RuntimeConfig::default()).expect("context init");
ctx.initialize(&code, &[]).expect("init");
while !ctx.step().expect("step").halted {}
let expected = (5i64).to_le_bytes().to_vec();
assert_eq!(
ctx.return_data(),
expected,
"SETITEM then PICKITEM should round-trip stored value"
);
}
#[test]
fn newmap_set_and_get_roundtrip() {
let mut code = vec![0xC8, 0x4A]; code.extend_from_slice(&[0x0C, 0x02, b'a', b'a']);
code.extend_from_slice(&[0x17]);
code.push(0xD0); code.extend_from_slice(&[0x0C, 0x02, b'a', b'a']);
code.push(0xCE); code.push(0x40);
let mut ctx = ExecutionContext::new(&RuntimeConfig::default()).expect("context init");
ctx.initialize(&code, &[]).expect("init");
while !ctx.step().expect("step").halted {}
let expected = (7i64).to_le_bytes().to_vec();
assert_eq!(
ctx.return_data(),
expected,
"map SETITEM/PICKITEM should round-trip stored value"
);
}
#[test]
fn haskey_and_keys_values_work_for_map() {
let mut code = vec![0xC8];
code.extend_from_slice(&[0x4A, 0x0C, 0x02, b'a', b'a', 0x11, 0xD0]); code.extend_from_slice(&[0x4A, 0x0C, 0x02, b'b', b'b', 0x12, 0xD0]); code.push(0x4A); code.extend_from_slice(&[0x0C, 0x02, b'a', b'a', 0xCB]); code.push(0x50); code.push(0xCC); code.push(0x46); code.push(0x40);
let mut ctx = ExecutionContext::new(&RuntimeConfig::default()).expect("context init");
ctx.initialize(&code, &[]).expect("init");
while !ctx.step().expect("step").halted {}
let values = ctx.return_data(); assert!(
!values.is_empty(),
"keys should be serialized into return data by RET"
);
}
#[test]
fn append_and_size_alias_operate_on_arrays() {
let code = [0xC2, 0x4A, 0x15, 0xCF, 0xCA, 0x40];
let mut ctx = ExecutionContext::new(&RuntimeConfig::default()).expect("context init");
ctx.initialize(&code, &[]).expect("init");
while !ctx.step().expect("step").halted {}
let expected = (1i64).to_le_bytes().to_vec();
assert_eq!(ctx.return_data(), expected, "size after append should be 1");
}
#[test]
fn remove_then_pickitem0_returns_remaining_element() {
let code = [0x11, 0x12, 0x12, 0xC0, 0x4A, 0x10, 0xD2, 0x10, 0xCE, 0x40];
let mut ctx = ExecutionContext::new(&RuntimeConfig::default()).expect("context init");
ctx.initialize(&code, &[]).expect("init");
while !ctx.step().expect("step").halted {}
let expected = (1i64).to_le_bytes().to_vec();
assert_eq!(
ctx.return_data(),
expected,
"remove should drop first element"
);
}
#[test]
fn packmap_builds_map_and_supports_pickitem() {
let code = [
0x11, 0x0C, 0x01, b'a', 0x12, 0x0C, 0x01, b'b', 0x12, 0xBE, 0x0C, 0x01, b'a', 0xCE, 0x40, ];
let mut ctx = ExecutionContext::new(&RuntimeConfig::default()).expect("context init");
ctx.initialize(&code, &[]).expect("init");
while !ctx.step().expect("step").halted {}
let expected = (1i64).to_le_bytes().to_vec();
assert_eq!(ctx.return_data(), expected);
}