@@ -460,6 +460,90 @@ func TestBuiltin_override_and_still_accessible(t *testing.T) {
460460 assert .Equal (t , true , out )
461461}
462462
463+ func TestBuiltin_override (t * testing.T ) {
464+ env := map [string ]any {
465+ "upper" : func (a string ) string { return strings .ToLower (a ) },
466+ }
467+ fn := expr .Function (
468+ "upper" ,
469+ func (params ... any ) (any , error ) {
470+ s := params [0 ].(string )
471+ return strings .ToUpper (s [:1 ]) + strings .ToLower (s [1 :]), nil
472+ })
473+
474+ t .Run ("with compiled env" , func (t * testing.T ) {
475+ program , err := expr .Compile (`upper("str")` , expr .Env (env ))
476+ require .NoError (t , err )
477+
478+ out , err := expr .Run (program , env )
479+ require .NoError (t , err )
480+ assert .Equal (t , "str" , out )
481+ })
482+
483+ t .Run ("with uncompiled env" , func (t * testing.T ) {
484+ program , err := expr .Compile (`upper("str")` )
485+ require .NoError (t , err )
486+
487+ out , err := expr .Run (program , env )
488+ require .NoError (t , err )
489+ assert .Equal (t , "STR" , out )
490+ })
491+
492+ t .Run ("with uncompiled env and disabled builtin" , func (t * testing.T ) {
493+ program , err := expr .Compile (`upper("str")` , expr .DisableBuiltin ("upper" ))
494+ require .NoError (t , err )
495+
496+ out , err := expr .Run (program , env )
497+ require .NoError (t , err )
498+ assert .Equal (t , "str" , out )
499+ })
500+
501+ t .Run ("with function" , func (t * testing.T ) {
502+ program , err := expr .Compile (`upper("str")` , fn )
503+ require .NoError (t , err )
504+
505+ out , err := expr .Run (program , nil )
506+ require .NoError (t , err )
507+ assert .Equal (t , "Str" , out )
508+ })
509+
510+ t .Run ("with function and compiled env" , func (t * testing.T ) {
511+ program , err := expr .Compile (`upper("str")` , fn , expr .Env (env ))
512+ require .NoError (t , err )
513+
514+ out , err := expr .Run (program , env )
515+ require .NoError (t , err )
516+ assert .Equal (t , "Str" , out )
517+ })
518+
519+ t .Run ("with function and compiled env and disabled builtin" , func (t * testing.T ) {
520+ program , err := expr .Compile (`upper("str")` , fn , expr .Env (env ), expr .DisableBuiltin ("upper" ))
521+ require .NoError (t , err )
522+
523+ out , err := expr .Run (program , env )
524+ require .NoError (t , err )
525+ assert .Equal (t , "Str" , out )
526+ })
527+
528+ t .Run ("with function and uncompiled env" , func (t * testing.T ) {
529+ program , err := expr .Compile (`upper("str")` , fn )
530+ require .NoError (t , err )
531+
532+ out , err := expr .Run (program , env )
533+ require .NoError (t , err )
534+ assert .Equal (t , "Str" , out )
535+ })
536+
537+ t .Run ("with function and uncompiled env and disabled builtin" , func (t * testing.T ) {
538+ program , err := expr .Compile (`upper("str")` , fn , expr .DisableBuiltin ("upper" ))
539+ require .NoError (t , err )
540+
541+ out , err := expr .Run (program , env )
542+ require .NoError (t , err )
543+ assert .Equal (t , "Str" , out )
544+ })
545+ }
546+
463547func TestBuiltin_DisableBuiltin (t * testing.T ) {
464548 t .Run ("via env" , func (t * testing.T ) {
465549 for _ , b := range builtin .Builtins {
0 commit comments