examples/ —— golden 样例
examples/ —— golden 样例
状态:✅ 已落盘——由主仓测试侧生成器驱动的真实导出物(非手写), 兑现规范附录「用 golden 测试产物替换骨架示意」的承诺;同时作为
tools/最小 reader 的全量校验语料。
覆盖矩阵
| 文件 | 玩法 | 形态 | 覆盖点 | seed |
|---|---|---|---|---|
mcr/majo-mcr-1-*.json |
国标 | format 1 | 70 帧完整手、1 和牌、seats[].flowers、wins[].fans[] |
101 |
riichi/majo-riichi-1-*.json |
日麻 | format 1 | 64 帧完整手、立直荣和、含天凤段四键、里宝揭示 | 102 |
riichi/majo-riichi-1-ryukyoku-*.json |
日麻 | format 1 | 途中流局(九种九牌):ryukyoku 载荷、天凤结果数组 [名称] 无 Δ分 形态 |
1017 |
riichi/majo-riichi-1-noseed-*.json |
日麻 | format 1 | 崩溃恢复局:seed=null、无 wall、无天凤段(§1 铁律 4 ②) |
—(恢复点) |
riichi/majo-riichi-match-*.json |
日麻 | format 2 | 整局容器 3 手(2 胜 + 1 途中流局)+ 天凤段合并、换庄计数 0/1/2、分数跨手承接 | 201/251/301 |
riichi/majo-riichi-mjai-1-*.jsonl |
日麻 | mjai JSONL | 与容器同一组手:245 事件(start_game→end_game、立直链、暗杠、hora/ryukyoku) | 同上 |
sichuan/majo-sichuan-1-*.json |
川麻 | format 1 | 定缺阶段、血战出局、3 家和牌、meta.dealerRotation = 0 |
101 |
sichuan/majo-sichuan-match-*.json |
川麻 | format 2 | 裸容器(无天凤段):3 手、帧 handNumber = null 口径 |
301/351/401 |
guangdong/majo-guangdong-1-*.json |
粤麻 | format 1 | 癞子指示、中马、花牌补花 | 101 |
negative/(14 例 + manifest) |
— | 负例 | 规范 §5.1 全部错误码路径,见 negative/manifest.json |
— |
生成方式
- 生成器:主仓(Mahjong Face to Face 实现仓)
feature/golden-dump分支的android/src/test/.../GoldenDumpTest.kt——HARD 档 bot(Lv2Bot,纯启发式无随机源) 全程驱动真实完整对局,走生产导出链(帧重建 + 牌墙重算 + 天凤段 + mjai)产出, pretty 重排后落盘(语义与导出器输出逐字段一致,重排仅为可读/diff)。 - 确定性:同引擎版本 + 同 seed 重跑字节级一致(固定时间戳基线、固定文件名)。
-
复现(在主仓 worktree/分支内):
GOLDEN_OUT_DIR=<本仓>/examples ./gradlew :android:testWebsiteDebugUnitTest \ --tests "party.mahjong.lan.server.GoldenDumpTest" - 生成基线:实现仓 v1.5.3(develop 分支)生成;格式演进后重跑生成器即可刷新本目录。
脱敏声明(入库硬前置,已复核)
- 昵称一律合成占位:东家 / 南家 / 西家 / 北家(全库扫描确认,无其他字符串);
- 时间戳全部来自固定基线(
2026-01-01 12:00派生),文件名时间部分同; - 无任何真实对局、真实用户数据;牌局内容为 bot 对局(非真人)。
负例(negative/)
手写变异构造:以最小合法正例为底,每个文件只含一个违例点,manifest.json
声明每个文件应命中的错误码与原因——供 reader/消费方验证 §5.1 错误路径。
覆盖:bad_file / not_majo / bad_version / not_supported / bad_shape
(seat 错位、座位数、牌码文法、phase 白名单、drawPositions 越界、缺必需字段、
format 2 冒充、容器内玩法不符)。