use aegis_vm::{execute, build_config::opcodes::{stack, vector, exec}};
#[test]
fn test_vec_new_and_len() {
let bytecode = [
stack::PUSH_IMM8, 10, stack::PUSH_IMM8, 8, vector::VEC_NEW,
stack::DUP, vector::VEC_LEN,
exec::HALT,
];
let result = execute(&bytecode, &[]).unwrap();
assert_eq!(result, 0, "New vector should have length 0");
}
#[test]
fn test_vec_capacity() {
let bytecode = [
stack::PUSH_IMM8, 20, stack::PUSH_IMM8, 8, vector::VEC_NEW,
vector::VEC_CAP,
exec::HALT,
];
let result = execute(&bytecode, &[]).unwrap();
assert_eq!(result, 20, "Vector capacity should be 20");
}
#[test]
fn test_vec_push() {
let bytecode = [
stack::PUSH_IMM8, 10, stack::PUSH_IMM8, 8, vector::VEC_NEW,
stack::DUP, stack::PUSH_IMM8, 42, vector::VEC_PUSH,
stack::DUP,
stack::PUSH_IMM8, 100,
vector::VEC_PUSH,
stack::DUP,
stack::PUSH_IMM8, 255,
vector::VEC_PUSH,
vector::VEC_LEN,
exec::HALT,
];
let result = execute(&bytecode, &[]).unwrap();
assert_eq!(result, 3, "Vector should have 3 elements after 3 pushes");
}
#[test]
fn test_vec_get() {
let bytecode = [
stack::PUSH_IMM8, 10,
stack::PUSH_IMM8, 8,
vector::VEC_NEW,
stack::DUP,
stack::PUSH_IMM8, 42,
vector::VEC_PUSH,
stack::DUP,
stack::PUSH_IMM8, 100,
vector::VEC_PUSH,
stack::DUP,
stack::PUSH_IMM8, 255,
vector::VEC_PUSH,
stack::DUP,
stack::PUSH_IMM8, 1, vector::VEC_GET,
stack::SWAP,
stack::DROP, exec::HALT,
];
let result = execute(&bytecode, &[]).unwrap();
assert_eq!(result, 100, "arr[1] should be 100");
}
#[test]
fn test_vec_set() {
let bytecode = [
stack::PUSH_IMM8, 10,
stack::PUSH_IMM8, 8,
vector::VEC_NEW,
stack::DUP, stack::PUSH_IMM8, 42, vector::VEC_PUSH,
stack::DUP, stack::PUSH_IMM8, 100, vector::VEC_PUSH,
stack::DUP, stack::PUSH_IMM8, 255, vector::VEC_PUSH,
stack::DUP,
stack::PUSH_IMM8, 1, stack::PUSH_IMM16, 0xE7, 0x03, vector::VEC_SET,
stack::DUP,
stack::PUSH_IMM8, 1,
vector::VEC_GET,
stack::SWAP,
stack::DROP,
exec::HALT,
];
let result = execute(&bytecode, &[]).unwrap();
assert_eq!(result, 999, "arr[1] should be 999 after set");
}
#[test]
fn test_vec_pop() {
let bytecode = [
stack::PUSH_IMM8, 10,
stack::PUSH_IMM8, 8,
vector::VEC_NEW,
stack::DUP, stack::PUSH_IMM8, 10, vector::VEC_PUSH,
stack::DUP, stack::PUSH_IMM8, 20, vector::VEC_PUSH,
stack::DUP, stack::PUSH_IMM8, 30, vector::VEC_PUSH,
stack::DUP,
vector::VEC_POP,
stack::SWAP,
stack::DROP,
exec::HALT,
];
let result = execute(&bytecode, &[]).unwrap();
assert_eq!(result, 30, "Pop should return last element (30)");
}
#[test]
fn test_vec_repeat() {
let bytecode = [
stack::PUSH_IMM8, 42, stack::PUSH_IMM8, 5, stack::PUSH_IMM8, 8, vector::VEC_REPEAT,
stack::DUP,
vector::VEC_LEN, stack::DROP,
stack::DUP,
stack::PUSH_IMM8, 3,
vector::VEC_GET,
stack::SWAP,
stack::DROP,
exec::HALT,
];
let result = execute(&bytecode, &[]).unwrap();
assert_eq!(result, 42, "[42; 5][3] should be 42");
}
#[test]
fn test_vec_clear() {
let bytecode = [
stack::PUSH_IMM8, 10,
stack::PUSH_IMM8, 8,
vector::VEC_NEW,
stack::DUP, stack::PUSH_IMM8, 1, vector::VEC_PUSH,
stack::DUP, stack::PUSH_IMM8, 2, vector::VEC_PUSH,
stack::DUP, stack::PUSH_IMM8, 3, vector::VEC_PUSH,
stack::DUP,
vector::VEC_CLEAR,
vector::VEC_LEN,
exec::HALT,
];
let result = execute(&bytecode, &[]).unwrap();
assert_eq!(result, 0, "Length should be 0 after clear");
}
#[test]
fn test_vec_elem_size_1() {
let bytecode = [
stack::PUSH_IMM8, 10,
stack::PUSH_IMM8, 1, vector::VEC_NEW,
stack::DUP, stack::PUSH_IMM8, 0xAB, vector::VEC_PUSH,
stack::DUP, stack::PUSH_IMM8, 0xCD, vector::VEC_PUSH,
stack::DUP,
stack::PUSH_IMM8, 0,
vector::VEC_GET,
stack::SWAP,
stack::DROP,
exec::HALT,
];
let result = execute(&bytecode, &[]).unwrap();
assert_eq!(result, 0xAB, "arr[0] should be 0xAB");
}
#[test]
fn test_vec_elem_size_2() {
let bytecode = [
stack::PUSH_IMM8, 10,
stack::PUSH_IMM8, 2, vector::VEC_NEW,
stack::DUP,
stack::PUSH_IMM16, 0x34, 0x12, vector::VEC_PUSH,
stack::DUP,
stack::PUSH_IMM8, 0,
vector::VEC_GET,
stack::SWAP,
stack::DROP,
exec::HALT,
];
let result = execute(&bytecode, &[]).unwrap();
assert_eq!(result, 0x1234, "arr[0] should be 0x1234");
}
#[test]
fn test_vec_elem_size_4() {
let bytecode = [
stack::PUSH_IMM8, 10,
stack::PUSH_IMM8, 4, vector::VEC_NEW,
stack::DUP,
stack::PUSH_IMM32, 0x78, 0x56, 0x34, 0x12, vector::VEC_PUSH,
stack::DUP,
stack::PUSH_IMM8, 0,
vector::VEC_GET,
stack::SWAP,
stack::DROP,
exec::HALT,
];
let result = execute(&bytecode, &[]).unwrap();
assert_eq!(result, 0x12345678, "arr[0] should be 0x12345678");
}
#[test]
fn test_vec_bounds_check() {
let bytecode = [
stack::PUSH_IMM8, 5,
stack::PUSH_IMM8, 8,
vector::VEC_NEW,
stack::DUP,
stack::PUSH_IMM8, 42,
vector::VEC_PUSH,
stack::PUSH_IMM8, 5,
vector::VEC_GET,
exec::HALT,
];
let result = execute(&bytecode, &[]);
assert!(result.is_err(), "Accessing out of bounds should error");
}
#[test]
fn test_list_form_array() {
let bytecode = [
stack::PUSH_IMM8, 5,
stack::PUSH_IMM8, 8,
vector::VEC_NEW,
stack::DUP, stack::PUSH_IMM8, 10, vector::VEC_PUSH,
stack::DUP, stack::PUSH_IMM8, 20, vector::VEC_PUSH,
stack::DUP, stack::PUSH_IMM8, 30, vector::VEC_PUSH,
stack::DUP, stack::PUSH_IMM8, 40, vector::VEC_PUSH,
stack::DUP, stack::PUSH_IMM8, 50, vector::VEC_PUSH,
stack::DUP, stack::PUSH_IMM8, 0, vector::VEC_GET,
stack::PUSH_IMM8, 10,
aegis_vm::build_config::opcodes::control::CMP,
stack::DROP, stack::DROP,
stack::DUP, stack::PUSH_IMM8, 4, vector::VEC_GET,
stack::SWAP,
stack::DROP,
exec::HALT,
];
let result = execute(&bytecode, &[]).unwrap();
assert_eq!(result, 50, "arr[4] should be 50");
}
#[test]
fn test_large_repeat_array() {
let bytecode = [
stack::PUSH_IMM8, 0, stack::PUSH_IMM8, 100, stack::PUSH_IMM8, 8, vector::VEC_REPEAT,
vector::VEC_LEN,
exec::HALT,
];
let result = execute(&bytecode, &[]).unwrap();
assert_eq!(result, 100, "Length should be 100");
}