-
-
Notifications
You must be signed in to change notification settings - Fork 435
/
Copy pathfold_test.go
82 lines (64 loc) · 1.95 KB
/
fold_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
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
package optimizer_test
import (
"reflect"
"testing"
"github.com/expr-lang/expr/ast"
"github.com/expr-lang/expr/internal/testify/assert"
"github.com/expr-lang/expr/internal/testify/require"
"github.com/expr-lang/expr/optimizer"
"github.com/expr-lang/expr/parser"
)
func TestOptimize_constant_folding(t *testing.T) {
tree, err := parser.Parse(`[1,2,3][5*5-25]`)
require.NoError(t, err)
err = optimizer.Optimize(&tree.Node, nil)
require.NoError(t, err)
expected := &ast.MemberNode{
Node: &ast.ConstantNode{Value: []any{1, 2, 3}},
Property: &ast.IntegerNode{Value: 0},
}
assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))
}
func TestOptimize_constant_folding_with_floats(t *testing.T) {
tree, err := parser.Parse(`1 + 2.0 * ((1.0 * 2) / 2) - 0`)
require.NoError(t, err)
err = optimizer.Optimize(&tree.Node, nil)
require.NoError(t, err)
expected := &ast.FloatNode{Value: 3.0}
assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))
assert.Equal(t, reflect.Float64, tree.Node.Type().Kind())
}
func TestOptimize_constant_folding_with_bools(t *testing.T) {
tree, err := parser.Parse(`(true and false) or (true or false) or (false and false) or (true and (true == false))`)
require.NoError(t, err)
err = optimizer.Optimize(&tree.Node, nil)
require.NoError(t, err)
expected := &ast.BoolNode{Value: true}
assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))
}
func TestOptimize_constant_folding_filter_filter(t *testing.T) {
tree, err := parser.Parse(`filter(filter(1..2, true), true)`)
require.NoError(t, err)
err = optimizer.Optimize(&tree.Node, nil)
require.NoError(t, err)
expected := &ast.BuiltinNode{
Name: "filter",
Arguments: []ast.Node{
&ast.BinaryNode{
Operator: "..",
Left: &ast.IntegerNode{
Value: 1,
},
Right: &ast.IntegerNode{
Value: 2,
},
},
&ast.BoolNode{
Value: true,
},
},
Throws: false,
Map: nil,
}
assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))
}