@@ -901,18 +901,147 @@ func TestExpr(t *testing.T) {
901
901
`all(1..3, {# > 0})` ,
902
902
true ,
903
903
},
904
+ {
905
+ `all(1..3, {# > 0}) && all(1..3, {# < 4})` ,
906
+ true ,
907
+ },
908
+ {
909
+ `all(1..3, {# > 2}) && all(1..3, {# < 4})` ,
910
+ false ,
911
+ },
912
+ {
913
+ `all(1..3, {# > 0}) && all(1..3, {# < 2})` ,
914
+ false ,
915
+ },
916
+ {
917
+ `all(1..3, {# > 2}) && all(1..3, {# < 2})` ,
918
+ false ,
919
+ },
920
+ {
921
+ `all(1..3, {# > 0}) || all(1..3, {# < 4})` ,
922
+ true ,
923
+ },
924
+ {
925
+ `all(1..3, {# > 0}) || all(1..3, {# != 2})` ,
926
+ true ,
927
+ },
928
+ {
929
+ `all(1..3, {# != 3}) || all(1..3, {# < 4})` ,
930
+ true ,
931
+ },
932
+ {
933
+ `all(1..3, {# != 3}) || all(1..3, {# != 2})` ,
934
+ false ,
935
+ },
904
936
{
905
937
`none(1..3, {# == 0})` ,
906
938
true ,
907
939
},
940
+ {
941
+ `none(1..3, {# == 0}) && none(1..3, {# == 4})` ,
942
+ true ,
943
+ },
944
+ {
945
+ `none(1..3, {# == 0}) && none(1..3, {# == 3})` ,
946
+ false ,
947
+ },
948
+ {
949
+ `none(1..3, {# == 1}) && none(1..3, {# == 4})` ,
950
+ false ,
951
+ },
952
+ {
953
+ `none(1..3, {# == 1}) && none(1..3, {# == 3})` ,
954
+ false ,
955
+ },
956
+ {
957
+ `none(1..3, {# == 0}) || none(1..3, {# == 4})` ,
958
+ true ,
959
+ },
960
+ {
961
+ `none(1..3, {# == 0}) || none(1..3, {# == 3})` ,
962
+ true ,
963
+ },
964
+ {
965
+ `none(1..3, {# == 1}) || none(1..3, {# == 4})` ,
966
+ true ,
967
+ },
968
+ {
969
+ `none(1..3, {# == 1}) || none(1..3, {# == 3})` ,
970
+ false ,
971
+ },
908
972
{
909
973
`any([1,1,0,1], {# == 0})` ,
910
974
true ,
911
975
},
976
+ {
977
+ `any(1..3, {# == 1}) && any(1..3, {# == 2})` ,
978
+ true ,
979
+ },
980
+ {
981
+ `any(1..3, {# == 0}) && any(1..3, {# == 2})` ,
982
+ false ,
983
+ },
984
+ {
985
+ `any(1..3, {# == 1}) && any(1..3, {# == 4})` ,
986
+ false ,
987
+ },
988
+ {
989
+ `any(1..3, {# == 0}) && any(1..3, {# == 4})` ,
990
+ false ,
991
+ },
992
+ {
993
+ `any(1..3, {# == 1}) || any(1..3, {# == 2})` ,
994
+ true ,
995
+ },
996
+ {
997
+ `any(1..3, {# == 0}) || any(1..3, {# == 2})` ,
998
+ true ,
999
+ },
1000
+ {
1001
+ `any(1..3, {# == 1}) || any(1..3, {# == 4})` ,
1002
+ true ,
1003
+ },
1004
+ {
1005
+ `any(1..3, {# == 0}) || any(1..3, {# == 4})` ,
1006
+ false ,
1007
+ },
912
1008
{
913
1009
`one([1,1,0,1], {# == 0}) and not one([1,0,0,1], {# == 0})` ,
914
1010
true ,
915
1011
},
1012
+ {
1013
+ `one(1..3, {# == 1}) and one(1..3, {# == 2})` ,
1014
+ true ,
1015
+ },
1016
+ {
1017
+ `one(1..3, {# == 1 || # == 2}) and one(1..3, {# == 2})` ,
1018
+ false ,
1019
+ },
1020
+ {
1021
+ `one(1..3, {# == 1}) and one(1..3, {# == 2 || # == 3})` ,
1022
+ false ,
1023
+ },
1024
+ {
1025
+ `one(1..3, {# == 1 || # == 2}) and one(1..3, {# == 2 || # == 3})` ,
1026
+ false ,
1027
+ },
1028
+ {
1029
+ `one(1..3, {# == 1}) or one(1..3, {# == 2})` ,
1030
+ true ,
1031
+ },
1032
+ {
1033
+ `one(1..3, {# == 1 || # == 2}) or one(1..3, {# == 2})` ,
1034
+ true ,
1035
+ },
1036
+ {
1037
+ `one(1..3, {# == 1}) or one(1..3, {# == 2 || # == 3})` ,
1038
+ true ,
1039
+ },
1040
+ {
1041
+ `one(1..3, {# == 1 || # == 2}) or one(1..3, {# == 2 || # == 3})` ,
1042
+ false ,
1043
+ },
1044
+
916
1045
{
917
1046
`count(1..30, {# % 3 == 0})` ,
918
1047
10 ,
@@ -2525,6 +2654,66 @@ func TestOperatorDependsOnEnv(t *testing.T) {
2525
2654
assert .Equal (t , 42 , out )
2526
2655
}
2527
2656
2657
+ func TestIssue624 (t * testing.T ) {
2658
+ type tag struct {
2659
+ Name string
2660
+ }
2661
+
2662
+ type item struct {
2663
+ Tags []tag
2664
+ }
2665
+
2666
+ i := item {
2667
+ Tags : []tag {
2668
+ {Name : "one" },
2669
+ {Name : "two" },
2670
+ },
2671
+ }
2672
+
2673
+ rule := `[
2674
+ true && true,
2675
+ one(Tags, .Name in ["one"]),
2676
+ one(Tags, .Name in ["two"]),
2677
+ one(Tags, .Name in ["one"]) && one(Tags, .Name in ["two"])
2678
+ ]`
2679
+ resp , err := expr .Eval (rule , i )
2680
+ require .NoError (t , err )
2681
+ require .Equal (t , []interface {}{true , true , true , true }, resp )
2682
+ }
2683
+
2684
+ func TestPredicateCombination (t * testing.T ) {
2685
+ tests := []struct {
2686
+ code1 string
2687
+ code2 string
2688
+ }{
2689
+ {"all(1..3, {# > 0}) && all(1..3, {# < 4})" , "all(1..3, {# > 0 && # < 4})" },
2690
+ {"all(1..3, {# > 1}) && all(1..3, {# < 4})" , "all(1..3, {# > 1 && # < 4})" },
2691
+ {"all(1..3, {# > 0}) && all(1..3, {# < 2})" , "all(1..3, {# > 0 && # < 2})" },
2692
+ {"all(1..3, {# > 1}) && all(1..3, {# < 2})" , "all(1..3, {# > 1 && # < 2})" },
2693
+
2694
+ {"any(1..3, {# > 0}) || any(1..3, {# < 4})" , "any(1..3, {# > 0 || # < 4})" },
2695
+ {"any(1..3, {# > 1}) || any(1..3, {# < 4})" , "any(1..3, {# > 1 || # < 4})" },
2696
+ {"any(1..3, {# > 0}) || any(1..3, {# < 2})" , "any(1..3, {# > 0 || # < 2})" },
2697
+ {"any(1..3, {# > 1}) || any(1..3, {# < 2})" , "any(1..3, {# > 1 || # < 2})" },
2698
+
2699
+ {"none(1..3, {# > 0}) && none(1..3, {# < 4})" , "none(1..3, {# > 0 || # < 4})" },
2700
+ {"none(1..3, {# > 1}) && none(1..3, {# < 4})" , "none(1..3, {# > 1 || # < 4})" },
2701
+ {"none(1..3, {# > 0}) && none(1..3, {# < 2})" , "none(1..3, {# > 0 || # < 2})" },
2702
+ {"none(1..3, {# > 1}) && none(1..3, {# < 2})" , "none(1..3, {# > 1 || # < 2})" },
2703
+ }
2704
+ for _ , tt := range tests {
2705
+ t .Run (tt .code1 , func (t * testing.T ) {
2706
+ out1 , err := expr .Eval (tt .code1 , nil )
2707
+ require .NoError (t , err )
2708
+
2709
+ out2 , err := expr .Eval (tt .code2 , nil )
2710
+ require .NoError (t , err )
2711
+
2712
+ require .Equal (t , out1 , out2 )
2713
+ })
2714
+ }
2715
+ }
2716
+
2528
2717
func TestArrayComparison (t * testing.T ) {
2529
2718
tests := []struct {
2530
2719
env any
0 commit comments