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() { use rustijvm::value::Value::Int; 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(&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))); }