import { test } from 'node:test'; import assert from 'node:assert/strict'; import { EventBus } from '../../YouleNexus/assets/framework/core/events.ts'; import { PlatformSession } from '../../YouleNexus/assets/framework/platform/session.ts'; import { RoomRPCBus } from '../../YouleNexus/assets/framework/platform/room-rpc-bus.ts'; import type { NetClientEvents } from '../../YouleNexus/assets/framework/net/net-client.ts'; test('RoomRPCBus: route=room 的包分发到对应 handler', () => { const bus = new EventBus(); const session = new PlatformSession(bus); const roomBus = new RoomRPCBus(bus, session); roomBus.start(); // 触发 room apply_free_room bus.emit('message', { route: 'room', rpc: 'other_apply_free_room', data: { applyer: 2 } } as any); assert.equal(session.room.state.value.state, 1, 'apply_free_room 后 state=1'); roomBus.stop(); }); test('RoomRPCBus: route=agent/platform 不被分发(归 Router 处理)', () => { const bus = new EventBus(); const session = new PlatformSession(bus); const roomBus = new RoomRPCBus(bus, session); roomBus.start(); // 故意发一个 route=room + rpc 不存在的包,不应崩 bus.emit('message', { route: 'room', rpc: 'unknown_rpc', data: {} } as any); // state 不应变化 assert.equal(session.room.state.value.state, 0); roomBus.stop(); }); test('RoomRPCBus: stop 后不再分发', () => { const bus = new EventBus(); const session = new PlatformSession(bus); const roomBus = new RoomRPCBus(bus, session); roomBus.start(); roomBus.stop(); bus.emit('message', { route: 'room', rpc: 'other_apply_free_room', data: {} } as any); // stop 后 handler 不该被调用,state 应保持 0 assert.equal(session.room.state.value.state, 0); }); test('RoomRPCBus: room rpc 走 handler,其他 route 忽略', () => { const bus = new EventBus(); const session = new PlatformSession(bus); const roomBus = new RoomRPCBus(bus, session); roomBus.start(); // 模拟 login 后玩家入房,players 数组已存在 session.room.applyRecovery({ roomcode: 'R1', seat: 1, players: [null, { playerid: 100 } as any, null, null], } as any); // 第三方加入 bus.emit('message', { route: 'room', rpc: 'other_join_room', data: { seat: 3, playerid: 300, nickname: '丙' }, } as any); assert.equal(session.room.state.value.players[2]?.playerid, 300); // 第三方退出 bus.emit('message', { route: 'room', rpc: 'other_exit_room', data: { seat: 3 } } as any); assert.equal(session.room.state.value.players[2], null); roomBus.stop(); });