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 }