Files
agentmc/tests
JianFeeeee 480fe8e225 M0 完成:空白测试服(vanilla 1.21.1 / 0 mods)
## 为什么不用现役服(用户定向)

> 我觉得可以起一个空白新服用来测试功能,而不是用现在的服。

理由不只是"干净",而是**可预期**:
现役 `/home/minecraft` 是 world 15G + 64 mods + neoforge ——
任何协议层改动都可能污染它,且**测不出边界**(模组太多、状态太杂)。
我们要验的是**协议与行为**:已知方块集、已知出生点、可重置的世界。

## 形态

    store/vanilla-1.21.1/server/    内容根  jar + 配置 + world
    runtime/test-server/            运行期  server.log / server.pid

- **vanilla 1.21.1**,0 mods(协议最干净,先验协议再逐个加 mod 验差异)
- **超平坦 + 固定种子** `mcfold-test-2026`(地形可预测)
- creative / peaceful / 无怪物 / 无结构 / spawn-protection=0
- **端口 25566**(避开现役 25565)
- server.jar 下载后**校验 sha1**(`59353fb...`,实测一致)

## mcfold/server.py:起停 + 探活

`python3 -m mcfold.server {start,stop,status,reset}`

★ **status 是协议级探活**(Server List Ping,state=1),不是"端口开着就算活":
必须回出 version / protocol / motd 才算真起来。
实测:`1.21.1 protocol 767  players 0/4  motd=mcfold test server`

## tests/test_server.py(4 项,默认套件)

  ✓ 配置生成一致  —— ★ 守护一个真实踩过的坑:
      properties 里写**行内注释**(`k=v  # 注释`)会被解析成值的一部分。
      我第一版 `level-type=minecraft\:flat  \# 超平坦` 就是这样坏掉的
      (服务端把它当成值,且 spawn-protection 也回到默认)。
      ⇒ 生成器**不写行内注释**,这条判据守它。
  ✓ 三层隔离(内容根 vs 运行期;日志不落内容根)
  ✓ 端口避让(25566 ≠ 现役 25565)
  ✓ **协议级探活**(起服时验 protocol == 767;没起服则跳过,不误报)

## 变异验证(工程纪律 #2:判据必须能失败)

把 `PROTOCOL = 767` 改成 `999` ⇒ `test_status_proves_protocol` **变红**
("协议号不符:767 != 999"),还原后恢复绿。
⇒ 这条判据不是恒绿。

## 测试

  ./run_tests.sh  → **70 项**(原 66 + 本套件 4),0 失败
2026-09-26 11:12:40 +08:00
..