import { chromium } from 'playwright-core'; const chrome = process.env.CHROME_PATH ?? '/home/emil/.cache/ms-playwright/chromium-1248/chrome-linux64/chrome'; const browser = await chromium.launch({ executablePath: chrome, args: ['--no-sandbox', '--autoplay-policy=no-user-gesture-required'] }); const page = await browser.newPage({ viewport: { width: 1600, height: 1000 }, deviceScaleFactor: 1 }); const errors = []; page.on('pageerror', (error) => errors.push(`pageerror: ${error.message}`)); page.on('console', (message) => { if (message.type() === 'error') errors.push(`console: ${message.text()}`); }); await page.goto('http://127.0.0.1:5173/', { waitUntil: 'load' }); await page.waitForTimeout(2400); await page.locator('.room', { hasText: 'quarry' }).click(); await page.waitForTimeout(500); await page.screenshot({ path: '../preview-p1-quarry-empty.png' }); await page.locator('input[type=file]').setInputFiles('../fixtures/clicks-01.wav'); await page.waitForFunction(() => document.querySelector('.core-name')?.textContent?.includes('clicks-01'), null, { timeout: 20000 }); await page.waitForTimeout(700); await page.locator('.face').nth(10).click(); await page.waitForTimeout(250); await page.locator('.assign').click(); await page.waitForTimeout(500); if (!(await page.locator('.play.is-playing').count())) await page.locator('.play').click(); await page.waitForTimeout(1900); await page.screenshot({ path: '../preview-p1-quarry.png' }); const report = await page.evaluate(() => ({ net: document.querySelector('.net b')?.textContent, cores: [...document.querySelectorAll('.core-name')].map((el) => el.textContent), faces: document.querySelectorAll('.face').length, selectedFace: document.querySelector('.face.is-on .face-index')?.textContent, patternFace: document.querySelector('.pattern-row .pattern-face')?.textContent?.trim(), steps: document.querySelectorAll('.step').length, stepsOn: document.querySelectorAll('.step.is-on').length, wire: [...document.querySelectorAll('.wire-label')].map((el) => el.textContent).slice(-8), master: document.querySelector('.master-db')?.textContent, cilia: [...document.querySelectorAll('.cilium')].map((el) => Number(getComputedStyle(el).getPropertyValue('--level'))), canvas: { w: document.querySelector('canvas.wave')?.width, h: document.querySelector('canvas.wave')?.height } })); console.log(JSON.stringify(report, null, 2)); await page.locator('.room', { hasText: 'nave' }).click(); await page.waitForTimeout(1600); await page.screenshot({ path: '../preview-p1-nave.png' }); const nave = await page.evaluate(() => ({ canvas: { w: document.querySelector('.descent canvas')?.width, h: document.querySelector('.descent canvas')?.height }, lanes: document.querySelectorAll('.lane').length, faceRows: [...document.querySelectorAll('.wire-label')].map((el) => el.textContent).slice(-4) })); console.log(JSON.stringify(nave, null, 2)); const failures = []; if (!report.cores.length) failures.push('no core imported'); if (report.faces !== 16) failures.push('the face wall is not 16'); if (!report.patternFace || report.patternFace.startsWith('procedural')) failures.push('the pattern face was not assigned'); if (report.canvas.w < 200) failures.push('the waveform canvas did not size'); if (!report.cilia.some((level) => level > 0.001)) failures.push('no level moved'); if (errors.length) failures.push('console errors'); await browser.close(); if (failures.length) { console.error('QUARRY SMOKE FAILED: ' + failures.join('; ')); process.exit(1); } console.log('quarry smoke passed');