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
36
37
38
39

mod ast;
mod parser;
mod machine;

pub type Machine<T> = machine::Machine<T>;

#[cfg(test)]
mod tests {
    use super::*;

    fn execute_test(grammar : &str, subjects : &Vec<&str>, expected : &Vec<bool>) {
        let machine_result = Machine::<String>::new(&grammar);
        assert!(machine_result.is_ok());
        let mut machine = machine_result.ok().unwrap();
        assert!(subjects.len() == expected.len());
        for i in 0..expected.len() {
            let result = machine.execute(subjects[i].to_string().into_bytes());
            let fail = result.is_err();
            println!("{}", subjects[i]);
            println!("{:?}", result);
            assert!(!fail == expected[i]);
        }
    }

    #[test]
    fn add_multiply_variable_expression() {
        let grammar = "
            main { 
                main:1 '+' main:2
                / main:2 '*' main:3
                / 'n'
            }
        ";
        let subjects = vec!["n", "n+n", "n*n", "n+n+n", "n*n*n", "n+n*n", "n*n+n"];
        let expected = vec![true, true, true, true, true, true, true];
        execute_test(grammar, &subjects, &expected);
    }
}