feat: integrate platform room entry, UI migration and erqiwang documentation
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
/** Cocos Game View verification: mocked wire, no real ranking/card requests. */
|
||||
export async function verifyRankCardPreview(){
|
||||
const e=await System.import('cc'),modules=Array.from(System.entries()).map(([,m])=>m);
|
||||
const exported=name=>{const m=modules.find(m=>m[name]);if(!m)throw Error(`Missing ${name}`);return m[name];};
|
||||
const source=e.director.getScene().getChildByName('PlatformServices').getComponent('PlatformStartup');
|
||||
const config=source.config,assets=source.getComponent('LobbyAssets');
|
||||
source.unsubscribe?.();source.runtime?.stop();source.panel?.dispose();source.panel=null;
|
||||
await new Promise((resolve,reject)=>e.director.loadScene('PlatformLobby',err=>err?reject(err):resolve()));
|
||||
const sent=[],tips=[],checks=[];let receive,panel;
|
||||
const assert=(ok,msg)=>{if(!ok)throw Error(msg);checks.push(msg);};
|
||||
const runtime=new (exported('PlatformRuntime'))({
|
||||
gameEntry:exported('createLoginStageGameEntry')(config.identity.gameid,()=>{}),resolveRuntimeConfig:async()=>config,
|
||||
createWireClient:()=>({subscribe:cb=>{receive=cb;return ()=>{};},start:()=>{},stop:()=>{},send:p=>sent.push(p),switchServer:()=>{},reconnectCurrent:()=>{}}),
|
||||
scene:{showLoading:()=>{},showLogin:()=>{},showLobby:()=>{},showRoom:()=>{},showReconnect:()=>{},showKicked:()=>{},showServerDenial:()=>{},showFatal:err=>{throw err;},
|
||||
showTips:(msg,time,kind)=>{if(kind==='show_message')panel?.cancelRankRequest();tips.push(msg);}},
|
||||
loadResources:async()=>{},waitForMinimumDisplay:async()=>{},getLoginDeviceSnapshot:()=>{throw Error('Fixture only');},
|
||||
});
|
||||
await runtime.start();receive({type:'open',server:config.servers[0]});
|
||||
const packet=(rpc,data)=>receive({type:'message',message:{route:'agent',rpc,data}});
|
||||
packet('player_login',{state:0,playerid:7,nickname:'接线验证',avatar:'',sex:0,bean:0,roomcard:3,taskstate:0,score:0,sign:null,ip:'127.0.0.1',openid:'test',unionid:'test',invitecode:null});
|
||||
const canvas=e.director.getScene().getChildByName('Canvas'),popup=new e.Node('RankCardTestPopup');popup.parent=canvas;popup.layer=canvas.layer;popup.addComponent(e.UITransform).setContentSize(1600,720);
|
||||
const remote=exported('createRemoteConfig')({gameNoticeShow:-1,rankList:2,cdKey:2},config.identity);
|
||||
panel=new (exported('LobbyPanel'))(canvas,popup,assets,config,exported('resolveLobbyPolicy')(remote),runtime.state,msg=>tips.push(msg),()=>{},()=>null,()=>{},
|
||||
exported('resolveLobbyMenuConfig')(remote),{versionState:0,launchMode:0},()=>{},()=>{},()=>{},undefined,undefined,
|
||||
{rank:()=>runtime.getTreasureList(),redeem:card=>runtime.redeemCard(card),paste:async()=>'00Ab-12'});
|
||||
popup.setSiblingIndex(canvas.children.length-1);
|
||||
const off=runtime.subscribeState(state=>panel.render(state),err=>{throw err;});
|
||||
const click=id=>panel.menuNodes.get(id).emit(e.Button.EventType.CLICK);
|
||||
click(3233);click(3233);assert(sent.length===1&&sent[0].rpc==='get_treasurelist','rank query suppresses duplicate clicks');
|
||||
assert(panel.modal===null,'rank waits for server');
|
||||
const list=Array.from({length:8},(_,i)=>({name:`测试${i+1}`,headimg:'',playerid:i+1,star:100-i,signature:`签名${i+1}`}));
|
||||
packet('get_treasurelist',{list});assert(panel.modalKind==='rank','server opens authored rank prefab');
|
||||
let group=panel.modal.getChildByName('group-84'),rows=group.getComponentInChildren(e.ScrollView).content;
|
||||
assert(rows.children.length===8,'all rank rows rendered');
|
||||
assert(rows.children.every(n=>n._prefab?.asset===assets.rankItem),'all rank rows instantiate VipRankItem prefab');
|
||||
assert(rows.children.every(n=>n.getChildByPath('Spirit630/Spirit631')),'prefab avatar hierarchy is preserved');
|
||||
const authoredLayout=rows.getComponent(e.Layout);assert(authoredLayout&&rows.getComponent(e.UITransform).height>511,'authored layout grows scroll content');
|
||||
const viewport=group.getComponentInChildren(e.ScrollView);viewport.scrollToBottom(0);assert(viewport.getScrollOffset().y>0,'authored ScrollView reaches lower rows');viewport.scrollToTop(0);
|
||||
assert(group.getComponentInChildren(e.ScrollView).content===rows,'native scroll content is bound');
|
||||
rows.children[1].emit(e.Button.EventType.CLICK);
|
||||
assert(group.getChildByName('Spirit637').getComponent(e.Label).string==='ID:2','row selection updates detail ID');
|
||||
assert(group.getChildByName('Spirit641').getComponent(e.Label).string==='个性签名:\n签名2','row selection updates signature');
|
||||
group.getChildByName('Spirit605').emit(e.Button.EventType.CLICK);assert(panel.modal===null,'rank shade closes');
|
||||
click(3233);packet('get_treasurelist',{list:[]});assert(panel.modal===null,'empty rank does not open');
|
||||
click(3233);packet('show_message',{msg:'暂不可用',time:0});assert(!panel.rankPending,'denial releases rank request');
|
||||
click(3264);assert(panel.modalKind==='cdkey','card entry opens original feedback group');
|
||||
group=panel.modal.getChildByName('group-74');const edit=group.getChildByName('CardInput').getComponent(e.EditBox);
|
||||
assert(edit.textLabel&&edit.maxLength===-1,'native card input is bound');
|
||||
const anchor=edit.textLabel.node.getComponent(e.UITransform).anchorPoint;assert(anchor.x===0&&anchor.y===1,'card label uses native input anchor');
|
||||
const count=sent.length;edit.string=' ';group.getChildByName('Spirit3266').emit(e.Button.EventType.CLICK);assert(sent.length===count,'blank card is not sent');
|
||||
group.getChildByName('Spirit3265').emit(e.Button.EventType.CLICK);await Promise.resolve();await Promise.resolve();
|
||||
assert(edit.string==='00Ab-12','paste preserves original card text');
|
||||
group.getChildByName('Spirit3266').emit(e.Button.EventType.CLICK);assert(panel.modal===null,'redeem closes original dialog');
|
||||
assert(sent.at(-1).rpc==='topup_card'&&sent.at(-1).data.cardno==='00Ab-12','redemption sends exact card');
|
||||
packet('topup_card',{});packet('update_bean',{bean:200});assert(panel.model.bean===200,'server bean update reaches lobby');
|
||||
const sentBeforeConfig=sent.length;
|
||||
const cfgRemote=exported('createRemoteConfig')({rankList:1,rankList1:list,nameImgFrame_2:2},config.identity);
|
||||
panel.config={...config,remoteConfig:cfgRemote};panel.menuConfig=exported('resolveLobbyMenuConfig')(cfgRemote);
|
||||
click(3233);assert(panel.modalKind==='rank'&&sent.length===sentBeforeConfig,'config rank opens without server request');
|
||||
assert(panel.modal.getChildByPath('group-84/Spirit639').getComponent(e.Sprite).spriteFrame===assets.rankSymbols[1],'configured currency symbol is used');
|
||||
await new Promise(resolve=>e.director.once(e.Director.EVENT_AFTER_DRAW,resolve));
|
||||
globalThis.__rankCardVerification={panel,runtime,checks,close:()=>{off();panel.dispose();runtime.stop();popup.destroy();}};
|
||||
return {checks,packets:sent.map(p=>({rpc:p.rpc,fields:Object.keys(p.data)}))};
|
||||
}
|
||||
Reference in New Issue
Block a user