github.com/expr-lang/expr@v1.16.9/test/patch/patch_test.go (about)

     1  package patch_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/expr-lang/expr/internal/testify/require"
     7  
     8  	"github.com/expr-lang/expr"
     9  	"github.com/expr-lang/expr/ast"
    10  	"github.com/expr-lang/expr/test/mock"
    11  )
    12  
    13  type lengthPatcher struct{}
    14  
    15  func (p *lengthPatcher) Visit(node *ast.Node) {
    16  	switch n := (*node).(type) {
    17  	case *ast.MemberNode:
    18  		if prop, ok := n.Property.(*ast.StringNode); ok && prop.Value == "length" {
    19  			ast.Patch(node, &ast.BuiltinNode{
    20  				Name:      "len",
    21  				Arguments: []ast.Node{n.Node},
    22  			})
    23  		}
    24  	}
    25  }
    26  
    27  func TestPatch_length(t *testing.T) {
    28  	program, err := expr.Compile(
    29  		`String.length == 5`,
    30  		expr.Env(mock.Env{}),
    31  		expr.Patch(&lengthPatcher{}),
    32  	)
    33  	require.NoError(t, err)
    34  
    35  	env := mock.Env{String: "hello"}
    36  	output, err := expr.Run(program, env)
    37  	require.NoError(t, err)
    38  	require.Equal(t, true, output)
    39  }