From 9a2fbf6f4854b1f2cfd5979b91d5b3d7e183d487 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Wed, 3 Sep 2025 19:03:48 +0900 Subject: test: merge test scripts --- tests/001.sh | 5 - tests/002.sh | 5 - tests/003.sh | 5 - tests/004.sh | 5 - tests/005.sh | 5 - tests/006.sh | 47 -------- tests/007.sh | 7 -- tests/008.sh | 9 -- tests/009.sh | 35 ------ tests/010.sh | 19 ---- tests/011.sh | 12 -- tests/012.sh | 15 --- tests/013.sh | 15 --- tests/014.sh | 19 ---- tests/015.sh | 59 ---------- tests/016.sh | 13 --- tests/017.sh | 6 - tests/018.sh | 23 ---- tests/019.sh | 33 ------ tests/020.sh | 121 -------------------- tests/021.sh | 22 ---- tests/022.sh | 15 --- tests/023.sh | 39 ------- tests/024.sh | 39 ------- tests/025.sh | 15 --- tests/026.sh | 41 ------- tests/027.sh | 70 ------------ tests/028.sh | 88 --------------- tests/029.sh | 23 ---- tests/030.sh | 51 --------- tests/031.sh | 12 -- tests/032.sh | 15 --- tests/033.sh | 44 -------- tests/034.sh | 15 --- tests/035.sh | 15 --- tests/036.sh | 25 ---- tests/037.sh | 16 --- tests/038.sh | 36 ------ tests/039.sh | 30 ----- tests/040.sh | 38 ------- tests/041.sh | 48 -------- tests/042.sh | 18 --- tests/043.sh | 15 --- tests/044.sh | 20 ---- tests/045.sh | 21 ---- tests/046.sh | 19 ---- tests/047.sh | 91 --------------- tests/048.sh | 18 --- tests/049.sh | 30 ----- tests/050.sh | 10 -- tests/051.sh | 8 -- tests/052.sh | 9 -- tests/053.sh | 31 ----- tests/054.sh | 21 ---- tests/055.sh | 51 --------- tests/056.sh | 28 ----- tests/057.sh | 11 -- tests/058.sh | 23 ---- tests/059.sh | 23 ---- tests/060.sh | 18 --- tests/061.sh | 12 -- tests/062.sh | 36 ------ tests/063.sh | 31 ----- tests/064.sh | 18 --- tests/065.sh | 6 - tests/066.sh | 13 --- tests/067.sh | 13 --- tests/068.sh | 27 ----- tests/069.sh | 16 --- tests/070.sh | 13 --- tests/071.sh | 16 --- tests/072.sh | 85 -------------- tests/073.sh | 20 ---- tests/074.sh | 20 ---- tests/075.sh | 14 --- tests/076.sh | 33 ------ tests/077.sh | 10 -- tests/078.sh | 36 ------ tests/079.sh | 25 ---- tests/080.sh | 28 ----- tests/081.sh | 16 --- tests/082.sh | 22 ---- tests/083.sh | 27 ----- tests/084.sh | 26 ----- tests/085.sh | 38 ------- tests/086.sh | 15 --- tests/087.sh | 22 ---- tests/088.sh | 33 ------ tests/089.sh | 23 ---- tests/090.sh | 19 ---- tests/091.sh | 11 -- tests/092.sh | 15 --- tests/093.sh | 20 ---- tests/094.sh | 8 -- tests/095.sh | 16 --- tests/096.sh | 39 ------- tests/097.sh | 18 --- tests/098.sh | 16 --- tests/099.sh | 9 -- tests/100.sh | 44 -------- tests/101.sh | 22 ---- tests/102.sh | 128 --------------------- tests/103.sh | 26 ----- tests/104.sh | 32 ------ tests/105.sh | 11 -- tests/106.sh | 50 -------- tests/107.sh | 42 ------- tests/108.sh | 26 ----- tests/109.sh | 10 -- tests/110.sh | 15 --- tests/111.sh | 6 - tests/112.sh | 35 ------ tests/113.sh | 26 ----- tests/114.sh | 26 ----- tests/115.sh | 185 ------------------------------ tests/116.sh | 33 ------ tests/117.sh | 31 ----- tests/118.sh | 19 ---- tests/119.sh | 13 --- tests/120.sh | 21 ---- tests/121.sh | 16 --- tests/all.sh | 2 +- tests/helpers.sh | 68 +++++++++++ tests/run.sh | 2 +- tests/test_arithmetic_operators.sh | 30 +++++ tests/test_array_basics.sh | 163 ++++++++++++++++++++++++++ tests/test_assignment_operators.sh | 49 ++++++++ tests/test_bitwise_operators.sh | 65 +++++++++++ tests/test_bool_type.sh | 14 +++ tests/test_char_literals.sh | 59 ++++++++++ tests/test_comma_operator.sh | 37 ++++++ tests/test_command_line_args.sh | 19 ++++ tests/test_comments.sh | 25 ++++ tests/test_comparison_operators.sh | 48 ++++++++ tests/test_compile_errors.sh | 33 ++++++ tests/test_compiler_output.sh | 17 +++ tests/test_compiler_version.sh | 7 ++ tests/test_conditional_errors.sh | 74 ++++++++++++ tests/test_define_macros.sh | 92 +++++++++++++++ tests/test_do_while.sh | 92 +++++++++++++++ tests/test_empty_preprocessor.sh | 10 ++ tests/test_empty_statements.sh | 7 ++ tests/test_enums.sh | 48 ++++++++ tests/test_error_directive.sh | 27 +++++ tests/test_example_programs.sh | 133 ++++++++++++++++++++++ tests/test_file_io.sh | 31 +++++ tests/test_for_loops.sh | 141 +++++++++++++++++++++++ tests/test_function_basics.sh | 87 ++++++++++++++ tests/test_function_macros.sh | 106 +++++++++++++++++ tests/test_global_variables.sh | 16 +++ tests/test_helpers.sh | 68 ----------- tests/test_identifiers.sh | 16 +++ tests/test_if_elif_else.sh | 193 +++++++++++++++++++++++++++++++ tests/test_if_else.sh | 20 ++++ tests/test_ifdef_ifndef.sh | 74 ++++++++++++ tests/test_implicit_return.sh | 19 ++++ tests/test_include_errors.sh | 52 +++++++++ tests/test_include_guards.sh | 26 +++++ tests/test_include_local.sh | 100 ++++++++++++++++ tests/test_increment_operators.sh | 29 +++++ tests/test_input_operations.sh | 37 ++++++ tests/test_invalid_directives.sh | 28 +++++ tests/test_keywords.sh | 9 ++ tests/test_line_continuation.sh | 57 ++++++++++ tests/test_local_variables.sh | 67 +++++++++++ tests/test_logical_operators.sh | 68 +++++++++++ tests/test_macro_operators.sh | 43 +++++++ tests/test_nested_conditionals.sh | 12 ++ tests/test_pointer_basics.sh | 79 +++++++++++++ tests/test_predefined_macros.sh | 55 +++++++++ tests/test_preprocessor_comments.sh | 11 ++ tests/test_printf.sh | 220 ++++++++++++++++++++++++++++++++++++ tests/test_recursive_functions.sh | 14 +++ tests/test_short_type.sh | 17 +++ tests/test_sizeof_operator.sh | 177 +++++++++++++++++++++++++++++ tests/test_stdlib_declarations.sh | 22 ++++ tests/test_string_operations.sh | 57 ++++++++++ tests/test_struct_arrays.sh | 34 ++++++ tests/test_struct_basics.sh | 121 ++++++++++++++++++++ tests/test_struct_initialization.sh | 108 ++++++++++++++++++ tests/test_ternary_operator.sh | 12 ++ tests/test_typedef_struct.sh | 85 ++++++++++++++ tests/test_undef.sh | 27 +++++ tests/test_unions.sh | 23 ++++ tests/test_variadic_functions.sh | 32 ++++++ tests/test_void_functions.sh | 49 ++++++++ 186 files changed, 3493 insertions(+), 3372 deletions(-) delete mode 100644 tests/001.sh delete mode 100644 tests/002.sh delete mode 100644 tests/003.sh delete mode 100644 tests/004.sh delete mode 100644 tests/005.sh delete mode 100644 tests/006.sh delete mode 100644 tests/007.sh delete mode 100644 tests/008.sh delete mode 100644 tests/009.sh delete mode 100644 tests/010.sh delete mode 100644 tests/011.sh delete mode 100644 tests/012.sh delete mode 100644 tests/013.sh delete mode 100644 tests/014.sh delete mode 100644 tests/015.sh delete mode 100644 tests/016.sh delete mode 100644 tests/017.sh delete mode 100644 tests/018.sh delete mode 100644 tests/019.sh delete mode 100644 tests/020.sh delete mode 100644 tests/021.sh delete mode 100644 tests/022.sh delete mode 100644 tests/023.sh delete mode 100644 tests/024.sh delete mode 100644 tests/025.sh delete mode 100644 tests/026.sh delete mode 100644 tests/027.sh delete mode 100644 tests/028.sh delete mode 100644 tests/029.sh delete mode 100644 tests/030.sh delete mode 100644 tests/031.sh delete mode 100644 tests/032.sh delete mode 100644 tests/033.sh delete mode 100644 tests/034.sh delete mode 100644 tests/035.sh delete mode 100644 tests/036.sh delete mode 100644 tests/037.sh delete mode 100644 tests/038.sh delete mode 100644 tests/039.sh delete mode 100644 tests/040.sh delete mode 100644 tests/041.sh delete mode 100644 tests/042.sh delete mode 100644 tests/043.sh delete mode 100644 tests/044.sh delete mode 100644 tests/045.sh delete mode 100644 tests/046.sh delete mode 100644 tests/047.sh delete mode 100644 tests/048.sh delete mode 100644 tests/049.sh delete mode 100644 tests/050.sh delete mode 100644 tests/051.sh delete mode 100644 tests/052.sh delete mode 100644 tests/053.sh delete mode 100644 tests/054.sh delete mode 100644 tests/055.sh delete mode 100644 tests/056.sh delete mode 100644 tests/057.sh delete mode 100644 tests/058.sh delete mode 100644 tests/059.sh delete mode 100644 tests/060.sh delete mode 100644 tests/061.sh delete mode 100644 tests/062.sh delete mode 100644 tests/063.sh delete mode 100644 tests/064.sh delete mode 100644 tests/065.sh delete mode 100644 tests/066.sh delete mode 100644 tests/067.sh delete mode 100644 tests/068.sh delete mode 100644 tests/069.sh delete mode 100644 tests/070.sh delete mode 100644 tests/071.sh delete mode 100644 tests/072.sh delete mode 100644 tests/073.sh delete mode 100644 tests/074.sh delete mode 100644 tests/075.sh delete mode 100644 tests/076.sh delete mode 100644 tests/077.sh delete mode 100644 tests/078.sh delete mode 100644 tests/079.sh delete mode 100644 tests/080.sh delete mode 100644 tests/081.sh delete mode 100644 tests/082.sh delete mode 100644 tests/083.sh delete mode 100644 tests/084.sh delete mode 100644 tests/085.sh delete mode 100644 tests/086.sh delete mode 100644 tests/087.sh delete mode 100644 tests/088.sh delete mode 100644 tests/089.sh delete mode 100644 tests/090.sh delete mode 100644 tests/091.sh delete mode 100644 tests/092.sh delete mode 100644 tests/093.sh delete mode 100644 tests/094.sh delete mode 100644 tests/095.sh delete mode 100644 tests/096.sh delete mode 100644 tests/097.sh delete mode 100644 tests/098.sh delete mode 100644 tests/099.sh delete mode 100644 tests/100.sh delete mode 100644 tests/101.sh delete mode 100644 tests/102.sh delete mode 100644 tests/103.sh delete mode 100644 tests/104.sh delete mode 100644 tests/105.sh delete mode 100644 tests/106.sh delete mode 100644 tests/107.sh delete mode 100644 tests/108.sh delete mode 100644 tests/109.sh delete mode 100644 tests/110.sh delete mode 100644 tests/111.sh delete mode 100644 tests/112.sh delete mode 100644 tests/113.sh delete mode 100644 tests/114.sh delete mode 100644 tests/115.sh delete mode 100644 tests/116.sh delete mode 100644 tests/117.sh delete mode 100644 tests/118.sh delete mode 100644 tests/119.sh delete mode 100644 tests/120.sh delete mode 100644 tests/121.sh create mode 100644 tests/helpers.sh create mode 100644 tests/test_arithmetic_operators.sh create mode 100644 tests/test_array_basics.sh create mode 100644 tests/test_assignment_operators.sh create mode 100644 tests/test_bitwise_operators.sh create mode 100644 tests/test_bool_type.sh create mode 100644 tests/test_char_literals.sh create mode 100644 tests/test_comma_operator.sh create mode 100644 tests/test_command_line_args.sh create mode 100644 tests/test_comments.sh create mode 100644 tests/test_comparison_operators.sh create mode 100644 tests/test_compile_errors.sh create mode 100644 tests/test_compiler_output.sh create mode 100644 tests/test_compiler_version.sh create mode 100644 tests/test_conditional_errors.sh create mode 100644 tests/test_define_macros.sh create mode 100644 tests/test_do_while.sh create mode 100644 tests/test_empty_preprocessor.sh create mode 100644 tests/test_empty_statements.sh create mode 100644 tests/test_enums.sh create mode 100644 tests/test_error_directive.sh create mode 100644 tests/test_example_programs.sh create mode 100644 tests/test_file_io.sh create mode 100644 tests/test_for_loops.sh create mode 100644 tests/test_function_basics.sh create mode 100644 tests/test_function_macros.sh create mode 100644 tests/test_global_variables.sh delete mode 100644 tests/test_helpers.sh create mode 100644 tests/test_identifiers.sh create mode 100644 tests/test_if_elif_else.sh create mode 100644 tests/test_if_else.sh create mode 100644 tests/test_ifdef_ifndef.sh create mode 100644 tests/test_implicit_return.sh create mode 100644 tests/test_include_errors.sh create mode 100644 tests/test_include_guards.sh create mode 100644 tests/test_include_local.sh create mode 100644 tests/test_increment_operators.sh create mode 100644 tests/test_input_operations.sh create mode 100644 tests/test_invalid_directives.sh create mode 100644 tests/test_keywords.sh create mode 100644 tests/test_line_continuation.sh create mode 100644 tests/test_local_variables.sh create mode 100644 tests/test_logical_operators.sh create mode 100644 tests/test_macro_operators.sh create mode 100644 tests/test_nested_conditionals.sh create mode 100644 tests/test_pointer_basics.sh create mode 100644 tests/test_predefined_macros.sh create mode 100644 tests/test_preprocessor_comments.sh create mode 100644 tests/test_printf.sh create mode 100644 tests/test_recursive_functions.sh create mode 100644 tests/test_short_type.sh create mode 100644 tests/test_sizeof_operator.sh create mode 100644 tests/test_stdlib_declarations.sh create mode 100644 tests/test_string_operations.sh create mode 100644 tests/test_struct_arrays.sh create mode 100644 tests/test_struct_basics.sh create mode 100644 tests/test_struct_initialization.sh create mode 100644 tests/test_ternary_operator.sh create mode 100644 tests/test_typedef_struct.sh create mode 100644 tests/test_undef.sh create mode 100644 tests/test_unions.sh create mode 100644 tests/test_variadic_functions.sh create mode 100644 tests/test_void_functions.sh (limited to 'tests') diff --git a/tests/001.sh b/tests/001.sh deleted file mode 100644 index 9337ec5..0000000 --- a/tests/001.sh +++ /dev/null @@ -1,5 +0,0 @@ -test_exit_code 42 <<'EOF' -int main() { - return 42; -} -EOF diff --git a/tests/002.sh b/tests/002.sh deleted file mode 100644 index c3fdcc9..0000000 --- a/tests/002.sh +++ /dev/null @@ -1,5 +0,0 @@ -test_exit_code 21 <<'EOF' -int main() { - return 5+20-4; -} -EOF diff --git a/tests/003.sh b/tests/003.sh deleted file mode 100644 index 61ea83f..0000000 --- a/tests/003.sh +++ /dev/null @@ -1,5 +0,0 @@ -test_exit_code 26 <<'EOF' -int main() { - return 2*3+4*5; -} -EOF diff --git a/tests/004.sh b/tests/004.sh deleted file mode 100644 index 028ef90..0000000 --- a/tests/004.sh +++ /dev/null @@ -1,5 +0,0 @@ -test_exit_code 197 <<'EOF' -int main() { - return (((3+5)/2) + (5*(9-6)) * (5+6*7)) % 256; -} -EOF diff --git a/tests/005.sh b/tests/005.sh deleted file mode 100644 index ffcd0a5..0000000 --- a/tests/005.sh +++ /dev/null @@ -1,5 +0,0 @@ -test_exit_code 30 <<'EOF' -int main() { - return (-10 + 20 * -3) + 100; -} -EOF diff --git a/tests/006.sh b/tests/006.sh deleted file mode 100644 index ee88013..0000000 --- a/tests/006.sh +++ /dev/null @@ -1,47 +0,0 @@ -test_exit_code 1 <<'EOF' -int main() { - return 0 == 0; -} -EOF - -test_exit_code 0 <<'EOF' -int main() { - return 123 != 123; -} -EOF - -test_exit_code 1 <<'EOF' -int main() { - return 123 != 456; -} -EOF - -test_exit_code 0 <<'EOF' -int main() { - return 123 == 124; -} -EOF - -test_exit_code 1 <<'EOF' -int main() { - return 123 < 567; -} -EOF - -test_exit_code 1 <<'EOF' -int main() { - return 123 <= 567; -} -EOF - -test_exit_code 1 <<'EOF' -int main() { - return 123 <= 123; -} -EOF - -test_exit_code 0 <<'EOF' -int main() { - return 123 < 123; -} -EOF diff --git a/tests/007.sh b/tests/007.sh deleted file mode 100644 index d780993..0000000 --- a/tests/007.sh +++ /dev/null @@ -1,7 +0,0 @@ -test_exit_code 42 <<'EOF' -int main() { - int foo; - foo = 42; - return foo; -} -EOF diff --git a/tests/008.sh b/tests/008.sh deleted file mode 100644 index 6de3a99..0000000 --- a/tests/008.sh +++ /dev/null @@ -1,9 +0,0 @@ -test_exit_code 70 <<'EOF' -int main() { - int foo; - int bar; - foo = 42; - bar = 28; - return foo + bar; -} -EOF diff --git a/tests/009.sh b/tests/009.sh deleted file mode 100644 index 821d330..0000000 --- a/tests/009.sh +++ /dev/null @@ -1,35 +0,0 @@ -test_exit_code 45 <<'EOF' -int main() { - int a1; - int a2; - int a3; - int a4; - int a5; - int a6; - int a7; - int a8; - int a9; - - a1 = 1; - a2 = 2; - a3 = 3; - a4 = 4; - a5 = 5; - a6 = 6; - a7 = 7; - a8 = 8; - a9 = 9; - - return - a1 + - a2 + - a3 + - a4 + - a5 + - a6 + - a7 + - a8 + - a9 + - 0; -} -EOF diff --git a/tests/010.sh b/tests/010.sh deleted file mode 100644 index 4ddf39c..0000000 --- a/tests/010.sh +++ /dev/null @@ -1,19 +0,0 @@ -test_exit_code 12 <<'EOF' -int main() { - if (1) { - return 12; - } else { - return 34; - } -} -EOF - -test_exit_code 34 <<'EOF' -int main() { - if (1 + 1 != 2) { - return 12; - } else { - return 34; - } -} -EOF diff --git a/tests/011.sh b/tests/011.sh deleted file mode 100644 index 877b8d1..0000000 --- a/tests/011.sh +++ /dev/null @@ -1,12 +0,0 @@ -test_exit_code 45 <<'EOF' -int main() { - int i; - int ret; - i = 0; - ret = 0; - for (i = 0; i < 10; i = i + 1) { - ret = ret + i; - } - return ret; -} -EOF diff --git a/tests/012.sh b/tests/012.sh deleted file mode 100644 index bee4e69..0000000 --- a/tests/012.sh +++ /dev/null @@ -1,15 +0,0 @@ -test_exit_code 25 <<'EOF' -int main() { - int i; - int ret; - i = 0; - ret = 0; - for (i = 0; i < 10; i = i + 1) { - if (i % 2 == 0) { - continue; - } - ret = ret + i; - } - return ret; -} -EOF diff --git a/tests/013.sh b/tests/013.sh deleted file mode 100644 index e8e4b13..0000000 --- a/tests/013.sh +++ /dev/null @@ -1,15 +0,0 @@ -test_exit_code 66 <<'EOF' -int main() { - int i; - int ret; - i = 0; - ret = 0; - for (i = 0; i < 100; i = i + 1) { - if (i == 12) { - break; - } - ret = ret + i; - } - return ret; -} -EOF diff --git a/tests/014.sh b/tests/014.sh deleted file mode 100644 index 7e5573a..0000000 --- a/tests/014.sh +++ /dev/null @@ -1,19 +0,0 @@ -test_exit_code 66 <<'EOF' -int foo() { - int i; - int ret; - i = 0; - ret = 0; - for (i = 0; i < 100; i = i + 1) { - if (i == 12) { - break; - } - ret = ret + i; - } - return ret; -} - -int main() { - return foo(); -} -EOF diff --git a/tests/015.sh b/tests/015.sh deleted file mode 100644 index e1964b8..0000000 --- a/tests/015.sh +++ /dev/null @@ -1,59 +0,0 @@ -test_exit_code 10 <<'EOF' -int f(int a, int b, int c, int d, int e, int f) { - return a; -} - -int main() { - return 10 * f(1, 2, 3, 4, 5, 6); -} -EOF - -test_exit_code 20 <<'EOF' -int f(int a, int b, int c, int d, int e, int f) { - return b; -} - -int main() { - return 10 * f(1, 2, 3, 4, 5, 6); -} -EOF - -test_exit_code 30 <<'EOF' -int f(int a, int b, int c, int d, int e, int f) { - return c; -} - -int main() { - return 10 * f(1, 2, 3, 4, 5, 6); -} -EOF - -test_exit_code 40 <<'EOF' -int f(int a, int b, int c, int d, int e, int f) { - return d; -} - -int main() { - return 10 * f(1, 2, 3, 4, 5, 6); -} -EOF - -test_exit_code 50 <<'EOF' -int f(int a, int b, int c, int d, int e, int f) { - return e; -} - -int main() { - return 10 * f(1, 2, 3, 4, 5, 6); -} -EOF - -test_exit_code 60 <<'EOF' -int f(int a, int b, int c, int d, int e, int f) { - return f; -} - -int main() { - return 10 * f(1, 2, 3, 4, 5, 6); -} -EOF diff --git a/tests/016.sh b/tests/016.sh deleted file mode 100644 index 82c433d..0000000 --- a/tests/016.sh +++ /dev/null @@ -1,13 +0,0 @@ -test_exit_code 89 <<'EOF' -int fib(int n) { - if (n <= 1) { - return 1; - } else { - return fib(n - 1) + fib(n - 2); - } -} - -int main() { - return fib(10); -} -EOF diff --git a/tests/017.sh b/tests/017.sh deleted file mode 100644 index 552fbf4..0000000 --- a/tests/017.sh +++ /dev/null @@ -1,6 +0,0 @@ -touch expected -test_diff <<'EOF' -int main() { - return 0; -} -EOF diff --git a/tests/018.sh b/tests/018.sh deleted file mode 100644 index a9d4e1d..0000000 --- a/tests/018.sh +++ /dev/null @@ -1,23 +0,0 @@ -touch expected -test_diff <<'EOF' -int main() { - ""; - return 0; -} -EOF - -touch expected -test_diff <<'EOF' -int main() { - "abc"; - return 0; -} -EOF - -touch expected -test_diff <<'EOF' -int main() { - "\"foo\"bar\\\n\""; - return 0; -} -EOF diff --git a/tests/019.sh b/tests/019.sh deleted file mode 100644 index 33b2e7d..0000000 --- a/tests/019.sh +++ /dev/null @@ -1,33 +0,0 @@ -touch expected -test_diff <<'EOF' -int printf(); - -int main() { - printf(""); - return 0; -} -EOF - -cat <<'EOF' > expected -Hello, World! -EOF -test_diff <<'EOF' -int printf(); - -int main() { - printf("Hello, World!\n"); - return 0; -} -EOF - -cat <<'EOF' > expected -"Hello, World!" -EOF -test_diff <<'EOF' -int printf(); - -int main() { - printf("\"Hello, World!\"\n"); - return 0; -} -EOF diff --git a/tests/020.sh b/tests/020.sh deleted file mode 100644 index abc3f8e..0000000 --- a/tests/020.sh +++ /dev/null @@ -1,121 +0,0 @@ -cat <<'EOF' > expected -1 -2 -Fizz -4 -Buzz -Fizz -7 -8 -Fizz -Buzz -11 -Fizz -13 -14 -FizzBuzz -16 -17 -Fizz -19 -Buzz -Fizz -22 -23 -Fizz -Buzz -26 -Fizz -28 -29 -FizzBuzz -31 -32 -Fizz -34 -Buzz -Fizz -37 -38 -Fizz -Buzz -41 -Fizz -43 -44 -FizzBuzz -46 -47 -Fizz -49 -Buzz -Fizz -52 -53 -Fizz -Buzz -56 -Fizz -58 -59 -FizzBuzz -61 -62 -Fizz -64 -Buzz -Fizz -67 -68 -Fizz -Buzz -71 -Fizz -73 -74 -FizzBuzz -76 -77 -Fizz -79 -Buzz -Fizz -82 -83 -Fizz -Buzz -86 -Fizz -88 -89 -FizzBuzz -91 -92 -Fizz -94 -Buzz -Fizz -97 -98 -Fizz -Buzz -EOF -test_diff <<'EOF' -int printf(); - -int main() { - int i; - for (i = 1; i <= 100; i = i + 1) { - if (i % 15 == 0) { - printf("FizzBuzz\n"); - } else if (i % 3 == 0) { - printf("Fizz\n"); - } else if (i % 5 == 0) { - printf("Buzz\n"); - } else { - printf("%d\n", i); - } - } - return 0; -} -EOF diff --git a/tests/021.sh b/tests/021.sh deleted file mode 100644 index d51057f..0000000 --- a/tests/021.sh +++ /dev/null @@ -1,22 +0,0 @@ -cat <<'EOF' > expected -EOF -test_diff <<'EOF' -int main() { - int a1; - int* a2; - char a3; - char* a4; - long a5; - long* a6; - void* a8; - int** a10; - char** a12; - long** a14; - void** a16; - int*** a18; - char*** a20; - long*** a22; - void*** a24; - return 0; -} -EOF diff --git a/tests/022.sh b/tests/022.sh deleted file mode 100644 index 93efe9b..0000000 --- a/tests/022.sh +++ /dev/null @@ -1,15 +0,0 @@ -cat <<'EOF' > expected -42 42 -EOF -test_diff <<'EOF' -int printf(); - -int main() { - int x; - int* y; - y = &x; - *y = 42; - printf("%d %d\n", x, *y); - return 0; -} -EOF diff --git a/tests/023.sh b/tests/023.sh deleted file mode 100644 index 8346e3a..0000000 --- a/tests/023.sh +++ /dev/null @@ -1,39 +0,0 @@ -cat <<'EOF' > expected -sizeof(int) = 4 -sizeof(int*) = 8 -sizeof(char) = 1 -sizeof(char*) = 8 -sizeof(long) = 8 -sizeof(long*) = 8 -sizeof(void*) = 8 -sizeof(int**) = 8 -sizeof(char**) = 8 -sizeof(long**) = 8 -sizeof(void**) = 8 -sizeof(int***) = 8 -sizeof(char***) = 8 -sizeof(long***) = 8 -sizeof(void***) = 8 -EOF -test_diff <<'EOF' -int printf(); - -int main() { - printf("sizeof(int) = %d\n", sizeof(int)); - printf("sizeof(int*) = %d\n", sizeof(int*)); - printf("sizeof(char) = %d\n", sizeof(char)); - printf("sizeof(char*) = %d\n", sizeof(char*)); - printf("sizeof(long) = %d\n", sizeof(long)); - printf("sizeof(long*) = %d\n", sizeof(long*)); - printf("sizeof(void*) = %d\n", sizeof(void*)); - printf("sizeof(int**) = %d\n", sizeof(int**)); - printf("sizeof(char**) = %d\n", sizeof(char**)); - printf("sizeof(long**) = %d\n", sizeof(long**)); - printf("sizeof(void**) = %d\n", sizeof(void**)); - printf("sizeof(int***) = %d\n", sizeof(int***)); - printf("sizeof(char***) = %d\n", sizeof(char***)); - printf("sizeof(long***) = %d\n", sizeof(long***)); - printf("sizeof(void***) = %d\n", sizeof(void***)); - return 0; -} -EOF diff --git a/tests/024.sh b/tests/024.sh deleted file mode 100644 index 9b3c484..0000000 --- a/tests/024.sh +++ /dev/null @@ -1,39 +0,0 @@ -cat <<'EOF' > expected -3 -3 -3 -EOF -test_diff <<'EOF' -int printf(); - -int main() { - char c; - int i; - long l; - c = 42; - i = 42*2; - l = 42*3; - - char* cp1; - char* cp2; - int* ip1; - int* ip2; - long* lp1; - long* lp2; - - cp1 = &c; - cp2 = &c + 3; - - ip1 = &i; - ip2 = &i + 3; - - lp1 = &l; - lp2 = &l + 3; - - printf("%d\n", cp2 - cp1); - printf("%d\n", ip2 - ip1); - printf("%d\n", lp2 - lp1); - - return 0; -} -EOF diff --git a/tests/025.sh b/tests/025.sh deleted file mode 100644 index 54fd905..0000000 --- a/tests/025.sh +++ /dev/null @@ -1,15 +0,0 @@ -cat <<'EOF' > expected -123 -EOF -test_diff <<'EOF' -int printf(); - -void foo_bar(int hoge_piyo) { - printf("%d\n", hoge_piyo); -} - -int main() { - foo_bar(123); - return 0; -} -EOF diff --git a/tests/026.sh b/tests/026.sh deleted file mode 100644 index 093adf0..0000000 --- a/tests/026.sh +++ /dev/null @@ -1,41 +0,0 @@ -cat <<'EOF' > expected -EOF -test_diff <<'EOF' -#define A 1 -int main() { - return 0; -} -EOF - -cat <<'EOF' > expected -1,2,3 -EOF -test_diff <<'EOF' -int printf(); - -#define A 1 -#define B 2 -#define C 3 - -int main() { - printf("%d,%d,%d\n", A, B, C); - return 0; -} -EOF - -cat <<'EOF' > expected -0,0,0,0 -EOF -test_diff <<'EOF' -int printf(); - -#define NULL 0 -#define TK_EOF 0 -#define TY_UNKNOWN 0 -#define AST_UNKNOWN 0 - -int main() { - printf("%d,%d,%d,%d\n", NULL, TK_EOF, TY_UNKNOWN, AST_UNKNOWN); - return 0; -} -EOF diff --git a/tests/027.sh b/tests/027.sh deleted file mode 100644 index 167d398..0000000 --- a/tests/027.sh +++ /dev/null @@ -1,70 +0,0 @@ -cat <<'EOF' > expected -EOF -test_diff <<'EOF' -struct Token { - int kind; - char* value; -}; - -struct Define { - char* from; - struct Token* to; -}; - -struct AstNode; - -struct Type { - int kind; - struct Type* to; - struct AstNode* members; -}; - -struct AstNode { - int kind; - struct AstNode* next; - struct AstNode* last; - char* name; - struct AstNode* func_params; - struct AstNode* func_body; - int int_value; - struct AstNode* expr1; - struct AstNode* expr2; - struct AstNode* expr3; - int op; - struct Type* ty; - int var_index; - struct AstNode* node1; - struct AstNode* node2; - char** str_literals; -}; - -struct LVar { - char* name; - struct Type* ty; -}; - -struct Func { - char* name; - struct Type* ty; -}; - -struct Parser { - struct Token* tokens; - int pos; - struct LVar* locals; - int n_locals; - struct Func* funcs; - int n_funcs; - char** str_literals; - int n_str_literals; -}; - -struct CodeGen { - int next_label; - int* loop_labels; -}; - -int main() { - return 0; -} -EOF diff --git a/tests/028.sh b/tests/028.sh deleted file mode 100644 index a3babed..0000000 --- a/tests/028.sh +++ /dev/null @@ -1,88 +0,0 @@ -cat <<'EOF' > expected -sizeof(struct Token) = 16 -sizeof(struct Define) = 16 -sizeof(struct Type) = 24 -sizeof(struct AstNode) = 128 -sizeof(struct LVar) = 16 -sizeof(struct Func) = 16 -sizeof(struct Parser) = 64 -sizeof(struct CodeGen) = 16 -EOF -test_diff <<'EOF' -struct Token { - int kind; - char* value; -}; - -struct Define { - char* from; - struct Token* to; -}; - -struct AstNode; - -struct Type { - int kind; - struct Type* to; - struct AstNode* members; -}; - -struct AstNode { - int kind; - struct AstNode* next; - struct AstNode* last; - char* name; - struct AstNode* func_params; - struct AstNode* func_body; - int int_value; - struct AstNode* expr1; - struct AstNode* expr2; - struct AstNode* expr3; - int op; - struct Type* ty; - int var_index; - struct AstNode* node1; - struct AstNode* node2; - char** str_literals; -}; - -struct LVar { - char* name; - struct Type* ty; -}; - -struct Func { - char* name; - struct Type* ty; -}; - -struct Parser { - struct Token* tokens; - int pos; - struct LVar* locals; - int n_locals; - struct Func* funcs; - int n_funcs; - char** str_literals; - int n_str_literals; -}; - -struct CodeGen { - int next_label; - int* loop_labels; -}; - -int printf(); - -int main() { - printf("sizeof(struct Token) = %d\n", sizeof(struct Token)); - printf("sizeof(struct Define) = %d\n", sizeof(struct Define)); - printf("sizeof(struct Type) = %d\n", sizeof(struct Type)); - printf("sizeof(struct AstNode) = %d\n", sizeof(struct AstNode)); - printf("sizeof(struct LVar) = %d\n", sizeof(struct LVar)); - printf("sizeof(struct Func) = %d\n", sizeof(struct Func)); - printf("sizeof(struct Parser) = %d\n", sizeof(struct Parser)); - printf("sizeof(struct CodeGen) = %d\n", sizeof(struct CodeGen)); - return 0; -} -EOF diff --git a/tests/029.sh b/tests/029.sh deleted file mode 100644 index 81cc5b4..0000000 --- a/tests/029.sh +++ /dev/null @@ -1,23 +0,0 @@ -cat <<'EOF' > expected -42 -123 -EOF -test_diff <<'EOF' -struct S { - int a; - int b; -}; - -int printf(); -void* calloc(); - -int main() { - struct S* sp; - sp = calloc(1, sizeof(struct S)); - sp->a = 42; - printf("%d\n", sp->a); - (*sp).b = 123; - printf("%d\n", (*sp).b); - return 0; -} -EOF diff --git a/tests/030.sh b/tests/030.sh deleted file mode 100644 index fda5dc8..0000000 --- a/tests/030.sh +++ /dev/null @@ -1,51 +0,0 @@ -cat <<'EOF' > expected -foo -EOF -test_diff <<'EOF' -int printf(); - -int foo() { - printf("foo\n"); - return 0; -} - -int bar() { - printf("bar\n"); - return 1; -} - -int main() { - if (foo() && bar()) { - printf("baz\n"); - } - - return 0; -} -EOF - -cat <<'EOF' > expected -foo -bar -baz -EOF -test_diff <<'EOF' -int printf(); - -int foo() { - printf("foo\n"); - return 0; -} - -int bar() { - printf("bar\n"); - return 1; -} - -int main() { - if (foo() || bar()) { - printf("baz\n"); - } - - return 0; -} -EOF diff --git a/tests/031.sh b/tests/031.sh deleted file mode 100644 index a2b3832..0000000 --- a/tests/031.sh +++ /dev/null @@ -1,12 +0,0 @@ -cat <<'EOF' > expected -42 -EOF -test_diff <<'EOF' -int printf(); - -int main() { - int a = 42; - printf("%d\n", a); - return 0; -} -EOF diff --git a/tests/032.sh b/tests/032.sh deleted file mode 100644 index b5812dd..0000000 --- a/tests/032.sh +++ /dev/null @@ -1,15 +0,0 @@ -cat <<'EOF' > expected -97 48 -92 39 -10 -EOF -test_diff <<'EOF' -int printf(); - -int main() { - printf("%d %d\n", 'a', '0'); - printf("%d %d\n", '\\', '\''); - printf("%d\n", '\n'); - return 0; -} -EOF diff --git a/tests/033.sh b/tests/033.sh deleted file mode 100644 index fd43548..0000000 --- a/tests/033.sh +++ /dev/null @@ -1,44 +0,0 @@ -cat <<'EOF' > expected -42 -EOF -test_diff <<'EOF' -int printf(); -void* calloc(); - -int main() { - int b; - int* a = &b; - a[0] = 42; - printf("%d\n", *a); - return 0; -} -EOF - -cat <<'EOF' > expected -0 0 -1 1 -2 2 -3 3 -4 4 -5 5 -6 6 -7 7 -8 8 -9 9 -EOF -test_diff <<'EOF' -int printf(); -void* calloc(); - -int main() { - long* a = calloc(10, sizeof(long)); - long i = 0; - for (i = 0; i < 10; i = i + 1) { - a[i] = i; - } - for (i = 0; i < 10; i = i + 1) { - printf("%d %d\n", *(a + i), a[i]); - } - return 0; -} -EOF diff --git a/tests/034.sh b/tests/034.sh deleted file mode 100644 index ebf0a4e..0000000 --- a/tests/034.sh +++ /dev/null @@ -1,15 +0,0 @@ -cat <<'EOF' > expected -EOF -test_diff <<'EOF' -struct S { - int a; -}; - -struct S* f(); - -struct S* g() {} - -int main() { - return 0; -} -EOF diff --git a/tests/035.sh b/tests/035.sh deleted file mode 100644 index f411a27..0000000 --- a/tests/035.sh +++ /dev/null @@ -1,15 +0,0 @@ -cat <<'EOF' > expected -0 -1 -0 -EOF -test_diff <<'EOF' -int printf(); - -int main() { - printf("%d\n", !1); - printf("%d\n", !0); - printf("%d\n", !23); - return 0; -} -EOF diff --git a/tests/036.sh b/tests/036.sh deleted file mode 100644 index 0975bcf..0000000 --- a/tests/036.sh +++ /dev/null @@ -1,25 +0,0 @@ -cat <<'EOF' > expected -42 -EOF -test_diff <<'EOF' -void* calloc(); -int printf(); - -struct T; - -struct S { - struct T* a; -}; - -struct T { - int b; -}; - -int main() { - struct S* s = calloc(1, sizeof(struct S)); - s->a = calloc(1, sizeof(struct T)); - s->a->b = 42; - printf("%d\n", s->a->b); - return 0; -} -EOF diff --git a/tests/037.sh b/tests/037.sh deleted file mode 100644 index bef69a5..0000000 --- a/tests/037.sh +++ /dev/null @@ -1,16 +0,0 @@ -cat <<'EOF' > expected -hi -EOF -test_diff <<'EOF' -int printf(); - -void f() { - printf("hi\n"); - return; -} - -int main() { - f(); - return 0; -} -EOF diff --git a/tests/038.sh b/tests/038.sh deleted file mode 100644 index 465108e..0000000 --- a/tests/038.sh +++ /dev/null @@ -1,36 +0,0 @@ -cat <<'EOF' > input -abc -EOF -cat <<'EOF' > expected -4 -abc -EOF -test_diff <<'EOF' -void* calloc(); -int getchar(); -int printf(); - -int read_all(char* buf) { - int c; - int n = 0; - for (0; 1; 0) { - c = getchar(); - if (c == -1) { - break; - } - buf[n] = c; - n = n + 1; - } - return n; -} - -int main() { - char* source = calloc(1024, sizeof(char)); - int source_len = read_all(source); - - printf("%d\n", source_len); - printf("%s", source); - - return 0; -} -EOF diff --git a/tests/039.sh b/tests/039.sh deleted file mode 100644 index f00d024..0000000 --- a/tests/039.sh +++ /dev/null @@ -1,30 +0,0 @@ -cat <<'EOF' > expected -65 -65 -66 -67 -68 -EOF -test_diff <<'EOF' -void* calloc(); -int printf(); - -int main() { - char* source = calloc(4, sizeof(char)); - - source[0] = 'A'; - source[1] = 'B'; - source[2] = 'C'; - source[3] = 'D'; - - int a = source[0]; - - printf("%d\n", a); - printf("%d\n", source[0]); - printf("%d\n", source[1]); - printf("%d\n", source[2]); - printf("%d\n", source[3]); - - return 0; -} -EOF diff --git a/tests/040.sh b/tests/040.sh deleted file mode 100644 index 88ba93f..0000000 --- a/tests/040.sh +++ /dev/null @@ -1,38 +0,0 @@ -cat <<'EOF' > expected -0 -1 -2 -3 -4 -10 -11 -12 -13 -14 -20 -21 -22 -23 -24 -25 -EOF -test_diff <<'EOF' -int printf(); - -int main() { - int i = 0; - for (; i < 5; i = i + 1) { - printf("%d\n", i); - } - for (i = 10; i < 15; ) { - printf("%d\n", i); - i = i + 1; - } - for (i = 20; ; i = i + 1) { - printf("%d\n", i); - if (i == 25) break; - } - - return 0; -} -EOF diff --git a/tests/041.sh b/tests/041.sh deleted file mode 100644 index a867cac..0000000 --- a/tests/041.sh +++ /dev/null @@ -1,48 +0,0 @@ -cat <<'EOF' > expected -0 -1 -2 -3 -4 - -5 -4 -3 -2 -1 -0 - -56088 - -24 - -3 -EOF -test_diff <<'EOF' -int printf(); - -int main() { - int i = 0; - for (; i < 5; i += 1) { - printf("%d\n", i); - } - printf("\n"); - for (i = 5; i >= 0; i -= 1) { - printf("%d\n", i); - } - - int x = 123; - x *= 456; - printf("\n%d\n", x); - - int y = 120; - y /= 5; - printf("\n%d\n", y); - - int z = 17; - z %= 7; - printf("\n%d\n", z); - - return 0; -} -EOF diff --git a/tests/042.sh b/tests/042.sh deleted file mode 100644 index 8e2c85b..0000000 --- a/tests/042.sh +++ /dev/null @@ -1,18 +0,0 @@ -cat <<'EOF' > expected -42,123 -EOF -test_diff <<'EOF' -int printf(); - -#define A foo_a -#define B foo_b - -int main() { - int foo_a = 42; - int foo_b = 123; - - printf("%d,%d\n", A, B); - - return 0; -} -EOF diff --git a/tests/043.sh b/tests/043.sh deleted file mode 100644 index ae00bd3..0000000 --- a/tests/043.sh +++ /dev/null @@ -1,15 +0,0 @@ -cat <<'EOF' > expected -42,123 -EOF -test_diff <<'EOF' -int printf(); - -int main() { - int _a = 42; - int _b = 123; - - printf("%d,%d\n", _a, _b); - - return 0; -} -EOF diff --git a/tests/044.sh b/tests/044.sh deleted file mode 100644 index a460ae4..0000000 --- a/tests/044.sh +++ /dev/null @@ -1,20 +0,0 @@ -cat <<'EOF' > expected -4 -0,1,2 -EOF -test_diff <<'EOF' -int printf(); - -enum E { - A, - B, - C, -}; - -int main() { - enum E x = A; - printf("%d\n", sizeof(enum E)); - printf("%d,%d,%d\n", A, B, C); - return 0; -} -EOF diff --git a/tests/045.sh b/tests/045.sh deleted file mode 100644 index efd6a30..0000000 --- a/tests/045.sh +++ /dev/null @@ -1,21 +0,0 @@ -cat <<'EOF' > expected -EOF -test_diff <<'EOF' -typedef long size_t; - -int atoi(const char*); -void* calloc(size_t, size_t); -void exit(int); -int getchar(void); -int isalnum(int); -int isalpha(int); -int isdigit(int); -int isspace(int); -void* memcpy(void*, void*, size_t); -int printf(const char*, ...); -int sprintf(char*, const char*, ...); -int strcmp(const char*, const char*); -char* strstr(const char*, const char*); - -int main() { return 0; } -EOF diff --git a/tests/046.sh b/tests/046.sh deleted file mode 100644 index 240d969..0000000 --- a/tests/046.sh +++ /dev/null @@ -1,19 +0,0 @@ -cat <<'EOF' > expected -42 -EOF -test_diff <<'EOF' -void* calloc(); -int printf(); - -struct S { - int x; -}; -typedef struct S S; - -int main() { - S* s = calloc(1, sizeof(S)); - s->x = 42; - printf("%d\n", s->x); - return 0; -} -EOF diff --git a/tests/047.sh b/tests/047.sh deleted file mode 100644 index 57d0d8f..0000000 --- a/tests/047.sh +++ /dev/null @@ -1,91 +0,0 @@ -cat <<'EOF' > expected -body 0 -foo 1 -body 1 -foo 2 -body 2 -foo 3 -body 3 -foo 4 -body 4 -foo 5 -EOF -test_diff <<'EOF' -int printf(); - -int foo(int i) { - printf("foo %d\n", i); - return i; -} - -int main() { - int i = 0; - do { - printf("body %d\n", i); - ++i; - } while (foo(i) < 5); - - return 0; -} -EOF - -cat <<'EOF' > expected -body 0 -foo 1 -body 1 -foo 2 -body 2 -EOF -test_diff <<'EOF' -int printf(); - -int foo(int i) { - printf("foo %d\n", i); - return i; -} - -int main() { - int i = 0; - do { - printf("body %d\n", i); - ++i; - if (i == 3) { - break; - } - } while (foo(i) < 5); - - return 0; -} -EOF - -cat <<'EOF' > expected -body 1 -foo 1 -foo 2 -body 3 -foo 3 -foo 4 -body 5 -foo 5 -EOF -test_diff <<'EOF' -int printf(); - -int foo(int i) { - printf("foo %d\n", i); - return i; -} - -int main() { - int i = 0; - do { - ++i; - if (i % 2 == 0) { - continue; - } - printf("body %d\n", i); - } while (foo(i) < 5); - - return 0; -} -EOF diff --git a/tests/048.sh b/tests/048.sh deleted file mode 100644 index 7286815..0000000 --- a/tests/048.sh +++ /dev/null @@ -1,18 +0,0 @@ -cat <<'EOF' > expected -argc = 4 -argv[1] = hoge -argv[2] = piyo -argv[3] = fuga -EOF -test_diff hoge piyo fuga<<'EOF' -int printf(); - -int main(int argc, char** argv) { - printf("argc = %d\n", argc); - int i; - for (i = 1; i < argc; ++i) { - printf("argv[%d] = %s\n", i, argv[i]); - } - return 0; -} -EOF diff --git a/tests/049.sh b/tests/049.sh deleted file mode 100644 index 4484324..0000000 --- a/tests/049.sh +++ /dev/null @@ -1,30 +0,0 @@ -cat <<'EOF' > input -foo -bar -baz -EOF -cat <<'EOF' > expected -foo -foo -bar -bar -baz -baz -EOF -test_diff hoge piyo fuga<<'EOF' -struct FILE; -typedef struct FILE FILE; -extern FILE* stdin; -extern FILE* stdout; -int fprintf(); -char* fgets(); -void* calloc(); - -int main() { - char* buf = calloc(256, sizeof(char)); - while (fgets(buf, 256, stdin)) { - fprintf(stdout, "%s%s", buf, buf); - } - return 0; -} -EOF diff --git a/tests/050.sh b/tests/050.sh deleted file mode 100644 index 1d3fe2d..0000000 --- a/tests/050.sh +++ /dev/null @@ -1,10 +0,0 @@ -cat <<'EOF' > expected -hello, world -EOF -test_diff <<'EOF' -int printf(); -int main() { - printf("hello, world\n"); - return 0; -} -EOF diff --git a/tests/051.sh b/tests/051.sh deleted file mode 100644 index f504664..0000000 --- a/tests/051.sh +++ /dev/null @@ -1,8 +0,0 @@ -cat <<'EOF' > expected -undefined function: f -EOF -test_compile_error <<'EOF' -int main() { - f(); -} -EOF diff --git a/tests/052.sh b/tests/052.sh deleted file mode 100644 index 73bcd5d..0000000 --- a/tests/052.sh +++ /dev/null @@ -1,9 +0,0 @@ -cat <<'EOF' > expected -EOF -test_diff <<'EOF' -// TODO: check if the token is at the beginning of line. -// TODO: check if skipped whitespaces do not contain line breaks. -int main() { - return 0; -} -EOF diff --git a/tests/053.sh b/tests/053.sh deleted file mode 100644 index f97a17d..0000000 --- a/tests/053.sh +++ /dev/null @@ -1,31 +0,0 @@ -cat <<'EOF' > expected -39 -34 -63 -92 -7 -8 -12 -10 -13 -9 -11 -EOF -test_diff <<'EOF' -int printf(); - -int main() { - printf("%d\n", '\''); - printf("%d\n", '\"'); - printf("%d\n", '\?'); - printf("%d\n", '\\'); - printf("%d\n", '\a'); - printf("%d\n", '\b'); - printf("%d\n", '\f'); - printf("%d\n", '\n'); - printf("%d\n", '\r'); - printf("%d\n", '\t'); - printf("%d\n", '\v'); - return 0; -} -EOF diff --git a/tests/054.sh b/tests/054.sh deleted file mode 100644 index 4990b89..0000000 --- a/tests/054.sh +++ /dev/null @@ -1,21 +0,0 @@ -cat <<'EOF' > expected -0 -1 -EOF -test_diff <<'EOF' -int printf(); -void* calloc(); - -struct S { - int a; - int b; -}; - -int main() { - struct S* s = calloc(1, sizeof(struct S)); - s->b = 1; - printf("%ld\n", s->a); - printf("%ld\n", s->b); - return 0; -} -EOF diff --git a/tests/055.sh b/tests/055.sh deleted file mode 100644 index 997f12b..0000000 --- a/tests/055.sh +++ /dev/null @@ -1,51 +0,0 @@ -cat <<'EOF' > header.h -int add(int a, int b) { - return a + b; -} - -int printf(const char*, ...); -EOF - -cat <<'EOF' > expected -8 -EOF -test_diff <<'EOF' -#include "header.h" - -int main() { - printf("%d\n", add(5, 3)); - return 0; -} -EOF - -mkdir -p foo -cat <<'EOF' > bar.h -#include "baz.h" -EOF -cat <<'EOF' > baz.h -#define A 123 -EOF -cat <<'EOF' > foo/bar.h -#include "baz.h" -EOF -cat <<'EOF' > foo/baz.h -#define A 456 -EOF - -cat <<'EOF' > expected -123 -456 -EOF -test_diff <<'EOF' -int printf(const char*, ...); - -int main() { -#include "bar.h" - printf("%d\n", A); - -#undef A - -#include "foo/bar.h" - printf("%d\n", A); -} -EOF diff --git a/tests/056.sh b/tests/056.sh deleted file mode 100644 index ff2ad18..0000000 --- a/tests/056.sh +++ /dev/null @@ -1,28 +0,0 @@ -cat <<'EOF' > expected -12 -EOF - -cat <<'EOF' > math.h -int multiply(int a, int b) { - return a * b; -} -EOF - -cat <<'EOF' > calc.h -#include "math.h" - -int calculate(int x) { - return multiply(x, 2); -} - -int printf(const char*, ...); -EOF - -test_diff <<'EOF' -#include "calc.h" - -int main() { - printf("%d\n", calculate(6)); - return 0; -} -EOF diff --git a/tests/057.sh b/tests/057.sh deleted file mode 100644 index 3649588..0000000 --- a/tests/057.sh +++ /dev/null @@ -1,11 +0,0 @@ -cat <<'EOF' > expected -main.c:1: cannot open include file: "nonexistent.h" -EOF - -test_compile_error <<'EOF' -#include "nonexistent.h" - -int main() { - return 0; -} -EOF diff --git a/tests/058.sh b/tests/058.sh deleted file mode 100644 index b491ad4..0000000 --- a/tests/058.sh +++ /dev/null @@ -1,23 +0,0 @@ -cat <<'EOF' > expected -include depth limit exceeded -EOF - -# Create circular include files -cat <<'EOF' > a.h -#include "b.h" -int a() { return 1; } -EOF - -cat <<'EOF' > b.h -#include "a.h" -int b() { return 2; } -EOF - -test_compile_error <<'EOF' -#include "a.h" - -int main() { - a() + b(); - return 0; -} -EOF diff --git a/tests/059.sh b/tests/059.sh deleted file mode 100644 index b478b14..0000000 --- a/tests/059.sh +++ /dev/null @@ -1,23 +0,0 @@ -# TODO: improve error message -# cat <<'EOF' > expected -# main.c:1: expected ';' or '{', but got '}' -# EOF -cat <<'EOF' > expected -main.c:1: expected ';', but got '}' -EOF - -test_compile_error <<'EOF' -int main() } -EOF - -# TODO: improve error message -# cat <<'EOF' > expected -# main.c:1: expected ';' or '{', but got '}' -# EOF -cat <<'EOF' > expected -main.c:1: expected ';', but got '123' -EOF - -test_compile_error <<'EOF' -int main() 123 -EOF diff --git a/tests/060.sh b/tests/060.sh deleted file mode 100644 index 7f80fcf..0000000 --- a/tests/060.sh +++ /dev/null @@ -1,18 +0,0 @@ -cat <<'EOF' > expected -42 -EOF - -cat <<'EOF' > header.h -#define A 42 -EOF - -test_diff <<'EOF' -#include "header.h" - -int printf(); - -int main() { - printf("%d\n", A); - return 0; -} -EOF diff --git a/tests/061.sh b/tests/061.sh deleted file mode 100644 index 019aac2..0000000 --- a/tests/061.sh +++ /dev/null @@ -1,12 +0,0 @@ -cat <<'EOF' > expected -1 -EOF - -test_diff <<'EOF' -int printf(); - -int main() { - printf("%d\n", __ducc__); - return 0; -} -EOF diff --git a/tests/062.sh b/tests/062.sh deleted file mode 100644 index 74ef2e1..0000000 --- a/tests/062.sh +++ /dev/null @@ -1,36 +0,0 @@ -cat <<'EOF' > expected -__ducc__ is defined. -A is defined. -B is undefined. -EOF - -test_diff <<'EOF' -int printf(); - -#define A 123 - -int main() { - -#ifdef __ducc__ - printf("__ducc__ is defined.\n"); -#else - printf("__ducc__ is undefined.\n"); -#endif - -#ifdef A - printf("A is defined.\n"); -#else - printf("A is undefined.\n"); -#endif - -#ifdef B - printf("B is defined.\n"); -#else - printf("B is undefined.\n"); -#endif - -#define B 456 - - return 0; -} -EOF diff --git a/tests/063.sh b/tests/063.sh deleted file mode 100644 index 4f899ee..0000000 --- a/tests/063.sh +++ /dev/null @@ -1,31 +0,0 @@ -cat <<'EOF' > expected -123 -456 789 -EOF - -test_diff <<'EOF' -#include - -int fprintf(); - -struct FILE; -typedef struct FILE FILE; - -extern FILE* stdout; - -int vfprintf(FILE*, const char*, va_list); - -void fatal_error(const char* msg, ...) { - va_list args; - va_start(args, msg); - vfprintf(stdout, msg, args); - va_end(args); - fprintf(stdout, "\n"); -} - -int main() { - fatal_error("%d", 123); - fatal_error("%d %d", 456, 789); - return 0; -} -EOF diff --git a/tests/064.sh b/tests/064.sh deleted file mode 100644 index 20a8bed..0000000 --- a/tests/064.sh +++ /dev/null @@ -1,18 +0,0 @@ -# C99: 5.1.2.2.3 -test_exit_code 0 <<'EOF' -int main() { -} -EOF - -test_exit_code 0 <<'EOF' -int main() { - 1 + 2 + 3; -} -EOF - -test_exit_code 0 <<'EOF' -int main() { - if (1); - else return 1; -} -EOF diff --git a/tests/065.sh b/tests/065.sh deleted file mode 100644 index 8588944..0000000 --- a/tests/065.sh +++ /dev/null @@ -1,6 +0,0 @@ -cat <<'EOF' > expected -EOF - -test_diff <<'EOF' -int main() { ; } -EOF diff --git a/tests/066.sh b/tests/066.sh deleted file mode 100644 index 0a5e570..0000000 --- a/tests/066.sh +++ /dev/null @@ -1,13 +0,0 @@ -cat <<'EOF' > expected -24 -EOF - -test_diff <<'EOF' -#include - -int printf(); - -int main() { - printf("%d\n", sizeof(va_list)); -} -EOF diff --git a/tests/067.sh b/tests/067.sh deleted file mode 100644 index fa8510f..0000000 --- a/tests/067.sh +++ /dev/null @@ -1,13 +0,0 @@ -cat <<'EOF' > expected -123 -460 -EOF - -test_diff <<'EOF' -int printf(); - -int main() { - printf("%d\n", 0 | 123); - printf("%d\n", 12 | 456); -} -EOF diff --git a/tests/068.sh b/tests/068.sh deleted file mode 100644 index b3fc394..0000000 --- a/tests/068.sh +++ /dev/null @@ -1,27 +0,0 @@ -cat <<'EOF' > expected -0 -1 -4 -9 -16 -25 -36 -49 -64 -81 -EOF - -test_diff <<'EOF' -int printf(); - -int main() { - int i; - int a[10]; - for (i = 0; i < 10; ++i) { - a[i] = i * i; - } - for (i = 0; i < 10; ++i) { - printf("%d\n", a[i]); - } -} -EOF diff --git a/tests/069.sh b/tests/069.sh deleted file mode 100644 index 6be03e5..0000000 --- a/tests/069.sh +++ /dev/null @@ -1,16 +0,0 @@ -cat <<'EOF' > expected -h -l -, -EOF - -test_diff <<'EOF' -int printf(); - -int main() { - char* h = " hello,world" + 1; - printf("%c\n", *h); - printf("%c\n", h[2]); - printf("%c\n", *(h + 5)); -} -EOF diff --git a/tests/070.sh b/tests/070.sh deleted file mode 100644 index e90f1e0..0000000 --- a/tests/070.sh +++ /dev/null @@ -1,13 +0,0 @@ -cat <<'EOF' > expected -123 -EOF - -test_diff <<'EOF' -#define foo() 123 - -int printf(); - -int main() { - printf("%d\n", foo()); -} -EOF diff --git a/tests/071.sh b/tests/071.sh deleted file mode 100644 index 6af34ee..0000000 --- a/tests/071.sh +++ /dev/null @@ -1,16 +0,0 @@ -cat <<'EOF' > expected -579 -975 -EOF - -test_diff <<'EOF' -#define foo 123 + 456 -#define bar() 321 + 654 - -int printf(); - -int main() { - printf("%d\n", foo); - printf("%d\n", bar()); -} -EOF diff --git a/tests/072.sh b/tests/072.sh deleted file mode 100644 index d82751c..0000000 --- a/tests/072.sh +++ /dev/null @@ -1,85 +0,0 @@ -cat <<'EOF' > expected -123 456 -0 0 -123 456 -EOF - -test_diff <<'EOF' -struct S { - int a; - int b; -}; -typedef struct S S; - -void* calloc(); -int printf(); - -int main() { - S* s1 = calloc(1, sizeof(S)); - S* s2 = calloc(1, sizeof(S)); - s1->a = 123; - s1->b = 456; - printf("%d %d\n", s1->a, s1->b); - printf("%d %d\n", s2->a, s2->b); - *s2 = *s1; - printf("%d %d\n", s2->a, s2->b); -} -EOF - -cat <<'EOF' > expected -123 456 -0 0 -123 456 -EOF - -test_diff <<'EOF' -struct S { - long a; - long b; -}; -typedef struct S S; - -void* calloc(); -int printf(); - -int main() { - S* s1 = calloc(1, sizeof(S)); - S* s2 = calloc(1, sizeof(S)); - s1->a = 123; - s1->b = 456; - printf("%d %d\n", s1->a, s1->b); - printf("%d %d\n", s2->a, s2->b); - *s2 = *s1; - printf("%d %d\n", s2->a, s2->b); -} -EOF - -cat <<'EOF' > expected -123 456 -0 0 -123 456 -EOF - -test_diff <<'EOF' -struct S { - long a; - long b; -}; -typedef struct S S; - -void* calloc(); -int printf(); - -int main() { - S s1; - S s2; - s1.a = 123; - s1.b = 456; - s2.a = 0; - s2.b = 0; - printf("%d %d\n", s1.a, s1.b); - printf("%d %d\n", s2.a, s2.b); - s2 = s1; - printf("%d %d\n", s2.a, s2.b); -} -EOF diff --git a/tests/073.sh b/tests/073.sh deleted file mode 100644 index c804692..0000000 --- a/tests/073.sh +++ /dev/null @@ -1,20 +0,0 @@ -cat <<'EOF' > expected -main.c -main.c -main.c -EOF - -cat <<'EOF' > header.h -#define A __FILE__ -EOF - -test_diff <<'EOF' -#define B __FILE__ -#include "header.h" -int printf(); -int main() { - printf("%s\n", __FILE__); - printf("%s\n", B); - printf("%s\n", A); -} -EOF diff --git a/tests/074.sh b/tests/074.sh deleted file mode 100644 index f7ac0fe..0000000 --- a/tests/074.sh +++ /dev/null @@ -1,20 +0,0 @@ -cat <<'EOF' > expected -5 -6 6 -7 7 -EOF - -cat <<'EOF' > header.h -#define A __LINE__ -EOF - -test_diff <<'EOF' -#define B __LINE__ -#include "header.h" -int printf(); -int main() { - printf("%d\n", __LINE__); - printf("%d %d\n", B, B); - printf("%d %d\n", A, A); -} -EOF diff --git a/tests/075.sh b/tests/075.sh deleted file mode 100644 index 2f15211..0000000 --- a/tests/075.sh +++ /dev/null @@ -1,14 +0,0 @@ -cat <<'EOF' > expected -EOF - -test_diff <<'EOF' -/* lorem ipsum */ -/* -lorem ipsum -*/ -// /* -/* /* - */ -int/**/main() { -} -EOF diff --git a/tests/076.sh b/tests/076.sh deleted file mode 100644 index 71de9d7..0000000 --- a/tests/076.sh +++ /dev/null @@ -1,33 +0,0 @@ -cat <<'EOF' > expected -sizeof(a) = 4 -sizeof(b) = 8 -sizeof(c) = 123 -sizeof(d) = 16 -sizeof(e) = 8 -sizeof(f) = 1968 -EOF -test_diff <<'EOF' -int printf(); - -struct S { - long x; - long y; -}; - -int main() { - int a; - long b; - char c[123]; - struct S d; - void* e; - struct S f[123]; - - printf("sizeof(a) = %d\n", sizeof(a)); - printf("sizeof(b) = %d\n", sizeof(b)); - printf("sizeof(c) = %d\n", sizeof(c)); - printf("sizeof(d) = %d\n", sizeof(d)); - printf("sizeof(e) = %d\n", sizeof(e)); - printf("sizeof(f) = %d\n", sizeof(f)); - return 0; -} -EOF diff --git a/tests/077.sh b/tests/077.sh deleted file mode 100644 index 89cfb8c..0000000 --- a/tests/077.sh +++ /dev/null @@ -1,10 +0,0 @@ -cat <<'EOF' > expected -0 -EOF -test_diff <<'EOF' -int printf(); - -int main() { - printf("%d\n", '\0'); -} -EOF diff --git a/tests/078.sh b/tests/078.sh deleted file mode 100644 index a9ac190..0000000 --- a/tests/078.sh +++ /dev/null @@ -1,36 +0,0 @@ -cat <<'EOF' > expected -__ducc__ is defined. -A is defined. -B is undefined. -EOF - -test_diff <<'EOF' -int printf(); - -#define A 123 - -int main() { - -#ifndef __ducc__ - printf("__ducc__ is undefined.\n"); -#else - printf("__ducc__ is defined.\n"); -#endif - -#ifndef A - printf("A is undefined.\n"); -#else - printf("A is defined.\n"); -#endif - -#ifndef B - printf("B is undefined.\n"); -#else - printf("B is defined.\n"); -#endif - -#define B 456 - - return 0; -} -EOF diff --git a/tests/079.sh b/tests/079.sh deleted file mode 100644 index f8f0462..0000000 --- a/tests/079.sh +++ /dev/null @@ -1,25 +0,0 @@ -cat <<'EOF' > expected -42 -EOF - -cat <<'EOF' > header.h -#ifndef HEADER_H -#define HEADER_H - -int f() { return 42; } - -#endif -EOF - -test_diff <<'EOF' -#include "header.h" -#include "header.h" -#include "header.h" - -int printf(); - -int main() { - printf("%d\n", HEADER_H HEADER_H HEADER_H f() HEADER_H HEADER_H HEADER_H); - return 0; -} -EOF diff --git a/tests/080.sh b/tests/080.sh deleted file mode 100644 index e7fb221..0000000 --- a/tests/080.sh +++ /dev/null @@ -1,28 +0,0 @@ -cat <<'EOF' > expected -44 -44 -46 -46 -44 -42 -42 -EOF - -test_diff <<'EOF' -int printf(); - -int main() { - int a = 42; - ++a; - a++; - printf("%d\n", a); - printf("%d\n", a++); - printf("%d\n", ++a); - printf("%d\n", a); - --a; - a--; - printf("%d\n", a--); - printf("%d\n", --a); - printf("%d\n", a); -} -EOF diff --git a/tests/081.sh b/tests/081.sh deleted file mode 100644 index b298a98..0000000 --- a/tests/081.sh +++ /dev/null @@ -1,16 +0,0 @@ -cat <<'EOF' > expected -2 42 -8 123 -EOF - -test_diff <<'EOF' -int printf(); - -int main() { - short a = 42; - printf("%zu %hd\n", sizeof(a), a); - short* b = &a; - *b = 123; - printf("%zu %hd\n", sizeof(b), *b); -} -EOF diff --git a/tests/082.sh b/tests/082.sh deleted file mode 100644 index d1e87d6..0000000 --- a/tests/082.sh +++ /dev/null @@ -1,22 +0,0 @@ -cat <<'EOF' > expected -8 -42 -42 -EOF - -test_diff <<'EOF' -int printf(); - -union U { - int i; - long l; -}; - -int main() { - union U u; - printf("%zu\n", sizeof(u)); - u.l = 42; - printf("%d\n", u.i); - printf("%ld\n", u.l); -} -EOF diff --git a/tests/083.sh b/tests/083.sh deleted file mode 100644 index 2152666..0000000 --- a/tests/083.sh +++ /dev/null @@ -1,27 +0,0 @@ -cat <<'EOF' > expected -main.c:1: invalid preprocessing directive, '#foo' -EOF -test_compile_error <<'EOF' -#foo - -int main() {} -EOF - -cat <<'EOF' > expected -main.c:1: invalid preprocessing directive, '#bar' -EOF -test_compile_error <<'EOF' -# bar 1 2 3 - -int main() {} -EOF - -cat <<'EOF' > expected -EOF -test_diff <<'EOF' -#if 0 -#baz -#endif - -int main() {} -EOF diff --git a/tests/084.sh b/tests/084.sh deleted file mode 100644 index 8b0a900..0000000 --- a/tests/084.sh +++ /dev/null @@ -1,26 +0,0 @@ -cat <<'EOF' > expected -A is defined -A is undefined -EOF - -test_diff <<'EOF' -int printf(); - -int main() { -#define A 1 - -#ifdef A - printf("A is defined\n"); -#else - printf("A is undefined\n"); -#endif - -#undef A - -#ifdef A - printf("A is defined\n"); -#else - printf("A is undefined\n"); -#endif -} -EOF diff --git a/tests/085.sh b/tests/085.sh deleted file mode 100644 index 9e2f32d..0000000 --- a/tests/085.sh +++ /dev/null @@ -1,38 +0,0 @@ -cat <<'EOF' > expected -0 -42 -48 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -123 -EOF - -test_diff <<'EOF' -int printf(); - -int a; -int b[12]; - -int main() { - printf("%d\n", a); - a = 42; - printf("%d\n", a); - printf("%zu\n", sizeof(b)); - int i; - for (i = 0; i < 12; ++i) { - printf("%d\n", b[i]); - } - b[11] = 123; - printf("%d\n", b[11]); -} -EOF diff --git a/tests/086.sh b/tests/086.sh deleted file mode 100644 index 93b1e14..0000000 --- a/tests/086.sh +++ /dev/null @@ -1,15 +0,0 @@ -cat <<'EOF' > expected -105 -0 -EOF - -test_diff <<'EOF' -int printf(); - -int main() { - char* s = "hi"; - while (*s++) { - printf("%d\n", *s); - } -} -EOF diff --git a/tests/087.sh b/tests/087.sh deleted file mode 100644 index 57e7612..0000000 --- a/tests/087.sh +++ /dev/null @@ -1,22 +0,0 @@ -cat <<'EOF' > expected -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -EOF - -test_diff <<'EOF' -int printf(); - -int main() { - for (int i = 0; i < 10; i++) { - printf("%d\n", i); - } -} -EOF diff --git a/tests/088.sh b/tests/088.sh deleted file mode 100644 index 06c88ee..0000000 --- a/tests/088.sh +++ /dev/null @@ -1,33 +0,0 @@ -cat <<'EOF' > expected -0 -1 -2 -3 -4 -0 -1 -2 -3 -4 -43 -42 -EOF - -test_diff <<'EOF' -int printf(); - -int main() { - for (int i = 0; i < 5; i++) { - printf("%d\n", i); - } - for (int i = 0; i < 5; i++) { - printf("%d\n", i); - } - int x = 42; - { - int x = 43; - printf("%d\n", x); - } - printf("%d\n", x); -} -EOF diff --git a/tests/089.sh b/tests/089.sh deleted file mode 100644 index e467a26..0000000 --- a/tests/089.sh +++ /dev/null @@ -1,23 +0,0 @@ -cat <<'EOF' > expected -8 -336 -EOF -test_diff <<'EOF' -int printf(); -int main() { - printf("%d\n", 1 << 3); - printf("%d\n", 21 << 4); -} -EOF - -cat <<'EOF' > expected -13 -0 -EOF -test_diff <<'EOF' -int printf(); -int main() { - printf("%d\n", 111 >> 3); - printf("%d\n", 15 >> 14); -} -EOF diff --git a/tests/090.sh b/tests/090.sh deleted file mode 100644 index e5e4df8..0000000 --- a/tests/090.sh +++ /dev/null @@ -1,19 +0,0 @@ -cat <<'EOF' > expected -0 0 -1 1 -2 2 -3 3 -4 4 -EOF - -test_diff <<'EOF' -int printf(); - -int main() { - int i = 1000; - int j = 1000; - for (i = 0, j = 0; i < 5; i++, j++) { - printf("%d %d\n", i, j); - } -} -EOF diff --git a/tests/091.sh b/tests/091.sh deleted file mode 100644 index a64c8ff..0000000 --- a/tests/091.sh +++ /dev/null @@ -1,11 +0,0 @@ -cat <<'EOF' > expected -2 5 -EOF - -test_diff <<'EOF' -int printf(); - -int main() { - printf("%d %d\n", 1 ? 2 : 3, 0 ? 4 : 5); -} -EOF diff --git a/tests/092.sh b/tests/092.sh deleted file mode 100644 index 20c3a1f..0000000 --- a/tests/092.sh +++ /dev/null @@ -1,15 +0,0 @@ -cat <<'EOF' > expected -42 123 999 -EOF - -test_diff <<'EOF' -int printf(); - -char a = 42; -short b = 123; -int c = 999; - -int main() { - printf("%d %d %d\n", a, b, c); -} -EOF diff --git a/tests/093.sh b/tests/093.sh deleted file mode 100644 index a22e168..0000000 --- a/tests/093.sh +++ /dev/null @@ -1,20 +0,0 @@ -cat <<'EOF' > expected -42 -246 -221 -EOF - -test_diff <<'EOF' -int printf(); - -#define A(x) x -#define B(x) x+x -#define C(x, y) x*y - -int main() { - printf("%d\n", A(42)); - printf("%d\n", B - (123)); - printf("%d\n", C (13, 17)); -} -EOF diff --git a/tests/094.sh b/tests/094.sh deleted file mode 100644 index ae622bc..0000000 --- a/tests/094.sh +++ /dev/null @@ -1,8 +0,0 @@ -touch expected -test_diff <<'EOF' -// A keyword is treated as a normal identifier in preprocessing phase. -#define auto int - -auto printf(); -auto main() {} -EOF diff --git a/tests/095.sh b/tests/095.sh deleted file mode 100644 index 5d274d0..0000000 --- a/tests/095.sh +++ /dev/null @@ -1,16 +0,0 @@ -cat <<'EOF' > expected -1 2 3 4 -0 0 5 -EOF - -test_diff <<'EOF' -int printf(); -int x, y, z = 5; -int main() { - int a, b; - a = 1, b = 2; - int c = 3, d = 4; - printf("%d %d %d %d\n", a, b, c, d); - printf("%d %d %d\n", x, y, z); -} -EOF diff --git a/tests/096.sh b/tests/096.sh deleted file mode 100644 index 7963ed7..0000000 --- a/tests/096.sh +++ /dev/null @@ -1,39 +0,0 @@ -cat <<'EOF' > expected -10 20 -100 300 500 -EOF - -test_diff <<'EOF' -int printf(); -in\ -t ma\ -in() { - int x = 1\ -0; - - int y = 2\ -\ -\ -0; - -#def\ -ine X 100 -#define Y 100 + \ -200 -#define Z /* -*/ 500 - // comment \ - x *= 100, y *= 200; - /* comment *\ -/ - - printf("%d %d\n", x, y); - printf("%d %d %d\n", X, Y, Z); -} -EOF - -cat <<'EOF' > expected -main.c:1: expected, but got -EOF - -echo -n 'int main() {}\' | test_compile_error diff --git a/tests/097.sh b/tests/097.sh deleted file mode 100644 index c5b8d0d..0000000 --- a/tests/097.sh +++ /dev/null @@ -1,18 +0,0 @@ -cat <<'EOF' > expected -1 -EOF - -test_diff <<'EOF' -int printf(); - -#define A -#define B - -int main() { -#if defined A && defined(B) - printf("1\n"); -#else - printf("2\n"); -#endif -} -EOF diff --git a/tests/098.sh b/tests/098.sh deleted file mode 100644 index 33c4f17..0000000 --- a/tests/098.sh +++ /dev/null @@ -1,16 +0,0 @@ -cat > foo.c <<'EOF' -int main() {} -EOF - -"$ducc" -o bar.s foo.c -if [[ $? -ne 0 ]]; then - exit 1 -fi -gcc -o a.out bar.s -./a.out "$@" -exit_code=$? - -if [[ $exit_code -ne 0 ]]; then - echo "invalid exit code: $exit_code" >&2 - exit 1 -fi diff --git a/tests/099.sh b/tests/099.sh deleted file mode 100644 index 5a744a8..0000000 --- a/tests/099.sh +++ /dev/null @@ -1,9 +0,0 @@ -touch expected -test_diff <<'EOF' -# -# -# -# -# -int main() {} -EOF diff --git a/tests/100.sh b/tests/100.sh deleted file mode 100644 index 9df8476..0000000 --- a/tests/100.sh +++ /dev/null @@ -1,44 +0,0 @@ -cat <<'EOF' > expected -1 -1 -2 -3 -EOF - -test_diff <<'EOF' -int printf(); - -int main() { -#if 1 - printf("1\n"); -#elif 1 - printf("2\n"); -#else - printf("3\n"); -#endif - -#if 1 - printf("1\n"); -#elif 0 - printf("2\n"); -#else - printf("3\n"); -#endif - -#if 0 - printf("1\n"); -#elif 1 - printf("2\n"); -#else - printf("3\n"); -#endif - -#if 0 - printf("1\n"); -#elif 0 - printf("2\n"); -#else - printf("3\n"); -#endif -} -EOF diff --git a/tests/101.sh b/tests/101.sh deleted file mode 100644 index 338b879..0000000 --- a/tests/101.sh +++ /dev/null @@ -1,22 +0,0 @@ -cat <<'EOF' > expected -main.c:2: expected '#endif', but got '' -EOF -test_compile_error <<'EOF' -#if 0 -EOF - -cat <<'EOF' > expected -main.c:3: expected '#endif', but got '' -EOF -test_compile_error <<'EOF' -#if 1 -#else -EOF - -cat <<'EOF' > expected -main.c:3: expected '#endif', but got '' -EOF -test_compile_error <<'EOF' -#if 1 -#elif 1 -EOF diff --git a/tests/102.sh b/tests/102.sh deleted file mode 100644 index b323893..0000000 --- a/tests/102.sh +++ /dev/null @@ -1,128 +0,0 @@ -cat <<'EOF' > expected -1 -1 -2 -2 -3 -4 -3 -4 -EOF - -test_diff <<'EOF' -int printf(); - -int main() { -#if 1 -# if 1 - printf("1\n"); -# else - printf("2\n"); -# endif -#else -# if 1 - printf("3\n"); -# else - printf("4\n"); -# endif -#endif - -#if 1 -# if 1 - printf("1\n"); -# else - printf("2\n"); -# endif -#else -# if 0 - printf("3\n"); -# else - printf("4\n"); -# endif -#endif - -#if 1 -# if 0 - printf("1\n"); -# else - printf("2\n"); -# endif -#else -# if 1 - printf("3\n"); -# else - printf("4\n"); -# endif -#endif - -#if 1 -# if 0 - printf("1\n"); -# else - printf("2\n"); -# endif -#else -# if 0 - printf("3\n"); -# else - printf("4\n"); -# endif -#endif - -#if 0 -# if 1 - printf("1\n"); -# else - printf("2\n"); -# endif -#else -# if 1 - printf("3\n"); -# else - printf("4\n"); -# endif -#endif - -#if 0 -# if 1 - printf("1\n"); -# else - printf("2\n"); -# endif -#else -# if 0 - printf("3\n"); -# else - printf("4\n"); -# endif -#endif - -#if 0 -# if 0 - printf("1\n"); -# else - printf("2\n"); -# endif -#else -# if 1 - printf("3\n"); -# else - printf("4\n"); -# endif -#endif - -#if 0 -# if 0 - printf("1\n"); -# else - printf("2\n"); -# endif -#else -# if 0 - printf("3\n"); -# else - printf("4\n"); -# endif -#endif -} -EOF diff --git a/tests/103.sh b/tests/103.sh deleted file mode 100644 index becfa50..0000000 --- a/tests/103.sh +++ /dev/null @@ -1,26 +0,0 @@ -cat <<'EOF' > expected -main.c:1: foo -EOF -test_compile_error <<'EOF' -#error "foo" -EOF - -cat <<'EOF' > expected -EOF -test_diff <<'EOF' -#if 0 -#error "foo" -#endif -int main() {} -EOF - -cat <<'EOF' > expected -main.c:5: foo -EOF -test_compile_error <<'EOF' -#define \ - A \ - B - -#error "foo" -EOF diff --git a/tests/104.sh b/tests/104.sh deleted file mode 100644 index d385e23..0000000 --- a/tests/104.sh +++ /dev/null @@ -1,32 +0,0 @@ -cat <<'EOF' > expected -4 -EOF -test_diff <<'EOF' -struct S0; -typedef struct S0 S0; - -struct S1 { - int x; -}; - -struct S2 { - int x; -}; - -struct S3 { - int x; -}; - -struct S4 { - int x; -}; - -struct S0 { - int x; -}; - -int printf(const char*, ...); -int main() { - printf("%zu\n", sizeof(S0)); -} -EOF diff --git a/tests/105.sh b/tests/105.sh deleted file mode 100644 index 7c673ab..0000000 --- a/tests/105.sh +++ /dev/null @@ -1,11 +0,0 @@ -cat <<'EOF' > expected -EOF -test_diff <<'EOF' -#if 0 -# if 1 -# error "not an error" -# endif -#endif - -int main() {} -EOF diff --git a/tests/106.sh b/tests/106.sh deleted file mode 100644 index 2a61a33..0000000 --- a/tests/106.sh +++ /dev/null @@ -1,50 +0,0 @@ -cat <<'EOF' > expected -main.c:1: unexpected '#elif'; no corresponding '#if'* -EOF -test_compile_error <<'EOF' -#elif -#endif - -int main() {} -EOF - -cat <<'EOF' > expected -main.c:1: unexpected '#endif'; no corresponding '#if'* -EOF -test_compile_error <<'EOF' -#endif - -int main() {} -EOF - -cat <<'EOF' > expected -main.c:1: unexpected '#else'; no corresponding '#if'* -EOF -test_compile_error <<'EOF' -#else -#endif - -int main() {} -EOF - -cat <<'EOF' > expected -main.c:4: expected '#endif', but got '' -EOF -test_compile_error <<'EOF' -#if 1 - -int main() {} -EOF - -cat <<'EOF' > a.h -#if 1 -EOF -cat <<'EOF' > expected -./a.h:2: expected '#endif', but got '' -EOF -test_compile_error <<'EOF' -#include "a.h" -#endif - -int main() {} -EOF diff --git a/tests/107.sh b/tests/107.sh deleted file mode 100644 index bb0c1a2..0000000 --- a/tests/107.sh +++ /dev/null @@ -1,42 +0,0 @@ -cat <<'EOF' > expected -foobar=100 -prefix_test=200 -test_suffix=300 -var_1=10 -var_2=20 -var_A=30 -number_12=12 -EOF - -test_diff <<'EOF' -int printf(); - -#define CONCAT(a, b) a##b -#define PREFIX(name) prefix_##name -#define SUFFIX(name) name##_suffix - -int CONCAT(foo, bar) = 100; -int PREFIX(test) = 200; -int SUFFIX(test) = 300; - -#define MAKE_VAR(n) var_##n -int MAKE_VAR(1) = 10; -int MAKE_VAR(2) = 20; - -#define A 0 -int MAKE_VAR(A) = 30; - -#define NUMBER(x, y) number_##x##y -int NUMBER(1, 2) = 12; - -int main() { - printf("foobar=%d\n", foobar); - printf("prefix_test=%d\n", prefix_test); - printf("test_suffix=%d\n", test_suffix); - printf("var_1=%d\n", var_1); - printf("var_2=%d\n", var_2); - printf("var_A=%d\n", var_A); - printf("number_12=%d\n", number_12); - return 0; -} -EOF diff --git a/tests/108.sh b/tests/108.sh deleted file mode 100644 index 7dab53b..0000000 --- a/tests/108.sh +++ /dev/null @@ -1,26 +0,0 @@ -cat <<'EOF' > expected -123 -EOF -test_diff <<'EOF' -#define A(x) x - -int printf(); - -int main() { - printf("%d\n", A ( 123 )); -} -EOF - -cat <<'EOF' > expected -main.c:4: expected ')', but got '' -EOF -test_compile_error <<'EOF' -#define A(x) x - -int main() { -#if A ( - 123) < A(345) - printf("1\n"); -#endif -} -EOF diff --git a/tests/109.sh b/tests/109.sh deleted file mode 100644 index 40b2c82..0000000 --- a/tests/109.sh +++ /dev/null @@ -1,10 +0,0 @@ -cat <<'EOF' > expected -EOF - -test_diff <<'EOF' -#if 1 // a -#else // b -#endif // c - -int main() {} -EOF diff --git a/tests/110.sh b/tests/110.sh deleted file mode 100644 index 4d48752..0000000 --- a/tests/110.sh +++ /dev/null @@ -1,15 +0,0 @@ -cat <<'EOF' > expected -main.c:1: cannot open include file: "hoge.h" -EOF - -test_compile_error <<'EOF' -#include "hoge.h" -EOF - -cat <<'EOF' > expected -main.c:1: cannot resolve include file name: -EOF - -test_compile_error <<'EOF' -#include -EOF diff --git a/tests/111.sh b/tests/111.sh deleted file mode 100644 index 5b21831..0000000 --- a/tests/111.sh +++ /dev/null @@ -1,6 +0,0 @@ -expected="ducc v0.2.0" - -if [[ "$("$ducc" --version)" != "$expected" ]]; then - echo "invalid output" >&2 - exit 1 -fi diff --git a/tests/112.sh b/tests/112.sh deleted file mode 100644 index c56e0d6..0000000 --- a/tests/112.sh +++ /dev/null @@ -1,35 +0,0 @@ -cat <<'EOF' > expected -42 -100 200 -300 -0 -1 2 3 -15 -42 -123 -879 -EOF - -test_diff <<'EOF' -int printf(); - -#define ADD(a, b) ((a) + (b)) -#define PRINT_TWO(x, y) printf("%d %d\n", x, y) -#define MAX(a, b) ((a) > (b) ? (a) : (b)) -#define NESTED(x) (x) -#define CONCAT3(a, b, c) a ## b ## c - -int main() { - printf("%d\n", ADD(40, 2)); - PRINT_TWO(100, 200); - printf("%d\n", MAX(100 + 200, 250)); - printf("%d\n"); - NESTED((printf("1 "), printf("2 "), printf("3\n"), 0)); - - int x = 5, y = 10; - printf("%d\n", ADD(x + 2, y - 2)); - printf("%d\n", ADD(MAX(10, 20), MAX(15 + 5, 22))); - printf("%d\n", ADD( 100 , 23 )); - printf("%d\n", ADD(NESTED((100 + 200)), MAX((123 + 456), (111 + 222)))); -} -EOF diff --git a/tests/113.sh b/tests/113.sh deleted file mode 100644 index 94e6e5f..0000000 --- a/tests/113.sh +++ /dev/null @@ -1,26 +0,0 @@ -cat <<'EOF' > expected -10,11,20,21 -0,5,6 -EOF - -test_diff <<'EOF' -int printf(); - -enum E1 { - A = 10, - B, - C = 20, - D, -}; - -enum E2 { - E, - F = 5, - G -}; - -int main() { - printf("%d,%d,%d,%d\n", A, B, C, D); - printf("%d,%d,%d\n", E, F, G); -} -EOF diff --git a/tests/114.sh b/tests/114.sh deleted file mode 100644 index 1ba1e8a..0000000 --- a/tests/114.sh +++ /dev/null @@ -1,26 +0,0 @@ -cat <<'EOF' > expected -1 -7 -6 -4 -3 2 3 0 -EOF -test_diff <<'EOF' -int printf(); - -int main() { - int a = 5; - int b = 3; - - printf("%d\n", a & b); - printf("%d\n", a | b); - printf("%d\n", a ^ b); - printf("%d\n", 2 + 3 & 4); - - int c = 1 + 2 & 3; - int d = 4 & 5 ^ 6; - int e = 1 ^ 2 | 3; - int f = 0 | 1 & 2; - printf("%d %d %d %d\n", c, d, e, f); -} -EOF diff --git a/tests/115.sh b/tests/115.sh deleted file mode 100644 index ea7ca0b..0000000 --- a/tests/115.sh +++ /dev/null @@ -1,185 +0,0 @@ -cat <<'EOF' > expected -1 -1 -1 -1 -1 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -4 -4 -4 -4 -4 -4 -4 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -EOF - -test_diff <<'EOF' -int printf(); - -int main() { - printf("%d\n", sizeof(char)); - printf("%d\n", sizeof(signed char)); - printf("%d\n", sizeof(char signed)); - printf("%d\n", sizeof(unsigned char)); - printf("%d\n", sizeof(char unsigned)); - - printf("%d\n", sizeof(short)); - printf("%d\n", sizeof(signed short)); - printf("%d\n", sizeof(short signed)); - printf("%d\n", sizeof(short int)); - printf("%d\n", sizeof(int short)); - printf("%d\n", sizeof(signed short int)); - printf("%d\n", sizeof(signed int short)); - printf("%d\n", sizeof(short signed int)); - printf("%d\n", sizeof(short int signed)); - printf("%d\n", sizeof(int short signed)); - printf("%d\n", sizeof(int signed short)); - - printf("%d\n", sizeof(unsigned short)); - printf("%d\n", sizeof(short unsigned)); - printf("%d\n", sizeof(unsigned short int)); - printf("%d\n", sizeof(unsigned int short)); - printf("%d\n", sizeof(short unsigned int)); - printf("%d\n", sizeof(short int unsigned)); - printf("%d\n", sizeof(int short unsigned)); - printf("%d\n", sizeof(int unsigned short)); - - printf("%d\n", sizeof(int)); - printf("%d\n", sizeof(signed)); - printf("%d\n", sizeof(signed int)); - printf("%d\n", sizeof(int signed)); - - printf("%d\n", sizeof(unsigned)); - printf("%d\n", sizeof(unsigned int)); - printf("%d\n", sizeof(int unsigned)); - - printf("%d\n", sizeof(long)); - printf("%d\n", sizeof(signed long)); - printf("%d\n", sizeof(long signed)); - printf("%d\n", sizeof(long int)); - printf("%d\n", sizeof(int long)); - printf("%d\n", sizeof(signed long int)); - printf("%d\n", sizeof(signed int long)); - printf("%d\n", sizeof(long signed int)); - printf("%d\n", sizeof(long int signed)); - printf("%d\n", sizeof(int long signed)); - printf("%d\n", sizeof(int signed long)); - - printf("%d\n", sizeof(unsigned long)); - printf("%d\n", sizeof(long unsigned)); - printf("%d\n", sizeof(unsigned long int)); - printf("%d\n", sizeof(unsigned int long)); - printf("%d\n", sizeof(long unsigned int)); - printf("%d\n", sizeof(long int unsigned)); - printf("%d\n", sizeof(int long unsigned)); - printf("%d\n", sizeof(int unsigned long)); - - printf("%d\n", sizeof(long long)); - printf("%d\n", sizeof(signed long long)); - printf("%d\n", sizeof(long signed long)); - printf("%d\n", sizeof(long long signed)); - printf("%d\n", sizeof(long long int)); - printf("%d\n", sizeof(long int long)); - printf("%d\n", sizeof(int long long)); - printf("%d\n", sizeof(signed long long int)); - printf("%d\n", sizeof(signed long int long)); - printf("%d\n", sizeof(signed int long long)); - printf("%d\n", sizeof(long signed long int)); - printf("%d\n", sizeof(long signed int long)); - printf("%d\n", sizeof(int signed long long)); - printf("%d\n", sizeof(long long signed int)); - printf("%d\n", sizeof(long int signed long)); - printf("%d\n", sizeof(int long signed long)); - printf("%d\n", sizeof(long long int signed)); - printf("%d\n", sizeof(long int long signed)); - printf("%d\n", sizeof(int long long signed)); - - printf("%d\n", sizeof(unsigned long long)); - printf("%d\n", sizeof(long unsigned long)); - printf("%d\n", sizeof(long long unsigned)); - printf("%d\n", sizeof(unsigned long long int)); - printf("%d\n", sizeof(unsigned long int long)); - printf("%d\n", sizeof(unsigned int long long)); - printf("%d\n", sizeof(long unsigned long int)); - printf("%d\n", sizeof(long unsigned int long)); - printf("%d\n", sizeof(int unsigned long long)); - printf("%d\n", sizeof(long long unsigned int)); - printf("%d\n", sizeof(long int unsigned long)); - printf("%d\n", sizeof(int long unsigned long)); - printf("%d\n", sizeof(long long int unsigned)); - printf("%d\n", sizeof(long int long unsigned)); - printf("%d\n", sizeof(int long long unsigned)); -} -EOF diff --git a/tests/116.sh b/tests/116.sh deleted file mode 100644 index 628c0d3..0000000 --- a/tests/116.sh +++ /dev/null @@ -1,33 +0,0 @@ -cat <<'EOF' > expected -20 -10 -20 -30 -40 -50 -EOF - -test_diff <<'EOF' -int printf(); - -struct S { - int a[5]; -}; - -int main() { - struct S x; - x.a[0] = 10; - x.a[1] = 20; - x.a[2] = 30; - x.a[3] = 40; - x.a[4] = 50; - - printf("%zu\n", sizeof(struct S)); - - printf("%d\n", x.a[0]); - printf("%d\n", x.a[1]); - printf("%d\n", x.a[2]); - printf("%d\n", x.a[3]); - printf("%d\n", x.a[4]); -} -EOF diff --git a/tests/117.sh b/tests/117.sh deleted file mode 100644 index 765dc58..0000000 --- a/tests/117.sh +++ /dev/null @@ -1,31 +0,0 @@ -cat <<'EOF' > expected -8 -4 -4 -EOF - -test_diff <<'EOF' -int printf(); - -typedef struct { - int x; - int y; -} S; - -typedef union { - int a; - char b; -} U; - -typedef enum { - RED, - GREEN, - BLUE -} E; - -int main() { - printf("%zu\n", sizeof(S)); - printf("%zu\n", sizeof(U)); - printf("%zu\n", sizeof(E)); -} -EOF diff --git a/tests/118.sh b/tests/118.sh deleted file mode 100644 index 48a8569..0000000 --- a/tests/118.sh +++ /dev/null @@ -1,19 +0,0 @@ -cat <<'EOF' > expected -400 -80 -16 -EOF - -test_diff <<'EOF' -int printf(); - -int main() { - int a[10 * 10]; - int b[10 + 10]; - int c[1 << 2]; - - printf("%zu\n", sizeof(a)); - printf("%zu\n", sizeof(b)); - printf("%zu\n", sizeof(c)); -} -EOF diff --git a/tests/119.sh b/tests/119.sh deleted file mode 100644 index be485cf..0000000 --- a/tests/119.sh +++ /dev/null @@ -1,13 +0,0 @@ -cat <<'EOF' > expected -1,0 -1,1,1 -EOF -test_diff <<'EOF' -int printf(const char*, ...); - -int main() { - bool b1 = true, b0 = false; - printf("%d,%d\n", b1, b0); - printf("%d,%d,%d\n", sizeof(b1), sizeof(b0), sizeof(bool)); -} -EOF diff --git a/tests/120.sh b/tests/120.sh deleted file mode 100644 index b3724cd..0000000 --- a/tests/120.sh +++ /dev/null @@ -1,21 +0,0 @@ -cat <<'EOF' > expected -42 -123 -EOF -test_diff <<'EOF' -int printf(const char*, ...); - -int main() { - // TODO: check if "foo" is expanded to "foo" or not once '#' operator is implemented. -#define foo foo - int foo = 42; - printf("%d\n", foo); - - // TODO: check if "a" is expanded to "a" or not once '#' operator is implemented. -#define a b -#define b c -#define c a - int a = 123; - printf("%d\n", a); -} -EOF diff --git a/tests/121.sh b/tests/121.sh deleted file mode 100644 index a5ecdb6..0000000 --- a/tests/121.sh +++ /dev/null @@ -1,16 +0,0 @@ -cat <<'EOF' > expected -Hello World -Line continues -EOF - -# CRLF -printf 'int printf(const char*, ...);\r\nint main() {\r\n printf("Hello World\\n");\r\n printf("Line con\\\r\ntinues\\n");\r\n return 0;\r\n}\r\n' > main_crlf.c -test_diff < main_crlf.c - -# CR -printf 'int printf(const char*, ...);\rint main() {\r printf("Hello World\\n");\r printf("Line con\\\rtinues\\n");\r return 0;\r}\r' > main_cr.c -test_diff < main_cr.c - -# Mixed -printf 'int printf(const char*, ...);\nint main() {\r\n printf("Hello World\\n");\r printf("Line con\\\r\ntinues\\n");\n return 0;\r\n}\r\n' > main_mixed.c -test_diff < main_mixed.c diff --git a/tests/all.sh b/tests/all.sh index cb5df2b..a5c6df8 100644 --- a/tests/all.sh +++ b/tests/all.sh @@ -8,7 +8,7 @@ for filename in tests/*.sh; do testcase="${testcase_/%.sh/}" test_file="tests/$testcase.sh" case "$testcase" in - all|run|test_*) + all|run|helpers) ;; *) source tests/run.sh "$testcase" diff --git a/tests/helpers.sh b/tests/helpers.sh new file mode 100644 index 0000000..eaccd5c --- /dev/null +++ b/tests/helpers.sh @@ -0,0 +1,68 @@ +function test_exit_code() { + cat > main.c + + "$ducc" -o a.out main.c + set +e + ./a.out + exit_code=$? + set -e + + expected=$1 + + if [[ $exit_code -ne $expected ]]; then + echo "invalid exit code: expected $expected, but got $exit_code" >&2 + exit 1 + fi +} + +function test_diff() { + cat > main.c + + "$ducc" -o a.out main.c + if [[ ! -f input ]]; then + touch input + fi + ./a.out "$@" < input > output + exit_code=$? + + if [[ $exit_code -ne 0 ]]; then + echo "invalid exit code: $exit_code" >&2 + exit 1 + fi + + diff -u expected output +} + +function test_compile_error() { + cat > main.c + + set +e + "$ducc" main.c > /dev/null 2> output + exit_code=$? + set -e + + if [[ $exit_code -eq 0 ]]; then + echo "expected to fail" >&2 + exit 1 + fi + + diff -u expected output +} + +function test_example() { + filename="../../../examples/$1.c" + + "$ducc" -o a.out "$filename" + if [[ ! -f input ]]; then + touch input + fi + ./a.out "$@" < input > output + exit_code=$? + + if [[ $exit_code -ne 0 ]]; then + echo "invalid exit code: $exit_code" >&2 + exit 1 + fi + + diff -u expected output +} diff --git a/tests/run.sh b/tests/run.sh index 728af52..1003e87 100644 --- a/tests/run.sh +++ b/tests/run.sh @@ -12,7 +12,7 @@ if [[ ! -f "$test_file" ]]; then exit 1 fi -source tests/test_helpers.sh +source tests/helpers.sh echo "$test_file" mkdir -p "$tmp_dir" diff --git a/tests/test_arithmetic_operators.sh b/tests/test_arithmetic_operators.sh new file mode 100644 index 0000000..50cb1ec --- /dev/null +++ b/tests/test_arithmetic_operators.sh @@ -0,0 +1,30 @@ +test_exit_code 42 <<'EOF' +int main() { + return 42; +} +EOF + +test_exit_code 21 <<'EOF' +int main() { + return 5+20-4; +} +EOF + +test_exit_code 26 <<'EOF' +int main() { + return 2*3+4*5; +} +EOF + +test_exit_code 197 <<'EOF' +int main() { + return (((3+5)/2) + (5*(9-6)) * (5+6*7)) % 256; +} +EOF + +test_exit_code 30 <<'EOF' +int main() { + return (-10 + 20 * -3) + 100; +} +EOF + diff --git a/tests/test_array_basics.sh b/tests/test_array_basics.sh new file mode 100644 index 0000000..75bb244 --- /dev/null +++ b/tests/test_array_basics.sh @@ -0,0 +1,163 @@ +cat <<'EOF' > expected +42 +EOF +test_diff <<'EOF' +int printf(); +void* calloc(); + +int main() { + int b; + int* a = &b; + a[0] = 42; + printf("%d\n", *a); + return 0; +} +EOF + +cat <<'EOF' > expected +0 0 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 9 +EOF +test_diff <<'EOF' +int printf(); +void* calloc(); + +int main() { + long* a = calloc(10, sizeof(long)); + long i = 0; + for (i = 0; i < 10; i = i + 1) { + a[i] = i; + } + for (i = 0; i < 10; i = i + 1) { + printf("%d %d\n", *(a + i), a[i]); + } + return 0; +} +EOF + +cat <<'EOF' > expected +65 +65 +66 +67 +68 +EOF +test_diff <<'EOF' +void* calloc(); +int printf(); + +int main() { + char* source = calloc(4, sizeof(char)); + + source[0] = 'A'; + source[1] = 'B'; + source[2] = 'C'; + source[3] = 'D'; + + int a = source[0]; + + printf("%d\n", a); + printf("%d\n", source[0]); + printf("%d\n", source[1]); + printf("%d\n", source[2]); + printf("%d\n", source[3]); + + return 0; +} +EOF + +cat <<'EOF' > expected +0 +1 +4 +9 +16 +25 +36 +49 +64 +81 +EOF + +test_diff <<'EOF' +int printf(); + +int main() { + int i; + int a[10]; + for (i = 0; i < 10; ++i) { + a[i] = i * i; + } + for (i = 0; i < 10; ++i) { + printf("%d\n", a[i]); + } +} +EOF + +cat <<'EOF' > expected +0 +42 +48 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +123 +EOF + +test_diff <<'EOF' +int printf(); + +int a; +int b[12]; + +int main() { + printf("%d\n", a); + a = 42; + printf("%d\n", a); + printf("%zu\n", sizeof(b)); + int i; + for (i = 0; i < 12; ++i) { + printf("%d\n", b[i]); + } + b[11] = 123; + printf("%d\n", b[11]); +} +EOF + +cat <<'EOF' > expected +400 +80 +16 +EOF + +test_diff <<'EOF' +int printf(); + +int main() { + int a[10 * 10]; + int b[10 + 10]; + int c[1 << 2]; + + printf("%zu\n", sizeof(a)); + printf("%zu\n", sizeof(b)); + printf("%zu\n", sizeof(c)); +} +EOF + diff --git a/tests/test_assignment_operators.sh b/tests/test_assignment_operators.sh new file mode 100644 index 0000000..c1cce28 --- /dev/null +++ b/tests/test_assignment_operators.sh @@ -0,0 +1,49 @@ +cat <<'EOF' > expected +0 +1 +2 +3 +4 + +5 +4 +3 +2 +1 +0 + +56088 + +24 + +3 +EOF +test_diff <<'EOF' +int printf(); + +int main() { + int i = 0; + for (; i < 5; i += 1) { + printf("%d\n", i); + } + printf("\n"); + for (i = 5; i >= 0; i -= 1) { + printf("%d\n", i); + } + + int x = 123; + x *= 456; + printf("\n%d\n", x); + + int y = 120; + y /= 5; + printf("\n%d\n", y); + + int z = 17; + z %= 7; + printf("\n%d\n", z); + + return 0; +} +EOF + diff --git a/tests/test_bitwise_operators.sh b/tests/test_bitwise_operators.sh new file mode 100644 index 0000000..90f553a --- /dev/null +++ b/tests/test_bitwise_operators.sh @@ -0,0 +1,65 @@ +cat <<'EOF' > expected +123 +460 +EOF + +test_diff <<'EOF' +int printf(); + +int main() { + printf("%d\n", 0 | 123); + printf("%d\n", 12 | 456); +} +EOF + +cat <<'EOF' > expected +8 +336 +EOF +test_diff <<'EOF' +int printf(); +int main() { + printf("%d\n", 1 << 3); + printf("%d\n", 21 << 4); +} +EOF + +cat <<'EOF' > expected +13 +0 +EOF +test_diff <<'EOF' +int printf(); +int main() { + printf("%d\n", 111 >> 3); + printf("%d\n", 15 >> 14); +} +EOF + +cat <<'EOF' > expected +1 +7 +6 +4 +3 2 3 0 +EOF +test_diff <<'EOF' +int printf(); + +int main() { + int a = 5; + int b = 3; + + printf("%d\n", a & b); + printf("%d\n", a | b); + printf("%d\n", a ^ b); + printf("%d\n", 2 + 3 & 4); + + int c = 1 + 2 & 3; + int d = 4 & 5 ^ 6; + int e = 1 ^ 2 | 3; + int f = 0 | 1 & 2; + printf("%d %d %d %d\n", c, d, e, f); +} +EOF + diff --git a/tests/test_bool_type.sh b/tests/test_bool_type.sh new file mode 100644 index 0000000..16087bf --- /dev/null +++ b/tests/test_bool_type.sh @@ -0,0 +1,14 @@ +cat <<'EOF' > expected +1,0 +1,1,1 +EOF +test_diff <<'EOF' +int printf(const char*, ...); + +int main() { + bool b1 = true, b0 = false; + printf("%d,%d\n", b1, b0); + printf("%d,%d,%d\n", sizeof(b1), sizeof(b0), sizeof(bool)); +} +EOF + diff --git a/tests/test_char_literals.sh b/tests/test_char_literals.sh new file mode 100644 index 0000000..3d1bff3 --- /dev/null +++ b/tests/test_char_literals.sh @@ -0,0 +1,59 @@ +cat <<'EOF' > expected +97 48 +92 39 +10 +EOF +test_diff <<'EOF' +int printf(); + +int main() { + printf("%d %d\n", 'a', '0'); + printf("%d %d\n", '\\', '\''); + printf("%d\n", '\n'); + return 0; +} +EOF + +cat <<'EOF' > expected +39 +34 +63 +92 +7 +8 +12 +10 +13 +9 +11 +EOF +test_diff <<'EOF' +int printf(); + +int main() { + printf("%d\n", '\''); + printf("%d\n", '\"'); + printf("%d\n", '\?'); + printf("%d\n", '\\'); + printf("%d\n", '\a'); + printf("%d\n", '\b'); + printf("%d\n", '\f'); + printf("%d\n", '\n'); + printf("%d\n", '\r'); + printf("%d\n", '\t'); + printf("%d\n", '\v'); + return 0; +} +EOF + +cat <<'EOF' > expected +0 +EOF +test_diff <<'EOF' +int printf(); + +int main() { + printf("%d\n", '\0'); +} +EOF + diff --git a/tests/test_comma_operator.sh b/tests/test_comma_operator.sh new file mode 100644 index 0000000..7c53845 --- /dev/null +++ b/tests/test_comma_operator.sh @@ -0,0 +1,37 @@ +cat <<'EOF' > expected +0 0 +1 1 +2 2 +3 3 +4 4 +EOF + +test_diff <<'EOF' +int printf(); + +int main() { + int i = 1000; + int j = 1000; + for (i = 0, j = 0; i < 5; i++, j++) { + printf("%d %d\n", i, j); + } +} +EOF + +cat <<'EOF' > expected +1 2 3 4 +0 0 5 +EOF + +test_diff <<'EOF' +int printf(); +int x, y, z = 5; +int main() { + int a, b; + a = 1, b = 2; + int c = 3, d = 4; + printf("%d %d %d %d\n", a, b, c, d); + printf("%d %d %d\n", x, y, z); +} +EOF + diff --git a/tests/test_command_line_args.sh b/tests/test_command_line_args.sh new file mode 100644 index 0000000..094b36c --- /dev/null +++ b/tests/test_command_line_args.sh @@ -0,0 +1,19 @@ +cat <<'EOF' > expected +argc = 4 +argv[1] = hoge +argv[2] = piyo +argv[3] = fuga +EOF +test_diff hoge piyo fuga<<'EOF' +int printf(); + +int main(int argc, char** argv) { + printf("argc = %d\n", argc); + int i; + for (i = 1; i < argc; ++i) { + printf("argv[%d] = %s\n", i, argv[i]); + } + return 0; +} +EOF + diff --git a/tests/test_comments.sh b/tests/test_comments.sh new file mode 100644 index 0000000..7a43832 --- /dev/null +++ b/tests/test_comments.sh @@ -0,0 +1,25 @@ +cat <<'EOF' > expected +EOF +test_diff <<'EOF' +// TODO: check if the token is at the beginning of line. +// TODO: check if skipped whitespaces do not contain line breaks. +int main() { + return 0; +} +EOF + +cat <<'EOF' > expected +EOF + +test_diff <<'EOF' +/* lorem ipsum */ +/* +lorem ipsum +*/ +// /* +/* /* + */ +int/**/main() { +} +EOF + diff --git a/tests/test_comparison_operators.sh b/tests/test_comparison_operators.sh new file mode 100644 index 0000000..3b6d827 --- /dev/null +++ b/tests/test_comparison_operators.sh @@ -0,0 +1,48 @@ +test_exit_code 1 <<'EOF' +int main() { + return 0 == 0; +} +EOF + +test_exit_code 0 <<'EOF' +int main() { + return 123 != 123; +} +EOF + +test_exit_code 1 <<'EOF' +int main() { + return 123 != 456; +} +EOF + +test_exit_code 0 <<'EOF' +int main() { + return 123 == 124; +} +EOF + +test_exit_code 1 <<'EOF' +int main() { + return 123 < 567; +} +EOF + +test_exit_code 1 <<'EOF' +int main() { + return 123 <= 567; +} +EOF + +test_exit_code 1 <<'EOF' +int main() { + return 123 <= 123; +} +EOF + +test_exit_code 0 <<'EOF' +int main() { + return 123 < 123; +} +EOF + diff --git a/tests/test_compile_errors.sh b/tests/test_compile_errors.sh new file mode 100644 index 0000000..23bf394 --- /dev/null +++ b/tests/test_compile_errors.sh @@ -0,0 +1,33 @@ +cat <<'EOF' > expected +undefined function: f +EOF +test_compile_error <<'EOF' +int main() { + f(); +} +EOF + +# TODO: improve error message +# cat <<'EOF' > expected +# main.c:1: expected ';' or '{', but got '}' +# EOF +cat <<'EOF' > expected +main.c:1: expected ';', but got '}' +EOF + +test_compile_error <<'EOF' +int main() } +EOF + +# TODO: improve error message +# cat <<'EOF' > expected +# main.c:1: expected ';' or '{', but got '}' +# EOF +cat <<'EOF' > expected +main.c:1: expected ';', but got '123' +EOF + +test_compile_error <<'EOF' +int main() 123 +EOF + diff --git a/tests/test_compiler_output.sh b/tests/test_compiler_output.sh new file mode 100644 index 0000000..6993c36 --- /dev/null +++ b/tests/test_compiler_output.sh @@ -0,0 +1,17 @@ +cat > foo.c <<'EOF' +int main() {} +EOF + +"$ducc" -o bar.s foo.c +if [[ $? -ne 0 ]]; then + exit 1 +fi +gcc -o a.out bar.s +./a.out "$@" +exit_code=$? + +if [[ $exit_code -ne 0 ]]; then + echo "invalid exit code: $exit_code" >&2 + exit 1 +fi + diff --git a/tests/test_compiler_version.sh b/tests/test_compiler_version.sh new file mode 100644 index 0000000..1e22718 --- /dev/null +++ b/tests/test_compiler_version.sh @@ -0,0 +1,7 @@ +expected="ducc v0.2.0" + +if [[ "$("$ducc" --version)" != "$expected" ]]; then + echo "invalid output" >&2 + exit 1 +fi + diff --git a/tests/test_conditional_errors.sh b/tests/test_conditional_errors.sh new file mode 100644 index 0000000..5a33e8c --- /dev/null +++ b/tests/test_conditional_errors.sh @@ -0,0 +1,74 @@ +cat <<'EOF' > expected +main.c:2: expected '#endif', but got '' +EOF +test_compile_error <<'EOF' +#if 0 +EOF + +cat <<'EOF' > expected +main.c:3: expected '#endif', but got '' +EOF +test_compile_error <<'EOF' +#if 1 +#else +EOF + +cat <<'EOF' > expected +main.c:3: expected '#endif', but got '' +EOF +test_compile_error <<'EOF' +#if 1 +#elif 1 +EOF + +cat <<'EOF' > expected +main.c:1: unexpected '#elif'; no corresponding '#if'* +EOF +test_compile_error <<'EOF' +#elif +#endif + +int main() {} +EOF + +cat <<'EOF' > expected +main.c:1: unexpected '#endif'; no corresponding '#if'* +EOF +test_compile_error <<'EOF' +#endif + +int main() {} +EOF + +cat <<'EOF' > expected +main.c:1: unexpected '#else'; no corresponding '#if'* +EOF +test_compile_error <<'EOF' +#else +#endif + +int main() {} +EOF + +cat <<'EOF' > expected +main.c:4: expected '#endif', but got '' +EOF +test_compile_error <<'EOF' +#if 1 + +int main() {} +EOF + +cat <<'EOF' > a.h +#if 1 +EOF +cat <<'EOF' > expected +./a.h:2: expected '#endif', but got '' +EOF +test_compile_error <<'EOF' +#include "a.h" +#endif + +int main() {} +EOF + diff --git a/tests/test_define_macros.sh b/tests/test_define_macros.sh new file mode 100644 index 0000000..1b674f1 --- /dev/null +++ b/tests/test_define_macros.sh @@ -0,0 +1,92 @@ +cat <<'EOF' > expected +EOF +test_diff <<'EOF' +#define A 1 +int main() { + return 0; +} +EOF + +cat <<'EOF' > expected +1,2,3 +EOF +test_diff <<'EOF' +int printf(); + +#define A 1 +#define B 2 +#define C 3 + +int main() { + printf("%d,%d,%d\n", A, B, C); + return 0; +} +EOF + +cat <<'EOF' > expected +0,0,0,0 +EOF +test_diff <<'EOF' +int printf(); + +#define NULL 0 +#define TK_EOF 0 +#define TY_UNKNOWN 0 +#define AST_UNKNOWN 0 + +int main() { + printf("%d,%d,%d,%d\n", NULL, TK_EOF, TY_UNKNOWN, AST_UNKNOWN); + return 0; +} +EOF + +cat <<'EOF' > expected +42,123 +EOF +test_diff <<'EOF' +int printf(); + +#define A foo_a +#define B foo_b + +int main() { + int foo_a = 42; + int foo_b = 123; + + printf("%d,%d\n", A, B); + + return 0; +} +EOF + +cat <<'EOF' > expected +123 +EOF + +test_diff <<'EOF' +#define foo() 123 + +int printf(); + +int main() { + printf("%d\n", foo()); +} +EOF + +cat <<'EOF' > expected +579 +975 +EOF + +test_diff <<'EOF' +#define foo 123 + 456 +#define bar() 321 + 654 + +int printf(); + +int main() { + printf("%d\n", foo); + printf("%d\n", bar()); +} +EOF + diff --git a/tests/test_do_while.sh b/tests/test_do_while.sh new file mode 100644 index 0000000..dbb4815 --- /dev/null +++ b/tests/test_do_while.sh @@ -0,0 +1,92 @@ +cat <<'EOF' > expected +body 0 +foo 1 +body 1 +foo 2 +body 2 +foo 3 +body 3 +foo 4 +body 4 +foo 5 +EOF +test_diff <<'EOF' +int printf(); + +int foo(int i) { + printf("foo %d\n", i); + return i; +} + +int main() { + int i = 0; + do { + printf("body %d\n", i); + ++i; + } while (foo(i) < 5); + + return 0; +} +EOF + +cat <<'EOF' > expected +body 0 +foo 1 +body 1 +foo 2 +body 2 +EOF +test_diff <<'EOF' +int printf(); + +int foo(int i) { + printf("foo %d\n", i); + return i; +} + +int main() { + int i = 0; + do { + printf("body %d\n", i); + ++i; + if (i == 3) { + break; + } + } while (foo(i) < 5); + + return 0; +} +EOF + +cat <<'EOF' > expected +body 1 +foo 1 +foo 2 +body 3 +foo 3 +foo 4 +body 5 +foo 5 +EOF +test_diff <<'EOF' +int printf(); + +int foo(int i) { + printf("foo %d\n", i); + return i; +} + +int main() { + int i = 0; + do { + ++i; + if (i % 2 == 0) { + continue; + } + printf("body %d\n", i); + } while (foo(i) < 5); + + return 0; +} +EOF + diff --git a/tests/test_empty_preprocessor.sh b/tests/test_empty_preprocessor.sh new file mode 100644 index 0000000..57e33ad --- /dev/null +++ b/tests/test_empty_preprocessor.sh @@ -0,0 +1,10 @@ +touch expected +test_diff <<'EOF' +# +# +# +# +# +int main() {} +EOF + diff --git a/tests/test_empty_statements.sh b/tests/test_empty_statements.sh new file mode 100644 index 0000000..71caed5 --- /dev/null +++ b/tests/test_empty_statements.sh @@ -0,0 +1,7 @@ +cat <<'EOF' > expected +EOF + +test_diff <<'EOF' +int main() { ; } +EOF + diff --git a/tests/test_enums.sh b/tests/test_enums.sh new file mode 100644 index 0000000..228786a --- /dev/null +++ b/tests/test_enums.sh @@ -0,0 +1,48 @@ +cat <<'EOF' > expected +4 +0,1,2 +EOF +test_diff <<'EOF' +int printf(); + +enum E { + A, + B, + C, +}; + +int main() { + enum E x = A; + printf("%d\n", sizeof(enum E)); + printf("%d,%d,%d\n", A, B, C); + return 0; +} +EOF + +cat <<'EOF' > expected +10,11,20,21 +0,5,6 +EOF + +test_diff <<'EOF' +int printf(); + +enum E1 { + A = 10, + B, + C = 20, + D, +}; + +enum E2 { + E, + F = 5, + G +}; + +int main() { + printf("%d,%d,%d,%d\n", A, B, C, D); + printf("%d,%d,%d\n", E, F, G); +} +EOF + diff --git a/tests/test_error_directive.sh b/tests/test_error_directive.sh new file mode 100644 index 0000000..a8b3fdb --- /dev/null +++ b/tests/test_error_directive.sh @@ -0,0 +1,27 @@ +cat <<'EOF' > expected +main.c:1: foo +EOF +test_compile_error <<'EOF' +#error "foo" +EOF + +cat <<'EOF' > expected +EOF +test_diff <<'EOF' +#if 0 +#error "foo" +#endif +int main() {} +EOF + +cat <<'EOF' > expected +main.c:5: foo +EOF +test_compile_error <<'EOF' +#define \ + A \ + B + +#error "foo" +EOF + diff --git a/tests/test_example_programs.sh b/tests/test_example_programs.sh new file mode 100644 index 0000000..21b7ca4 --- /dev/null +++ b/tests/test_example_programs.sh @@ -0,0 +1,133 @@ +cat <<'EOF' > expected +1 +2 +Fizz +4 +Buzz +Fizz +7 +8 +Fizz +Buzz +11 +Fizz +13 +14 +FizzBuzz +16 +17 +Fizz +19 +Buzz +Fizz +22 +23 +Fizz +Buzz +26 +Fizz +28 +29 +FizzBuzz +31 +32 +Fizz +34 +Buzz +Fizz +37 +38 +Fizz +Buzz +41 +Fizz +43 +44 +FizzBuzz +46 +47 +Fizz +49 +Buzz +Fizz +52 +53 +Fizz +Buzz +56 +Fizz +58 +59 +FizzBuzz +61 +62 +Fizz +64 +Buzz +Fizz +67 +68 +Fizz +Buzz +71 +Fizz +73 +74 +FizzBuzz +76 +77 +Fizz +79 +Buzz +Fizz +82 +83 +Fizz +Buzz +86 +Fizz +88 +89 +FizzBuzz +91 +92 +Fizz +94 +Buzz +Fizz +97 +98 +Fizz +Buzz +EOF +test_diff <<'EOF' +int printf(); + +int main() { + int i; + for (i = 1; i <= 100; i = i + 1) { + if (i % 15 == 0) { + printf("FizzBuzz\n"); + } else if (i % 3 == 0) { + printf("Fizz\n"); + } else if (i % 5 == 0) { + printf("Buzz\n"); + } else { + printf("%d\n", i); + } + } + return 0; +} +EOF + +cat <<'EOF' > expected +hello, world +EOF +test_diff <<'EOF' +int printf(); +int main() { + printf("hello, world\n"); + return 0; +} +EOF + diff --git a/tests/test_file_io.sh b/tests/test_file_io.sh new file mode 100644 index 0000000..07a335e --- /dev/null +++ b/tests/test_file_io.sh @@ -0,0 +1,31 @@ +cat <<'EOF' > input +foo +bar +baz +EOF +cat <<'EOF' > expected +foo +foo +bar +bar +baz +baz +EOF +test_diff hoge piyo fuga<<'EOF' +struct FILE; +typedef struct FILE FILE; +extern FILE* stdin; +extern FILE* stdout; +int fprintf(); +char* fgets(); +void* calloc(); + +int main() { + char* buf = calloc(256, sizeof(char)); + while (fgets(buf, 256, stdin)) { + fprintf(stdout, "%s%s", buf, buf); + } + return 0; +} +EOF + diff --git a/tests/test_for_loops.sh b/tests/test_for_loops.sh new file mode 100644 index 0000000..2e3205f --- /dev/null +++ b/tests/test_for_loops.sh @@ -0,0 +1,141 @@ +test_exit_code 45 <<'EOF' +int main() { + int i; + int ret; + i = 0; + ret = 0; + for (i = 0; i < 10; i = i + 1) { + ret = ret + i; + } + return ret; +} +EOF + +test_exit_code 25 <<'EOF' +int main() { + int i; + int ret; + i = 0; + ret = 0; + for (i = 0; i < 10; i = i + 1) { + if (i % 2 == 0) { + continue; + } + ret = ret + i; + } + return ret; +} +EOF + +test_exit_code 66 <<'EOF' +int main() { + int i; + int ret; + i = 0; + ret = 0; + for (i = 0; i < 100; i = i + 1) { + if (i == 12) { + break; + } + ret = ret + i; + } + return ret; +} +EOF + +cat <<'EOF' > expected +0 +1 +2 +3 +4 +10 +11 +12 +13 +14 +20 +21 +22 +23 +24 +25 +EOF +test_diff <<'EOF' +int printf(); + +int main() { + int i = 0; + for (; i < 5; i = i + 1) { + printf("%d\n", i); + } + for (i = 10; i < 15; ) { + printf("%d\n", i); + i = i + 1; + } + for (i = 20; ; i = i + 1) { + printf("%d\n", i); + if (i == 25) break; + } + + return 0; +} +EOF + +cat <<'EOF' > expected +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +EOF + +test_diff <<'EOF' +int printf(); + +int main() { + for (int i = 0; i < 10; i++) { + printf("%d\n", i); + } +} +EOF + +cat <<'EOF' > expected +0 +1 +2 +3 +4 +0 +1 +2 +3 +4 +43 +42 +EOF + +test_diff <<'EOF' +int printf(); + +int main() { + for (int i = 0; i < 5; i++) { + printf("%d\n", i); + } + for (int i = 0; i < 5; i++) { + printf("%d\n", i); + } + int x = 42; + { + int x = 43; + printf("%d\n", x); + } + printf("%d\n", x); +} +EOF + diff --git a/tests/test_function_basics.sh b/tests/test_function_basics.sh new file mode 100644 index 0000000..eb99cf5 --- /dev/null +++ b/tests/test_function_basics.sh @@ -0,0 +1,87 @@ +test_exit_code 66 <<'EOF' +int foo() { + int i; + int ret; + i = 0; + ret = 0; + for (i = 0; i < 100; i = i + 1) { + if (i == 12) { + break; + } + ret = ret + i; + } + return ret; +} + +int main() { + return foo(); +} +EOF + +test_exit_code 10 <<'EOF' +int f(int a, int b, int c, int d, int e, int f) { + return a; +} + +int main() { + return 10 * f(1, 2, 3, 4, 5, 6); +} +EOF + +test_exit_code 20 <<'EOF' +int f(int a, int b, int c, int d, int e, int f) { + return b; +} + +int main() { + return 10 * f(1, 2, 3, 4, 5, 6); +} +EOF + +test_exit_code 30 <<'EOF' +int f(int a, int b, int c, int d, int e, int f) { + return c; +} + +int main() { + return 10 * f(1, 2, 3, 4, 5, 6); +} +EOF + +test_exit_code 40 <<'EOF' +int f(int a, int b, int c, int d, int e, int f) { + return d; +} + +int main() { + return 10 * f(1, 2, 3, 4, 5, 6); +} +EOF + +test_exit_code 50 <<'EOF' +int f(int a, int b, int c, int d, int e, int f) { + return e; +} + +int main() { + return 10 * f(1, 2, 3, 4, 5, 6); +} +EOF + +test_exit_code 60 <<'EOF' +int f(int a, int b, int c, int d, int e, int f) { + return f; +} + +int main() { + return 10 * f(1, 2, 3, 4, 5, 6); +} +EOF + +touch expected +test_diff <<'EOF' +int main() { + return 0; +} +EOF + diff --git a/tests/test_function_macros.sh b/tests/test_function_macros.sh new file mode 100644 index 0000000..4bc0cc2 --- /dev/null +++ b/tests/test_function_macros.sh @@ -0,0 +1,106 @@ +cat <<'EOF' > expected +42 +246 +221 +EOF + +test_diff <<'EOF' +int printf(); + +#define A(x) x +#define B(x) x+x +#define C(x, y) x*y + +int main() { + printf("%d\n", A(42)); + printf("%d\n", B + (123)); + printf("%d\n", C (13, 17)); +} +EOF + +cat <<'EOF' > expected +123 +EOF +test_diff <<'EOF' +#define A(x) x + +int printf(); + +int main() { + printf("%d\n", A ( 123 )); +} +EOF + +cat <<'EOF' > expected +main.c:4: expected ')', but got '' +EOF +test_compile_error <<'EOF' +#define A(x) x + +int main() { +#if A ( + 123) < A(345) + printf("1\n"); +#endif +} +EOF + +cat <<'EOF' > expected +42 +100 200 +300 +0 +1 2 3 +15 +42 +123 +879 +EOF + +test_diff <<'EOF' +int printf(); + +#define ADD(a, b) ((a) + (b)) +#define PRINT_TWO(x, y) printf("%d %d\n", x, y) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#define NESTED(x) (x) +#define CONCAT3(a, b, c) a ## b ## c + +int main() { + printf("%d\n", ADD(40, 2)); + PRINT_TWO(100, 200); + printf("%d\n", MAX(100 + 200, 250)); + printf("%d\n"); + NESTED((printf("1 "), printf("2 "), printf("3\n"), 0)); + + int x = 5, y = 10; + printf("%d\n", ADD(x + 2, y - 2)); + printf("%d\n", ADD(MAX(10, 20), MAX(15 + 5, 22))); + printf("%d\n", ADD( 100 , 23 )); + printf("%d\n", ADD(NESTED((100 + 200)), MAX((123 + 456), (111 + 222)))); +} +EOF + +cat <<'EOF' > expected +42 +123 +EOF +test_diff <<'EOF' +int printf(const char*, ...); + +int main() { + // TODO: check if "foo" is expanded to "foo" or not once '#' operator is implemented. +#define foo foo + int foo = 42; + printf("%d\n", foo); + + // TODO: check if "a" is expanded to "a" or not once '#' operator is implemented. +#define a b +#define b c +#define c a + int a = 123; + printf("%d\n", a); +} +EOF + diff --git a/tests/test_global_variables.sh b/tests/test_global_variables.sh new file mode 100644 index 0000000..b4eef09 --- /dev/null +++ b/tests/test_global_variables.sh @@ -0,0 +1,16 @@ +cat <<'EOF' > expected +42 123 999 +EOF + +test_diff <<'EOF' +int printf(); + +char a = 42; +short b = 123; +int c = 999; + +int main() { + printf("%d %d %d\n", a, b, c); +} +EOF + diff --git a/tests/test_helpers.sh b/tests/test_helpers.sh deleted file mode 100644 index eaccd5c..0000000 --- a/tests/test_helpers.sh +++ /dev/null @@ -1,68 +0,0 @@ -function test_exit_code() { - cat > main.c - - "$ducc" -o a.out main.c - set +e - ./a.out - exit_code=$? - set -e - - expected=$1 - - if [[ $exit_code -ne $expected ]]; then - echo "invalid exit code: expected $expected, but got $exit_code" >&2 - exit 1 - fi -} - -function test_diff() { - cat > main.c - - "$ducc" -o a.out main.c - if [[ ! -f input ]]; then - touch input - fi - ./a.out "$@" < input > output - exit_code=$? - - if [[ $exit_code -ne 0 ]]; then - echo "invalid exit code: $exit_code" >&2 - exit 1 - fi - - diff -u expected output -} - -function test_compile_error() { - cat > main.c - - set +e - "$ducc" main.c > /dev/null 2> output - exit_code=$? - set -e - - if [[ $exit_code -eq 0 ]]; then - echo "expected to fail" >&2 - exit 1 - fi - - diff -u expected output -} - -function test_example() { - filename="../../../examples/$1.c" - - "$ducc" -o a.out "$filename" - if [[ ! -f input ]]; then - touch input - fi - ./a.out "$@" < input > output - exit_code=$? - - if [[ $exit_code -ne 0 ]]; then - echo "invalid exit code: $exit_code" >&2 - exit 1 - fi - - diff -u expected output -} diff --git a/tests/test_identifiers.sh b/tests/test_identifiers.sh new file mode 100644 index 0000000..5786ff7 --- /dev/null +++ b/tests/test_identifiers.sh @@ -0,0 +1,16 @@ +cat <<'EOF' > expected +42,123 +EOF +test_diff <<'EOF' +int printf(); + +int main() { + int _a = 42; + int _b = 123; + + printf("%d,%d\n", _a, _b); + + return 0; +} +EOF + diff --git a/tests/test_if_elif_else.sh b/tests/test_if_elif_else.sh new file mode 100644 index 0000000..a07dd5c --- /dev/null +++ b/tests/test_if_elif_else.sh @@ -0,0 +1,193 @@ +cat <<'EOF' > expected +1 +EOF + +test_diff <<'EOF' +int printf(); + +#define A +#define B + +int main() { +#if defined A && defined(B) + printf("1\n"); +#else + printf("2\n"); +#endif +} +EOF + +cat <<'EOF' > expected +1 +1 +2 +3 +EOF + +test_diff <<'EOF' +int printf(); + +int main() { +#if 1 + printf("1\n"); +#elif 1 + printf("2\n"); +#else + printf("3\n"); +#endif + +#if 1 + printf("1\n"); +#elif 0 + printf("2\n"); +#else + printf("3\n"); +#endif + +#if 0 + printf("1\n"); +#elif 1 + printf("2\n"); +#else + printf("3\n"); +#endif + +#if 0 + printf("1\n"); +#elif 0 + printf("2\n"); +#else + printf("3\n"); +#endif +} +EOF + +cat <<'EOF' > expected +1 +1 +2 +2 +3 +4 +3 +4 +EOF + +test_diff <<'EOF' +int printf(); + +int main() { +#if 1 +# if 1 + printf("1\n"); +# else + printf("2\n"); +# endif +#else +# if 1 + printf("3\n"); +# else + printf("4\n"); +# endif +#endif + +#if 1 +# if 1 + printf("1\n"); +# else + printf("2\n"); +# endif +#else +# if 0 + printf("3\n"); +# else + printf("4\n"); +# endif +#endif + +#if 1 +# if 0 + printf("1\n"); +# else + printf("2\n"); +# endif +#else +# if 1 + printf("3\n"); +# else + printf("4\n"); +# endif +#endif + +#if 1 +# if 0 + printf("1\n"); +# else + printf("2\n"); +# endif +#else +# if 0 + printf("3\n"); +# else + printf("4\n"); +# endif +#endif + +#if 0 +# if 1 + printf("1\n"); +# else + printf("2\n"); +# endif +#else +# if 1 + printf("3\n"); +# else + printf("4\n"); +# endif +#endif + +#if 0 +# if 1 + printf("1\n"); +# else + printf("2\n"); +# endif +#else +# if 0 + printf("3\n"); +# else + printf("4\n"); +# endif +#endif + +#if 0 +# if 0 + printf("1\n"); +# else + printf("2\n"); +# endif +#else +# if 1 + printf("3\n"); +# else + printf("4\n"); +# endif +#endif + +#if 0 +# if 0 + printf("1\n"); +# else + printf("2\n"); +# endif +#else +# if 0 + printf("3\n"); +# else + printf("4\n"); +# endif +#endif +} +EOF + diff --git a/tests/test_if_else.sh b/tests/test_if_else.sh new file mode 100644 index 0000000..cad1716 --- /dev/null +++ b/tests/test_if_else.sh @@ -0,0 +1,20 @@ +test_exit_code 12 <<'EOF' +int main() { + if (1) { + return 12; + } else { + return 34; + } +} +EOF + +test_exit_code 34 <<'EOF' +int main() { + if (1 + 1 != 2) { + return 12; + } else { + return 34; + } +} +EOF + diff --git a/tests/test_ifdef_ifndef.sh b/tests/test_ifdef_ifndef.sh new file mode 100644 index 0000000..f59b87b --- /dev/null +++ b/tests/test_ifdef_ifndef.sh @@ -0,0 +1,74 @@ +cat <<'EOF' > expected +__ducc__ is defined. +A is defined. +B is undefined. +EOF + +test_diff <<'EOF' +int printf(); + +#define A 123 + +int main() { + +#ifdef __ducc__ + printf("__ducc__ is defined.\n"); +#else + printf("__ducc__ is undefined.\n"); +#endif + +#ifdef A + printf("A is defined.\n"); +#else + printf("A is undefined.\n"); +#endif + +#ifdef B + printf("B is defined.\n"); +#else + printf("B is undefined.\n"); +#endif + +#define B 456 + + return 0; +} +EOF + +cat <<'EOF' > expected +__ducc__ is defined. +A is defined. +B is undefined. +EOF + +test_diff <<'EOF' +int printf(); + +#define A 123 + +int main() { + +#ifndef __ducc__ + printf("__ducc__ is undefined.\n"); +#else + printf("__ducc__ is defined.\n"); +#endif + +#ifndef A + printf("A is undefined.\n"); +#else + printf("A is defined.\n"); +#endif + +#ifndef B + printf("B is undefined.\n"); +#else + printf("B is defined.\n"); +#endif + +#define B 456 + + return 0; +} +EOF + diff --git a/tests/test_implicit_return.sh b/tests/test_implicit_return.sh new file mode 100644 index 0000000..423844e --- /dev/null +++ b/tests/test_implicit_return.sh @@ -0,0 +1,19 @@ +# C99: 5.1.2.2.3 +test_exit_code 0 <<'EOF' +int main() { +} +EOF + +test_exit_code 0 <<'EOF' +int main() { + 1 + 2 + 3; +} +EOF + +test_exit_code 0 <<'EOF' +int main() { + if (1); + else return 1; +} +EOF + diff --git a/tests/test_include_errors.sh b/tests/test_include_errors.sh new file mode 100644 index 0000000..3ac546f --- /dev/null +++ b/tests/test_include_errors.sh @@ -0,0 +1,52 @@ +cat <<'EOF' > expected +main.c:1: cannot open include file: "nonexistent.h" +EOF + +test_compile_error <<'EOF' +#include "nonexistent.h" + +int main() { + return 0; +} +EOF + +cat <<'EOF' > expected +include depth limit exceeded +EOF + +# Create circular include files +cat <<'EOF' > a.h +#include "b.h" +int a() { return 1; } +EOF + +cat <<'EOF' > b.h +#include "a.h" +int b() { return 2; } +EOF + +test_compile_error <<'EOF' +#include "a.h" + +int main() { + a() + b(); + return 0; +} +EOF + +cat <<'EOF' > expected +main.c:1: cannot open include file: "hoge.h" +EOF + +test_compile_error <<'EOF' +#include "hoge.h" +EOF + +cat <<'EOF' > expected +main.c:1: cannot resolve include file name: +EOF + +test_compile_error <<'EOF' +#include +EOF + diff --git a/tests/test_include_guards.sh b/tests/test_include_guards.sh new file mode 100644 index 0000000..87c44a9 --- /dev/null +++ b/tests/test_include_guards.sh @@ -0,0 +1,26 @@ +cat <<'EOF' > expected +42 +EOF + +cat <<'EOF' > header.h +#ifndef HEADER_H +#define HEADER_H + +int f() { return 42; } + +#endif +EOF + +test_diff <<'EOF' +#include "header.h" +#include "header.h" +#include "header.h" + +int printf(); + +int main() { + printf("%d\n", HEADER_H HEADER_H HEADER_H f() HEADER_H HEADER_H HEADER_H); + return 0; +} +EOF + diff --git a/tests/test_include_local.sh b/tests/test_include_local.sh new file mode 100644 index 0000000..c9fe755 --- /dev/null +++ b/tests/test_include_local.sh @@ -0,0 +1,100 @@ +cat <<'EOF' > header.h +int add(int a, int b) { + return a + b; +} + +int printf(const char*, ...); +EOF + +cat <<'EOF' > expected +8 +EOF +test_diff <<'EOF' +#include "header.h" + +int main() { + printf("%d\n", add(5, 3)); + return 0; +} +EOF + +mkdir -p foo +cat <<'EOF' > bar.h +#include "baz.h" +EOF +cat <<'EOF' > baz.h +#define A 123 +EOF +cat <<'EOF' > foo/bar.h +#include "baz.h" +EOF +cat <<'EOF' > foo/baz.h +#define A 456 +EOF + +cat <<'EOF' > expected +123 +456 +EOF +test_diff <<'EOF' +int printf(const char*, ...); + +int main() { +#include "bar.h" + printf("%d\n", A); + +#undef A + +#include "foo/bar.h" + printf("%d\n", A); +} +EOF + +cat <<'EOF' > expected +12 +EOF + +cat <<'EOF' > math.h +int multiply(int a, int b) { + return a * b; +} +EOF + +cat <<'EOF' > calc.h +#include "math.h" + +int calculate(int x) { + return multiply(x, 2); +} + +int printf(const char*, ...); +EOF + +test_diff <<'EOF' +#include "calc.h" + +int main() { + printf("%d\n", calculate(6)); + return 0; +} +EOF + +cat <<'EOF' > expected +42 +EOF + +cat <<'EOF' > header.h +#define A 42 +EOF + +test_diff <<'EOF' +#include "header.h" + +int printf(); + +int main() { + printf("%d\n", A); + return 0; +} +EOF + diff --git a/tests/test_increment_operators.sh b/tests/test_increment_operators.sh new file mode 100644 index 0000000..f6aa2b5 --- /dev/null +++ b/tests/test_increment_operators.sh @@ -0,0 +1,29 @@ +cat <<'EOF' > expected +44 +44 +46 +46 +44 +42 +42 +EOF + +test_diff <<'EOF' +int printf(); + +int main() { + int a = 42; + ++a; + a++; + printf("%d\n", a); + printf("%d\n", a++); + printf("%d\n", ++a); + printf("%d\n", a); + --a; + a--; + printf("%d\n", a--); + printf("%d\n", --a); + printf("%d\n", a); +} +EOF + diff --git a/tests/test_input_operations.sh b/tests/test_input_operations.sh new file mode 100644 index 0000000..15dfb2f --- /dev/null +++ b/tests/test_input_operations.sh @@ -0,0 +1,37 @@ +cat <<'EOF' > input +abc +EOF +cat <<'EOF' > expected +4 +abc +EOF +test_diff <<'EOF' +void* calloc(); +int getchar(); +int printf(); + +int read_all(char* buf) { + int c; + int n = 0; + for (0; 1; 0) { + c = getchar(); + if (c == -1) { + break; + } + buf[n] = c; + n = n + 1; + } + return n; +} + +int main() { + char* source = calloc(1024, sizeof(char)); + int source_len = read_all(source); + + printf("%d\n", source_len); + printf("%s", source); + + return 0; +} +EOF + diff --git a/tests/test_invalid_directives.sh b/tests/test_invalid_directives.sh new file mode 100644 index 0000000..877f9e9 --- /dev/null +++ b/tests/test_invalid_directives.sh @@ -0,0 +1,28 @@ +cat <<'EOF' > expected +main.c:1: invalid preprocessing directive, '#foo' +EOF +test_compile_error <<'EOF' +#foo + +int main() {} +EOF + +cat <<'EOF' > expected +main.c:1: invalid preprocessing directive, '#bar' +EOF +test_compile_error <<'EOF' +# bar 1 2 3 + +int main() {} +EOF + +cat <<'EOF' > expected +EOF +test_diff <<'EOF' +#if 0 +#baz +#endif + +int main() {} +EOF + diff --git a/tests/test_keywords.sh b/tests/test_keywords.sh new file mode 100644 index 0000000..1b99b67 --- /dev/null +++ b/tests/test_keywords.sh @@ -0,0 +1,9 @@ +touch expected +test_diff <<'EOF' +// A keyword is treated as a normal identifier in preprocessing phase. +#define auto int + +auto printf(); +auto main() {} +EOF + diff --git a/tests/test_line_continuation.sh b/tests/test_line_continuation.sh new file mode 100644 index 0000000..c5b5c2e --- /dev/null +++ b/tests/test_line_continuation.sh @@ -0,0 +1,57 @@ +cat <<'EOF' > expected +10 20 +100 300 500 +EOF + +test_diff <<'EOF' +int printf(); +in\ +t ma\ +in() { + int x = 1\ +0; + + int y = 2\ +\ +\ +0; + +#def\ +ine X 100 +#define Y 100 + \ +200 +#define Z /* +*/ 500 + // comment \ + x *= 100, y *= 200; + /* comment *\ +/ + + printf("%d %d\n", x, y); + printf("%d %d %d\n", X, Y, Z); +} +EOF + +cat <<'EOF' > expected +main.c:1: expected, but got +EOF + +echo -n 'int main() {}\' | test_compile_error + +cat <<'EOF' > expected +Hello World +Line continues +EOF + +# CRLF +printf 'int printf(const char*, ...);\r\nint main() {\r\n printf("Hello World\\n");\r\n printf("Line con\\\r\ntinues\\n");\r\n return 0;\r\n}\r\n' > main_crlf.c +test_diff < main_crlf.c + +# CR +printf 'int printf(const char*, ...);\rint main() {\r printf("Hello World\\n");\r printf("Line con\\\rtinues\\n");\r return 0;\r}\r' > main_cr.c +test_diff < main_cr.c + +# Mixed +printf 'int printf(const char*, ...);\nint main() {\r\n printf("Hello World\\n");\r printf("Line con\\\r\ntinues\\n");\n return 0;\r\n}\r\n' > main_mixed.c +test_diff < main_mixed.c + diff --git a/tests/test_local_variables.sh b/tests/test_local_variables.sh new file mode 100644 index 0000000..09c40b9 --- /dev/null +++ b/tests/test_local_variables.sh @@ -0,0 +1,67 @@ +test_exit_code 42 <<'EOF' +int main() { + int foo; + foo = 42; + return foo; +} +EOF + +test_exit_code 70 <<'EOF' +int main() { + int foo; + int bar; + foo = 42; + bar = 28; + return foo + bar; +} +EOF + +test_exit_code 45 <<'EOF' +int main() { + int a1; + int a2; + int a3; + int a4; + int a5; + int a6; + int a7; + int a8; + int a9; + + a1 = 1; + a2 = 2; + a3 = 3; + a4 = 4; + a5 = 5; + a6 = 6; + a7 = 7; + a8 = 8; + a9 = 9; + + return + a1 + + a2 + + a3 + + a4 + + a5 + + a6 + + a7 + + a8 + + a9 + + 0; +} +EOF + +cat <<'EOF' > expected +42 +EOF +test_diff <<'EOF' +int printf(); + +int main() { + int a = 42; + printf("%d\n", a); + return 0; +} +EOF + diff --git a/tests/test_logical_operators.sh b/tests/test_logical_operators.sh new file mode 100644 index 0000000..1cc6594 --- /dev/null +++ b/tests/test_logical_operators.sh @@ -0,0 +1,68 @@ +cat <<'EOF' > expected +foo +EOF +test_diff <<'EOF' +int printf(); + +int foo() { + printf("foo\n"); + return 0; +} + +int bar() { + printf("bar\n"); + return 1; +} + +int main() { + if (foo() && bar()) { + printf("baz\n"); + } + + return 0; +} +EOF + +cat <<'EOF' > expected +foo +bar +baz +EOF +test_diff <<'EOF' +int printf(); + +int foo() { + printf("foo\n"); + return 0; +} + +int bar() { + printf("bar\n"); + return 1; +} + +int main() { + if (foo() || bar()) { + printf("baz\n"); + } + + return 0; +} +EOF + +cat <<'EOF' > expected +0 +1 +0 +EOF +test_diff <<'EOF' +int printf(); + +int main() { + printf("%d\n", !1); + printf("%d\n", !0); + printf("%d\n", !23); + return 0; +} +EOF + diff --git a/tests/test_macro_operators.sh b/tests/test_macro_operators.sh new file mode 100644 index 0000000..daf8f47 --- /dev/null +++ b/tests/test_macro_operators.sh @@ -0,0 +1,43 @@ +cat <<'EOF' > expected +foobar=100 +prefix_test=200 +test_suffix=300 +var_1=10 +var_2=20 +var_A=30 +number_12=12 +EOF + +test_diff <<'EOF' +int printf(); + +#define CONCAT(a, b) a##b +#define PREFIX(name) prefix_##name +#define SUFFIX(name) name##_suffix + +int CONCAT(foo, bar) = 100; +int PREFIX(test) = 200; +int SUFFIX(test) = 300; + +#define MAKE_VAR(n) var_##n +int MAKE_VAR(1) = 10; +int MAKE_VAR(2) = 20; + +#define A 0 +int MAKE_VAR(A) = 30; + +#define NUMBER(x, y) number_##x##y +int NUMBER(1, 2) = 12; + +int main() { + printf("foobar=%d\n", foobar); + printf("prefix_test=%d\n", prefix_test); + printf("test_suffix=%d\n", test_suffix); + printf("var_1=%d\n", var_1); + printf("var_2=%d\n", var_2); + printf("var_A=%d\n", var_A); + printf("number_12=%d\n", number_12); + return 0; +} +EOF + diff --git a/tests/test_nested_conditionals.sh b/tests/test_nested_conditionals.sh new file mode 100644 index 0000000..d149e07 --- /dev/null +++ b/tests/test_nested_conditionals.sh @@ -0,0 +1,12 @@ +cat <<'EOF' > expected +EOF +test_diff <<'EOF' +#if 0 +# if 1 +# error "not an error" +# endif +#endif + +int main() {} +EOF + diff --git a/tests/test_pointer_basics.sh b/tests/test_pointer_basics.sh new file mode 100644 index 0000000..2f34821 --- /dev/null +++ b/tests/test_pointer_basics.sh @@ -0,0 +1,79 @@ +cat <<'EOF' > expected +EOF +test_diff <<'EOF' +int main() { + int a1; + int* a2; + char a3; + char* a4; + long a5; + long* a6; + void* a8; + int** a10; + char** a12; + long** a14; + void** a16; + int*** a18; + char*** a20; + long*** a22; + void*** a24; + return 0; +} +EOF + +cat <<'EOF' > expected +42 42 +EOF +test_diff <<'EOF' +int printf(); + +int main() { + int x; + int* y; + y = &x; + *y = 42; + printf("%d %d\n", x, *y); + return 0; +} +EOF + +cat <<'EOF' > expected +3 +3 +3 +EOF +test_diff <<'EOF' +int printf(); + +int main() { + char c; + int i; + long l; + c = 42; + i = 42*2; + l = 42*3; + + char* cp1; + char* cp2; + int* ip1; + int* ip2; + long* lp1; + long* lp2; + + cp1 = &c; + cp2 = &c + 3; + + ip1 = &i; + ip2 = &i + 3; + + lp1 = &l; + lp2 = &l + 3; + + printf("%d\n", cp2 - cp1); + printf("%d\n", ip2 - ip1); + printf("%d\n", lp2 - lp1); + + return 0; +} +EOF + diff --git a/tests/test_predefined_macros.sh b/tests/test_predefined_macros.sh new file mode 100644 index 0000000..51aeca8 --- /dev/null +++ b/tests/test_predefined_macros.sh @@ -0,0 +1,55 @@ +cat <<'EOF' > expected +1 +EOF + +test_diff <<'EOF' +int printf(); + +int main() { + printf("%d\n", __ducc__); + return 0; +} +EOF + +cat <<'EOF' > expected +main.c +main.c +main.c +EOF + +cat <<'EOF' > header.h +#define A __FILE__ +EOF + +test_diff <<'EOF' +#define B __FILE__ +#include "header.h" +int printf(); +int main() { + printf("%s\n", __FILE__); + printf("%s\n", B); + printf("%s\n", A); +} +EOF + +cat <<'EOF' > expected +5 +6 6 +7 7 +EOF + +cat <<'EOF' > header.h +#define A __LINE__ +EOF + +test_diff <<'EOF' +#define B __LINE__ +#include "header.h" +int printf(); +int main() { + printf("%d\n", __LINE__); + printf("%d %d\n", B, B); + printf("%d %d\n", A, A); +} +EOF + diff --git a/tests/test_preprocessor_comments.sh b/tests/test_preprocessor_comments.sh new file mode 100644 index 0000000..0fcea83 --- /dev/null +++ b/tests/test_preprocessor_comments.sh @@ -0,0 +1,11 @@ +cat <<'EOF' > expected +EOF + +test_diff <<'EOF' +#if 1 // a +#else // b +#endif // c + +int main() {} +EOF + diff --git a/tests/test_printf.sh b/tests/test_printf.sh new file mode 100644 index 0000000..da35fcb --- /dev/null +++ b/tests/test_printf.sh @@ -0,0 +1,220 @@ +touch expected +test_diff <<'EOF' +int printf(); + +int main() { + printf(""); + return 0; +} +EOF + +cat <<'EOF' > expected +Hello, World! +EOF +test_diff <<'EOF' +int printf(); + +int main() { + printf("Hello, World!\n"); + return 0; +} +EOF + +cat <<'EOF' > expected +"Hello, World!" +EOF +test_diff <<'EOF' +int printf(); + +int main() { + printf("\"Hello, World!\"\n"); + return 0; +} +EOF + +cat <<'EOF' > expected +1 +1 +1 +1 +1 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +4 +4 +4 +4 +4 +4 +4 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +EOF + +test_diff <<'EOF' +int printf(); + +int main() { + printf("%d\n", sizeof(char)); + printf("%d\n", sizeof(signed char)); + printf("%d\n", sizeof(char signed)); + printf("%d\n", sizeof(unsigned char)); + printf("%d\n", sizeof(char unsigned)); + + printf("%d\n", sizeof(short)); + printf("%d\n", sizeof(signed short)); + printf("%d\n", sizeof(short signed)); + printf("%d\n", sizeof(short int)); + printf("%d\n", sizeof(int short)); + printf("%d\n", sizeof(signed short int)); + printf("%d\n", sizeof(signed int short)); + printf("%d\n", sizeof(short signed int)); + printf("%d\n", sizeof(short int signed)); + printf("%d\n", sizeof(int short signed)); + printf("%d\n", sizeof(int signed short)); + + printf("%d\n", sizeof(unsigned short)); + printf("%d\n", sizeof(short unsigned)); + printf("%d\n", sizeof(unsigned short int)); + printf("%d\n", sizeof(unsigned int short)); + printf("%d\n", sizeof(short unsigned int)); + printf("%d\n", sizeof(short int unsigned)); + printf("%d\n", sizeof(int short unsigned)); + printf("%d\n", sizeof(int unsigned short)); + + printf("%d\n", sizeof(int)); + printf("%d\n", sizeof(signed)); + printf("%d\n", sizeof(signed int)); + printf("%d\n", sizeof(int signed)); + + printf("%d\n", sizeof(unsigned)); + printf("%d\n", sizeof(unsigned int)); + printf("%d\n", sizeof(int unsigned)); + + printf("%d\n", sizeof(long)); + printf("%d\n", sizeof(signed long)); + printf("%d\n", sizeof(long signed)); + printf("%d\n", sizeof(long int)); + printf("%d\n", sizeof(int long)); + printf("%d\n", sizeof(signed long int)); + printf("%d\n", sizeof(signed int long)); + printf("%d\n", sizeof(long signed int)); + printf("%d\n", sizeof(long int signed)); + printf("%d\n", sizeof(int long signed)); + printf("%d\n", sizeof(int signed long)); + + printf("%d\n", sizeof(unsigned long)); + printf("%d\n", sizeof(long unsigned)); + printf("%d\n", sizeof(unsigned long int)); + printf("%d\n", sizeof(unsigned int long)); + printf("%d\n", sizeof(long unsigned int)); + printf("%d\n", sizeof(long int unsigned)); + printf("%d\n", sizeof(int long unsigned)); + printf("%d\n", sizeof(int unsigned long)); + + printf("%d\n", sizeof(long long)); + printf("%d\n", sizeof(signed long long)); + printf("%d\n", sizeof(long signed long)); + printf("%d\n", sizeof(long long signed)); + printf("%d\n", sizeof(long long int)); + printf("%d\n", sizeof(long int long)); + printf("%d\n", sizeof(int long long)); + printf("%d\n", sizeof(signed long long int)); + printf("%d\n", sizeof(signed long int long)); + printf("%d\n", sizeof(signed int long long)); + printf("%d\n", sizeof(long signed long int)); + printf("%d\n", sizeof(long signed int long)); + printf("%d\n", sizeof(int signed long long)); + printf("%d\n", sizeof(long long signed int)); + printf("%d\n", sizeof(long int signed long)); + printf("%d\n", sizeof(int long signed long)); + printf("%d\n", sizeof(long long int signed)); + printf("%d\n", sizeof(long int long signed)); + printf("%d\n", sizeof(int long long signed)); + + printf("%d\n", sizeof(unsigned long long)); + printf("%d\n", sizeof(long unsigned long)); + printf("%d\n", sizeof(long long unsigned)); + printf("%d\n", sizeof(unsigned long long int)); + printf("%d\n", sizeof(unsigned long int long)); + printf("%d\n", sizeof(unsigned int long long)); + printf("%d\n", sizeof(long unsigned long int)); + printf("%d\n", sizeof(long unsigned int long)); + printf("%d\n", sizeof(int unsigned long long)); + printf("%d\n", sizeof(long long unsigned int)); + printf("%d\n", sizeof(long int unsigned long)); + printf("%d\n", sizeof(int long unsigned long)); + printf("%d\n", sizeof(long long int unsigned)); + printf("%d\n", sizeof(long int long unsigned)); + printf("%d\n", sizeof(int long long unsigned)); +} +EOF + diff --git a/tests/test_recursive_functions.sh b/tests/test_recursive_functions.sh new file mode 100644 index 0000000..f9f0ee5 --- /dev/null +++ b/tests/test_recursive_functions.sh @@ -0,0 +1,14 @@ +test_exit_code 89 <<'EOF' +int fib(int n) { + if (n <= 1) { + return 1; + } else { + return fib(n - 1) + fib(n - 2); + } +} + +int main() { + return fib(10); +} +EOF + diff --git a/tests/test_short_type.sh b/tests/test_short_type.sh new file mode 100644 index 0000000..fcbec87 --- /dev/null +++ b/tests/test_short_type.sh @@ -0,0 +1,17 @@ +cat <<'EOF' > expected +2 42 +8 123 +EOF + +test_diff <<'EOF' +int printf(); + +int main() { + short a = 42; + printf("%zu %hd\n", sizeof(a), a); + short* b = &a; + *b = 123; + printf("%zu %hd\n", sizeof(b), *b); +} +EOF + diff --git a/tests/test_sizeof_operator.sh b/tests/test_sizeof_operator.sh new file mode 100644 index 0000000..b14e2ca --- /dev/null +++ b/tests/test_sizeof_operator.sh @@ -0,0 +1,177 @@ +cat <<'EOF' > expected +sizeof(int) = 4 +sizeof(int*) = 8 +sizeof(char) = 1 +sizeof(char*) = 8 +sizeof(long) = 8 +sizeof(long*) = 8 +sizeof(void*) = 8 +sizeof(int**) = 8 +sizeof(char**) = 8 +sizeof(long**) = 8 +sizeof(void**) = 8 +sizeof(int***) = 8 +sizeof(char***) = 8 +sizeof(long***) = 8 +sizeof(void***) = 8 +EOF +test_diff <<'EOF' +int printf(); + +int main() { + printf("sizeof(int) = %d\n", sizeof(int)); + printf("sizeof(int*) = %d\n", sizeof(int*)); + printf("sizeof(char) = %d\n", sizeof(char)); + printf("sizeof(char*) = %d\n", sizeof(char*)); + printf("sizeof(long) = %d\n", sizeof(long)); + printf("sizeof(long*) = %d\n", sizeof(long*)); + printf("sizeof(void*) = %d\n", sizeof(void*)); + printf("sizeof(int**) = %d\n", sizeof(int**)); + printf("sizeof(char**) = %d\n", sizeof(char**)); + printf("sizeof(long**) = %d\n", sizeof(long**)); + printf("sizeof(void**) = %d\n", sizeof(void**)); + printf("sizeof(int***) = %d\n", sizeof(int***)); + printf("sizeof(char***) = %d\n", sizeof(char***)); + printf("sizeof(long***) = %d\n", sizeof(long***)); + printf("sizeof(void***) = %d\n", sizeof(void***)); + return 0; +} +EOF + +cat <<'EOF' > expected +sizeof(struct Token) = 16 +sizeof(struct Define) = 16 +sizeof(struct Type) = 24 +sizeof(struct AstNode) = 128 +sizeof(struct LVar) = 16 +sizeof(struct Func) = 16 +sizeof(struct Parser) = 64 +sizeof(struct CodeGen) = 16 +EOF +test_diff <<'EOF' +struct Token { + int kind; + char* value; +}; + +struct Define { + char* from; + struct Token* to; +}; + +struct AstNode; + +struct Type { + int kind; + struct Type* to; + struct AstNode* members; +}; + +struct AstNode { + int kind; + struct AstNode* next; + struct AstNode* last; + char* name; + struct AstNode* func_params; + struct AstNode* func_body; + int int_value; + struct AstNode* expr1; + struct AstNode* expr2; + struct AstNode* expr3; + int op; + struct Type* ty; + int var_index; + struct AstNode* node1; + struct AstNode* node2; + char** str_literals; +}; + +struct LVar { + char* name; + struct Type* ty; +}; + +struct Func { + char* name; + struct Type* ty; +}; + +struct Parser { + struct Token* tokens; + int pos; + struct LVar* locals; + int n_locals; + struct Func* funcs; + int n_funcs; + char** str_literals; + int n_str_literals; +}; + +struct CodeGen { + int next_label; + int* loop_labels; +}; + +int printf(); + +int main() { + printf("sizeof(struct Token) = %d\n", sizeof(struct Token)); + printf("sizeof(struct Define) = %d\n", sizeof(struct Define)); + printf("sizeof(struct Type) = %d\n", sizeof(struct Type)); + printf("sizeof(struct AstNode) = %d\n", sizeof(struct AstNode)); + printf("sizeof(struct LVar) = %d\n", sizeof(struct LVar)); + printf("sizeof(struct Func) = %d\n", sizeof(struct Func)); + printf("sizeof(struct Parser) = %d\n", sizeof(struct Parser)); + printf("sizeof(struct CodeGen) = %d\n", sizeof(struct CodeGen)); + return 0; +} +EOF + +cat <<'EOF' > expected +24 +EOF + +test_diff <<'EOF' +#include + +int printf(); + +int main() { + printf("%d\n", sizeof(va_list)); +} +EOF + +cat <<'EOF' > expected +sizeof(a) = 4 +sizeof(b) = 8 +sizeof(c) = 123 +sizeof(d) = 16 +sizeof(e) = 8 +sizeof(f) = 1968 +EOF +test_diff <<'EOF' +int printf(); + +struct S { + long x; + long y; +}; + +int main() { + int a; + long b; + char c[123]; + struct S d; + void* e; + struct S f[123]; + + printf("sizeof(a) = %d\n", sizeof(a)); + printf("sizeof(b) = %d\n", sizeof(b)); + printf("sizeof(c) = %d\n", sizeof(c)); + printf("sizeof(d) = %d\n", sizeof(d)); + printf("sizeof(e) = %d\n", sizeof(e)); + printf("sizeof(f) = %d\n", sizeof(f)); + return 0; +} +EOF + diff --git a/tests/test_stdlib_declarations.sh b/tests/test_stdlib_declarations.sh new file mode 100644 index 0000000..c919b88 --- /dev/null +++ b/tests/test_stdlib_declarations.sh @@ -0,0 +1,22 @@ +cat <<'EOF' > expected +EOF +test_diff <<'EOF' +typedef long size_t; + +int atoi(const char*); +void* calloc(size_t, size_t); +void exit(int); +int getchar(void); +int isalnum(int); +int isalpha(int); +int isdigit(int); +int isspace(int); +void* memcpy(void*, void*, size_t); +int printf(const char*, ...); +int sprintf(char*, const char*, ...); +int strcmp(const char*, const char*); +char* strstr(const char*, const char*); + +int main() { return 0; } +EOF + diff --git a/tests/test_string_operations.sh b/tests/test_string_operations.sh new file mode 100644 index 0000000..0c9a07e --- /dev/null +++ b/tests/test_string_operations.sh @@ -0,0 +1,57 @@ +touch expected +test_diff <<'EOF' +int main() { + ""; + return 0; +} +EOF + +touch expected +test_diff <<'EOF' +int main() { + "abc"; + return 0; +} +EOF + +touch expected +test_diff <<'EOF' +int main() { + "\"foo\"bar\\\n\""; + return 0; +} +EOF + +cat <<'EOF' > expected +h +l +, +EOF + +test_diff <<'EOF' +int printf(); + +int main() { + char* h = " hello,world" + 1; + printf("%c\n", *h); + printf("%c\n", h[2]); + printf("%c\n", *(h + 5)); +} +EOF + +cat <<'EOF' > expected +105 +0 +EOF + +test_diff <<'EOF' +int printf(); + +int main() { + char* s = "hi"; + while (*s++) { + printf("%d\n", *s); + } +} +EOF + diff --git a/tests/test_struct_arrays.sh b/tests/test_struct_arrays.sh new file mode 100644 index 0000000..ca1e0b2 --- /dev/null +++ b/tests/test_struct_arrays.sh @@ -0,0 +1,34 @@ +cat <<'EOF' > expected +20 +10 +20 +30 +40 +50 +EOF + +test_diff <<'EOF' +int printf(); + +struct S { + int a[5]; +}; + +int main() { + struct S x; + x.a[0] = 10; + x.a[1] = 20; + x.a[2] = 30; + x.a[3] = 40; + x.a[4] = 50; + + printf("%zu\n", sizeof(struct S)); + + printf("%d\n", x.a[0]); + printf("%d\n", x.a[1]); + printf("%d\n", x.a[2]); + printf("%d\n", x.a[3]); + printf("%d\n", x.a[4]); +} +EOF + diff --git a/tests/test_struct_basics.sh b/tests/test_struct_basics.sh new file mode 100644 index 0000000..74e2458 --- /dev/null +++ b/tests/test_struct_basics.sh @@ -0,0 +1,121 @@ +cat <<'EOF' > expected +EOF +test_diff <<'EOF' +struct Token { + int kind; + char* value; +}; + +struct Define { + char* from; + struct Token* to; +}; + +struct AstNode; + +struct Type { + int kind; + struct Type* to; + struct AstNode* members; +}; + +struct AstNode { + int kind; + struct AstNode* next; + struct AstNode* last; + char* name; + struct AstNode* func_params; + struct AstNode* func_body; + int int_value; + struct AstNode* expr1; + struct AstNode* expr2; + struct AstNode* expr3; + int op; + struct Type* ty; + int var_index; + struct AstNode* node1; + struct AstNode* node2; + char** str_literals; +}; + +struct LVar { + char* name; + struct Type* ty; +}; + +struct Func { + char* name; + struct Type* ty; +}; + +struct Parser { + struct Token* tokens; + int pos; + struct LVar* locals; + int n_locals; + struct Func* funcs; + int n_funcs; + char** str_literals; + int n_str_literals; +}; + +struct CodeGen { + int next_label; + int* loop_labels; +}; + +int main() { + return 0; +} +EOF + +cat <<'EOF' > expected +42 +123 +EOF +test_diff <<'EOF' +struct S { + int a; + int b; +}; + +int printf(); +void* calloc(); + +int main() { + struct S* sp; + sp = calloc(1, sizeof(struct S)); + sp->a = 42; + printf("%d\n", sp->a); + (*sp).b = 123; + printf("%d\n", (*sp).b); + return 0; +} +EOF + +cat <<'EOF' > expected +42 +EOF +test_diff <<'EOF' +void* calloc(); +int printf(); + +struct T; + +struct S { + struct T* a; +}; + +struct T { + int b; +}; + +int main() { + struct S* s = calloc(1, sizeof(struct S)); + s->a = calloc(1, sizeof(struct T)); + s->a->b = 42; + printf("%d\n", s->a->b); + return 0; +} +EOF + diff --git a/tests/test_struct_initialization.sh b/tests/test_struct_initialization.sh new file mode 100644 index 0000000..0454c57 --- /dev/null +++ b/tests/test_struct_initialization.sh @@ -0,0 +1,108 @@ +cat <<'EOF' > expected +0 +1 +EOF +test_diff <<'EOF' +int printf(); +void* calloc(); + +struct S { + int a; + int b; +}; + +int main() { + struct S* s = calloc(1, sizeof(struct S)); + s->b = 1; + printf("%ld\n", s->a); + printf("%ld\n", s->b); + return 0; +} +EOF + +cat <<'EOF' > expected +123 456 +0 0 +123 456 +EOF + +test_diff <<'EOF' +struct S { + int a; + int b; +}; +typedef struct S S; + +void* calloc(); +int printf(); + +int main() { + S* s1 = calloc(1, sizeof(S)); + S* s2 = calloc(1, sizeof(S)); + s1->a = 123; + s1->b = 456; + printf("%d %d\n", s1->a, s1->b); + printf("%d %d\n", s2->a, s2->b); + *s2 = *s1; + printf("%d %d\n", s2->a, s2->b); +} +EOF + +cat <<'EOF' > expected +123 456 +0 0 +123 456 +EOF + +test_diff <<'EOF' +struct S { + long a; + long b; +}; +typedef struct S S; + +void* calloc(); +int printf(); + +int main() { + S* s1 = calloc(1, sizeof(S)); + S* s2 = calloc(1, sizeof(S)); + s1->a = 123; + s1->b = 456; + printf("%d %d\n", s1->a, s1->b); + printf("%d %d\n", s2->a, s2->b); + *s2 = *s1; + printf("%d %d\n", s2->a, s2->b); +} +EOF + +cat <<'EOF' > expected +123 456 +0 0 +123 456 +EOF + +test_diff <<'EOF' +struct S { + long a; + long b; +}; +typedef struct S S; + +void* calloc(); +int printf(); + +int main() { + S s1; + S s2; + s1.a = 123; + s1.b = 456; + s2.a = 0; + s2.b = 0; + printf("%d %d\n", s1.a, s1.b); + printf("%d %d\n", s2.a, s2.b); + s2 = s1; + printf("%d %d\n", s2.a, s2.b); +} +EOF + diff --git a/tests/test_ternary_operator.sh b/tests/test_ternary_operator.sh new file mode 100644 index 0000000..c98ff43 --- /dev/null +++ b/tests/test_ternary_operator.sh @@ -0,0 +1,12 @@ +cat <<'EOF' > expected +2 5 +EOF + +test_diff <<'EOF' +int printf(); + +int main() { + printf("%d %d\n", 1 ? 2 : 3, 0 ? 4 : 5); +} +EOF + diff --git a/tests/test_typedef_struct.sh b/tests/test_typedef_struct.sh new file mode 100644 index 0000000..7181a86 --- /dev/null +++ b/tests/test_typedef_struct.sh @@ -0,0 +1,85 @@ +cat <<'EOF' > expected +42 +EOF +test_diff <<'EOF' +void* calloc(); +int printf(); + +struct S { + int x; +}; +typedef struct S S; + +int main() { + S* s = calloc(1, sizeof(S)); + s->x = 42; + printf("%d\n", s->x); + return 0; +} +EOF + +cat <<'EOF' > expected +4 +EOF +test_diff <<'EOF' +struct S0; +typedef struct S0 S0; + +struct S1 { + int x; +}; + +struct S2 { + int x; +}; + +struct S3 { + int x; +}; + +struct S4 { + int x; +}; + +struct S0 { + int x; +}; + +int printf(const char*, ...); +int main() { + printf("%zu\n", sizeof(S0)); +} +EOF + +cat <<'EOF' > expected +8 +4 +4 +EOF + +test_diff <<'EOF' +int printf(); + +typedef struct { + int x; + int y; +} S; + +typedef union { + int a; + char b; +} U; + +typedef enum { + RED, + GREEN, + BLUE +} E; + +int main() { + printf("%zu\n", sizeof(S)); + printf("%zu\n", sizeof(U)); + printf("%zu\n", sizeof(E)); +} +EOF + diff --git a/tests/test_undef.sh b/tests/test_undef.sh new file mode 100644 index 0000000..34c3dad --- /dev/null +++ b/tests/test_undef.sh @@ -0,0 +1,27 @@ +cat <<'EOF' > expected +A is defined +A is undefined +EOF + +test_diff <<'EOF' +int printf(); + +int main() { +#define A 1 + +#ifdef A + printf("A is defined\n"); +#else + printf("A is undefined\n"); +#endif + +#undef A + +#ifdef A + printf("A is defined\n"); +#else + printf("A is undefined\n"); +#endif +} +EOF + diff --git a/tests/test_unions.sh b/tests/test_unions.sh new file mode 100644 index 0000000..b588792 --- /dev/null +++ b/tests/test_unions.sh @@ -0,0 +1,23 @@ +cat <<'EOF' > expected +8 +42 +42 +EOF + +test_diff <<'EOF' +int printf(); + +union U { + int i; + long l; +}; + +int main() { + union U u; + printf("%zu\n", sizeof(u)); + u.l = 42; + printf("%d\n", u.i); + printf("%ld\n", u.l); +} +EOF + diff --git a/tests/test_variadic_functions.sh b/tests/test_variadic_functions.sh new file mode 100644 index 0000000..ec85d9a --- /dev/null +++ b/tests/test_variadic_functions.sh @@ -0,0 +1,32 @@ +cat <<'EOF' > expected +123 +456 789 +EOF + +test_diff <<'EOF' +#include + +int fprintf(); + +struct FILE; +typedef struct FILE FILE; + +extern FILE* stdout; + +int vfprintf(FILE*, const char*, va_list); + +void fatal_error(const char* msg, ...) { + va_list args; + va_start(args, msg); + vfprintf(stdout, msg, args); + va_end(args); + fprintf(stdout, "\n"); +} + +int main() { + fatal_error("%d", 123); + fatal_error("%d %d", 456, 789); + return 0; +} +EOF + diff --git a/tests/test_void_functions.sh b/tests/test_void_functions.sh new file mode 100644 index 0000000..57116ce --- /dev/null +++ b/tests/test_void_functions.sh @@ -0,0 +1,49 @@ +cat <<'EOF' > expected +123 +EOF +test_diff <<'EOF' +int printf(); + +void foo_bar(int hoge_piyo) { + printf("%d\n", hoge_piyo); +} + +int main() { + foo_bar(123); + return 0; +} +EOF + +cat <<'EOF' > expected +EOF +test_diff <<'EOF' +struct S { + int a; +}; + +struct S* f(); + +struct S* g() {} + +int main() { + return 0; +} +EOF + +cat <<'EOF' > expected +hi +EOF +test_diff <<'EOF' +int printf(); + +void f() { + printf("hi\n"); + return; +} + +int main() { + f(); + return 0; +} +EOF + -- cgit v1.2.3-70-g09d2