# 二七王服务端单元测试 ## 运行 ```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')`。 ## 覆盖 - `test_arith.js`:扣底倍数(§6.3)、算子常规+爬坡逐档(§7)、算奖 get_chongguan(§8.1)、甩牌分解/最大性/合法性(§5.4)、跟甩牌强制分量拆解(§5.4.4)。 - `test_config.js`:roomtype 位串解析、局数/扣卡映射(§10.1)。 - `test_paiju.js`:亮牌 get_liangpai(§8.2)、结算 get_paiju_account 集成(§7/§8,含投降)。 ## 约定(dev-guide §10 测试纪律) - 测试代码可用现代 JS(不受严格 ES5 限制);**正式代码不得为测试放宽/加后门**。 - 正反面 + 边界都要覆盖;失败先裁根因(业务缺陷改业务、脚本缺陷改脚本),不软化断言。