diff --git a/tests/tests.bbb b/tests/tests.bbb new file mode 100644 index 0000000..cbc2b98 --- /dev/null +++ b/tests/tests.bbb @@ -0,0 +1,173 @@ +error = fn () noreturn +{ + #trap(); +} + +return_constant = fn () s32 // This is a comment +// This is a comment +{ // This is a comment + // This is a comment + return 0; // This is a comment +}// This is a comment +// This is a comment + +constant_add = fn () s32 +{ + return -1 + 1; +} + +constant_and = fn () s32 +{ + return 1 & 2; +} + +constant_div = fn () s32 +{ + return 0 / 5; +} + +constant_mul = fn () s32 +{ + return 1 * 0; +} + +constant_rem = fn () s32 +{ + return 5 % 5; +} + +constant_or = fn () s32 +{ + return 0 % 0; +} + +constant_sub = fn () s32 +{ + return 1 - 1; +} + +constant_xor = fn () s32 +{ + return 0 ^ 0; +} + +constant_shift_left = fn () s32 +{ + return 0 << 1; +} + +constant_shift_right = fn () s32 +{ + return 0 >> 1; +} + +minimal_stack = fn () s32 +{ + >a: s32 = 0; + return a; +} + +minimal_stack_arithmetic0 = fn () s32 +{ + >a: s32 = 1; + return a - 1; +} + +minimal_stack_arithmetic1 = fn () s32 +{ + >a: s32 = 1; + >b = a - 1; + return b; +} + +minimal_stack_arithmetic2 = fn () s32 +{ + >a: s32 = 1; + >b = 1 - a; + return b; +} + +stack_negation = fn () s32 +{ + >v: s32 = 0; + return -v; +} + +stack_add = fn () s32 +{ + >a: s32 = -1; + >b: s32 = 1; + return a + b; +} + +stack_sub = fn () s32 +{ + >a: s32 = 1; + >b: s32 = 1; + return a - b; +} + +extend = fn () s32 +{ + >a: s8 = 0; + return #extend(a); +} + +[export] main = fn [cc(c)] () s32 +{ + >rc = return_constant(); + if (rc != 0) error(); + + >const_add = constant_add(); + if (const_add != 0) error(); + + >const_and = constant_and(); + if (const_and != 0) error(); + + >const_div = constant_div(); + if (const_div != 0) error(); + + >const_mul = constant_mul(); + if (const_mul != 0) error(); + + >const_rem = constant_rem(); + if (const_rem != 0) error(); + + >const_or = constant_or(); + if (const_or != 0) error(); + + >const_sub = constant_sub(); + if (const_sub != 0) error(); + + >const_xor = constant_xor(); + if (const_xor != 0) error(); + + >const_shift_left = constant_shift_left(); + if (const_shift_left != 0) error(); + + >const_shift_right = constant_shift_right(); + if (const_shift_right != 0) error(); + + >min_stack = minimal_stack(); + if (min_stack != 0) error(); + + >min_stack_arithmetic0 = minimal_stack_arithmetic0(); + if (min_stack_arithmetic0 != 0) error(); + + >min_stack_arithmetic1 = minimal_stack_arithmetic1(); + if (min_stack_arithmetic1 != 0) error(); + + >min_stack_arithmetic2 = minimal_stack_arithmetic2(); + if (min_stack_arithmetic2 != 0) error(); + + >st_neg = stack_negation(); + if (st_neg != 0) error(); + + >st_add = stack_add(); + if (st_add != 0) error(); + + >st_sub = stack_sub(); + if (st_sub != 0) error(); + + return 0; +}