@@ -284,37 +284,71 @@ func TestBuiltin_memory_limits(t *testing.T) {
284284 }
285285}
286286
287- func TestBuiltin_disallow_builtins_override (t * testing.T ) {
288- t .Run ("via env" , func (t * testing.T ) {
289- env := map [string ]any {
290- "len" : func () int { return 42 },
291- "repeat" : func (a string ) string {
292- return a
293- },
287+ func TestBuiltin_allow_builtins_override (t * testing.T ) {
288+ t .Run ("via env var" , func (t * testing.T ) {
289+ for _ , name := range builtin .Names {
290+ t .Run (name , func (t * testing.T ) {
291+ env := map [string ]any {
292+ name : "hello world" ,
293+ }
294+ program , err := expr .Compile (name , expr .Env (env ))
295+ require .NoError (t , err )
296+
297+ out , err := expr .Run (program , env )
298+ require .NoError (t , err )
299+ assert .Equal (t , "hello world" , out )
300+ })
301+ }
302+ })
303+ t .Run ("via env func" , func (t * testing.T ) {
304+ for _ , name := range builtin .Names {
305+ t .Run (name , func (t * testing.T ) {
306+ env := map [string ]any {
307+ name : func () int { return 1 },
308+ }
309+ program , err := expr .Compile (fmt .Sprintf ("%s()" , name ), expr .Env (env ))
310+ require .NoError (t , err )
311+
312+ out , err := expr .Run (program , env )
313+ require .NoError (t , err )
314+ assert .Equal (t , 1 , out )
315+ })
294316 }
295- assert .Panics (t , func () {
296- _ , _ = expr .Compile (`string(len("foo")) + repeat("0", 2)` , expr .Env (env ))
297- })
298317 })
299318 t .Run ("via expr.Function" , func (t * testing.T ) {
300- length := expr .Function ("len" ,
301- func (params ... any ) (any , error ) {
302- return 42 , nil
303- },
304- new (func () int ),
305- )
306- repeat := expr .Function ("repeat" ,
307- func (params ... any ) (any , error ) {
308- return params [0 ], nil
309- },
310- new (func (string ) string ),
311- )
312- assert .Panics (t , func () {
313- _ , _ = expr .Compile (`string(len("foo")) + repeat("0", 2)` , length , repeat )
314- })
319+ for _ , name := range builtin .Names {
320+ t .Run (name , func (t * testing.T ) {
321+ fn := expr .Function (name ,
322+ func (params ... any ) (any , error ) {
323+ return 42 , nil
324+ },
325+ new (func () int ),
326+ )
327+ program , err := expr .Compile (fmt .Sprintf ("%s()" , name ), fn )
328+ require .NoError (t , err )
329+
330+ out , err := expr .Run (program , nil )
331+ require .NoError (t , err )
332+ assert .Equal (t , 42 , out )
333+ })
334+ }
315335 })
316336}
317337
338+ func TestBuiltin_override_and_still_accessible (t * testing.T ) {
339+ env := map [string ]any {
340+ "len" : func () int { return 42 },
341+ "all" : []int {1 , 2 , 3 },
342+ }
343+
344+ program , err := expr .Compile (`::all(all, #>0) && len() == 42 && ::len(all) == 3` , expr .Env (env ))
345+ require .NoError (t , err )
346+
347+ out , err := expr .Run (program , env )
348+ require .NoError (t , err )
349+ assert .Equal (t , true , out )
350+ }
351+
318352func TestBuiltin_DisableBuiltin (t * testing.T ) {
319353 t .Run ("via env" , func (t * testing.T ) {
320354 for _ , b := range builtin .Builtins {
0 commit comments