#!/bin/bash # 获取项目根目录 PROJECT_ROOT=$(cd "$(dirname "$0")/.." ; pwd) COMPILER="$PROJECT_ROOT/build/bin/compiler" TEST_DIR="$PROJECT_ROOT/test/test_case/basic" # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' NC='\033[0m' # 检查编译器 if [ ! -f "$COMPILER" ]; then echo "错误: 编译器不存在: $COMPILER" exit 1 fi # 检查工具链 if ! command -v riscv64-linux-gnu-gcc >/dev/null 2>&1; then echo "错误: 未找到 riscv64-linux-gnu-gcc" exit 1 fi if ! command -v qemu-riscv64 >/dev/null 2>&1; then echo "错误: 未找到 qemu-riscv64" exit 1 fi echo "==========================================" echo "RISC-V 基础功能测试" echo "==========================================" # 定义测试用例 TESTS="arith:50 add:30 sub:7 mul:50 div:25 mod:2 var:43" PASS=0 FAIL=0 for test in $TESTS; do name=$(echo $test | cut -d: -f1) expected=$(echo $test | cut -d: -f2) echo -n "测试 $name (期望 $expected) ... " # 生成汇编 "$COMPILER" "$TEST_DIR/$name.sy" --emit-asm > /tmp/test_$name.s 2>&1 if [ $? -ne 0 ]; then echo -e "${RED}失败 (汇编错误)${NC}" FAIL=$((FAIL + 1)) continue fi # 链接 riscv64-linux-gnu-gcc -static /tmp/test_$name.s -o /tmp/test_$name -no-pie 2>/dev/null if [ $? -ne 0 ]; then echo -e "${RED}失败 (链接错误)${NC}" FAIL=$((FAIL + 1)) continue fi # 运行 qemu-riscv64 /tmp/test_$name > /dev/null 2>&1 exit_code=$? if [ $exit_code -eq $expected ]; then echo -e "${GREEN}通过${NC}" PASS=$((PASS + 1)) else echo -e "${RED}失败 (实际 $exit_code)${NC}" FAIL=$((FAIL + 1)) fi done echo "==========================================" echo -e "测试结果: ${GREEN}通过 $PASS${NC} / ${RED}失败 $FAIL${NC}" echo "==========================================" if [ $FAIL -eq 0 ]; then echo -e "${GREEN}✓ 所有基础测试通过!${NC}" exit 0 else echo -e "${RED}✗ 有 $FAIL 个测试失败${NC}" exit 1 fi