#!/bin/bash # Exit immediately if a command exits with a non-zero status. set -e # --- Helper Function --- run_test() { local src_file="$1" local expected_code="$2" local base_name base_name=$(basename "$src_file" .src) local obj_file="tests/$base_name.o" local exec_file="tests/$base_name" echo "--- Running test: $src_file ---" # 1. Compile the source file using our compiler echo " [1/4] Compiling..." cargo run --release -- "$src_file" -o "$obj_file" > /dev/null 2>&1 # 2. Link the object file with the system linker (gcc) echo " [2/4] Linking with gcc..." gcc "$obj_file" -o "$exec_file" # 3. Run the executable echo " [3/4] Running..." set +e ./"$exec_file" local actual_code=$? set -e # 4. Check the exit code echo " [4/4] Verifying exit code..." if [ "$actual_code" -eq "$expected_code" ]; then echo "SUCCESS: Exit code is $actual_code as expected." else echo "FAILURE: Expected exit code $expected_code, but got $actual_code." exit 1 fi # Clean up generated files rm "$obj_file" "$exec_file" echo "------------------------------------" echo } # --- Helper Function --- run_harness_test() { local src_file="$1" local harness_file="$2" local expected_code="$3" local base_name base_name=$(basename "$src_file" .src) local obj_file="tests/$base_name.o" local exec_file="tests/$base_name" echo "--- Running test: $src_file ---" # 1. Compile the source file using our compiler echo " [1/4] Compiling..." cargo run --release -- "$src_file" -o "$obj_file" > /dev/null 2>&1 # 2. Link the object file with the system linker (gcc) echo " [2/4] Linking with gcc..." gcc "$obj_file" "$harness_file" -o "$exec_file" # 3. Run the executable echo " [3/4] Running..." set +e ./"$exec_file" local actual_code=$? set -e # 4. Check the exit code echo " [4/4] Verifying exit code..." if [ "$actual_code" -eq "$expected_code" ]; then echo "SUCCESS: Exit code is $actual_code as expected." else echo "FAILURE: Expected exit code $expected_code, but got $actual_code." exit 1 fi # Clean up generated files rm "$obj_file" "$exec_file" echo "------------------------------------" echo } # --- Test Cases --- # Test a simple positive return value. run_test "tests/return_42.src" 42 # Test a negative return value. Shell exit codes are unsigned 8-bit integers, # so -69 (i8) wraps around to 187. run_test "tests/return_neg_69.src" 187 # Test boolean operations. run_harness_test "tests/booleans.src" "tests/booleans.c" 0 # Test if and else statements. run_harness_test "tests/if-else.src" "tests/if-else.c" 0 # Test variable declarations and scoping. run_test "tests/let_stmt.src" 30 echo "All end-to-end tests passed!"