#!/bin/bash
# ================================================
# SysY 编译器 Lab1 批量解析测试脚本
# 文件名：scripts/test_parse.sh
# 适用环境：Arch Linux（bash 原生支持，无需额外安装）
# 功能：
#   - 遍历 test/test_case 下所有 .sy 文件（functional + performance）
#   - 执行 --emit-parse-tree 检查是否能成功解析
#   - 输出简洁的 PASS/FAIL 结果 + 统计
#   - 错误文件会自动打印最后 10 行报错信息（方便调试）
#   - 所有结果保存到 test/test_result/parse_test.log
# ================================================

set -u  # 遇到未定义变量直接报错

# ================== 配置 ==================
COMPILER="./build/bin/compiler"
TEST_DIR="test/test_case"
LOG_FILE="test/test_result/parse_test.log"
MAX_ERROR_LINES=10

# 检查编译器是否存在
if [[ ! -x "$COMPILER" ]]; then
    echo "❌ 错误：找不到编译器 $COMPILER"
    echo "   请先执行 Lab1 构建命令："
    echo "   cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCOMPILER_PARSE_ONLY=ON"
    echo "   cmake --build build -j \"\$(nproc)\""
    exit 1
fi

# 创建日志目录（如果不存在）
mkdir -p "$(dirname "$LOG_FILE")"
> "$LOG_FILE"   # 清空日志

echo "开始 Lab1 批量语法树测试..." | tee -a "$LOG_FILE"
echo "测试目录：$TEST_DIR" | tee -a "$LOG_FILE"
echo "编译器：$COMPILER" | tee -a "$LOG_FILE"
echo "========================================" | tee -a "$LOG_FILE"

pass=0
fail=0
total=0

# 遍历所有 .sy 文件（支持子目录）
while IFS= read -r -d '' sy_file; do
    ((total++))
    echo -n "[$total] 测试: $sy_file ... " | tee -a "$LOG_FILE"

    # 执行解析（把输出丢到 /dev/null，防止刷屏）
    if "$COMPILER" --emit-parse-tree "$sy_file" > /dev/null 2>&1; then
        echo "✅PASS" | tee -a "$LOG_FILE"
        ((pass++))
    else
        echo "FAIL" | tee -a "$LOG_FILE"
        ((fail++))
        
        # 打印错误信息到日志（最后几行）
        echo "   └── 错误详情（最后 $MAX_ERROR_LINES 行）:" >> "$LOG_FILE"
        "$COMPILER" --emit-parse-tree "$sy_file" 2>&1 | tail -n "$MAX_ERROR_LINES" >> "$LOG_FILE"
        echo "" >> "$LOG_FILE"
    fi
done < <(find "$TEST_DIR" -name "*.sy" -print0 | sort -z)

# ================== 总结 ==================
echo "========================================" | tee -a "$LOG_FILE"
echo "测试完成！" | tee -a "$LOG_FILE"
echo "总文件数 : $total" | tee -a "$LOG_FILE"
echo "通过   : $pass" | tee -a "$LOG_FILE"
echo "失败   : $fail" | tee -a "$LOG_FILE"

if [[ $fail -eq 0 ]]; then
    echo "恭喜！Lab1 语法树构建全部通过！可以进入 Lab2 啦～" | tee -a "$LOG_FILE"
else
    echo "有 $fail 个文件解析失败，请检查 SysY.g4 或报错日志" | tee -a "$LOG_FILE"
    echo "   日志文件：$LOG_FILE" | tee -a "$LOG_FILE"
fi

echo "========================================" | tee -a "$LOG_FILE"
