Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
69 lines
4.0 KiB
JavaScript
69 lines
4.0 KiB
JavaScript
// Il GP di Fortezza nel browser vero: alla bona e seria la guida semplice (solo gas, lasciando si frena), a ginocchio
|
|
// in terra lo sterzo vero. npm run browser:gara — schermate in /tmp/regolo-gara.
|
|
import { chromium } from 'playwright';
|
|
import { mkdirSync } from 'node:fs';
|
|
import assert from 'node:assert/strict';
|
|
import { staticServer } from './helpers.mjs';
|
|
import { ARGS } from './chromium.mjs';
|
|
|
|
const out = process.env.OUT ?? '/tmp/regolo-gara';
|
|
mkdirSync(out, { recursive: true });
|
|
const server = await staticServer();
|
|
let browser;
|
|
const errors = [];
|
|
|
|
try {
|
|
browser = await chromium.launch({ args: ARGS });
|
|
for (const [name, mobile, viewport, level] of [
|
|
['touch', true, { width: 844, height: 390 }, 'seria'],
|
|
['portrait', true, { width: 390, height: 844 }, 'bona'],
|
|
['desktop', false, { width: 1280, height: 860 }, 'male'],
|
|
]) {
|
|
const page = await browser.newPage({ viewport, hasTouch: mobile, isMobile: mobile });
|
|
page.on('pageerror', e => errors.push(e.message));
|
|
await page.goto(`http://127.0.0.1:${server.port}/`);
|
|
await page.click('#splash');
|
|
await page.click('#new-game');
|
|
await page.click('#rione [data-rione="campomigliaio"]');
|
|
await page.click('#skip-intro');
|
|
await page.evaluate(async level => {
|
|
const { settle } = await import('/tests/helpers.mjs');
|
|
settle(game); game.run({ closeup: 'gara', level }); settle(game);
|
|
}, level);
|
|
// La presentazione dei piloti a tutto schermo: niente comandi finché non c'è il semaforo.
|
|
await page.waitForFunction(() => game.closeup?.step === 'intro');
|
|
await page.waitForTimeout(300);
|
|
assert.equal(await page.locator('#bocce-controls').isVisible(), false, `${name}: comandi nascosti nella presentazione`);
|
|
assert.equal(await page.locator('#side').isVisible(), false, `${name}: la scena da sola`);
|
|
await page.screenshot({ path: `${out}/${name}-presentazione.png` });
|
|
// Salta la presentazione dei piloti e aspetta il via.
|
|
await page.evaluate(async () => { const g = await import('/src/engine/gara.js'); while (game.closeup.step === 'intro') g.press(game.closeup); });
|
|
await page.waitForFunction(() => game.closeup.step === 'race', null, { timeout: 15000 });
|
|
await page.waitForSelector('#bocce-controls:not([hidden])');
|
|
const easy = level !== 'male';
|
|
for (const id of ['#bocce-left', '#bocce-right', '#gara-brake', '#gara-pad'])
|
|
assert.equal(await page.locator(id).isVisible(), !easy, `${name}: ${id} ${easy ? 'nascosto' : 'visibile'}`);
|
|
assert.equal(await page.locator('#bocce-power').isVisible(), !easy, 'la sensibilità solo con lo sterzo vero');
|
|
// Nella guida semplice il pulsante Gas si tiene premuto (giù gas, su freno) e la scritta non cambia; con lo
|
|
// sterzo vero un tocco accende il gas e un altro lo spegne.
|
|
const gas = page.locator('#bocce-throw');
|
|
if (easy) await gas.dispatchEvent('pointerdown', { pointerId: 5, pointerType: mobile ? 'touch' : 'mouse', isPrimary: true });
|
|
else await gas.click();
|
|
await page.waitForFunction(() => game.closeup.riders.find(r => r.id === 'andrea').v > 40, null, { timeout: 15000 });
|
|
assert.equal(await gas.textContent(), easy ? 'Gas' : 'Molla');
|
|
await page.screenshot({ path: `${out}/${name}-${level}.png` });
|
|
if (easy) await gas.dispatchEvent('pointerup', { pointerId: 5, pointerType: mobile ? 'touch' : 'mouse', isPrimary: true });
|
|
else await gas.click();
|
|
const v = await page.evaluate(() => game.closeup.riders.find(r => r.id === 'andrea').v);
|
|
await page.waitForTimeout(300);
|
|
const after = await page.evaluate(() => game.closeup.riders.find(r => r.id === 'andrea').v);
|
|
assert.ok(after < v, `${name}: senza gas rallenta (${v.toFixed(0)} → ${after.toFixed(0)})`);
|
|
await page.close();
|
|
}
|
|
assert.deepEqual(errors, []);
|
|
console.log(`ok: schermate in ${out}`);
|
|
} finally {
|
|
await browser?.close();
|
|
server.kill();
|
|
}
|