37 lines
2.1 KiB
TypeScript
37 lines
2.1 KiB
TypeScript
import {test} from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import {cloneAndFreezeRoomtype} from '../../YouleNexus/assets/framework/platform/stores/platform-store.ts';
|
|
import {parseCreateRoomResponse,parseRoomEntryFields} from '../../YouleNexus/assets/framework/protocol/contracts/room-contracts.ts';
|
|
import {ErqiwangRoomRules} from '../../YouleNexus/assets/games/erqiwang/erqiwang-room-rules.ts';
|
|
import {createRequire} from 'node:module';
|
|
const require=createRequire(import.meta.url);
|
|
const server=require('../../../server/games/erqiwang/class.config.js');
|
|
|
|
test('all 32 UI combinations match actual server config, round-trip and fees',()=>{
|
|
for(let mask=0;mask<32;mask++){
|
|
const r=new ErqiwangRoomRules();r.open(null);
|
|
for(let group=0;group<5;group++)r.select(group,(mask>>group)&1);
|
|
const code=r.build();assert.match(code,/^[01]{5}0{6}$/);
|
|
const cfg=server.parse(code);
|
|
assert.deepEqual([cfg.aset12,cfg.deductAA,cfg.nocheck,cfg.bangwang,cfg.climb],r.selection.map(Boolean));
|
|
const copy=new ErqiwangRoomRules();copy.open(code);assert.deepEqual(copy.selection,r.selection);
|
|
assert.equal(r.roomCards,(cfg.aset12?2:1)*(cfg.deductAA?1:2));
|
|
assert.equal(r.seatCount(code),3);
|
|
}
|
|
});
|
|
test('required groups have defaults and malformed saved configuration is rejected',()=>{
|
|
const r=new ErqiwangRoomRules();r.open(null);assert.equal(r.build(),'00000000000');
|
|
for(const invalid of ['00000','00000000001','2'.repeat(11),[],{},123])assert.throws(()=>r.open(invalid));
|
|
assert.throws(()=>r.select(5,0));assert.throws(()=>r.select(0,2));
|
|
});
|
|
|
|
test('platform preserves erqiwang string through canonical state and entry responses',()=>{
|
|
const code='10100000000';
|
|
assert.equal(cloneAndFreezeRoomtype(code as never),code);
|
|
assert.equal(parseCreateRoomResponse({state:0,roomcode:'123456',seat:0,roomtype:code}).room?.roomtype,code);
|
|
assert.equal(parseRoomEntryFields({roomcode:'123456',seat:0,roomtype:code,players:[{},null,null]}).roomtype,code);
|
|
const array=[1,[2]];const copied=cloneAndFreezeRoomtype(array);
|
|
assert.deepEqual(copied,array);assert.notEqual(copied,array);
|
|
assert.ok(Object.isFrozen(copied));
|
|
});
|