github.com/expr-lang/expr@v1.16.9/optimizer/sum_array_test.go (about) 1 package optimizer_test 2 3 import ( 4 "testing" 5 6 "github.com/expr-lang/expr/internal/testify/assert" 7 "github.com/expr-lang/expr/internal/testify/require" 8 9 "github.com/expr-lang/expr" 10 "github.com/expr-lang/expr/ast" 11 "github.com/expr-lang/expr/optimizer" 12 "github.com/expr-lang/expr/parser" 13 "github.com/expr-lang/expr/vm" 14 ) 15 16 func BenchmarkSumArray(b *testing.B) { 17 env := map[string]any{ 18 "a": 1, 19 "b": 2, 20 "c": 3, 21 "d": 4, 22 } 23 24 program, err := expr.Compile(`sum([a, b, c, d])`, expr.Env(env)) 25 require.NoError(b, err) 26 27 var out any 28 b.ResetTimer() 29 for n := 0; n < b.N; n++ { 30 out, err = vm.Run(program, env) 31 } 32 b.StopTimer() 33 34 require.NoError(b, err) 35 require.Equal(b, 10, out) 36 } 37 38 func TestOptimize_sum_array(t *testing.T) { 39 tree, err := parser.Parse(`sum([a, b])`) 40 require.NoError(t, err) 41 42 err = optimizer.Optimize(&tree.Node, nil) 43 require.NoError(t, err) 44 45 expected := &ast.BinaryNode{ 46 Operator: "+", 47 Left: &ast.IdentifierNode{Value: "a"}, 48 Right: &ast.IdentifierNode{Value: "b"}, 49 } 50 51 assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) 52 } 53 54 func TestOptimize_sum_array_3(t *testing.T) { 55 tree, err := parser.Parse(`sum([a, b, c])`) 56 require.NoError(t, err) 57 58 err = optimizer.Optimize(&tree.Node, nil) 59 require.NoError(t, err) 60 61 expected := &ast.BinaryNode{ 62 Operator: "+", 63 Left: &ast.IdentifierNode{Value: "a"}, 64 Right: &ast.BinaryNode{ 65 Operator: "+", 66 Left: &ast.IdentifierNode{Value: "b"}, 67 Right: &ast.IdentifierNode{Value: "c"}, 68 }, 69 } 70 71 assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) 72 }