#!/usr/bin/env bash # 统一测试入口。 # # ./run_tests.sh 纯 Python 单元测试(秒级) # ./run_tests.sh --with-render 额外跑渲染联测(需 Java + Xvfb,约 6 分钟) # # 渲染联测需要: # MCFOLD_RENDER_CLASSPATH 含 client-named.jar 与 McfoldRenderServer.class # MCFOLD_NATIVES_DIR lwjgl natives(**.so 必须平铺**,不能带包路径) # DISPLAY 指向可用的 X(Xvfb 即可) # (加载器联测另需 .mcfold/fabric/ 与已编译的 LoaderBoot.class) # 缺任一项会**跳过而非失败**(不误报)。 cd "$(dirname "$0")" WITH_RENDER=0 [ "${1:-}" = "--with-render" ] && WITH_RENDER=1 # 需要 JVM/Xvfb 的套件(默认不跑,跑一次约数分钟) SLOW="test_render_bridge.py test_loader_render.py" total=0; fail=0 for t in tests/test_*.py; do name=$(basename "$t") if [ $WITH_RENDER -eq 0 ] && [[ " $SLOW " == *" $name "* ]]; then printf ' %-24s ⊘ 跳过(用 --with-render 启用)\n' "$name" continue fi out=$(python3 "$t" 2>&1) if echo "$out" | grep -qE "全部通过|通过$"; then # ★ 计数必须包含 ★ 判据:我特意用 ★ 标出「这条守住了一个真 bug 的回归」, # 它们同样是**通过**的判据。只数 ✓ 会让总数少报(曾 16 条只报 7 条) # —— 报告少报也是撒谎。 n=$(echo "$out" | grep -cE "^ (✓|★)") skipped=$(echo "$out" | grep -c "^ - 跳过") total=$((total+n)) # ★ 全跳过的套件不算绿:它对环境一无所知,报绿等于把"没测"说成"测过了" if [ "$n" -eq 0 ] && [ "$skipped" -gt 0 ]; then printf ' %-24s ⊘ 全部跳过(%d 项;环境未就绪)\n' "$name" "$skipped" elif [ "$skipped" -gt 0 ]; then printf ' %-24s ✓ %2d 项(%d 项跳过)\n' "$name" "$n" "$skipped" else printf ' %-24s ✓ %2d 项\n' "$name" "$n" fi else fail=$((fail+1)) printf ' %-24s ✗ 失败\n' "$name" echo "$out" | tail -6 | sed 's/^/ /' fi done echo if [ $fail -eq 0 ]; then echo "全部通过:$total 项,0 失败" else echo "失败 $fail 个套件(共 $total 项通过)"; exit 1 fi