// 主牌序排序:必须与服务端 order_cards 同序(清单 T-5) const { load } = require('./_load'); const t = require('./_assert')(); load('client/js/01_SubGame/codes/shared/cards.js'); load('client/js/01_SubGame/codes/core/CardOrder.js'); // 服务端权威实现,用来做对照 const SRV = require('../../server/games/erqiwang/class.arith.js'); // 牌id构造(与服务端测试同款):deck d(1-2), flower f(1-4), number n(1-13) const id = (d, f, n) => (d - 1) * 54 + (f - 1) * 13 + (n - 1); const big = d => (d - 1) * 54 + 53; // 大王 const small = d => (d - 1) * 54 + 52; // 小王 // 一手混牌:两副牌、四花色、含王与 2/7 const hand = [ id(1, 1, 5), id(1, 4, 13), big(1), id(2, 2, 7), id(1, 3, 2), id(1, 1, 1), small(2), id(2, 4, 7), id(1, 2, 2), id(2, 3, 10) ]; // ---- 与服务端逐一对照:选主前(0) 与四种主花色 ---- [0, 1, 2, 3, 4].forEach(mf => { const expected = SRV.order_cards(mf, hand.concat()); t.eq('与服务端同序 mainflower=' + mf, EQW_CardOrder.sort(hand, mf), expected); }); // ---- 不修改入参数组 ---- const orig = hand.concat(); EQW_CardOrder.sort(hand, 1); t.eq('入参未被修改', hand, orig); // ---- 返回的是新数组,不是同一引用 ---- t.eq('返回新数组', EQW_CardOrder.sort(hand, 1) === hand, false); // ---- 选主前后顺序确实不同(正2/正7 升格、主花色并入主牌段)---- const beforeChoose = EQW_CardOrder.sort(hand, 0); const afterChoose = EQW_CardOrder.sort(hand, 1); t.eq('选主后顺序变化', JSON.stringify(beforeChoose) === JSON.stringify(afterChoose), false); // ---- 主牌在左:排序从大到小,最大的一张恒为大王 ---- t.eq('首张是大王', EQW_CardOrder.sort(hand, 1)[0], big(1)); // ---- 边界 ---- t.eq('空数组', EQW_CardOrder.sort([], 1), []); t.eq('null 入参', EQW_CardOrder.sort(null, 1), []); t.eq('单张', EQW_CardOrder.sort([id(1, 1, 5)], 1), [id(1, 1, 5)]); process.exit(t.done('cardorder') ? 0 : 1);