use super::*;
#[test]
fn test_execute_jr_forward() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 39483]);
sm.st.opcodes.extend_from_slice(&[
Opcode::LDI(0),
Opcode::LDI(1),
Opcode::LDI(2),
Opcode::LDI(2), Opcode::JR,
Opcode::LDI(3),
Opcode::LDI(4),
Opcode::LDI(5),
Opcode::RET,
]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![321, 39483, 0, 1, 2, 4, 5]);
}
#[test]
fn test_execute_jr_backward() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 39483]);
sm.st.opcodes.extend_from_slice(&[
Opcode::LDI(0),
Opcode::LDI(1),
Opcode::RET,
Opcode::LDI(2),
Opcode::LDI(-5), Opcode::JR,
]);
sm.execute(3, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![321, 39483, 2, 0, 1]);
}
#[test]
fn test_execute_jrz_forward() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 39483]);
sm.st.opcodes.extend_from_slice(&[
Opcode::LDI(0),
Opcode::LDI(1),
Opcode::LDI(2),
Opcode::LDI(1), Opcode::LDI(2), Opcode::JRZ,
Opcode::LDI(3),
Opcode::LDI(4),
Opcode::LDI(5),
Opcode::LDI(0),
Opcode::LDI(2), Opcode::JRZ, Opcode::LDI(6),
Opcode::LDI(7),
Opcode::LDI(8),
Opcode::RET,
]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![321, 39483, 0, 1, 2, 3, 4, 5, 7, 8]);
}
#[test]
fn test_execute_jrz_backward() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 39483]);
sm.st.opcodes.extend_from_slice(&[
Opcode::LDI(0),
Opcode::RET,
Opcode::LDI(1),
Opcode::LDI(2),
Opcode::LDI(1), Opcode::LDI(-2), Opcode::JRZ,
Opcode::LDI(3),
Opcode::LDI(4),
Opcode::LDI(5),
Opcode::LDI(0),
Opcode::LDI(-12), Opcode::JRZ, Opcode::LDI(6),
Opcode::LDI(7),
Opcode::LDI(8),
Opcode::RET,
]);
sm.execute(2, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![321, 39483, 1, 2, 3, 4, 5, 0]);
}
#[test]
fn test_execute_jrnz_forward() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 39483]);
sm.st.opcodes.extend_from_slice(&[
Opcode::LDI(0),
Opcode::LDI(1),
Opcode::LDI(2),
Opcode::LDI(0), Opcode::LDI(2), Opcode::JRNZ,
Opcode::LDI(3),
Opcode::LDI(4),
Opcode::LDI(5),
Opcode::LDI(1),
Opcode::LDI(2), Opcode::JRNZ, Opcode::LDI(6),
Opcode::LDI(7),
Opcode::LDI(8),
Opcode::RET,
]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![321, 39483, 0, 1, 2, 3, 4, 5, 7, 8]);
}
#[test]
fn test_execute_jrnz_backward() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 39483]);
sm.st.opcodes.extend_from_slice(&[
Opcode::LDI(0),
Opcode::RET,
Opcode::LDI(1),
Opcode::LDI(2),
Opcode::LDI(0), Opcode::LDI(-2), Opcode::JRNZ,
Opcode::LDI(3),
Opcode::LDI(4),
Opcode::LDI(5),
Opcode::LDI(1),
Opcode::LDI(-12), Opcode::JRNZ, Opcode::LDI(6),
Opcode::LDI(7),
Opcode::LDI(8),
Opcode::RET,
]);
sm.execute(2, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![321, 39483, 1, 2, 3, 4, 5, 0]);
}
#[test]
fn test_execute_cmpz_1() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[123, 321, 0]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::CMPZ, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![123_i64, 321, -1]);
}
#[test]
fn test_execute_cmpz_2() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[123, 321, 1]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::CMPZ, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![123_i64, 321, 0]);
}
#[test]
fn test_execute_cmpnz_1() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[123, 321, 0]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::CMPNZ, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![123_i64, 321, 0]);
}
#[test]
fn test_execute_cmpnz_2() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[123, 321, 1]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::CMPNZ, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![123_i64, 321, -1]);
}
#[test]
fn test_execute_call() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 39483]);
sm.st.opcodes.extend_from_slice(&[
Opcode::LDI(0),
Opcode::LDI(5),
Opcode::CALL,
Opcode::LDI(1),
Opcode::RET,
Opcode::LDI(2),
Opcode::LDI(10),
Opcode::CALL,
Opcode::LDI(3),
Opcode::RET,
Opcode::LDI(4),
Opcode::LDI(15),
Opcode::CALL,
Opcode::LDI(5),
Opcode::RET,
Opcode::LDI(6),
Opcode::LDI(20),
Opcode::CALL,
Opcode::LDI(7),
Opcode::RET,
Opcode::LDI(8),
Opcode::LDI(25),
Opcode::CALL,
Opcode::LDI(9),
Opcode::RET,
Opcode::RET,
]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(
sm.st.number_stack,
vec![321, 39483, 0, 2, 4, 6, 8, 9, 7, 5, 3, 1]
);
}
#[test]
fn test_execute_gt_r() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[0, 1, 2]);
sm.st.opcodes.extend_from_slice(&[Opcode::GtR, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![0_i64, 1]);
assert_eq!(sm.st.scratch_stack, vec![2_i64]);
}
#[test]
fn test_execute_r_gt() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[0, 1, 2]);
sm.st.scratch_stack.extend_from_slice(&[3, 4, 5]);
sm.st.opcodes.extend_from_slice(&[Opcode::RGt, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![0_i64, 1, 2, 5]);
assert_eq!(sm.st.scratch_stack, vec![3_i64, 4]);
}
#[test]
fn test_execute_r_at() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[0, 1, 2]);
sm.st.scratch_stack.extend_from_slice(&[3, 4, 5]);
sm.st.opcodes.extend_from_slice(&[Opcode::RAt, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![0_i64, 1, 2, 5]);
assert_eq!(sm.st.scratch_stack, vec![3_i64, 4, 5]);
}
#[test]
fn test_execute_gt_r_2() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[0, 1, 2]);
sm.st.scratch_stack.extend_from_slice(&[3, 4, 5]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::GtR2, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![0_i64]);
assert_eq!(sm.st.scratch_stack, vec![3_i64, 4, 5, 1, 2]);
}
#[test]
fn test_execute_r_gt_2() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[0, 1, 2]);
sm.st.scratch_stack.extend_from_slice(&[3, 4, 5]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::RGt2, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![0_i64, 1, 2, 4, 5]);
assert_eq!(sm.st.scratch_stack, vec![3_i64]);
}
#[test]
fn test_execute_r_at_2() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[0, 1, 2]);
sm.st.scratch_stack.extend_from_slice(&[3, 4, 5]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::RAt2, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![0_i64, 1, 2, 4, 5]);
assert_eq!(sm.st.scratch_stack, vec![3_i64, 4, 5]);
}
#[test]
fn test_execute_ldi() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 39483]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::LDI(0), Opcode::LDI(1), Opcode::LDI(2), Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![321, 39483, 0, 1, 2]);
}
#[test]
fn test_execute_pop() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 39483]);
sm.st.opcodes.extend_from_slice(&[
Opcode::LDI(0),
Opcode::LDI(1),
Opcode::DROP,
Opcode::LDI(2),
Opcode::RET,
]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![321, 39483, 0, 2]);
}
#[test]
#[should_panic]
fn test_execute_pop_error() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 39483]);
sm.st.opcodes.extend_from_slice(&[
Opcode::LDI(0),
Opcode::LDI(1),
Opcode::DROP,
Opcode::DROP,
Opcode::DROP,
Opcode::DROP,
Opcode::DROP,
Opcode::LDI(2),
Opcode::RET,
]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
}
#[test]
fn test_execute_swap() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 39483]);
sm.st.opcodes.extend_from_slice(&[
Opcode::LDI(0),
Opcode::LDI(1),
Opcode::SWAP,
Opcode::LDI(2),
Opcode::RET,
]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![321, 39483, 1, 0, 2]);
}
#[test]
fn test_execute_add() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[123, 321]);
sm.st.opcodes.extend_from_slice(&[Opcode::ADD, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![444]);
}
#[test]
fn test_execute_sub() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 444]);
sm.st.opcodes.extend_from_slice(&[Opcode::SUB, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![123]);
}
#[test]
fn test_execute_mul() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 123]);
sm.st.opcodes.extend_from_slice(&[Opcode::MUL, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![39483]);
}
#[test]
fn test_execute_div() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[10, 5]);
sm.st.opcodes.extend_from_slice(&[Opcode::DIV, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![2]);
}
#[test]
fn test_execute_not_1() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 0]);
sm.st.opcodes.extend_from_slice(&[Opcode::NOT, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![321_i64, 1]);
}
#[test]
fn test_execute_not_2() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 1]);
sm.st.opcodes.extend_from_slice(&[Opcode::NOT, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![321_i64, 0]);
}
#[test]
fn test_execute_not_3() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 346780]);
sm.st.opcodes.extend_from_slice(&[Opcode::NOT, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![321_i64, 0]);
}
#[test]
fn test_execute_dup() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[123, 39483]);
sm.st.opcodes.extend_from_slice(&[Opcode::DUP, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![123, 39483, 39483]);
}
#[test]
#[should_panic]
fn test_execute_run_out_of_gas() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 39483]);
sm.st.opcodes.extend_from_slice(&[
Opcode::LDI(0),
Opcode::LDI(5),
Opcode::CALL,
Opcode::LDI(1),
Opcode::RET,
Opcode::LDI(2),
Opcode::LDI(10),
Opcode::CALL,
Opcode::LDI(3),
Opcode::RET,
Opcode::LDI(4),
Opcode::LDI(15),
Opcode::CALL,
Opcode::LDI(5),
Opcode::RET,
Opcode::LDI(6),
Opcode::LDI(20),
Opcode::CALL,
Opcode::LDI(7),
Opcode::RET,
Opcode::LDI(8),
Opcode::LDI(25),
Opcode::CALL,
Opcode::LDI(9),
Opcode::RET,
Opcode::RET,
]);
sm.execute(0, GasLimit::Limited(10)).unwrap();
}
#[test]
fn test_handle_trap_1() {
let mut sm = StackMachine::default();
sm.trap_handlers
.push(Box::from(TrapHandler::new(100, |_trap_id, st| {
st.number_stack
.pop()
.ok_or(StackMachineError::NumberStackUnderflow)?;
st.number_stack.push(200);
Ok(TrapHandled::Handled)
})));
sm.st.number_stack.extend_from_slice(&[50_i64, 100]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::TRAP, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![200]);
}
#[test]
fn test_handle_trap_2() {
let mut sm = StackMachine::default();
sm.trap_handlers
.push(Box::from(TrapHandler::new(-100, |_trap_id, st| {
st.number_stack
.pop()
.ok_or(StackMachineError::NumberStackUnderflow)?;
st.number_stack.push(-100);
Ok(TrapHandled::Handled)
})));
sm.trap_handlers
.push(Box::from(TrapHandler::new(100, |_trap_id, st| {
st.number_stack
.pop()
.ok_or(StackMachineError::NumberStackUnderflow)?;
st.number_stack.push(200);
Ok(TrapHandled::Handled)
})));
sm.trap_handlers
.push(Box::from(TrapHandler::new(-200, |_trap_id, st| {
st.number_stack
.pop()
.ok_or(StackMachineError::NumberStackUnderflow)?;
st.number_stack.push(-200);
Ok(TrapHandled::Handled)
})));
sm.st.number_stack.extend_from_slice(&[50_i64, 100]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::TRAP, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![200]);
}
#[test]
fn test_unhandled_trap_1() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[50_i64, 100]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::TRAP, Opcode::RET]);
match sm.execute(0, GasLimit::Limited(100)) {
Err(StackMachineError::UnhandledTrap { unhandled_trap_id }) if unhandled_trap_id == 100 => {
()
}
r => panic!("Incorrect error type returned {:?}", r),
}
}
#[test]
fn test_execute_pushlp() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 39483, 0]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::PUSHLP, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![321]);
assert_eq!(sm.st.loop_stack, vec![(0, 39483)]);
}
#[test]
fn test_execute_inclp() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 39483, 0]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::PUSHLP, Opcode::INCLP, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![321]);
assert_eq!(sm.st.loop_stack, vec![(1, 39483)]);
}
#[test]
fn test_execute_addlp() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 39483, 0]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::PUSHLP, Opcode::ADDLP, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![]);
assert_eq!(sm.st.loop_stack, vec![(321, 39483)]);
}
#[test]
fn test_execute_getlp() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 39483]);
sm.st
.loop_stack
.extend_from_slice(&[(3210, 0), (394836, 0)]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::GETLP, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![321, 39483, 394836]);
assert_eq!(sm.st.loop_stack, vec![(3210, 0), (394836, 0)]);
}
#[test]
fn test_execute_getlp_fail_1() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 39483]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::GETLP, Opcode::RET]);
assert_eq!(
match sm.execute(0, GasLimit::Limited(100)) {
Err(StackMachineError::LoopStackUnderflow) => 1,
_ => 0,
},
1
);
}
#[test]
fn test_execute_getlp2() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 39483]);
sm.st
.loop_stack
.extend_from_slice(&[(3210, 0), (394836, 0)]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::GETLP2, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![321, 39483, 3210]);
assert_eq!(sm.st.loop_stack, vec![(3210, 0), (394836, 0)]);
}
#[test]
fn test_execute_getlp2_fail_2() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 39483]);
sm.st.loop_stack.extend_from_slice(&[(3210, 0)]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::GETLP2, Opcode::RET]);
assert_eq!(
match sm.execute(0, GasLimit::Limited(100)) {
Err(StackMachineError::LoopStackUnderflow) => 1,
_ => 0,
},
1
);
}
#[test]
fn test_execute_cmpgelp_eq() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 39583]);
sm.st
.loop_stack
.extend_from_slice(&[(3210, 0), (39483, 39483)]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::CMPLOOP, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![321, 39583, 1]);
assert_eq!(sm.st.loop_stack, vec![(3210, 0), (39483, 39483)]);
}
#[test]
fn test_execute_cmpgelp_gt() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 39583]);
sm.st
.loop_stack
.extend_from_slice(&[(3210, 0), (39484, 39483)]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::CMPLOOP, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![321, 39583, 1]);
assert_eq!(sm.st.loop_stack, vec![(3210, 0), (39484, 39483)]);
}
#[test]
fn test_execute_cmpgelp_lt() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[321, 39583]);
sm.st
.loop_stack
.extend_from_slice(&[(3210, 0), (39482, 39483)]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::CMPLOOP, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![321, 39583, 0]);
assert_eq!(sm.st.loop_stack, vec![(3210, 0), (39482, 39483)]);
}
#[test]
fn test_execute_and() {
let mut sm = StackMachine::default();
sm.st
.number_stack
.extend_from_slice(&[0b10101110i64, 0b01010111i64]);
sm.st.opcodes.extend_from_slice(&[Opcode::AND, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![0b00000110i64]);
}
#[test]
fn test_execute_newcells_1() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[0_i64, 2]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::NEWCELLS, Opcode::RET]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![0]);
assert_eq!(sm.st.cells, vec![0, 0]);
}
#[test]
fn test_execute_newcells_2() {
let mut sm = StackMachine::default();
sm.st.number_stack.extend_from_slice(&[0_i64, -2]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::NEWCELLS, Opcode::RET]);
assert_eq!(
match sm.execute(0, GasLimit::Limited(100)) {
Err(StackMachineError::InvalidCellOperation) => 1,
_ => 0,
},
1
);
}
#[test]
fn test_execute_movetocells_1() {
let mut sm = StackMachine::default();
sm.st
.number_stack
.extend_from_slice(&[0_i64, 1, 2, 3, 0, 2]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::MOVETOCELLS, Opcode::RET]);
sm.st.cells.extend_from_slice(&[0, 0]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![0_i64, 1]);
assert_eq!(sm.st.cells, vec![3, 2]);
}
#[test]
fn test_execute_movetocells_2() {
let mut sm = StackMachine::default();
sm.st
.number_stack
.extend_from_slice(&[0_i64, 1, 2, 3, 0, -2]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::MOVETOCELLS, Opcode::RET]);
assert_eq!(
match sm.execute(0, GasLimit::Limited(100)) {
Err(StackMachineError::InvalidCellOperation) => 1,
_ => 0,
},
1
);
}
#[test]
fn test_execute_movetocells_3() {
let mut sm = StackMachine::default();
sm.st
.number_stack
.extend_from_slice(&[0_i64, 1, 2, 3, -5, 2]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::MOVETOCELLS, Opcode::RET]);
assert_eq!(
match sm.execute(0, GasLimit::Limited(100)) {
Err(StackMachineError::InvalidCellOperation) => 1,
_ => 0,
},
1
);
}
#[test]
fn test_execute_movetocells_4() {
let mut sm = StackMachine::default();
sm.st
.number_stack
.extend_from_slice(&[0_i64, 1, 2, 3, 0, 3]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::MOVETOCELLS, Opcode::RET]);
assert_eq!(
match sm.execute(0, GasLimit::Limited(100)) {
Err(StackMachineError::InvalidCellOperation) => 1,
_ => 0,
},
1
);
}
#[test]
fn test_execute_movefromcells_1() {
let mut sm = StackMachine::default();
sm.st
.number_stack
.extend_from_slice(&[0_i64, 1, 2, 3, 0, 2]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::MOVEFROMCELLS, Opcode::RET]);
sm.st.cells.extend_from_slice(&[5, 4]);
sm.execute(0, GasLimit::Limited(100)).unwrap();
assert_eq!(sm.st.number_stack, vec![0_i64, 1, 2, 3, 4, 5]);
assert_eq!(sm.st.cells, vec![5, 4]);
}
#[test]
fn test_execute_movefromcells_2() {
let mut sm = StackMachine::default();
sm.st
.number_stack
.extend_from_slice(&[0_i64, 1, 2, 3, 0, -2]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::MOVEFROMCELLS, Opcode::RET]);
assert_eq!(
match sm.execute(0, GasLimit::Limited(100)) {
Err(StackMachineError::InvalidCellOperation) => 1,
_ => 0,
},
1
);
}
#[test]
fn test_execute_movefromcells_3() {
let mut sm = StackMachine::default();
sm.st
.number_stack
.extend_from_slice(&[0_i64, 1, 2, 3, -5, 2]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::MOVEFROMCELLS, Opcode::RET]);
assert_eq!(
match sm.execute(0, GasLimit::Limited(100)) {
Err(StackMachineError::InvalidCellOperation) => 1,
_ => 0,
},
1
);
}
#[test]
fn test_execute_movefromcells_4() {
let mut sm = StackMachine::default();
sm.st
.number_stack
.extend_from_slice(&[0_i64, 1, 2, 3, 0, 3]);
sm.st
.opcodes
.extend_from_slice(&[Opcode::MOVEFROMCELLS, Opcode::RET]);
assert_eq!(
match sm.execute(0, GasLimit::Limited(100)) {
Err(StackMachineError::InvalidCellOperation) => 1,
_ => 0,
},
1
);
}