// Verifica visiva mirata: node tests/veicoli.browser.mjs // Usa lo stesso Chromium/SwiftShader di browser.mjs, senza titolo e audio. import { chromium } from 'playwright'; import { mkdirSync } from 'node:fs'; import assert from 'node:assert/strict'; import { staticServer } from './helpers.mjs'; const out = process.env.OUT ?? '/tmp/regolo-shots'; mkdirSync(out, { recursive: true }); const server = await staticServer(); let browser; try { browser = await chromium.launch({ args: ['--autoplay-policy=no-user-gesture-required', '--use-gl=angle', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] }); const page = await browser.newPage({ viewport: { width: 1280, height: 720 } }); const errors = []; page.on('pageerror', e => errors.push(e.message)); page.on('response', r => { if (r.status() >= 400) errors.push(`${r.status()} ${r.url()}`); }); await page.route('**/__veicoli', route => route.fulfill({ contentType: 'text/html', body: '' })); await page.goto(`http://127.0.0.1:${server.port}/__veicoli`); await page.evaluate(async () => { const [{ story }, { Game }, renderer] = await Promise.all([ import('/src/story/story.js'), import('/src/engine/game.js'), import('/src/engine/render.js'), ]); const loaded = await renderer.loadAssets(story, 'campomigliaio_circolo'); if (loaded.some(ok => !ok)) throw new Error('Uno sfondo/personaggio non รจ arrivato'); const game = new Game(story); game.go('campomigliaio_circolo'); game.time = 8; const ctx = document.querySelector('canvas').getContext('2d'); renderer.render(ctx, game, { time: 8000 }); }); assert.deepEqual(errors, []); await page.screenshot({ path: `${out}/campomigliaio-veicoli.png` }); console.log(`Schermata: ${out}/campomigliaio-veicoli.png`); } finally { await browser?.close(); server.kill(); }