// 夹具自检:真包必须覆盖全部阶段,且保留座位差异 const fs = require('fs'); const path = require('path'); const { ROOT } = require('./_load'); const t = require('./_assert')(); const fx = JSON.parse(fs.readFileSync(path.join(ROOT, 'client/tests/fixtures/packets.json'), 'utf8')); t.eq('三个座位', fx.seats.length, 3); const rpcsOf = seat => fx.seats[seat].map(p => p.rpc); const allRpcs = [].concat(rpcsOf(0), rpcsOf(1), rpcsOf(2)); ['fapai','jiaofen','shangzhuang','xuanzhu','maipai','chupai1','chupai2','chupai3','jiesuan'] .forEach(rpc => t.eq('夹具覆盖 ' + rpc, allRpcs.indexOf(rpc) >= 0, true)); // 差异化下发确实存在:bottomcards 不该三家都有 const withBottom = [0,1,2].filter(s => fx.seats[s].some(p => p.rpc === 'shangzhuang' && p.data.hasOwnProperty('bottomcards'))); t.eq('底牌只发给部分座位', withBottom.length < 3, true); // deskinfo 快照覆盖多个阶段 const steps = fx.deskinfo.map(d => d.step).filter((v, i, a) => a.indexOf(v) === i).sort(); t.eq('deskinfo 覆盖 ≥3 个阶段', steps.length >= 3, true); // 每个包都有 success(协议 §0.1:每个下发包的 data 必带 success) const noSuccess = []; [0,1,2].forEach(s => fx.seats[s].forEach(p => { if (!p.data || !p.data.hasOwnProperty('success')) { noSuccess.push(s + ':' + p.rpc); } })); t.eq('每个下发包都带 success', noSuccess, []); process.exit(t.done('fixture') ? 0 : 1);