/** Execute through Cocos MCP in the editor Game View. No business RPC is sent. */ export async function verifyRoomRefactorPreview(){ const e=await System.import('cc'),modules=Array.from(System.entries()).map(([,m])=>m); const get=name=>{const value=modules.find(m=>m[name])?.[name];if(!value)throw Error('Missing compiled export '+name);return value;}; const assert=(value,message)=>{if(!value)throw Error(message);}; const tick=()=>new Promise(resolve=>setTimeout(resolve,80)); const load=uuid=>new Promise((resolve,reject)=>e.assetManager.loadAny(uuid,(error,asset)=>error?reject(error):resolve(asset))); const scene=e.director.getScene(),startup=scene.getComponentInChildren('PlatformStartup'); assert(startup,'PlatformStartup required');startup.unsubscribe?.();startup.unsubscribe=null;startup.runtime.stop();startup.panel?.dispose();startup.panel=null; const canvas=scene.getChildByName('Canvas'),composition=startup.getComponent('GameComposition');assert(composition,'abstract GameComposition resolves moved script'); for(const node of [...canvas.children])if(node.name==='Layer418_ChatPannel')node.destroy();await tick(); const definitions={erqiwang:e.js.getClassByName('GameEntry_erqiwang').definition,Game_Surface_3:e.js.getClassByName('GameEntry_Game_Surface_3').definition},created=[]; for(const [key,uuid]of [['erqiwang',composition.createRoom._uuid],['Game_Surface_3','584dbb85-4acc-4bea-9d9b-e0cbeb8741da']]){ const root=e.instantiate(await load(uuid));root.parent=canvas;const page=root.getComponent('CreateRoomPage'),packets=[]; assert(page&&page.__classname__!==null,key+' create page'); const cases=key==='erqiwang'?32:1; for(let bits=0;bitspackets.push(value),cancel(){},reportError:message=>{throw Error(message);}}); if(key==='erqiwang')for(let group=0;group<5;group++){ const value=(bits>>group)&1,index=group<3?group*2+value:group+3; page.options[index].isChecked=!!value||group<3;page.options[index].node.emit(e.Toggle.EventType.TOGGLE); } page.submitButton.node.emit(e.Button.EventType.CLICK); } assert(packets.length===cases,key+' actual submit count'); if(key==='erqiwang'){assert(packets.every(value=>typeof value==='string'&&/^[01]{5}000000$/.test(value)),'all erqiwang sends are eleven bits');assert(new Set(packets).size===32,'all erqiwang combinations distinct');} else assert(Array.isArray(packets[0]),'template keeps array'); created.push({key,submissions:packets.length,format:typeof packets[0]});page.close();root.destroy(); } const Chat=get('RoomChatPanel'),cache=get('roomAvatarCache'); const panel=new Chat(canvas,startup.roomChatPrefab,startup.chatPhrasePrefab,startup.chatHistoryPrefab,definitions.erqiwang.chat,{text(){},phrase(){},expression(){},voice(){},error:message=>{throw Error(message);},readAnnouncements(){}}); panel.open();panel.select('History'); const history=Array.from({length:50},(_,i)=>Object.freeze({id:i+1,kind:'text',sender:{nickname:'玩家'+i,avatar:''},text:'测试聊天 '+i})); const state=messages=>({app:{phase:'logged-in'},room:{kind:'inside'},roomSocial:{history:messages,announcements:[]}}); panel.render(state(history),false,'');await tick(); const content=panel.content('History'),nodes=[...content.children],scroll=panel.scroll('History');scroll.scrollToTop(0);await tick();const offset=scroll.getScrollOffset().y; const layout=content.getComponent(e.Layout),original=layout.updateLayout;let layouts=0,layoutChecks=0;layout.updateLayout=function(...args){layoutChecks++;if(this._layoutDirty||args[0])layouts++;return original.apply(this,args);}; const drawHistory=panel.renderHistory;let renderPasses=0;panel.renderHistory=function(messages){renderPasses++;return drawHistory.call(this,messages);}; const before=performance.now();for(let i=0;i<5;i++)panel.render(state([...history,{id:51,kind:'text',sender:{nickname:'新玩家',avatar:''},text:'追加消息'}]),false,'');await tick(); const elapsed=performance.now()-before; assert(content.children.length===51,'one additional row');assert(nodes.every((node,i)=>content.children[i]===node),'all fifty existing row identities retained');assert(Math.abs(scroll.getScrollOffset().y-offset)<1,'scroll position retained while reading history');assert(renderPasses===1,'same-frame state changes must render history once'); layout.updateLayout=original; const activeLeases=cache.leases;panel.dispose();await tick();assert(cache.leases===0,'avatar leases return to zero'); return {created,chat:{beforeRows:50,afterRows:51,retainedRows:50,renderPasses,layouts,layoutChecks,scrollPreserved:true,elapsedIncludingFrameWaitMs:elapsed},leases:{beforeDispose:activeLeases,afterDispose:cache.leases},environment:{userAgent:navigator.userAgent,width:e.view.getVisibleSize().width,height:e.view.getVisibleSize().height}}; }