Files
RustIJVM/tests/task3.rs

138 lines
3.7 KiB
Rust

extern crate rustijvm;
fn steps(machine: &mut rustijvm::machine::Machine, num: usize) {
for _ in 0..num {
machine.step().unwrap();
}
}
#[test]
fn task3_goto1() {
let mut machine = rustijvm::machine::Machine::new_from_file("files/task3/GOTO1.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 1);
assert_eq!(machine.get_tos(), Ok(0x31));
steps(&mut machine, 3);
assert_eq!(machine.get_tos(), Ok(0x33));
steps(&mut machine, 1);
}
#[test]
fn task3_goto2() {
let mut machine = rustijvm::machine::Machine::new_from_file("files/task3/GOTO2.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 1);
assert_eq!(machine.get_tos(), Ok(0x31));
steps(&mut machine, 3);
assert_eq!(machine.get_tos(), Ok(0x33));
steps(&mut machine, 3);
assert_eq!(machine.get_tos(), Ok(0x32));
steps(&mut machine, 1);
}
#[test]
fn task3_ifeq1() {
let mut machine = rustijvm::machine::Machine::new_from_file("files/task3/IFEQ1.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub());
steps(&mut machine, 1);
assert_eq!(machine.get_tos(), Ok(0x5));
// L2 iteration 1
steps(&mut machine, 6);
assert_eq!(machine.get_tos(), Ok(0x4));
steps(&mut machine, 3);
let pc = machine.get_program_counter();
// L2 iteration 2
steps(&mut machine, 6);
assert_eq!(machine.get_tos(), Ok(0x3));
steps(&mut machine, 3);
assert_eq!(machine.get_program_counter(), pc);
// L2 iteration 3
steps(&mut machine, 6);
assert_eq!(machine.get_tos(), Ok(0x2));
steps(&mut machine, 3);
assert_eq!(machine.get_program_counter(), pc);
// L2 iteration 4
steps(&mut machine, 6);
assert_eq!(machine.get_tos(), Ok(0x1));
steps(&mut machine, 3);
assert_eq!(machine.get_program_counter(), pc);
// L2 iteration 5
steps(&mut machine, 6);
assert_eq!(machine.get_tos(), Ok(0x0));
steps(&mut machine, 2);
assert_eq!(machine.get_program_counter(), pc + 15);
}
#[test]
fn task3_iflt1() {
let mut machine = rustijvm::machine::Machine::new_from_file("files/task3/IFLT1.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub());
let mut pc = 0;
// L1
steps(&mut machine, 2);
assert_eq!(machine.get_program_counter(), pc + 5);
pc = machine.get_program_counter();
// L2
steps(&mut machine, 2);
assert_eq!(machine.get_program_counter(), pc + 5);
pc = machine.get_program_counter();
// L3
steps(&mut machine, 2);
assert_eq!(machine.get_program_counter(), pc + 5);
pc = machine.get_program_counter();
// L4
steps(&mut machine, 4);
assert_eq!(machine.get_program_counter(), pc + 19);
steps(&mut machine, 1);
assert_eq!(machine.get_tos(), Ok(0x37));
}
#[test]
fn task3_ificmpeq1() {
let mut machine = rustijvm::machine::Machine::new_from_file("files/task3/IFICMPEQ1.ijvm").unwrap();
machine.set_output(rustijvm::stubs::output_stub());
let mut pc = 0;
// L1
steps(&mut machine, 3);
assert_eq!(machine.get_program_counter(), pc + 7);
pc = machine.get_program_counter();
// L2
steps(&mut machine, 5);
assert_eq!(machine.get_program_counter(), pc + 10);
pc = machine.get_program_counter();
// L3
steps(&mut machine, 4);
assert_eq!(machine.get_program_counter(), pc + 8);
pc = machine.get_program_counter();
// L4
for _ in 0..3 {
steps(&mut machine, 3);
assert_eq!(machine.get_program_counter(), pc);
pc = machine.get_program_counter()
}
// L6
steps(&mut machine, 2);
assert_eq!(machine.get_program_counter(), pc + 9);
steps(&mut machine, 1);
assert_eq!(machine.get_tos(), Ok(0x13));
}