# HG changeset patch # User Emmanuel Gil Peyrot # Date 1566520257 -7200 # Node ID f5b34a1c2707ea17400b9e09c5974aca656dba48 # Parent 3ff1af76e41385471d6462d2eb38c4f27aeaa635 ecl_vm: add a test for Call and Return. diff --git a/src/th06/ecl_vm.rs b/src/th06/ecl_vm.rs --- a/src/th06/ecl_vm.rs +++ b/src/th06/ecl_vm.rs @@ -956,3 +956,50 @@ impl EclRunner { } } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::th06::anm0::Anm0; + use crate::th06::ecl::{Sub, CallSub, Rank}; + use crate::th06::enemy::{Game, Position}; + use std::io::{self, Read}; + use std::fs::File; + + fn setup() -> (Rc>, Rc>) { + let file = File::open("EoSD/ST/stg1enm.anm").unwrap(); + let mut file = io::BufReader::new(file); + let mut buf = vec![]; + file.read_to_end(&mut buf).unwrap(); + let anm0 = Anm0::from_slice(&buf).unwrap(); + let anm0 = Rc::new(RefCell::new(anm0)); + let prng = Rc::new(RefCell::new(Prng::new(0))); + let game = Game::new(prng, Rank::Easy); + let game = Rc::new(RefCell::new(game)); + let enemy = Enemy::new(Position::new(0., 0.), 500, 0, 640, Rc::downgrade(&anm0), Rc::downgrade(&game)); + (game, enemy) + } + + #[test] + fn call_and_return() { + let (game, enemy) = setup(); + let ecl = Ecl { mains: vec![], subs: vec![ + Sub { instructions: vec![ + CallSub::new(0, Rank::Easy, SubInstruction::Call(1, 13, 12.)), + ]}, + Sub { instructions: vec![ + CallSub::new(0, Rank::Easy, SubInstruction::Noop()), + CallSub::new(1, Rank::Easy, SubInstruction::Return()), + ]}, + ]}; + let mut ecl_runner = EclRunner::new(&ecl, enemy, 0); + ecl_runner.run_frame(); + assert_eq!(ecl_runner.frame.ints1[0], 13); + assert_eq!(ecl_runner.frame.floats[0], 12.); + assert_eq!(ecl_runner.stack.len(), 1); + ecl_runner.run_frame(); + assert_eq!(ecl_runner.frame.ints1[0], 0); + assert_eq!(ecl_runner.frame.floats[0], 0.); + assert_eq!(ecl_runner.stack.len(), 0); + } +}