@@ -208,6 +208,43 @@ mod test {
208208 ) ;
209209 }
210210
211+ #[ rstest]
212+ // --- Arithmetic Precedence ---
213+ #[ case:: mul_add( "2 + 3 * 4" , "u8" , 14 ) ] // (3 * 4) + 2
214+ #[ case:: add_mul( "3 * 4 + 2" , "u8" , 14 ) ] // (3 * 4) + 2
215+ #[ case:: div_sub( "10 - 6 / 2" , "u8" , 7 ) ] // 10 - (6 / 2)
216+ #[ case:: complex_maths( "1 + 2 * 3 - 4 / 2" , "u8" , 5 ) ] // 1 + 6 - 2
217+ // --- Bitwise Operations (&, |) ---
218+ #[ case:: sum_bitwise( "1 + 2 & 1" , "u8" , 1 ) ] // (1 + 2) & 1 = 3 & 1 = 1
219+ #[ case:: bitwise_and_or( "1 | 2 & 2" , "u8" , 3 ) ] // 1 | (2 & 2) = 1 | 2 = 3
220+ #[ case:: bitwise_complex( "1 + 1 | 2 * 2" , "u8" , 6 ) ] // (1+1) | (2*2) = 2 | 4 = 6
221+ // --- Comparison vs Arithmetic/Bitwise ---
222+ #[ case:: cmp_add( "1 + 2 < 4" , "bool" , 1 ) ] // (1 + 2) < 4
223+ #[ case:: cmp_mul( "10 < 2 * 6" , "bool" , 1 ) ] // 10 < (12)
224+ #[ case:: bitwise_cmp( "3 & 1 == 1" , "bool" , 1 ) ] // (3 & 1) == 1 -> 1 == 1
225+ // --- Logical Precedence ---
226+ #[ case:: cmp_logical( "1 == 1 && 2 == 3" , "bool" , 0 ) ] // (1==1) && (2==3)
227+ #[ case:: logic_precedence( "true || false && false" , "bool" , 1 ) ] // true || (false && false)
228+ #[ case:: logic_mixed( "5 > 3 && 2 == 2" , "bool" , 1 ) ]
229+ // --- Brackets (Explicit Override) ---
230+ #[ case:: brackets_sum( "(2 + 3) * 4" , "u8" , 20 ) ]
231+ #[ case:: brackets_logic( "(true || false) && false" , "bool" , 0 ) ]
232+ #[ case:: brackets_bitwise( "1 + (2 & 1)" , "u8" , 1 ) ]
233+ #[ case:: nested_brackets( "2 * (3 + (10 / 5))" , "u8" , 10 ) ]
234+ // --- Signed Operations ---
235+ #[ case:: div_signed( "-12 / -4" , "i8" , 3 ) ]
236+ #[ case:: less_signed( "-4 < -3" , "bool" , 1 ) ]
237+ #[ case:: assign_right_associative( "{ let x = (); let y = 0; x = y = 5; y }" , "u8" , 5 ) ]
238+ fn precedence_operations (
239+ #[ case] source : & str ,
240+ #[ case] return_ty : & str ,
241+ #[ case] output : u8 ,
242+ ) {
243+ assert_eq ! (
244+ run( & format!( "fn main() -> {return_ty} {{ {source} }}" ) ) ,
245+ output
246+ ) ;
247+ }
211248 #[ test]
212249 fn if_statement ( ) {
213250 assert_eq ! ( run( "fn main() -> u8 { if true { 123 } else { 99 } }" ) , 123 ) ;
0 commit comments