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  }