summaryrefslogtreecommitdiffstats
path: root/src/forth/mod.rs
blob: 57921487acea15840d0e3e8cdbeaaa3814d086d3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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");
    }
}