forked from 0xfaded/eval
/
example_eval_test.go
54 lines (48 loc) · 1.66 KB
/
example_eval_test.go
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
package eval_test
import (
"fmt"
"reflect"
"go/parser"
"github.com/0xfaded/eval"
)
const constant1 = "A constant"
//MakeEnv creates an environment to use in eval
func makeEnv() *eval.Env {
env := &eval.Env {
Vars: make(map[string] reflect.Value),
Consts: make(map[string] reflect.Value),
Funcs: make(map[string] reflect.Value),
Types: make(map[string] reflect.Type),
Pkgs: make(map[string] eval.Pkg),
}
env.Consts["constant1"] = reflect.ValueOf(constant1)
var1 := 1
env.Vars["var1"] = reflect.ValueOf(&var1)
env.Funcs["expectResult"] = reflect.ValueOf(ExpectResult)
return env
}
// ExpectResult check the evaluation of a string with an expected result.
// More importantly though, does the steps to evaluate a string:
// 0. Create an evaluation enviroment
// 1. Parse expression using parser.ParseExpr (go/parser)
// 2. Type check expression using evalCheckExpr (0xfaded/eval)
// 3. run eval.EvalExpr (0xfaded/eval)
func ExpectResult(expr string, expected interface{}) {
env := makeEnv() // Create evaluation environment
ctx := &eval.Ctx{expr}
if e, err := parser.ParseExpr(expr); err != nil {
fmt.Printf("Failed to parse expression '%s' (%v)\n", expr, err)
return
} else if cexpr, errs := eval.CheckExpr(ctx, e, env); len(errs) != 0 {
fmt.Printf("Error checking expression '%s' (%v)\n", expr, errs)
} else if results, _, err := eval.EvalExpr(ctx, cexpr, env); err != nil {
fmt.Printf("Error evaluating expression '%s' (%v)\n", expr, err)
return
} else {
fmt.Printf("Expression '%s' yielded '%+v', expected '%+v'\n",
expr, (*results)[0].Interface(), expected)
}
}
func Example() {
ExpectResult("\"A\" + \" constant!\"!", constant1+"!")
}