forked from NUDT-compiler/nudt-compiler-cpp
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
2.8 KiB
122 lines
2.8 KiB
#!/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
|
|
|
|
# 检查 verify_ir.sh 是否存在(可选)
|
|
VERIFY_SCRIPT="./scripts/verify_ir.sh"
|
|
if [ ! -f "$VERIFY_SCRIPT" ]; then
|
|
echo "错误: 验证脚本 $VERIFY_SCRIPT 未找到"
|
|
exit 1
|
|
fi
|
|
|
|
# 如果指定了单个文件,检查文件是否存在
|
|
if [ -n "$1" ] && [ ! -f "$1" ]; then
|
|
echo "错误: 文件 $1 不存在"
|
|
exit 1
|
|
fi
|
|
|
|
# 清空(或创建)结果文件
|
|
> "$RESULT_FILE"
|
|
|
|
# 计数器
|
|
total=0
|
|
emit_ir=0
|
|
passed=0
|
|
failed=0
|
|
|
|
echo "开始测试 IR 生成与验证..."
|
|
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"
|
|
|
|
# 1. 运行编译器生成 IR
|
|
if [ $VERBOSE -eq 1 ]; then
|
|
"$COMPILER" --emit-ir "$file" 2>&1 | tee -a "$RESULT_FILE"
|
|
result1=${PIPESTATUS[0]}
|
|
else
|
|
"$COMPILER" --emit-ir "$file" >> "$RESULT_FILE" 2>&1
|
|
result1=$?
|
|
fi
|
|
echo "" >> "$RESULT_FILE"
|
|
|
|
# 2. 运行验证脚本
|
|
if [ $VERBOSE -eq 1 ]; then
|
|
"$VERIFY_SCRIPT" "$file" test/test_result/function/ir --run 2>&1 | tee -a "$RESULT_FILE"
|
|
result2=${PIPESTATUS[0]}
|
|
else
|
|
"$VERIFY_SCRIPT" "$file" test/test_result/function/ir --run >> "$RESULT_FILE" 2>&1
|
|
result2=$?
|
|
fi
|
|
echo "" >> "$RESULT_FILE"
|
|
|
|
# 判断整体通过(两个命令都成功)
|
|
if [ $result1 -eq 0 ]; then
|
|
if [ $VERBOSE -eq 0 ]; then
|
|
echo "生成ir"
|
|
fi
|
|
if [ $result2 -eq 0 ]; then
|
|
if [ $VERBOSE -eq 0 ]; then
|
|
echo "通过"
|
|
fi
|
|
((passed++))
|
|
fi
|
|
((emit_ir++))
|
|
else
|
|
if [ $VERBOSE -eq 0 ]; then
|
|
echo "失败"
|
|
else
|
|
echo ">>> 测试失败: $file (compiler exit: $result1, verify exit: $result2)"
|
|
fi
|
|
((failed++))
|
|
fi
|
|
done
|
|
|
|
echo "------------------------"
|
|
echo "总计: $total"
|
|
echo "生成: $emit_ir"
|
|
echo "通过: $passed"
|
|
echo "失败: $failed"
|
|
echo "详细输出已保存至 $RESULT_FILE"
|
|
|
|
if [ $failed -gt 0 ]; then
|
|
exit 1
|
|
else
|
|
exit 0
|
|
fi |