#!/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