/** Real Cocos layout and coordinate-input checks. Only a dedicated local fixture history is written. */ export async function verifyOwnerRoomPreview(e,listId){ const checks=[],assert=(v,m)=>{if(!v)throw Error(m);checks.push(m);},sleep=ms=>new Promise(r=>setTimeout(r,ms)); const load=id=>new Promise((r,j)=>e.assetManager.loadAny(id,(err,a)=>err?j(err):r(a))); const source=await load('1c10c2ee-adc2-496f-9005-d3e0e6ebbb56'),refs=source.scene.getComponentInChildren('LobbyAssets'); const asset=await load(listId),canvas=e.director.getScene().getComponentInChildren(e.Canvas); assert(refs.ownedRoomList.uuid===listId,'startup points at independent room list'); assert(!refs.qrCode.data.getChildByName('group-98')&&refs.qrCode.data.getChildByName('group-42'),'room and QR groups use separate prefabs'); const view=asset.data.getComponent('OwnerRoomListView'); assert(asset.data.children.length===1&&asset.data.children[0].name==='group-98','room prefab contains only group-98'); assert(view.itemPrefab.data.name==='OwnerRoomItem','list references the requested OwnerRoomItem prefab'); const LobbyPanel=Array.from(System.entries()).map(([,m])=>m).find(m=>m.LobbyPanel).LobbyPanel,panel=Object.create(LobbyPanel.prototype),joined=[]; panel.assets={ownedRoomList:asset,ownedRoomDigits:refs.ownedRoomDigits};panel.model={canAct:true};panel.config={identity:{gameid:'__owner_preview_',agentid:'local'}}; panel.disposed=false;panel.modal=null;panel.modalReleases=[];panel.extras={joinOwned:code=>joined.push(code)}; panel.close=()=>{for(const off of panel.modalReleases.splice(0))off();panel.modal?.destroy();panel.modal=null;}; panel.open=(prefab,kind)=>{panel.close();const n=e.instantiate(prefab);n.parent=canvas.node;n.setPosition(0,0,0);const w=n.getComponent(e.Widget);w.target=canvas.node;w.updateAlignment();panel.modal=n;panel.modalKind=kind;return n;}; const key='tsgame_roomlist___owner_preview_local',previous=localStorage.getItem(key),codes=Array.from({length:9},(_,i)=>100001+i); let id=200; const send=(touch,type)=>e.input._dispatchEventTouch(new e.EventTouch([touch],false,type,[touch])); const touchAt=(node,dx=0,dy=0)=>{const p=node.worldPosition.clone();p.x+=dx;p.y+=dy;const s=canvas.cameraComponent.worldToScreen(p);return new e.Touch(s.x,s.y,id++);}; const tap=async(node,dx=0,dy=0)=>{const t=touchAt(node,dx,dy);send(t,e.Input.EventType.TOUCH_START);send(t,e.Input.EventType.TOUCH_END);await sleep(30);}; try{ localStorage.setItem(key,JSON.stringify({data:codes}));panel.openOwnedRooms();await sleep(100); let v=panel.modal.getComponent('OwnerRoomListView'),rows=v.content.children; assert(rows.length===9,'more than five cached records are displayed'); assert(v.scroll.getMaxScrollOffset().y>0,'long room list is scrollable'); assert(rows.every((n,i)=>n.getChildByName('Digits').children.map(d=>refs.ownedRoomDigits.indexOf(d.getComponent(e.Sprite).spriteFrame)).join('')===String(codes[i])),'all room numbers retain digit artwork and ordering'); const layout=v.content.getComponent(e.Layout); assert(rows.slice(1).every((n,i)=>Math.abs(rows[i].position.y-n.position.y-80-layout.spacingY)<.1),'room spacing comes from Layout'); await tap(panel.modal.getChildByPath('group-98/房间列表背景'),0,240);assert(panel.modal!==null,'panel header blank area does not close'); const t=touchAt(rows[1]);send(t,e.Input.EventType.TOUCH_START);const p=t.getLocation(); t.setTouchInfo(t.getID(),p.x,p.y+120);send(t,e.Input.EventType.TOUCH_MOVE);send(t,e.Input.EventType.TOUCH_END);await sleep(80); assert(panel.modal!==null&&joined.length===0,'dragging a row never joins or closes'); assert(v.scroll.getScrollOffset().y>0,'coordinate drag moves scroll content'); v.scroll.stopAutoScroll();v.scroll.scrollToBottom(0);await sleep(60); await tap(rows.at(-1));assert(joined.at(-1)===codes.at(-1)&&panel.modal===null,'last scrolled row joins its own room and closes'); panel.openOwnedRooms();await sleep(60);v=panel.modal.getComponent('OwnerRoomListView'); assert(Math.abs(v.scroll.getScrollOffset().y)<.1,'reopening starts at top'); v.render([],refs.ownedRoomDigits);await sleep(40);assert(v.content.children.length===0,'empty update removes all rows'); assert(v.content.getComponent(e.UITransform).height===0,'empty update removes stale scroll height'); v.render(codes,refs.ownedRoomDigits);await sleep(40);assert(v.content.children.length===9&&v.scroll.getMaxScrollOffset().y>0,'refilling empty list restores layout and scrolling'); panel.close();localStorage.setItem(key,JSON.stringify({data:[]}));panel.openOwnedRooms();await sleep(60); assert(panel.modal.getComponent('OwnerRoomListView').content.children.length===0,'empty history opens an empty list'); await tap(panel.modal.getChildByPath('group-98/Spirit103'),600,0);assert(panel.modal===null,'outside shade closes room list'); return {checks}; }finally{panel.close();if(previous===null)localStorage.removeItem(key);else localStorage.setItem(key,previous);} }