about summary refs log tree commit diff stats
path: root/awk/uxn/test/runner.sh
diff options
context:
space:
mode:
Diffstat (limited to 'awk/uxn/test/runner.sh')
-rwxr-xr-xawk/uxn/test/runner.sh105
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