#!/bin/bash
# ch8 测试脚本
#
# 用法：
#   ./test.sh          # 运行全部测试（等价于 ./test.sh all）
#   ./test.sh base     # 运行基础测试
#   ./test.sh exercise # 运行练习测试
#   ./test.sh all      # 运行全部测试（base + exercise）

set -e

GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[0;33m'
NC='\033[0m'

# 检查并安装 tg-rcore-tutorial-checker
ensure_tg_checker() {
    if ! command -v tg-rcore-tutorial-checker &> /dev/null; then
        echo -e "${YELLOW}tg-rcore-tutorial-checker 未安装，正在安装...${NC}"
        if cargo install tg-rcore-tutorial-checker; then
            echo -e "${GREEN}✓ tg-rcore-tutorial-checker 安装成功${NC}"
        else
            echo -e "${RED}✗ tg-rcore-tutorial-checker 安装失败${NC}"
            exit 1
        fi
    fi
}

ensure_tg_checker

# 使用 pipefail 确保管道中任意命令失败都能被捕获
set -o pipefail

QEMU_HEADLESS_RUNNER='qemu-system-riscv64 -machine virt -nographic -bios none -serial stdio -monitor none -drive file=target/riscv64gc-unknown-none-elf/debug/fs.img,if=none,format=raw,id=x0 -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.0 -kernel'

run_base() {
    echo "运行 ch8 基础测试..."
    cargo clean
    export CHAPTER=-8
    echo -e "${YELLOW}────────── cargo run 输出 ──────────${NC}"

    # 使用 tee 将 cargo run 的输出同时显示在终端和传递给 tg-rcore-tutorial-checker
    if CARGO_TARGET_RISCV64GC_UNKNOWN_NONE_ELF_RUNNER="$QEMU_HEADLESS_RUNNER" cargo run 2>&1 | tee /dev/stderr | tg-rcore-tutorial-checker --ch 8; then
        echo ""
        echo -e "${YELLOW}────────── 测试结果 ──────────${NC}"
        echo -e "${GREEN}✓ ch8 基础测试通过${NC}"
        cargo clean
        return 0
    else
        echo ""
        echo -e "${YELLOW}────────── 测试结果 ──────────${NC}"
        echo -e "${RED}✗ ch8 基础测试失败${NC}"
        cargo clean
        return 1
    fi
}

run_exercise() {
    echo "运行 ch8 练习测试..."
    cargo clean
    export CHAPTER=8
    echo -e "${YELLOW}────────── cargo run --features exercise 输出 ──────────${NC}"

    # 使用 tee 将 cargo run 的输出同时显示在终端和传递给 tg-rcore-tutorial-checker
    if CARGO_TARGET_RISCV64GC_UNKNOWN_NONE_ELF_RUNNER="$QEMU_HEADLESS_RUNNER" cargo run --features exercise 2>&1 | tee /dev/stderr | tg-rcore-tutorial-checker --ch 8 --exercise; then
        echo ""
        echo -e "${YELLOW}────────── 测试结果 ──────────${NC}"
        echo -e "${GREEN}✓ ch8 练习测试通过${NC}"
        cargo clean
        return 0
    else
        echo ""
        echo -e "${YELLOW}────────── 测试结果 ──────────${NC}"
        echo -e "${RED}✗ ch8 练习测试失败${NC}"
        cargo clean
        return 1
    fi
}

case "${1:-all}" in
    base)
        run_base
        ;;
    exercise)
        run_exercise
        ;;
    all)
        run_base
        echo ""
        run_exercise
        ;;
    *)
        echo "用法: $0 [base|exercise|all]"
        exit 1
        ;;
esac
