- §8.2 亮牌改用埋牌后 28 张静态快照 get_seat_cards_award,不再用 get_seat_cards(只含未出的牌)——否则闲家重连时 get_deskinfo 按庄家 当前剩余手牌重算,亮牌统计缩水甚至变 null。 - §9 出牌包由只带出牌者一家的 info 改为整表下发三家 seatlist,与重连包 PushCards.seatlist 同名同构;报无主后另两家的主牌数/对子数不再滞后两次出牌。 - §5.4.3 甩牌"无组合数量限制":can_playcard 去掉规则外的 14 张硬上限, 改为结构性上界 28(单人手牌上限,牌型编码在此范围内不溢出)。 协议文档同步改写 chupai 三处 info 条目与 liangpai 口径;合规文档补记第四轮 核对(流程层无缺环,规则层 3 项已收口)。全套单测 368 项通过。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
44 lines
3.1 KiB
Markdown
44 lines
3.1 KiB
Markdown
# 二七王服务端单元测试
|
||
|
||
## 运行
|
||
|
||
```bash
|
||
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`](../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 的 seatlist/baozhu 查牌门控(§9,含「seatlist 整表带三家」)、投降 touxiang 条件、jiaofen 入参校验、70分上庄暗牌亮牌下发(§4)。
|
||
|
||
## 约定(dev-guide §10 测试纪律)
|
||
|
||
- 测试代码可用现代 JS(不受严格 ES5 限制);**正式代码不得为测试放宽/加后门**。
|
||
- 正反面 + 边界都要覆盖;失败先裁根因(业务缺陷改业务、脚本缺陷改脚本),不软化断言。
|