diff options
| author | Brian Cully <bjc@spork.org> | 2025-08-21 15:26:44 -0400 |
|---|---|---|
| committer | Brian Cully <bjc@spork.org> | 2025-08-21 18:53:35 -0400 |
| commit | a1c946b747325b4d7df778ebc70112338482f143 (patch) | |
| tree | 48a0d71eaf00a0198f95204327580228e268d9ef /src/forth/mod.rs | |
| parent | c4b52f5f0770d3a83d67815b18e3cd76b01f0258 (diff) | |
| download | automathon-a1c946b747325b4d7df778ebc70112338482f143.tar.gz automathon-a1c946b747325b4d7df778ebc70112338482f143.zip | |
factorial working
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"); + } +} |
