48 lines
4.9 KiB
JavaScript
48 lines
4.9 KiB
JavaScript
/** 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);}
|
|
}
|