@@ -1304,6 +1304,113 @@ var _ = Describe("Expressions", func() {
13041304 Expect (vs ).To (Equal ([]any {int64 (1 ), int64 (2 ), int64 (3 ), int64 (4 ), int64 (5 )}))
13051305 })
13061306
1307+ It ("should evaluate a @range sequence from 0 to n-1" , func () {
1308+ expr := Expression {
1309+ Op : "@range" ,
1310+ Arg : & Expression {Op : "@list" , Literal : []Expression {
1311+ {Op : "@int" , Literal : int64 (0 )},
1312+ {Op : "@int" , Literal : int64 (5 )},
1313+ }},
1314+ }
1315+
1316+ result , err := expr .Evaluate (EvalCtx {Log : logger })
1317+ Expect (err ).NotTo (HaveOccurred ())
1318+
1319+ list , ok := result .([]any )
1320+ Expect (ok ).To (BeTrue ())
1321+ Expect (list ).To (HaveLen (5 ))
1322+ Expect (list ).To (Equal ([]any {int64 (0 ), int64 (1 ), int64 (2 ), int64 (3 ), int64 (4 )}))
1323+ })
1324+
1325+ It ("should evaluate a @range sequence with custom start" , func () {
1326+ expr := Expression {
1327+ Op : "@range" ,
1328+ Arg : & Expression {Op : "@list" , Literal : []Expression {
1329+ {Op : "@int" , Literal : int64 (3 )},
1330+ {Op : "@int" , Literal : int64 (7 )},
1331+ }},
1332+ }
1333+
1334+ result , err := expr .Evaluate (EvalCtx {Log : logger })
1335+ Expect (err ).NotTo (HaveOccurred ())
1336+
1337+ list , ok := result .([]any )
1338+ Expect (ok ).To (BeTrue ())
1339+ Expect (list ).To (HaveLen (4 ))
1340+ Expect (list ).To (Equal ([]any {int64 (3 ), int64 (4 ), int64 (5 ), int64 (6 )}))
1341+ })
1342+
1343+ It ("should return empty list on @range when start equals end" , func () {
1344+ expr := Expression {
1345+ Op : "@range" ,
1346+ Arg : & Expression {Op : "@list" , Literal : []Expression {
1347+ {Op : "@int" , Literal : int64 (5 )},
1348+ {Op : "@int" , Literal : int64 (5 )},
1349+ }},
1350+ }
1351+
1352+ result , err := expr .Evaluate (EvalCtx {Log : logger })
1353+ Expect (err ).NotTo (HaveOccurred ())
1354+
1355+ list , ok := result .([]any )
1356+ Expect (ok ).To (BeTrue ())
1357+ Expect (list ).To (BeEmpty ())
1358+ })
1359+
1360+ It ("should return empty list on @range when start is greater than end" , func () {
1361+ expr := Expression {
1362+ Op : "@range" ,
1363+ Arg : & Expression {Op : "@list" , Literal : []Expression {
1364+ {Op : "@int" , Literal : int64 (10 )},
1365+ {Op : "@int" , Literal : int64 (5 )},
1366+ }},
1367+ }
1368+
1369+ result , err := expr .Evaluate (EvalCtx {Log : logger })
1370+ Expect (err ).NotTo (HaveOccurred ())
1371+
1372+ list , ok := result .([]any )
1373+ Expect (ok ).To (BeTrue ())
1374+ Expect (list ).To (BeEmpty ())
1375+ })
1376+
1377+ It ("should evaluate a @range with JSONPath expressions for end value" , func () {
1378+ obj := map [string ]any {
1379+ "spec" : map [string ]any {
1380+ "replicas" : int64 (3 ),
1381+ },
1382+ }
1383+
1384+ expr := Expression {
1385+ Op : "@range" ,
1386+ Arg : & Expression {Op : "@list" , Literal : []Expression {
1387+ {Op : "@int" , Literal : int64 (0 )},
1388+ {Op : "@string" , Literal : "$.spec.replicas" },
1389+ }},
1390+ }
1391+
1392+ result , err := expr .Evaluate (EvalCtx {Object : obj , Log : logger })
1393+ Expect (err ).NotTo (HaveOccurred ())
1394+
1395+ list , ok := result .([]any )
1396+ Expect (ok ).To (BeTrue ())
1397+ Expect (list ).To (HaveLen (3 ))
1398+ Expect (list ).To (Equal ([]any {int64 (0 ), int64 (1 ), int64 (2 )}))
1399+ })
1400+
1401+ It ("should evaluate a @range with error on non-integer arguments" , func () {
1402+ expr := Expression {
1403+ Op : "@range" ,
1404+ Arg : & Expression {Op : "@list" , Literal : []Expression {
1405+ {Op : "@string" , Literal : "not-a-number" },
1406+ {Op : "@int" , Literal : int64 (5 )},
1407+ }},
1408+ }
1409+
1410+ _ , err := expr .Evaluate (EvalCtx {Log : logger })
1411+ Expect (err ).To (HaveOccurred ())
1412+ })
1413+
13071414 // It("should evaluate stacked @map expressions", func() {
13081415 // jsonData := `{"@map":[{"@lte":["$",2]},{"@first":[{"@map":["$.spec.x"]}]}]}`
13091416 // var exp Expression
0 commit comments