diff options
Diffstat (limited to 'src/forth/mod.rs')
| -rwxr-xr-x[-rw-r--r--] | src/forth/mod.rs | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/forth/mod.rs b/src/forth/mod.rs index fdda066..5792148 100644..100755 --- a/src/forth/mod.rs +++ b/src/forth/mod.rs @@ -1,2 +1,35 @@ 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"); + } +} |
