diff options
Diffstat (limited to 'awk/uxn/test/runner.sh')
-rwxr-xr-x | awk/uxn/test/runner.sh | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/awk/uxn/test/runner.sh b/awk/uxn/test/runner.sh new file mode 100755 index 0000000..711dd28 --- /dev/null +++ b/awk/uxn/test/runner.sh @@ -0,0 +1,105 @@ +#!/bin/bash + +# Test runner for Uxntal AWK assembler +# Compares output with reference C implementation + +set -e + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Paths +AWK_ASM="../awk/uxnasm.awk" +REF_ASM="../ref/uxnasm" +TEST_DIR="tal" +OUT_DIR="out" + +# Ensure output directory exists +mkdir -p "$OUT_DIR" + +echo "Testing Uxntal AWK Assembler" +echo "=============================" + +# Check if reference assembler exists +if [ ! -f "$REF_ASM" ]; then + echo -e "${RED}Error: Reference assembler not found at $REF_ASM${NC}" + echo "Please compile the reference implementation first:" + echo " cd ../ref && make" + exit 1 +fi + +# Check if AWK assembler exists +if [ ! -f "$AWK_ASM" ]; then + echo -e "${RED}Error: AWK assembler not found at $AWK_ASM${NC}" + exit 1 +fi + +# Test function +test_file() { + local input_file="$1" + local base_name=$(basename "$input_file" .tal) + + echo -n "Testing $base_name.tal... " + + # Run reference assembler + if ! "$REF_ASM" "$input_file" "$OUT_DIR/${base_name}_ref.rom" >/dev/null 2>&1; then + echo -e "${RED}FAIL${NC} (reference assembler failed)" + return 1 + fi + + # Run AWK assembler + if [ "$DEBUG_AWK" -eq 1 ]; then + awk -f "$AWK_ASM" "$input_file" "$OUT_DIR/${base_name}_awk.rom" 2> "$OUT_DIR/${base_name}_awk.debug" + else + awk -f "$AWK_ASM" "$input_file" "$OUT_DIR/${base_name}_awk.rom" >/dev/null 2>&1 + fi + + # Compare outputs + if cmp -s "$OUT_DIR/${base_name}_ref.rom" "$OUT_DIR/${base_name}_awk.rom"; then + echo -e "${GREEN}PASS${NC}" + if [ "$DEBUG_AWK" -eq 1 ]; then + echo " Debug output: $OUT_DIR/${base_name}_awk.debug" + fi + return 0 + else + echo -e "${RED}FAIL${NC} (outputs differ)" + echo " Reference size: $(wc -c < "$OUT_DIR/${base_name}_ref.rom") bytes" + echo " AWK size: $(wc -c < "$OUT_DIR/${base_name}_awk.rom") bytes" + echo " Diff:" + xxd "$OUT_DIR/${base_name}_ref.rom" > "$OUT_DIR/${base_name}_ref.hex" + xxd "$OUT_DIR/${base_name}_awk.rom" > "$OUT_DIR/${base_name}_awk.hex" + diff "$OUT_DIR/${base_name}_ref.hex" "$OUT_DIR/${base_name}_awk.hex" || true + if [ "$DEBUG_AWK" -eq 1 ]; then + echo " Debug output: $OUT_DIR/${base_name}_awk.debug" + fi + return 1 + fi +} + +# Run tests +failed=0 +total=0 + +for test_file in "$TEST_DIR"/*.tal; do + if [ -f "$test_file" ]; then + total=$((total + 1)) + if ! test_file "$test_file"; then + failed=$((failed + 1)) + fi + fi +done + +echo +echo "=============================" +echo "Results: $((total - failed))/$total tests passed" + +if [ $failed -eq 0 ]; then + echo -e "${GREEN}All tests passed!${NC}" + exit 0 +else + echo -e "${RED}$failed tests failed${NC}" + exit 1 +fi |