extern crate rustijvm; use std::io::{Cursor, Read, Seek, SeekFrom}; use std::sync::{Arc, Mutex}; fn steps(machine: &mut rustijvm::Machine, num: usize) { for _ in 0..num { machine.step().unwrap(); } } #[test] fn task4_ldcw1() { let mut machine = rustijvm::Machine::new_from_file("files/task4/LoadTest1.ijvm").unwrap(); 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::new_from_file("files/task4/LoadTest3.ijvm").unwrap(); 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::new_from_file("files/task4/LoadTest2.ijvm").unwrap(); 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 = Arc::new(Mutex::new(Cursor::new(Vec::new()))); let mut machine = rustijvm::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() { let mut machine = rustijvm::Machine::new_from_file("files/task4/IINCTest.ijvm").unwrap(); steps(&mut machine, 4); assert_eq!(machine.cur_frame().get(0), Ok(0)); assert_eq!(machine.cur_frame().get(1), Ok(0)); steps(&mut machine, 1); assert_eq!(machine.cur_frame().get(0), Ok(0)); steps(&mut machine, 1); assert_eq!(machine.cur_frame().get(0), Ok(1)); steps(&mut machine, 1); assert_eq!(machine.cur_frame().get(0), Ok(4)); steps(&mut machine, 1); assert_eq!(machine.cur_frame().get(1), Ok(0)); steps(&mut machine, 1); assert_eq!(machine.cur_frame().get(1), Ok(-1)); steps(&mut machine, 1); assert_eq!(machine.cur_frame().get(1), Ok(-4)); }