@@ -13,6 +13,7 @@ import (
1313 "github.com/expr-lang/expr/internal/testify/assert"
1414 "github.com/expr-lang/expr/internal/testify/require"
1515 "github.com/expr-lang/expr/types"
16+ "github.com/expr-lang/expr/vm"
1617
1718 "github.com/expr-lang/expr"
1819 "github.com/expr-lang/expr/ast"
@@ -2225,26 +2226,6 @@ func TestEval_slices_out_of_bound(t *testing.T) {
22252226 }
22262227}
22272228
2228- func TestMemoryBudget (t * testing.T ) {
2229- tests := []struct {
2230- code string
2231- }{
2232- {`map(1..100, {map(1..100, {map(1..100, {0})})})` },
2233- {`len(1..10000000)` },
2234- }
2235-
2236- for _ , tt := range tests {
2237- t .Run (tt .code , func (t * testing.T ) {
2238- program , err := expr .Compile (tt .code )
2239- require .NoError (t , err , "compile error" )
2240-
2241- _ , err = expr .Run (program , nil )
2242- assert .Error (t , err , "run error" )
2243- assert .Contains (t , err .Error (), "memory budget exceeded" )
2244- })
2245- }
2246- }
2247-
22482229func TestExpr_custom_tests (t * testing.T ) {
22492230 f , err := os .Open ("custom_tests.json" )
22502231 if os .IsNotExist (err ) {
@@ -2731,3 +2712,45 @@ func TestIssue785_get_nil(t *testing.T) {
27312712 })
27322713 }
27332714}
2715+
2716+ func TestMaxNodes (t * testing.T ) {
2717+ maxNodes := uint (100 )
2718+
2719+ code := ""
2720+ for i := 0 ; i < int (maxNodes ); i ++ {
2721+ code += "1; "
2722+ }
2723+
2724+ _ , err := expr .Compile (code , expr .MaxNodes (maxNodes ))
2725+ require .Error (t , err )
2726+ assert .Contains (t , err .Error (), "exceeds maximum allowed nodes" )
2727+
2728+ _ , err = expr .Compile (code , expr .MaxNodes (maxNodes + 1 ))
2729+ require .NoError (t , err )
2730+ }
2731+
2732+ func TestMemoryBudget (t * testing.T ) {
2733+ tests := []struct {
2734+ code string
2735+ max int
2736+ }{
2737+ {`map(1..100, {map(1..100, {map(1..100, {0})})})` , - 1 },
2738+ {`len(1..10000000)` , - 1 },
2739+ {`1..100` , 100 },
2740+ }
2741+
2742+ for _ , tt := range tests {
2743+ t .Run (tt .code , func (t * testing.T ) {
2744+ program , err := expr .Compile (tt .code )
2745+ require .NoError (t , err , "compile error" )
2746+
2747+ vm := vm.VM {}
2748+ if tt .max > 0 {
2749+ vm .MemoryBudget = uint (tt .max )
2750+ }
2751+ _ , err = vm .Run (program , nil )
2752+ require .Error (t , err , "run error" )
2753+ assert .Contains (t , err .Error (), "memory budget exceeded" )
2754+ })
2755+ }
2756+ }
0 commit comments