summaryrefslogtreecommitdiffstats
path: root/src/forth/mod.rs
diff options
context:
space:
mode:
authorBrian Cully <bjc@spork.org>2025-08-21 15:26:44 -0400
committerBrian Cully <bjc@spork.org>2025-08-21 18:53:35 -0400
commita1c946b747325b4d7df778ebc70112338482f143 (patch)
tree48a0d71eaf00a0198f95204327580228e268d9ef /src/forth/mod.rs
parentc4b52f5f0770d3a83d67815b18e3cd76b01f0258 (diff)
downloadautomathon-a1c946b747325b4d7df778ebc70112338482f143.tar.gz
automathon-a1c946b747325b4d7df778ebc70112338482f143.zip
factorial working
Diffstat (limited to 'src/forth/mod.rs')
-rwxr-xr-x[-rw-r--r--]src/forth/mod.rs33
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");
+ }
+}