127 lines
3.9 KiB
Rust
127 lines
3.9 KiB
Rust
extern crate rustijvm;
|
|
|
|
use std::io::{Read, Seek, SeekFrom};
|
|
|
|
fn steps(machine: &mut rustijvm::machine::Machine, num: usize) {
|
|
for _ in 0..num {
|
|
machine.step().unwrap();
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn task4_ldcw1() {
|
|
let mut machine = rustijvm::machine::Machine::new_from_file("files/task4/LoadTest1.ijvm").unwrap();
|
|
machine.set_output(rustijvm::stubs::output_stub());
|
|
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0x1));
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0x2));
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0x3));
|
|
}
|
|
|
|
#[test]
|
|
fn task4_simple_load() {
|
|
let mut machine = rustijvm::machine::Machine::new_from_file("files/task4/LoadTest3.ijvm").unwrap();
|
|
machine.set_output(rustijvm::stubs::output_stub());
|
|
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0x2a));
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0x1));
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0x2a));
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0x2));
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0x2a));
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0x3));
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0x2a));
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0x3));
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0x2));
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0x1));
|
|
steps(&mut machine, 3);
|
|
assert_eq!(machine.get_tos(), Ok(0x2a));
|
|
}
|
|
|
|
#[test]
|
|
fn task4_complex_load() {
|
|
let mut machine = rustijvm::machine::Machine::new_from_file("files/task4/LoadTest2.ijvm").unwrap();
|
|
machine.set_output(rustijvm::stubs::output_stub());
|
|
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0x2a));
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0x2));
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0x2));
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0x0));
|
|
|
|
steps(&mut machine, 2);
|
|
assert_eq!(machine.get_tos(), Ok(0x3));
|
|
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0x2a));
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0x0));
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0x3));
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0x4f));
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0x3));
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0x4b));
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0x3));
|
|
}
|
|
|
|
#[test]
|
|
fn task4_iteration_load() {
|
|
let rc = rustijvm::stubs::output_stub();
|
|
|
|
let mut machine = rustijvm::machine::Machine::new_from_file("files/task4/LoadTest4.ijvm").unwrap();
|
|
machine.set_output(rc.clone());
|
|
machine.run().unwrap();
|
|
|
|
let mut out = rc.lock().unwrap();
|
|
let mut string = String::new();
|
|
|
|
out.seek(SeekFrom::Start(0)).unwrap();
|
|
out.read_to_string(&mut string).unwrap();
|
|
|
|
assert_eq!(string, "kjihgfedcbaabcd");
|
|
}
|
|
|
|
#[test]
|
|
fn task4_iinc() {
|
|
use rustijvm::value::Value::Int;
|
|
let mut machine = rustijvm::machine::Machine::new_from_file("files/task4/IINCTest.ijvm").unwrap();
|
|
machine.set_output(rustijvm::stubs::output_stub());
|
|
|
|
steps(&mut machine, 4);
|
|
assert_eq!(machine.cur_frame().get(0), Ok(&Int(0)));
|
|
assert_eq!(machine.cur_frame().get(1), Ok(&Int(0)));
|
|
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.cur_frame().get(0), Ok(&Int(0)));
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.cur_frame().get(0), Ok(&Int(1)));
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.cur_frame().get(0), Ok(&Int(4)));
|
|
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.cur_frame().get(1), Ok(&Int(0)));
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.cur_frame().get(1), Ok(&Int(-1)));
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.cur_frame().get(1), Ok(&Int(-4)));
|
|
}
|