241 lines
6.7 KiB
Rust
241 lines
6.7 KiB
Rust
extern crate rustijvm;
|
|
|
|
use std::io::{Seek, SeekFrom, Read};
|
|
|
|
fn steps(machine: &mut rustijvm::Machine, num: usize) {
|
|
for _ in 0..num {
|
|
machine.step().unwrap();
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn advanced1() {
|
|
let output = rustijvm::stubs::output_stub();
|
|
let input = Box::new("A".as_bytes());
|
|
let mut machine = rustijvm::Machine::new_from_file("files/task5/all_regular.ijvm").unwrap();
|
|
machine.set_input(input);
|
|
machine.set_output(output.clone());
|
|
|
|
assert_eq!(0x10, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(16));
|
|
|
|
assert_eq!(0x59, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(16));
|
|
|
|
assert_eq!(0xa7, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
|
|
assert_eq!(0x60, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(32));
|
|
|
|
assert_eq!(0x10, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(33));
|
|
|
|
assert_eq!(0x7e, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(32));
|
|
|
|
assert_eq!(0x10, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(1));
|
|
|
|
assert_eq!(0x10, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(2));
|
|
|
|
assert_eq!(0xB0, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(3));
|
|
|
|
assert_eq!(0x64, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(29));
|
|
|
|
assert_eq!(0x00, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(29));
|
|
|
|
assert_eq!(0x10, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(68));
|
|
|
|
assert_eq!(0x60, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(97));
|
|
|
|
assert_eq!(0xFD, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
|
|
{
|
|
let mut outstream = output.lock().unwrap();
|
|
outstream.seek(SeekFrom::Start(0)).unwrap();
|
|
let mut buf = [0; 1];
|
|
outstream.read_exact(&mut buf).unwrap();
|
|
assert_eq!(buf[0], 'a' as u8);
|
|
}
|
|
|
|
assert_eq!(0x10, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0));
|
|
|
|
assert_eq!(0x99, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
|
|
assert_eq!(0x10, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(-22));
|
|
|
|
assert_eq!(0x9B, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
|
|
assert_eq!(0x13, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(65));
|
|
|
|
assert_eq!(0x10, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0x41));
|
|
|
|
assert_eq!(0x9F, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
|
|
assert_eq!(0x10, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(1));
|
|
|
|
assert_eq!(0x36, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
|
|
assert_eq!(0x15, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(1));
|
|
|
|
assert_eq!(0x57, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
|
|
assert_eq!(0x84, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
|
|
assert_eq!(0x15, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(2));
|
|
|
|
assert_eq!(0x57, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
|
|
assert_eq!(0xFC, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok('A' as i32));
|
|
|
|
assert_eq!(0xFC, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0));
|
|
|
|
assert_eq!(0x99, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
|
|
assert_eq!(0x10, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0));
|
|
|
|
assert_eq!(0x10, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(1));
|
|
|
|
assert_eq!(0x10, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(2));
|
|
|
|
assert_eq!(0x10, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(3));
|
|
|
|
assert_eq!(0xB6, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
|
|
assert_eq!(0x15, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(1));
|
|
|
|
assert_eq!(0x57, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
|
|
assert_eq!(0x15, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(2));
|
|
|
|
assert_eq!(0x57, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
|
|
assert_eq!(0x15, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(3));
|
|
|
|
assert_eq!(0x57, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
|
|
assert_eq!(0x10, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0));
|
|
|
|
assert_eq!(0x10, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(5));
|
|
|
|
assert_eq!(0xB6, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
|
|
assert_eq!(0x10, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(10));
|
|
|
|
assert_eq!(0x10, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(0));
|
|
|
|
assert_eq!(0x10, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(1));
|
|
|
|
assert_eq!(0x15, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(5));
|
|
|
|
assert_eq!(0xB6, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
|
|
assert_eq!(0x15, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(5));
|
|
|
|
assert_eq!(0xAC, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(5));
|
|
|
|
assert_eq!(0x57, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(10));
|
|
|
|
assert_eq!(0xAC, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(10));
|
|
|
|
assert_eq!(0x00, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
|
|
assert_eq!(0xAC, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
assert_eq!(machine.get_tos(), Ok(10));
|
|
|
|
assert_eq!(0x57, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
|
|
assert_eq!(0xFF, machine.cur_instruction());
|
|
steps(&mut machine, 1);
|
|
}
|
|
|