mod interp; mod parser; #[cfg(test)] mod tests { use super::{ interp::{Interp, WordList}, parser::Parser }; fn parser_for(text: &str) -> Parser { let mut p = Parser::new(text); p.parse().expect("badparse"); p } fn eprintwordlist(wordlist: &WordList) { for i in 0..wordlist.0.len() { eprintln!("wordlist[{}]: {:?}", i, wordlist.0[i]); } } // recursive! #[test] fn fac() { let prog = ": fac dup 1 > if dup 1 - fac * then ; 5 fac\n"; let p = parser_for(prog); eprintwordlist(&p.wordlist); let mut interp = Interp::new(p.wordlist); interp.run().expect("should run to completion"); eprintln!("stack: {:?}", interp.stack); assert_eq!(interp.stack.0.len(), 1, "factorial result stack len"); assert_eq!(interp.stack.0[0], 120, "factorial result value"); } }