Files
2026-07-13 13:20:22 +08:00

173 lines
5.4 KiB
TypeScript

/**
* Zoom / font-scale E2E tests.
*
* Covers the FontSizeControl widget on the Display settings page:
* - Increase via "+" button
* - Decrease via "-" button
* - Reset via "Reset zoom" button
* - Percentage label reflects current value
*/
import { test, expect } from '../../../fixtures';
import { goToSettings, waitForSettle } from '../../../helpers';
const PERCENT_RE = /^\d{2,3}%$/;
function fontSizeControlLocator(page: import('@playwright/test').Page) {
return page.locator('.font-scale-slider').locator('..');
}
function percentLabel(page: import('@playwright/test').Page) {
return fontSizeControlLocator(page).locator('..').locator('span').filter({ hasText: PERCENT_RE });
}
function plusButton(page: import('@playwright/test').Page) {
return fontSizeControlLocator(page).locator('button:has-text("+")');
}
function minusButton(page: import('@playwright/test').Page) {
return fontSizeControlLocator(page).locator('button:has-text("-")');
}
function resetButton(page: import('@playwright/test').Page) {
return fontSizeControlLocator(page)
.locator('..')
.locator('..')
.locator('button')
.filter({ hasNotText: /^[+-]$/ })
.last();
}
async function currentPercent(page: import('@playwright/test').Page): Promise<number> {
const text = await percentLabel(page).textContent();
return parseInt(text!.replace('%', ''), 10);
}
test.describe('Zoom scale (FontSizeControl)', () => {
test.beforeEach(async ({ page }) => {
await goToSettings(page, 'display');
await waitForSettle(page);
});
test('percentage label is visible and shows a valid value', async ({ page }) => {
const label = percentLabel(page);
await expect(label).toBeVisible({ timeout: 5_000 });
const text = await label.textContent();
expect(text).toMatch(PERCENT_RE);
});
test('clicking + increases the percentage', async ({ page }) => {
const btn = plusButton(page);
await expect(btn).toBeVisible({ timeout: 5_000 });
if (await btn.isDisabled()) {
// Already at max — click minus first to make room
await minusButton(page).click();
await waitForSettle(page, 1_000);
}
const baseline = await currentPercent(page);
await plusButton(page).click();
await waitForSettle(page, 1_000);
const after = await currentPercent(page);
expect(after).toBeGreaterThan(baseline);
});
test('clicking - decreases the percentage', async ({ page }) => {
const btn = minusButton(page);
await expect(btn).toBeVisible({ timeout: 5_000 });
if (await btn.isDisabled()) {
// Already at min — click plus first to make room
await plusButton(page).click();
await waitForSettle(page, 1_000);
}
const baseline = await currentPercent(page);
await minusButton(page).click();
await waitForSettle(page, 1_000);
const after = await currentPercent(page);
expect(after).toBeLessThan(baseline);
});
test('clicking reset returns to the 95% default', async ({ page }) => {
const pct = await currentPercent(page);
const plus = plusButton(page);
// Move away from the default so reset has something to do
if (pct === 95) {
await plus.click();
await waitForSettle(page, 1_000);
const moved = await currentPercent(page);
expect(moved).not.toBe(95);
}
const reset = resetButton(page);
await expect(reset).toBeVisible({ timeout: 5_000 });
await expect(reset).toBeEnabled({ timeout: 2_000 });
await reset.click();
await waitForSettle(page, 1_000);
const final = await currentPercent(page);
expect(final).toBe(95);
});
test('+ button is disabled at maximum scale', async ({ page }) => {
const plus = plusButton(page);
for (let i = 0; i < 11; i++) {
if (await plus.isDisabled()) break;
await plus.click();
await waitForSettle(page, 500);
}
await expect(plus).toBeDisabled();
const pct = await currentPercent(page);
expect(pct).toBe(130);
});
test('- button is disabled at minimum scale', async ({ page }) => {
const minus = minusButton(page);
for (let i = 0; i < 11; i++) {
if (await minus.isDisabled()) break;
await minus.click();
await waitForSettle(page, 500);
}
await expect(minus).toBeDisabled();
const pct = await currentPercent(page);
expect(pct).toBe(80);
// Restore default so subsequent tests are not affected
await resetButton(page).click();
await waitForSettle(page, 1_000);
});
test('clicking the slider track changes the percentage', async ({ page }) => {
// Reset to the 95% default first for a known baseline
const reset = resetButton(page);
if (await reset.isEnabled()) {
await reset.click();
await waitForSettle(page, 1_000);
}
const baseline = await currentPercent(page);
expect(baseline).toBe(95);
const slider = fontSizeControlLocator(page);
await expect(slider).toBeVisible({ timeout: 5_000 });
const box = await slider.boundingBox();
expect(box).not.toBeNull();
// Click at ~80% of the track width to increase the value
const targetX = box!.x + box!.width * 0.8;
const targetY = box!.y + box!.height / 2;
await page.mouse.click(targetX, targetY);
await waitForSettle(page, 1_000);
const after = await currentPercent(page);
expect(after).toBeGreaterThan(baseline);
// Restore default
await resetButton(page).click();
await waitForSettle(page, 1_000);
});
});