diff --git a/.gitea/workflows/test.yml b/.gitea/workflows/test.yml index 9254db1..0ca0da1 100644 --- a/.gitea/workflows/test.yml +++ b/.gitea/workflows/test.yml @@ -1,6 +1,6 @@ # Le Gitea Actions del gioco: girano sul runner del PC di Andrea (make runner; label ubuntu-latest = node:22-bookworm). # A ogni push su main e a ogni tag i test unitari; su un tag vX.Y.Z (o a mano, «Run workflow») anche le venti prove nel -# browser, una per job nell'immagine di Playwright (due alla volta sul runner); se passa tutto, la release. +# browser, una per job nell'immagine di Playwright, sulla scheda video del PC; se passa tutto, la release. # Il controllo dei file pubblicabili non sta qui (a pipeline partita il push è già pubblico): è l'hook pre-push. name: test on: @@ -25,6 +25,8 @@ jobs: runs-on: ubuntu-latest container: image: mcr.microsoft.com/playwright:v1.64.1-noble + # La scheda video del PC (runtime NVIDIA di Docker): Chromium disegna lì, tests/chromium.mjs la trova da solo. + options: --gpus all -e NVIDIA_DRIVER_CAPABILITIES=all strategy: fail-fast: false matrix: diff --git a/CLAUDE.md b/CLAUDE.md index 96150ed..73e6ba9 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -18,8 +18,9 @@ i suoi ricordi: non inventare persone, luoghi o fatti del paese al posto suoi; p - Ogni funzionalità con il suo test; un test automatico percorre tutta la soluzione dell'avventura. - Le prove nel browser sono a sezioni (`scripts/verify.mjs`, dal 2026-11-01): `make verify` rifà solo quelle i cui ingressi sono cambiati dall'ultimo verde (la briscola se cambia la briscola, la partita intera se cambiano storia, motore, stile - o risorse). Una prova nuova in `tests/*.browser.mjs` va aggiunta a `SUITES` (il test `verify.test.mjs` lo pretende). -- Verifica visiva nel browser con Playwright e swiftshader prima di dichiarare finito qualcosa di grafico. + o risorse). Un `chromium.launch` nuovo nelle prove usa `args: ARGS` di `tests/chromium.mjs`. Una prova nuova in `tests/*.browser.mjs` va aggiunta a `SUITES` (il test `verify.test.mjs` lo pretende). +- Verifica visiva nel browser con Playwright prima di dichiarare finito qualcosa di grafico. Chromium disegna sulla scheda + video del PC se c'è, altrimenti con swiftshader (`tests/chromium.mjs`, dal 2026-11-01: giro intero ~4 min invece di ~16). - Pubblicare (tag/bump/push) solo quando Andrea lo chiede. - Persone vere nel gioco solo con consenso; niente nomi, personaggi o musiche di giochi esistenti. - Prompt delle immagini in `prompts/` e fogli grezzi in `assets/raw/`: esclusi da git. diff --git a/docs/STATO.md b/docs/STATO.md index 85ee3aa..7299391 100644 --- a/docs/STATO.md +++ b/docs/STATO.md @@ -319,6 +319,16 @@ versione nuova. Nella pipeline di Gitea (runner sul PC) sui tag, o a mano, girano tutte e venti, una per job nell'immagine di Playwright, prima della release: il primo giro completo (1 novembre, a mano su main) verde in 17 minuti. +- **Prove sulla scheda video (1 novembre, Andrea: «prova con la scheda video»):** Chromium disegnava con swiftshader, + sul processore: una schermata 633 ms. Con la RTX del PC (`--use-angle=gl-egl`) 41 ms; micro da 283 a 27 s, briscola da + 259 a 29, flipper da 186 a 10; tutte e venti da ~16 minuti (due alla volta) a ~4 (sei alla volta), tutte verdi. Le + opzioni stanno in `tests/chromium.mjs`: scheda video se c'è (`/dev/dri`, `/dev/nvidia0`), altrimenti swiftshader; + `REGOLO_GPU=0/1` forza. Con 6 o 8 prove insieme il giro dura uguale: il limite è la partita intera (243 s, il tempo + del gioco, non della grafica). La pipeline dà la GPU ai job (`--gpus all`, runtime NVIDIA di Docker); runner a 6 job. + +- **Flipper da tastiera (1 novembre, Andrea):** la freccia giù carica la molla come Spazio, i due Shift comandano le + palette (sinistro e destro, `e.code` passato da main.js ai minigiochi). Test unitario e nel browser. + ## Materiale ricevuto da Andrea (in `assets/raw/`, escluso da git) | File | Cosa | Uso previsto | diff --git a/scripts/runner.sh b/scripts/runner.sh index d4a53db..c39938e 100755 --- a/scripts/runner.sh +++ b/scripts/runner.sh @@ -26,4 +26,6 @@ if [[ ! -s $RUNNER_DATA/.runner ]]; then fi # Senza token nell'ambiente del container: da qui in poi si autentica con .runner. docker compose -f "$COMPOSE" up -d +# config.yaml si legge solo all'avvio: se è cambiato (capacità, opzioni) il runner riparte. +[[ $(docker inspect -f '{{.State.StartedAt}}' gitea-runner | date -f - +%s) -lt $(stat -c %Y "$(dirname "$COMPOSE")/config.yaml") ]] && docker restart gitea-runner >/dev/null sleep 2; docker logs --tail 1 gitea-runner diff --git a/scripts/verify.mjs b/scripts/verify.mjs index 6fdd0ae..704d9d1 100644 --- a/scripts/verify.mjs +++ b/scripts/verify.mjs @@ -3,7 +3,8 @@ // si rifà solo se la loro impronta (i blob di git, più i file modificati nella cartella di lavoro) è cambiata dall'ultimo // verde, ricordato in .verify-ok.json (fuori da git). Se cambia la briscola si riprova la briscola; se cambia la storia, il // motore, l'impaginazione o le risorse si riprova la partita intera (e le prove delle scene speciali), non la briscola. -// node scripts/verify.mjs le prove da rifare, in parallelo (JOBS=2: con quattro Chromium swiftshader insieme le schermate vanno in timeout), e aggiorna i verdi +// node scripts/verify.mjs le prove da rifare, in parallelo, e aggiorna i verdi (JOBS: quante insieme; con la +// scheda video JOBS_GPU, senza 2: con quattro Chromium swiftshader le schermate vanno in timeout) // node scripts/verify.mjs --plan dice solo cosa rifarebbe e perché // node scripts/verify.mjs --all tutte, senza guardare i verdi // node scripts/verify.mjs briscola solo quelle nominate (anche se verdi) @@ -13,10 +14,11 @@ import { createHash } from 'node:crypto'; import { readFileSync, writeFileSync, existsSync } from 'node:fs'; import { fileURLToPath } from 'node:url'; import { cpus } from 'node:os'; +import { GPU } from '../tests/chromium.mjs'; // Il motore comune a tutto: cambia questo e si riprova ogni minigioco. export const ENGINE = ['index.html', 'style.css', 'src/main.js', 'src/engine/game.js', 'src/engine/render.js', - 'tests/helpers.mjs', 'package-lock.json']; + 'tests/helpers.mjs', 'tests/chromium.mjs', 'package-lock.json']; // Non toccano il gioco nel browser: documenti, strumenti, pubblicazione, versione (make bump la cambia prima di verificare), // test unitari (girano sempre, a parte), e questo stesso script (lo prova verify.test.mjs). export const IGNORED = [/^docs\//, /^[^/]*\.md$/, /^src\/version\.js$/, /^package\.json$/, /^Makefile$/, /^scripts\//, @@ -49,6 +51,9 @@ export const SUITES = { risveglio: { run: ['tests/risveglio.browser.mjs'] }, }; +// Prove insieme con la scheda video (misurato il 1° novembre 2026 sul PC di Andrea, 16 thread e RTX 3080 Ti). +const JOBS_GPU = 6; // con 6 e con 8 il giro intero dura uguale (~4 min): da solo «principale» ne prende 243 s + const ownRe = name => new RegExp(`(^|/)${name}([-_.][^/]*)?$`, 'i'); const matches = (path, rule) => rule instanceof RegExp ? rule.test(path) : rule === path; export const ignored = path => IGNORED.some(r => r.test(path)); @@ -123,7 +128,8 @@ async function main() { } if (green.length && !named.length) console.log(`già verdi: ${green.join(', ')}`); if (onlyPlan) return; - const jobs = Math.max(1, Number(process.env.JOBS) || Math.min(2, Math.floor(cpus().length / 4))); + const jobs = Math.max(1, Number(process.env.JOBS) || Math.min(GPU ? JOBS_GPU : 2, Math.floor(cpus().length / (GPU ? 2 : 4)))); + console.log(`Chromium ${GPU ? 'sulla scheda video' : 'con swiftshader'}, ${Math.min(jobs, todo.length)} prove alla volta.`); const queue = todo.sort((a, b) => (b.seconds || 999) - (a.seconds || 999)), results = []; const worker = async () => { for (let t; (t = queue.shift());) { const r = await run(t.name); results.push(r); diff --git a/tests/ambient.browser.mjs b/tests/ambient.browser.mjs index 3883018..4ea7166 100644 --- a/tests/ambient.browser.mjs +++ b/tests/ambient.browser.mjs @@ -3,6 +3,7 @@ // npm run browser:effects — immagini in /tmp/regolo-effects (oppure $OUT). import { chromium } from 'playwright'; import { staticServer } from './helpers.mjs'; +import { ARGS } from './chromium.mjs'; import { mkdirSync, writeFileSync } from 'node:fs'; import assert from 'node:assert/strict'; @@ -11,7 +12,7 @@ mkdirSync(out, { recursive: true }); const server = await staticServer(), port = server.port; let browser; try { - browser = await chromium.launch({ args: ['--autoplay-policy=no-user-gesture-required', '--use-gl=angle', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] }); + browser = await chromium.launch({ args: ARGS }); const page = await browser.newPage({ viewport: { width: 640, height: 360 } }); const errors = []; page.on('pageerror', e => errors.push(e.message)); diff --git a/tests/biliardo.browser.mjs b/tests/biliardo.browser.mjs index 4f415d5..2a3db68 100644 --- a/tests/biliardo.browser.mjs +++ b/tests/biliardo.browser.mjs @@ -4,6 +4,7 @@ import { chromium } from 'playwright'; import { mkdirSync, writeFileSync } 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-biliardo'; mkdirSync(out, { recursive: true }); @@ -64,7 +65,7 @@ async function checkArtwork(page, name) { } try { - browser = await chromium.launch({ args: ['--autoplay-policy=no-user-gesture-required', '--use-gl=angle', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] }); + browser = await chromium.launch({ args: ARGS }); for (const [name, mobile, viewport] of [ ['desktop', false, { width: 1280, height: 860 }], ['touch', true, { width: 844, height: 390 }], diff --git a/tests/briscola.browser.mjs b/tests/briscola.browser.mjs index f5293dd..b53031e 100644 --- a/tests/briscola.browser.mjs +++ b/tests/briscola.browser.mjs @@ -4,6 +4,7 @@ import { chromium } from 'playwright'; import { mkdirSync, writeFileSync } from 'node:fs'; import assert from 'node:assert/strict'; import { staticServer } from './helpers.mjs'; +import { ARGS } from './chromium.mjs'; const out = '/tmp/regolo-shots'; mkdirSync(out, { recursive: true }); const server = await staticServer(), errors = []; @@ -51,7 +52,7 @@ async function artwork(page) { for (const [name, png] of Object.entries(pictures)) writeFileSync(`${out}/briscola-${name}.png`, Buffer.from(png, 'base64')); } try { - browser = await chromium.launch({ args: ['--autoplay-policy=no-user-gesture-required', '--use-gl=angle', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] }); + browser = await chromium.launch({ args: ARGS }); const scenarios = ['mouse', 'touch', 'keyboard'].flatMap(mode => [ { name: `desktop-${mode}`, mode, viewport: { width: 1280, height: 860 } }, { name: `telefono-${mode}`, mode, viewport: { width: 390, height: 844 } }, diff --git a/tests/browser.mjs b/tests/browser.mjs index 74e8eb5..33b0573 100644 --- a/tests/browser.mjs +++ b/tests/browser.mjs @@ -5,6 +5,7 @@ // attese si sovrappongono. Una parte sola: node tests/browser.mjs --parte=minigiochi (--media-only: solo multimedia). import { chromium } from 'playwright'; import { staticServer } from './helpers.mjs'; +import { ARGS } from './chromium.mjs'; import { mkdirSync, readFileSync } from 'node:fs'; import assert from 'node:assert/strict'; import { solution, route } from '../src/story/solution.js'; @@ -31,7 +32,7 @@ if (!PARTE && !process.argv.includes('--media-only')) { process.exit(esiti.every(e => e.code === 0) ? 0 : 1); } const server = await staticServer(), PORT = server.port; -const browser = await chromium.launch({ args: ['--autoplay-policy=no-user-gesture-required', '--use-gl=angle', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] }); +const browser = await chromium.launch({ args: ARGS }); const errors = []; async function open(viewport, query = '') { diff --git a/tests/bruciate.browser.mjs b/tests/bruciate.browser.mjs index 8d78cd9..4d30090 100644 --- a/tests/bruciate.browser.mjs +++ b/tests/bruciate.browser.mjs @@ -4,6 +4,7 @@ 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-bruciate'; mkdirSync(out, { recursive: true }); @@ -11,7 +12,7 @@ const server = await staticServer(); let browser; const errors = []; try { - browser = await chromium.launch({ args: ['--autoplay-policy=no-user-gesture-required', '--use-gl=angle', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] }); + browser = await chromium.launch({ args: ARGS }); for (const [name, mobile, viewport] of [['desktop', false, { width: 1280, height: 860 }], ['touch', true, { width: 844, height: 390 }]]) { const page = await browser.newPage({ viewport, hasTouch: mobile, isMobile: mobile }); page.on('pageerror', e => errors.push(e.message)); diff --git a/tests/campana.browser.mjs b/tests/campana.browser.mjs index b9a9e1a..3f7e7e1 100644 --- a/tests/campana.browser.mjs +++ b/tests/campana.browser.mjs @@ -4,6 +4,7 @@ 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-campana'; mkdirSync(out, { recursive: true }); @@ -11,7 +12,7 @@ const server = await staticServer(); let browser; const errors = []; try { - browser = await chromium.launch({ args: ['--autoplay-policy=no-user-gesture-required', '--use-gl=angle', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] }); + browser = await chromium.launch({ args: ARGS }); for (const [name, mobile, viewport] of [['desktop', false, { width: 1280, height: 860 }], ['touch', true, { width: 844, height: 390 }]]) { const page = await browser.newPage({ viewport, hasTouch: mobile, isMobile: mobile }); page.on('pageerror', e => errors.push(e.message)); diff --git a/tests/cerbottana.browser.mjs b/tests/cerbottana.browser.mjs index 367dd9f..cfcb6de 100644 --- a/tests/cerbottana.browser.mjs +++ b/tests/cerbottana.browser.mjs @@ -4,6 +4,7 @@ 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-cerbottana'; mkdirSync(out, { recursive: true }); @@ -11,7 +12,7 @@ const server = await staticServer(); let browser; const errors = []; try { - browser = await chromium.launch({ args: ['--autoplay-policy=no-user-gesture-required', '--use-gl=angle', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] }); + browser = await chromium.launch({ args: ARGS }); for (const [name, mobile, viewport] of [['desktop', false, { width: 1280, height: 860 }], ['touch', true, { width: 844, height: 390 }]]) { const page = await browser.newPage({ viewport, hasTouch: mobile, isMobile: mobile }); page.on('pageerror', e => errors.push(e.message)); diff --git a/tests/chromium.mjs b/tests/chromium.mjs new file mode 100644 index 0000000..c5e1a60 --- /dev/null +++ b/tests/chromium.mjs @@ -0,0 +1,10 @@ +// Come si apre Chromium nelle prove nel browser (solo da node: helpers.mjs lo carica anche la pagina). +// Con una scheda video (/dev/dri o /dev/nvidia0, anche nei contenitori lanciati con --gpus) si disegna lì: una +// schermata costa ~45 ms invece di ~600 con swiftshader, e le prove girano 5-10 volte più in fretta. Senza, swiftshader. +// REGOLO_GPU=0 forza swiftshader, REGOLO_GPU=1 la scheda video. +import { existsSync } from 'node:fs'; + +export const GPU = process.env.REGOLO_GPU ? process.env.REGOLO_GPU === '1' : ['/dev/dri/renderD128', '/dev/nvidia0'].some(existsSync); +const GL = GPU ? ['--use-gl=angle', '--use-angle=gl-egl', '--ignore-gpu-blocklist', '--enable-gpu-rasterization'] + : ['--use-gl=angle', '--use-angle=swiftshader', '--enable-unsafe-swiftshader']; +export const ARGS = ['--autoplay-policy=no-user-gesture-required', ...GL]; diff --git a/tests/condor.browser.mjs b/tests/condor.browser.mjs index 167b8e3..4f9ec4d 100644 --- a/tests/condor.browser.mjs +++ b/tests/condor.browser.mjs @@ -4,6 +4,7 @@ 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-condor'; mkdirSync(out, { recursive: true }); @@ -11,7 +12,7 @@ const server = await staticServer(); let browser; const errors = []; try { - browser = await chromium.launch({ args: ['--autoplay-policy=no-user-gesture-required', '--use-gl=angle', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] }); + browser = await chromium.launch({ args: ARGS }); for (const [name, mobile, viewport] of [['desktop', false, { width: 1280, height: 860 }], ['touch', true, { width: 844, height: 390 }]]) { const page = await browser.newPage({ viewport, hasTouch: mobile, isMobile: mobile }); page.on('pageerror', e => errors.push(e.message)); diff --git a/tests/flipper.browser.mjs b/tests/flipper.browser.mjs index 6548c31..efe7cf6 100644 --- a/tests/flipper.browser.mjs +++ b/tests/flipper.browser.mjs @@ -5,6 +5,7 @@ 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-flipper'; mkdirSync(out, { recursive: true }); @@ -12,7 +13,7 @@ const server = await staticServer(); let browser; const errors = []; try { - browser = await chromium.launch({ args: ['--autoplay-policy=no-user-gesture-required', '--use-gl=angle', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] }); + browser = await chromium.launch({ args: ARGS }); for (const [name, mobile, viewport] of [['desktop', false, { width: 1280, height: 860 }], ['touch', true, { width: 844, height: 390 }]]) { const page = await browser.newPage({ viewport, hasTouch: mobile, isMobile: mobile }); page.on('pageerror', e => errors.push(e.message)); @@ -45,9 +46,10 @@ try { await page.waitForFunction(() => game.closeup.holding && game.closeup.power > 0.3, null, { polling: 'raf' }); await touch('touchEnd', []); } else { - await page.mouse.move(...P(440, 320)); await page.mouse.down(); + // Da tastiera con la freccia giù (il mouse tiene la molla come il dito, provato sul telefono). + await page.keyboard.down('ArrowDown'); await page.waitForFunction(() => game.closeup.holding && game.closeup.power > 0.3, null, { polling: 'raf' }); - await page.mouse.up(); + await page.keyboard.up('ArrowDown'); } await page.waitForFunction(() => game.closeup && !game.closeup.ball?.waiting, null, { timeout: 5000 }); // Due dita sulla scena: sinistra, poi anche destra, poi si alza la sinistra e la destra resta su. @@ -83,6 +85,13 @@ try { await page.keyboard.up('ArrowLeft'); await page.click('#resume'); await page.waitForFunction(() => document.querySelector('#pause').hidden); + // I due Shift: il sinistro alza la paletta sinistra, il destro la destra. + await page.keyboard.down('ShiftRight'); + await page.waitForFunction(() => game.closeup.flippers.right.held.includes('key-ShiftRight') && !game.closeup.flippers.left.held.length); + await page.keyboard.down('ShiftLeft'); + await page.waitForFunction(() => game.closeup.flippers.left.held.includes('key-ShiftLeft')); + await page.keyboard.up('ShiftRight'); await page.keyboard.up('ShiftLeft'); + await page.waitForFunction(() => !game.closeup.flippers.left.held.length && !game.closeup.flippers.right.held.length); } // Il traguardo aggiunge una pallina e lascia continuare la partita. const reward = await page.evaluate(async () => { diff --git a/tests/gara.browser.mjs b/tests/gara.browser.mjs index b0bea1a..2ce5c11 100644 --- a/tests/gara.browser.mjs +++ b/tests/gara.browser.mjs @@ -4,6 +4,7 @@ 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 }); @@ -12,7 +13,7 @@ let browser; const errors = []; try { - browser = await chromium.launch({ args: ['--autoplay-policy=no-user-gesture-required', '--use-gl=angle', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] }); + 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'], diff --git a/tests/ingorgo.browser.mjs b/tests/ingorgo.browser.mjs index b24ada3..a033c9e 100644 --- a/tests/ingorgo.browser.mjs +++ b/tests/ingorgo.browser.mjs @@ -5,6 +5,7 @@ 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-ingorgo'; mkdirSync(out, { recursive: true }); @@ -12,7 +13,7 @@ const server = await staticServer(); let browser; const errors = []; try { - browser = await chromium.launch({ args: ['--autoplay-policy=no-user-gesture-required', '--use-gl=angle', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] }); + browser = await chromium.launch({ args: ARGS }); const page = await browser.newPage({ viewport: { width: 1280, height: 860 } }); page.on('pageerror', e => { errors.push(e.message); console.log('ERR', e.message); }); await page.goto(`http://127.0.0.1:${server.port}/`); diff --git a/tests/micro.browser.mjs b/tests/micro.browser.mjs index 1af331b..0ea6d26 100644 --- a/tests/micro.browser.mjs +++ b/tests/micro.browser.mjs @@ -4,6 +4,7 @@ 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-micro'; mkdirSync(out, { recursive: true }); @@ -12,7 +13,7 @@ let browser; const errors = []; try { - browser = await chromium.launch({ args: ['--autoplay-policy=no-user-gesture-required', '--use-gl=angle', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] }); + browser = await chromium.launch({ args: ARGS }); for (const [name, mobile, viewport] of [ ['desktop', false, { width: 1280, height: 860 }], ['touch', true, { width: 844, height: 390 }], diff --git a/tests/risveglio.browser.mjs b/tests/risveglio.browser.mjs index 180b22f..a1175b6 100644 --- a/tests/risveglio.browser.mjs +++ b/tests/risveglio.browser.mjs @@ -4,6 +4,7 @@ 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-risveglio'; mkdirSync(out, { recursive: true }); @@ -11,7 +12,7 @@ const server = await staticServer(); let browser; const errors = []; try { - browser = await chromium.launch({ args: ['--autoplay-policy=no-user-gesture-required', '--use-gl=angle', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] }); + browser = await chromium.launch({ args: ARGS }); // Sul computer la versione con la sfocatura vera, sul telefono (touch) quella leggera senza filtri. for (const mobile of [false, true]) { const page = await browser.newPage(mobile ? { viewport: { width: 844, height: 390 }, hasTouch: true, isMobile: true } : { viewport: { width: 1280, height: 860 } }); diff --git a/tests/scopa.browser.mjs b/tests/scopa.browser.mjs index 3980d82..70747f6 100644 --- a/tests/scopa.browser.mjs +++ b/tests/scopa.browser.mjs @@ -4,6 +4,7 @@ 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 = '/tmp/regolo-shots'; mkdirSync(out, { recursive: true }); const server = await staticServer(), errors = []; @@ -44,7 +45,7 @@ async function wait(page) { }); } try { - browser = await chromium.launch({ args: ['--autoplay-policy=no-user-gesture-required', '--use-gl=angle', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] }); + browser = await chromium.launch({ args: ARGS }); const scenarios = [ { name: 'desktop-mouse', mode: 'mouse', viewport: { width: 1280, height: 860 }, full: true }, { name: 'telefono-touch', mode: 'touch', viewport: { width: 390, height: 844 } }, diff --git a/tests/smarronata.browser.mjs b/tests/smarronata.browser.mjs index 9d8d05a..a5a744c 100644 --- a/tests/smarronata.browser.mjs +++ b/tests/smarronata.browser.mjs @@ -4,6 +4,7 @@ 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-smarronata'; mkdirSync(out, { recursive: true }); @@ -11,7 +12,7 @@ const server = await staticServer(); let browser; const errors = []; try { - browser = await chromium.launch({ args: ['--autoplay-policy=no-user-gesture-required', '--use-gl=angle', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] }); + browser = await chromium.launch({ args: ARGS }); const page = await browser.newPage({ viewport: { width: 1280, height: 860 } }); page.on('pageerror', e => { errors.push(e.message); console.log('ERR', e.message); }); await page.goto(`http://127.0.0.1:${server.port}/`); diff --git a/tests/telefono.browser.mjs b/tests/telefono.browser.mjs index 4d6f50d..09581f3 100644 --- a/tests/telefono.browser.mjs +++ b/tests/telefono.browser.mjs @@ -4,6 +4,7 @@ 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-telefono'; mkdirSync(out, { recursive: true }); @@ -11,7 +12,7 @@ const server = await staticServer(); let browser; const errors = []; try { - browser = await chromium.launch({ args: ['--autoplay-policy=no-user-gesture-required', '--use-gl=angle', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] }); + browser = await chromium.launch({ args: ARGS }); const page = await browser.newPage({ viewport: { width: 1280, height: 860 } }); page.on('pageerror', e => { errors.push(e.message); console.log('ERR', e.message); }); await page.goto(`http://127.0.0.1:${server.port}/`); diff --git a/tests/tressette.browser.mjs b/tests/tressette.browser.mjs index 8723537..c951f52 100644 --- a/tests/tressette.browser.mjs +++ b/tests/tressette.browser.mjs @@ -4,6 +4,7 @@ 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 = '/tmp/regolo-shots'; mkdirSync(out, { recursive: true }); const server = await staticServer(), errors = []; @@ -46,7 +47,7 @@ async function wait(page) { }); } try { - browser = await chromium.launch({ args: ['--autoplay-policy=no-user-gesture-required', '--use-gl=angle', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] }); + browser = await chromium.launch({ args: ARGS }); const scenarios = [ { name: 'desktop-mouse', mode: 'mouse', viewport: { width: 1280, height: 860 }, full: true }, { name: 'telefono-touch', mode: 'touch', viewport: { width: 390, height: 844 } }, diff --git a/tests/veicoli.browser.mjs b/tests/veicoli.browser.mjs index 6de49bd..85c00d4 100644 --- a/tests/veicoli.browser.mjs +++ b/tests/veicoli.browser.mjs @@ -4,13 +4,14 @@ 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-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'] }); + browser = await chromium.launch({ args: ARGS }); const page = await browser.newPage({ viewport: { width: 1280, height: 720 } }); const errors = []; page.on('pageerror', e => errors.push(e.message)); diff --git a/tests/verify.test.mjs b/tests/verify.test.mjs index 63887f6..e65c1e4 100644 --- a/tests/verify.test.mjs +++ b/tests/verify.test.mjs @@ -10,7 +10,7 @@ const FILES = ['index.html', 'style.css', 'src/main.js', 'src/version.js', 'pack 'src/engine/briscola.js', 'src/engine/briscola-render.js', 'src/engine/flipper.js', 'src/engine/corsa.js', 'src/story/piloti.js', 'src/story/story.js', 'src/story/solution.js', 'assets/scenes/piazza.png', 'assets/closeups/micro-parcheggio.png', 'assets/closeups/gp/boccino.png', 'assets/muro/index.html', 'assets/video/briscola.mp4', 'docs/BRISCOLA.md', 'docs/STATO.md', - 'tests/helpers.mjs', 'tests/browser.mjs', 'tests/briscola.browser.mjs', 'tests/briscola.test.mjs', 'tests/story.test.mjs', + 'tests/helpers.mjs', 'tests/chromium.mjs', 'tests/browser.mjs', 'tests/briscola.browser.mjs', 'tests/briscola.test.mjs', 'tests/story.test.mjs', 'scripts/verify.mjs', 'scripts/bump.sh', 'tools/slice_sprites.py', '.verify-ok.json']; const suitesWith = path => Object.keys(SUITES).filter(n => inputsOf(n, FILES).includes(path)); const islands = Object.keys(SUITES).filter(n => !SUITES[n].core), cores = Object.keys(SUITES).filter(n => SUITES[n].core); diff --git a/tools/gitea-runner/config.yaml b/tools/gitea-runner/config.yaml index a346f61..f77fc07 100644 --- a/tools/gitea-runner/config.yaml +++ b/tools/gitea-runner/config.yaml @@ -3,7 +3,7 @@ log: level: info runner: file: .runner - capacity: 2 + capacity: 6 timeout: 30m container: network: ""