(t *testing.T)
| 1300 | } |
| 1301 | |
| 1302 | func TestVM_MemoryBudget(t *testing.T) { |
| 1303 | tests := []struct { |
| 1304 | name string |
| 1305 | expr string |
| 1306 | memBudget uint |
| 1307 | expectError string |
| 1308 | }{ |
| 1309 | { |
| 1310 | name: "under budget", |
| 1311 | expr: "map(1..10, #)", |
| 1312 | memBudget: 100, |
| 1313 | }, |
| 1314 | { |
| 1315 | name: "exceeds budget", |
| 1316 | expr: "map(1..1000, #)", |
| 1317 | memBudget: 10, |
| 1318 | expectError: "memory budget exceeded", |
| 1319 | }, |
| 1320 | { |
| 1321 | name: "zero budget uses default", |
| 1322 | expr: "map(1..10, #)", |
| 1323 | memBudget: 0, |
| 1324 | }, |
| 1325 | } |
| 1326 | |
| 1327 | for _, tt := range tests { |
| 1328 | t.Run(tt.name, func(t *testing.T) { |
| 1329 | node, err := parser.Parse(tt.expr) |
| 1330 | require.NoError(t, err) |
| 1331 | |
| 1332 | program, err := compiler.Compile(node, nil) |
| 1333 | require.NoError(t, err) |
| 1334 | |
| 1335 | vm := vm.VM{MemoryBudget: tt.memBudget} |
| 1336 | out, err := vm.Run(program, nil) |
| 1337 | |
| 1338 | if tt.expectError != "" { |
| 1339 | require.Error(t, err) |
| 1340 | require.Contains(t, err.Error(), tt.expectError) |
| 1341 | } else { |
| 1342 | require.NoError(t, err) |
| 1343 | require.NotNil(t, out) |
| 1344 | } |
| 1345 | }) |
| 1346 | } |
| 1347 | } |
| 1348 | |
| 1349 | // Helper functions for creating deeply nested expressions |
| 1350 | func createNestedArithmeticExpr(t *testing.T, depth int) string { |
nothing calls this directly
no test coverage detected
searching dependent graphs…