Files
agentmc/run_tests.sh
JianFeeeee d2b4c5029d M4:事件层(可按需排空的日志 + 游标)+ 16 项判据
新增 mcfold/events.py:EventLog(环形缓冲 + seq + 游标)
- 不做回调式推送:LLM 是回合制的,回调会让事件在两次观察之间静默丢失
- drain(limit) 只取本轮、剩余留待下次(不丢)
- 细分层(block_changed❌y:z)独立可查,不污染粗粒度流
- render_events() 输出紧凑文本行,省 token

session 接线:block_change / multi_block_change / chat / damage /
entity spawn·move·destroy / held_item_slot,并加 chat()/command() 发送

修的真 bug:
- dropped 恒 0:deque(maxlen=) 丢元素无声 ⇒ 改手动计数(事件丢了必须说)
- 事件键 to_state_id 与渲染器的 to 不一致 ⇒ 显示 None,改为解出方块名;
  from 区分「未加载/界外」而非裸 None
- run_tests.sh 只数 ✓ 不数 ★ ⇒ 判据少报(98 修正为 110)

实测:/setblock 后事件正确报 grass_block→stone→air,与状态层一致
判据:110 项全通过;4 项变异全部被抓
2026-09-26 12:27:28 +08:00

55 lines
2.2 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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