Files
youle_cocos/cocoscreator_projects/scripts/verify-profile-preview.mjs
T

73 lines
6.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/** Execute in Cocos Game View. All input fixtures stay local; no server submission. */
export async function verifyProfilePreview(e,profileId) {
const checks=[],assert=(ok,message)=>{if(!ok)throw Error(message);checks.push(message);};
const load=id=>new Promise((resolve,reject)=>e.assetManager.loadAny(id,(err,a)=>err?reject(err):resolve(a)));
const sleep=ms=>new Promise(resolve=>setTimeout(resolve,ms));
const asset=await load(profileId),root=e.instantiate(asset);root.parent=e.director.getScene();
const host=new e.Node('ProfileFlowVerification');host.parent=e.director.getScene();
try {
const view=root.getComponent('ProfileInfoListView');
assert(view,'profile prefab owns ProfileInfoListView');
assert(view.textItemPrefab&&view.authPrefab,'profile owns text-item and auth prefab references');
view.render(['昵称','ID:42','IP:127.0.0.1','积分:0','星星:10','城市','个性签名:'],'短签名');
await sleep(80);
const content=view.content,layout=content.getComponent(e.Layout);
const checkSpacing=()=>{
const children=content.children.filter(n=>n.active);
for(let i=1;i<children.length;i++){
const prev=children[i-1],next=children[i],pu=prev.getComponent(e.UITransform),nu=next.getComponent(e.UITransform);
const bottom=prev.position.y-pu.height*pu.anchorY,top=next.position.y+nu.height*(1-nu.anchorY);
assert(Math.abs(bottom-top-layout.spacingY)<0.1,'visible rows use the container spacing');
}
};
checkSpacing();const initialHeight=content.getComponent(e.UITransform).height;
view.render(['很长的昵称'.repeat(25),'ID:42','个性签名:'],'长签名内容'.repeat(100));await sleep(80);checkSpacing();
assert(content.children.filter(n=>n.active).length===4,'removed fields leave no empty rows');
assert(content.children[0].getComponent(e.UITransform).height>30,'long nickname wraps and increases its row height');
assert(view.signatureBox.height>=view.signature.node.getComponent(e.UITransform).height+20,'signature background grows with its text');
assert(content.getComponent(e.UITransform).height>initialHeight&&view.scroll.getMaxScrollOffset().y>0,'long content becomes scrollable');
view.scroll.scrollToBottom(0);await sleep(30);
view.render(['昵称','个性签名:'],'短签名');await sleep(60);checkSpacing();
assert(content.getComponent(e.UITransform).height<initialHeight,'shorter content shrinks the list again');
assert(view.scroll.getScrollOffset().y<=Math.max(0,view.scroll.getMaxScrollOffset().y)+0.1,'content shrink clamps scrolling');
const LobbyPanel=Array.from(System.entries()).map(([,m])=>m).find(m=>m.LobbyPanel)?.LobbyPanel;
assert(LobbyPanel,'LobbyPanel is loaded');
const panel=Object.create(LobbyPanel.prototype),tips=[];
panel.assets={profile:asset};panel.disposed=false;panel.modal=null;panel.modalReleases=[];
panel.policy={starName:'星星'};panel.model={nickname:'资料接线测试',playerid:42,ip:'127.0.0.1',score:0,bean:10,sign:'签名测试',canAct:true};
panel.avatarFrame=asset.data.getChildByPath('group-18/Spirit118').getComponent(e.Sprite).spriteFrame;
panel.location=()=>null;panel.tip=message=>tips.push(message);
panel.close=()=>{for(const off of panel.modalReleases.splice(0))off();panel.modal?.destroy();panel.modal=null;panel.modalKind='';};
panel.open=(prefab,kind)=>{panel.close();panel.modal=e.instantiate(prefab);panel.modal.parent=host;panel.modalKind=kind;return panel.modal;};
panel.openProfile();
const profile=panel.modal,profileView=profile.getComponent('ProfileInfoListView');
assert(profileView.content.children[0].getComponent(e.Label).string==='资料接线测试'&&profileView.signature.string==='签名测试','profile renders data through the new hierarchy');
const auth=()=>{
panel.modal.getChildByPath('group-18/Spirit484').emit(e.Button.EventType.CLICK);
assert(panel.modal?.name==='Layer18_Auth'&&panel.modalKind==='auth','real-name button opens the auth prefab');
const group=panel.modal.getChildByName('group-57');
return {group,name:group.getChildByName('NameInput').getComponent(e.EditBox),id:group.getChildByName('IdInput').getComponent(e.EditBox),submit:group.getChildByName('Spirit493')};
};
let inputs=auth();await sleep(40);
assert(!e.isValid(profile),'opening auth closes the profile');
assert(inputs.name.string===''&&inputs.id.string==='','auth opens with empty inputs');
assert(inputs.id.inputMode===e.EditBox.InputMode.SINGLE_LINE&&inputs.id.inputFlag===e.EditBox.InputFlag.DEFAULT,'ID input allows the X checksum character');
for(const edit of [inputs.name,inputs.id])for(const label of [edit.textLabel,edit.placeholderLabel]){
const ui=label.node.getComponent(e.UITransform);
assert(Math.abs(label.node.position.y+(0.5-ui.anchorY)*ui.height)<0.1&&label.verticalAlign===e.Label.VerticalAlign.CENTER,'input text stays vertically centered inside its hit area');
}
inputs.name.string='张';inputs.id.string='11010519491231002X';inputs.submit.emit(e.Button.EventType.CLICK);
assert(tips.at(-1)==='姓名不正确!'&&panel.modal!==null,'invalid name shows source tip and keeps auth open');
inputs.name.string='测试';inputs.id.string='110105194912310020';inputs.submit.emit(e.Button.EventType.CLICK);
assert(tips.at(-1)==='身份证信息不正确!'&&panel.modal!==null,'invalid ID shows source tip and keeps auth open');
inputs.id.string='11010519491231002X';inputs.submit.emit(e.Button.EventType.CLICK);
assert(tips.at(-1)==='认证成功!'&&panel.modal===null,'valid local input closes auth and shows source success tip');
panel.openProfile();inputs=auth();
assert(inputs.name.string===''&&inputs.id.string==='','reopening does not retain identity inputs');
inputs.group.getChildByName('Spirit485').emit(e.Button.EventType.CLICK);
assert(panel.modal===null,'auth backdrop closes the panel');
assert(tips.length===3,'flow produced only the three expected validation tips');
return {checks};
} finally {root.destroy();host.destroy();await sleep(50);}
}