Skip to content

Commit 3d2066c

Browse files
committed
fix(tests): add tests for precedence
1 parent 7972dbc commit 3d2066c

1 file changed

Lines changed: 37 additions & 0 deletions

File tree

src/main.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)