/** Run with Cocos MCP in Game View; no business packets are sent. */ export async function verifyVersionXmlPreview(){ const cc=await System.import('cc'),modules=Array.from(System.entries()).map(([,m])=>m); const exported=name=>{const result=modules.find(m=>m[name])?.[name];if(!result)throw Error('Missing '+name);return result;}; const assert=(value,message)=>{if(!value)throw Error(message);}; const startup=cc.director.getScene().getComponentInChildren('PlatformStartup'); const selected=startup.getComponent('SubgameAssets'); assert(selected.versionManifest.gameid===startup.config.identity.gameid,'live game identity'); assert(selected.versionManifest.versionCode===startup.config.identity.version,'live numeric version'); let label;function find(n){for(const c of n.components)if(c instanceof cc.Label&&n.name==='版本显示')label=c.string;n.children.forEach(find);}find(cc.director.getScene()); assert(label==='v'+selected.versionManifest.version,'live display version'); const outcomes=[]; for(const key of ['erqiwang','Game_Surface_3']){ const node=new cc.Node('VersionContractTest'); try{const component=node.addComponent(exported('SubgameAssets'));component.gameKey=key; const identity=await component.loadBuildIdentity();assert(identity.gameid===component.versionManifest.gameid,'selected XML identity'); outcomes.push({key,gameid:identity.gameid,versionCode:identity.version,version:component.displayVersion}); }finally{node.destroy();} } const Feedback=exported('FeedbackPanels'); const feedback=new Feedback(cc.director.getScene().getChildByName('Canvas'),{tips:startup.tipsPrefab,loading:startup.waitPrefab,reconnect:startup.reconnectPrefab,kick:startup.kickPrefab}); feedback.loadingNode.destroy(); await new Promise(resolve=>setTimeout(resolve,100)); feedback.dispose(); const invalid=Object.create(Feedback.prototype);invalid.loadingNode=new cc.Node('InvalidLiveLoading'); let rejected=false;try{invalid.renderLoading(false);}catch{rejected=true;}finally{invalid.loadingNode.destroy();} assert(rejected,'invalid live panel must still reject'); return {label,games:outcomes,disposedScenePanel:true,invalidLivePanelRejected:true}; }