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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
mod context;
mod engine;
mod error;
mod expr;
mod lexer;
mod module;
mod parser;
mod plugin;
mod position;
mod stmt;
mod token;
mod types;

#[cfg(test)]
mod tests {
    use crate::engine::Engine;
    use std::sync::{Arc, RwLock};
    // use crate::engine::Engine;
    use crate::lexer::Lexer;
    use crate::module::Module;
    use crate::parser::PipelineParser;
    // use crate::module::Module;
    // use crate::parser::PipelineParser;

    #[test]
    fn test_lexer() {
        let mut lexer = Lexer::from_script(
            "main",
            r#"
fun add(a:Int,b:Int){
    return a+b
}
        "#,
        );
        for (token, pos) in lexer.clone() {
            println!("{:?}", pos);
            let line1 = lexer.line(pos.row);
            println!("{}", line1);
            let mut p = String::from(' ');
            let mut p = p.repeat(pos.col - 1);
            p.push('↑');
            println!("{}", p);
        }
    }
    #[test]
    fn test_parser() {
        let lexer = Lexer::from_script(
            "main",
            r#"
        val a=123456;
        println(a);
        fun test():Unit{
            println("Hello,Word")
        }
        "#,
        );
        let mut m = Module::new("main");
        let mut parser = PipelineParser::new(lexer, Arc::new(RwLock::new(m)));
        let s = parser.parse_stmt_blocks().unwrap();
        // let f=parser.get_module();
        println!("{:?}", s);
        // println!("{:?}",m);
    }
    #[test]
    fn test_engine() {
        let mut e = Engine::default();
        e.compile(
            r#"
        fun range(n:Int):Array{
            let i=0
            let a=[]
            while i<n{
                a.append(i.clone())
                i=i+1
            }
            return a
        }
        "#,
        );
        e.run(
            r#"
        let a=readInt()
        print(a)
        "#,
        );
    }

    #[test]
    fn it_works() {}
}