@@ -55,10 +55,28 @@ public void testEscapeAssertion(){
5555
5656 @ Test
5757 public void testConvertInSyntax (){
58+ // Basic cases
5859 assertEquals ("include(r_obj, r_sub)" , Util .convertInSyntax ("r_sub in r_obj" ));
5960 assertEquals ("include(r_obj, r_sub.name)" , Util .convertInSyntax ("r_sub.name in r_obj" ));
6061 assertEquals ("include(r_obj.name, r_sub.name)" , Util .convertInSyntax ("r_sub.name in r_obj.name" ));
6162 assertEquals ("include(r_obj, r_sub) && r.obj == p.obj" , Util .convertInSyntax ("r_sub in r_obj && r.obj == p.obj" ));
63+
64+ // Tuple/array with single quotes - should convert to tuple() function
65+ assertEquals ("include(tuple('data2', 'data3'), r.obj)" , Util .convertInSyntax ("r.obj in ('data2', 'data3')" ));
66+
67+ // Tuple/array with double quotes - should convert to tuple() function
68+ assertEquals ("include(tuple(\" data2\" , \" data3\" ), r.obj)" , Util .convertInSyntax ("r.obj in (\" data2\" , \" data3\" )" ));
69+
70+ // Tuple/array without quotes - should convert to tuple() function
71+ assertEquals ("include(tuple(data2, data3), r.obj)" , Util .convertInSyntax ("r.obj in (data2, data3)" ));
72+
73+ // Complex expression with 'in' operator and tuple (the original issue scenario)
74+ assertEquals ("g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act || include(tuple('data2', 'data3'), r.obj)" ,
75+ Util .convertInSyntax ("g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act || r.obj in ('data2', 'data3')" ));
76+
77+ // Multiple 'in' operators
78+ assertEquals ("include(r.obj.admins, r.sub.name) && include(r.obj.admins, (\" bob\" ))" ,
79+ Util .convertInSyntax ("r.sub.name in r.obj.admins && (\" bob\" ) in r.obj.admins" ));
6280 }
6381
6482 @ Test
0 commit comments