MatchMaster/tools/coin-madness/check-reward-hud.cjs

58 lines
3.8 KiB
JavaScript

// Run against preview.cjs; all wallet changes below are local fixture data.
const { chromium } = require(process.env.PLAYWRIGHT_MODULE || 'playwright');
const assert = require('node:assert/strict');
(async () => {
const browser = await chromium.launch({ headless: true, channel: 'msedge' });
try {
for (const viewport of [{ width: 394, height: 738 }, { width: 720, height: 1280 }]) {
const page = await browser.newPage({ viewport });
const errors = []; page.on('pageerror', error => errors.push(error.message));
await page.goto('http://127.0.0.1:' + (process.env.PORT || 8765));
await page.waitForFunction(() => window.demo && demo.ready);
await page.evaluate(async () => {
const canvas = cc.director.getScene().getChildByName('Canvas');
let parent = canvas;
for (const name of ['Load', 'Top', 'Coin']) {
const node = new cc.Node(name); parent.addChild(node); parent = node;
}
canvas.getChildByName('Load').setPosition(20, 35);
canvas.getChildByName('Load').scale = .9;
parent.setPosition(170, 535);
const label = parent.addComponent(cc.Label); label.string = '1000'; label.fontSize = 24;
const Home = cc.Class({ name: 'JiaZai', extends: cc.Component,
updateCoin() { label.string = String(cc.fx.GameConfig.GM_INFO.coin); } });
canvas.addComponent(Home);
const host = canvas.getComponent('CoinMadnessHost');
const service = { request: async () => {
await Promise.resolve(); cc.fx.GameConfig.GM_INFO.coin += 100;
return { code: 1 };
} };
await host.requestActivity(service, 'claim', {});
if (label.string !== '1100') throw new Error('Claim did not refresh the HUD');
// A failed delivery confirmation must still show coins already saved locally.
await host.requestActivity({ request: async () => {
cc.fx.GameConfig.GM_INFO.coin += 200; throw new Error('confirmation failed');
} }, 'claim', {}).catch(() => {});
if (label.string !== '1300') throw new Error('Confirmation failure hid credited coins');
await demo.open();
const panel = demo.panel();
if (panel.api.coinTarget() !== parent) throw new Error('Incorrect home coin target');
panel.showRewardAnimation(0, 100);
});
assert.equal(await page.evaluate(() => demo.panel().node.getChildByName('RewardClaimAnimation')
.children.filter(n => n.name.startsWith('FlyingCoin')).length), 8);
await page.waitForFunction(() => {
const panel = demo.panel(), layer = panel.node.getChildByName('RewardClaimAnimation');
const coin = layer && layer.getChildByName('FlyingCoin0');
const target = panel.node.convertToNodeSpaceAR(panel.api.coinTarget().convertToWorldSpaceAR(cc.Vec2.ZERO));
return coin && Math.hypot(coin.x - target.x, coin.y - target.y) < 2;
}, null, { timeout: 4000 });
await page.waitForFunction(() => !demo.panel().node.getChildByName('RewardClaimAnimation'));
await page.evaluate(() => { demo.panel().showRewardAnimation(0, 100); return demo.close(); });
assert.deepEqual(errors, []);
await page.close();
}
console.log('PASS: wallet HUD refresh, confirmation failure, eight coins reach transformed home HUD at two viewport sizes, cleanup and close.');
} finally { await browser.close(); }
})().catch(error => { console.error(error); process.exit(1); });