use asmachina::{MachineW, MachineError};
#[test]
fn test_stack_operations_basic() {
let mut machine = MachineW::new();
machine.ak = 1234;
let sdp_instruction = (0b01010 << 11) | 0; machine.memory[0] = sdp_instruction;
machine.l = 0;
machine.is_running = true;
let initial_ws = machine.ws;
assert!(machine.step().is_ok());
assert_eq!(machine.memory[initial_ws as usize], 1234); assert_eq!(machine.ws, initial_ws - 1);
let pzs_instruction = (0b01001 << 11) | 0; machine.memory[1] = pzs_instruction;
machine.l = 1;
machine.ak = 0;
assert!(machine.step().is_ok());
assert_eq!(machine.ak, 1234); assert_eq!(machine.ws, initial_ws); }
#[test]
fn test_stack_operations_multiple_values() {
let mut machine = MachineW::new();
let values = vec![100, 200, 300, 400];
machine.is_running = true;
for (i, &value) in values.iter().enumerate() {
machine.ak = value;
machine.memory[i] = (0b01010 << 11) | 0; machine.l = i as u16;
assert!(machine.step().is_ok());
}
for (i, &expected_value) in values.iter().rev().enumerate() {
let addr = values.len() + i;
machine.memory[addr] = (0b01001 << 11) | 0; machine.l = addr as u16;
machine.ak = 0; assert!(machine.step().is_ok());
assert_eq!(machine.ak, expected_value);
}
}
#[test]
fn test_stack_overflow() {
let mut machine = MachineW::new();
machine.ws = 0; machine.ak = 1234;
let sdp_instruction = (0b01010 << 11) | 0;
machine.memory[0] = sdp_instruction;
machine.l = 0;
machine.is_running = true;
let result = machine.step();
assert!(matches!(result, Err(MachineError::StackOverflow)));
}
#[test]
fn test_stack_underflow() {
let mut machine = MachineW::new();
machine.ws = 2047;
let pzs_instruction = (0b01001 << 11) | 0;
machine.memory[0] = pzs_instruction;
machine.l = 0;
machine.is_running = true;
let result = machine.step();
assert!(matches!(result, Err(MachineError::StackUnderflow)));
}