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); }