design §9:「一旦有玩家的主牌全部打空,系统就为全体三人显示另外 两家各自的主牌数量、以及这些主牌里有多少对子」。 原实现只在出牌者自己出牌时更新自己那一格 seatlist[seat][4],所以 A 打空主牌报无主的那一刻,B、C 的主牌数/对子数仍是初始 [-1,-1], 要等各自轮到出牌才补上,界面最多滞后两次出牌才完整。 改为:出牌后先判定出牌者主牌是否出空,一旦 have_baofu() 成立,就 按各家实际手牌为三个座位统一重算 [剩余主牌数, 剩余主对数] 及主花 色标志。重算幂等——主牌一旦出空不会再有,[4][0] 恒为 0。 test_rpc 的 mkChupai 原先只把 seatlist[1][4][0] 置 0 伪造报无主, 而不真的清空 seat1 的主牌;新逻辑按实际手牌重算会把这个假状态纠 正回去,导致 baozhu 断言失败。这是新实现更严格的正确表现,故改测 试造真状态(把 seat1 的主牌标为已出),不是放宽断言。 test_input 新增 6 项:报无主前三家均为 [-1,-1];打空瞬间三家统计 与主花色标志同时刷新到实际值。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
二七王服务端单元测试
运行
node server/games/erqiwang/test/run.js # 跑全部单测
node server/games/erqiwang/test/test_arith.js # 单独跑某一组
退出码 0 表示全过,非 0 表示有失败;run.js 逐个以独立进程 spawn 各 test_*.js 并汇总。
原理:一套代码,两个运行时(dev-guide 01 §1)
正式代码(class.*.js)遵循平台的双运行时规范:
- 友乐 / 浏览器:无
require,由mod.js用min_loadJsFile加载为全局对象;文件顶部的if (typeof require !== 'undefined')守卫被跳过,跨模块按同名全局引用。 - Node(本地 / 单元测试):有
require,守卫块var X = require('./class.X.js')取到依赖;文件底部if (typeof module !== 'undefined') module.exports = ...导出。
因此这两处守卫是纯增量:友乐运行时行为完全不变,只在 Node 下额外启用 require/exports。
_shim.js:平台全局垫片(仅测试用,不进正式代码)
正式代码按全局名引用少量平台工具(min_ary_include/min_ary_deduct/min_random/min_now/min_ontimeout)与模块入口 youle_erqiwang.import。友乐由平台提供,Node 单测由 test/_shim.js 提供等价实现(数组/随机工具忠实复刻 server/minhttp.js,youle_erqiwang.import 用 mock)。测试文件顶部先 require('./_shim') 再 require('../class.*.js')。
测试计划
完整的"规则 → 用例"覆盖矩阵、缺口清单与优先级见 ../docs/compliance/02-测试计划.md。
覆盖
test_arith.js:主牌排序/相邻链(§3)、扣底倍数(§6.3)、算子常规+爬坡逐档+分界+升3级(§7)、算奖 get_chongguan(§8.1)、甩牌分解/最大性/合法性(§5.4)、跟甩牌强制分量拆解(§5.4.4)。test_follow.js:正常跟牌/毙牌/垫牌,单张/对子/拖拉机的必出与缺门毙牌数量对应(§5.1/5.2)。test_callgrade.js:叫分坐庄 do_callgrade(叫5立即/两家不叫/后叫更低)(§4.2)。test_config.js:roomtype 位串解析、局数/扣卡映射(§10.1)。test_paiju.js:亮牌 get_liangpai(§8.2)、结算 get_paiju_account 集成(§7/§8,大光/过庄/升级/爬坡/傍王/投降)、扣底触发 get_bottom_account(§6.3)。test_deal.js:发牌构成——92张/去3-4/三家28+底8/分值(§2/§6.1)。test_desk.js:坐庄轮换 do_prepare(庄赢连庄/闲赢·投降下家)(§4.6)。test_rpc.js(L3,用_rpc.js装配 mod.js + 捕获下发包):明牌 mingpai、出牌 chupai 的 info/baozhu 查牌门控(§9)、投降 touxiang 条件、jiaofen 入参校验、70分上庄暗牌亮牌下发(§4)。
约定(dev-guide §10 测试纪律)
- 测试代码可用现代 JS(不受严格 ES5 限制);正式代码不得为测试放宽/加后门。
- 正反面 + 边界都要覆盖;失败先裁根因(业务缺陷改业务、脚本缺陷改脚本),不软化断言。