#!/bin/bash

# 测试脚本
# 用法: ./run_tests.sh [--verbose] [<单个测试文件>]

COMPILER="./build/bin/compiler"
TEST_DIR="test/test_case"
RESULT_FILE="result.txt"
VERBOSE=0

# 解析参数
if [[ "$1" == "--verbose" ]]; then
    VERBOSE=1
    shift
fi

# 检查编译器是否存在
if [ ! -f "$COMPILER" ]; then
    echo "错误: 编译器未找到于 $COMPILER"
    echo "请先完成项目构建 (cmake 和 make)"
    exit 1
fi

# 如果指定了单个文件，检查文件是否存在
if [ -n "$1" ] && [ ! -f "$1" ]; then
    echo "错误: 文件 $1 不存在"
    exit 1
fi

# 清空（或创建）结果文件
> "$RESULT_FILE"

# 计数器
total=0
passed=0
failed=0

echo "开始测试 ir out 解析..."
echo "输出将保存到 $RESULT_FILE"
echo "------------------------"

# 确定测试文件列表
if [ -n "$1" ]; then
    # 使用提供的单个文件
    TEST_FILES=("$1")
else
    # 收集所有 .sy 文件
    mapfile -t TEST_FILES < <(find "$TEST_DIR" -type f -name "*.sy" | sort)
fi

for file in "${TEST_FILES[@]}"; do
    ((total++))
    if [ $VERBOSE -eq 1 ]; then
        echo "测试文件: $file"
    else
        echo -n "测试 $file ... "
    fi

    echo "========== $file ==========" >> "$RESULT_FILE"

    if [ $VERBOSE -eq 1 ]; then
        # "$COMPILER" --emit-parse-tree "$file" 2>&1 | tee -a "$RESULT_FILE"
        "$COMPILER" --emit-ir "$file" 2>&1 | tee -a "$RESULT_FILE"
        result=${PIPESTATUS[0]}
    else
        # "$COMPILER" --emit-parse-tree "$file" >> "$RESULT_FILE" 2>&1
        "$COMPILER" --emit-ir "$file" >> "$RESULT_FILE" 2>&1
        result=$?
    fi

    echo "" >> "$RESULT_FILE"

    if [ $result -eq 0 ]; then
        if [ $VERBOSE -eq 0 ]; then
            echo "通过"
        fi
        ((passed++))
    else
        if [ $VERBOSE -eq 0 ]; then
            echo "失败"
        else
            echo ">>> 解析失败: $file"
        fi
        ((failed++))
    fi
done

echo "------------------------"
echo "总计:  $total"
echo "通过:  $passed"
echo "失败:  $failed"
echo "详细输出已保存至 $RESULT_FILE"

if [ $failed -gt 0 ]; then
    exit 1
else
    exit 0
fi
