Files
youle_cocos/cocoscreator_projects/scripts/verify-feedback-split-preview.mjs
T

37 lines
4.2 KiB
JavaScript

/** Test extracted panels with local clipboard, image and command fixtures only. */
export async function verifyFeedbackSplitPreview(e){
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 refs=(await load('1c10c2ee-adc2-496f-9005-d3e0e6ebbb56')).scene.getComponentInChildren('LobbyAssets');
assert(refs.redeemCode.data.name==='RedeemCode'&&refs.redeemCode.data.children.length===1&&refs.redeemCode.data.children[0].name==='group-74','redeem prefab contains only group-74');
assert(refs.qrCode.data.name==='QrCode'&&refs.qrCode.data.children.length===1&&refs.qrCode.data.children[0].name==='group-42','QR prefab contains only group-42');
assert(!('notices' in refs),'obsolete shared asset field is removed');
const C=Array.from(System.entries()).map(([,m])=>m).find(m=>m.LobbyPanel).LobbyPanel,panel=Object.create(C.prototype);
const host=new e.Node('FeedbackSplitTest');host.parent=e.director.getScene();
const redeemed=[],shares=[],tips=[],images=[];const loadRemote=e.assetManager.loadRemote;
panel.assets=refs;panel.model={canAct:true};panel.modal=null;panel.modalReleases=[];panel.disposed=false;
panel.extras={paste:async()=>'00Ab-12',redeem:code=>redeemed.push(code)};panel.nativeCall=(name,data)=>shares.push({name,data});panel.tip=message=>tips.push(message);
let qrEnabled=true;
panel.config={identity:{gameid:'test',agentid:'test',channelid:'test',marketid:'test'},remoteConfig:{getValue:key=>({WechatPublicNo_ewm:qrEnabled?'https://example.invalid/fixture.png':'',sharename:'测试',shareDesc:'说明'})[key]}};
panel.close=()=>{for(const off of panel.modalReleases.splice(0))off();panel.modal?.destroy();panel.modal=null;};
panel.open=(asset,kind)=>{panel.close();panel.modal=e.instantiate(asset);panel.modal.parent=host;panel.modalKind=kind;return panel.modal;};
e.assetManager.loadRemote=(url,options,callback)=>images.push({url,callback});
try{
panel.openCdKey();let g=panel.modal.getChildByName('group-74'),edit=g.getChildByName('CardInput').getComponent(e.EditBox);
assert(edit.string==='','redeem input starts empty');
g.getChildByName('Spirit3266').emit(e.Button.EventType.CLICK);assert(redeemed.length===0&&panel.modal!==null,'empty redeem is ignored');
g.getChildByName('Spirit3265').emit(e.Button.EventType.CLICK);await sleep(20);assert(edit.string==='00Ab-12','paste preserves case and leading zeroes');
g.getChildByName('Spirit3266').emit(e.Button.EventType.CLICK);assert(redeemed[0]==='00Ab-12'&&panel.modal===null,'redeem command receives exact input and closes');
panel.openCdKey();g=panel.modal.getChildByName('group-74');assert(g.getChildByName('CardInput').getComponent(e.EditBox).string==='','redeem reopening clears input');
g.getChildByName('反馈遮罩').emit(e.Button.EventType.CLICK);assert(panel.modal===null,'redeem shade closes');
qrEnabled=false;panel.openQrCode();assert(panel.modal===null&&images.length===0,'missing QR config retains no-op behavior');
qrEnabled=true;panel.openQrCode();g=panel.modal.getChildByName('group-42');assert(images[0].url==='https://example.invalid/fixture.png','QR request uses configured URL');
const bitmap=document.createElement('canvas');bitmap.width=bitmap.height=2;bitmap.getContext('2d').fillRect(0,0,2,2);const image=new e.ImageAsset(bitmap);
images[0].callback(null,image);const sprite=g.getChildByName('Spirit343').getComponent(e.Sprite);assert(sprite.spriteFrame?.texture.image===image,'QR image callback populates sprite');
g.getChildByName('Spirit345').emit(e.Button.EventType.CLICK);assert(shares[0].name==='friendsSharetypeUrlToptitleDescript'&&shares[0].data.webpageUrl===images[0].url,'QR share retains existing bridge payload');
g.getChildByName('二维码遮罩').emit(e.Button.EventType.CLICK);assert(panel.modal===null&&sprite.spriteFrame===null,'QR close releases image frame');
panel.openQrCode();panel.close();images[1].callback(null,image);assert(panel.modal===null&&tips.length===0,'late image callback cannot reopen a closed panel');image.destroy();
return {checks};
}finally{panel.close();host.destroy();e.assetManager.loadRemote=loadRemote;}
}