Files
zhila/ui/scripts/quarry-smoke.mjs
T

65 lines
3.5 KiB
JavaScript

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');