MCPcopy Create free account
hub / github.com/cel-expr/cel-go / TestFunctionVariableArgBindings

Function TestFunctionVariableArgBindings

common/decls/decls_test.go:91–176  ·  view source on GitHub ↗
(t *testing.T)

Source from the content-addressed store, hash-verified

89}
90
91func TestFunctionVariableArgBindings(t *testing.T) {
92 splitImpl := func(str, delim string, count int64) ref.Val {
93 return types.DefaultTypeAdapter.NativeToValue(strings.SplitN(str, delim, int(count)))
94 }
95 splitFunc, err := NewFunction("split",
96 MemberOverload("string_split",
97 []*types.Type{types.StringType}, types.NewListType(types.StringType),
98 UnaryBinding(func(str ref.Val) ref.Val {
99 s := str.(types.String)
100 return splitImpl(string(s), "", -1)
101 })),
102 MemberOverload("string_split_string",
103 []*types.Type{types.StringType, types.StringType}, types.NewListType(types.StringType),
104 BinaryBinding(func(str, sep ref.Val) ref.Val {
105 s := str.(types.String)
106 delim := sep.(types.String)
107 return splitImpl(string(s), string(delim), -1)
108 })),
109 MemberOverload("string_split_string_int",
110 []*types.Type{types.StringType, types.StringType, types.IntType}, types.NewListType(types.StringType),
111 FunctionBinding(func(args ...ref.Val) ref.Val {
112 s := args[0].(types.String)
113 delim := args[1].(types.String)
114 count := args[2].(types.Int)
115 return splitImpl(string(s), string(delim), int64(count))
116 })),
117 )
118 if err != nil {
119 t.Fatalf("NewFunction() failed: %v", err)
120 }
121 bindings, err := splitFunc.Bindings()
122 if err != nil {
123 t.Fatalf("sizeFunc.Bindings() produced an err: %v", err)
124 }
125 if len(bindings) != 4 {
126 t.Errorf("sizeFunc.Bindings() produced %d bindings, wanted 4", len(bindings))
127 }
128 in := types.String("hi")
129 sep := types.String("")
130 out := types.DefaultTypeAdapter.NativeToValue([]string{"h", "i"})
131 for _, binding := range bindings {
132 if binding.Unary != nil {
133 if binding.Unary(in).Equal(out) != types.True {
134 t.Errorf("binding invocation got %v, wanted %v", binding.Unary(in), out)
135 }
136 celErr := binding.Unary(types.Bytes("hi"))
137 if !types.IsError(celErr) || !strings.Contains(celErr.(*types.Err).String(), "no such overload") {
138 t.Errorf("binding.Unary(bytes) got %v, wanted no such overload", celErr)
139 }
140 }
141 if binding.Binary != nil {
142 if binding.Binary(in, sep).Equal(out) != types.True {
143 t.Errorf("binding invocation got %v, wanted %v", binding.Binary(in, sep), out)
144 }
145 celErr := binding.Binary(types.Bytes("hi"), sep)
146 if !types.IsError(celErr) || !strings.Contains(celErr.(*types.Err).String(), "no such overload") {
147 t.Errorf("binding.Binary(bytes, string) got %v, wanted no such overload", celErr)
148 }

Callers

nothing calls this directly

Calls 15

NewListTypeFunction · 0.92
StringTypeAlias · 0.92
BytesTypeAlias · 0.92
IsErrorFunction · 0.92
NewUnknownFunction · 0.92
NewAttributeTrailFunction · 0.92
IsUnknownFunction · 0.92
splitImplFunction · 0.85
BindingsMethod · 0.80
NewFunctionFunction · 0.70
MemberOverloadFunction · 0.70
UnaryBindingFunction · 0.70

Tested by

no test coverage detected