@@ -284,37 +284,71 @@ func TestBuiltin_memory_limits(t *testing.T) {
284
284
}
285
285
}
286
286
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
+ })
294
316
}
295
- assert .Panics (t , func () {
296
- _ , _ = expr .Compile (`string(len("foo")) + repeat("0", 2)` , expr .Env (env ))
297
- })
298
317
})
299
318
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
+ }
315
335
})
316
336
}
317
337
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
+
318
352
func TestBuiltin_DisableBuiltin (t * testing.T ) {
319
353
t .Run ("via env" , func (t * testing.T ) {
320
354
for _ , b := range builtin .Builtins {
0 commit comments