Merge remote-tracking branch 'origin/main' into worktree-welcome-screen-controls
# Conflicts: # simulator/e2e/tests/a11y.spec.ts # simulator/static/app.js
This commit is contained in:
@@ -49,24 +49,26 @@ test.describe("Task 4 — Photosensitivity notice", () => {
|
||||
});
|
||||
|
||||
test.describe("Task 5 — Playback speed slider (replaces Reduce motion)", () => {
|
||||
test("the Reduce motion toggle is gone, replaced by a speed slider", async ({ page }) => {
|
||||
test("the Reduce motion toggle is gone, replaced by a 0–4x speed slider", async ({ page }) => {
|
||||
await page.emulateMedia({ reducedMotion: "no-preference" });
|
||||
await page.goto("/");
|
||||
await enter(page);
|
||||
await expect(page.locator("#reduce-motion")).toHaveCount(0);
|
||||
const slider = page.locator("#play-speed");
|
||||
await expect(slider).toBeVisible();
|
||||
await expect(slider).toHaveValue("1"); // default = normal speed
|
||||
await expect(slider).toHaveValue("1"); // default = normal speed
|
||||
await expect(slider).toHaveAttribute("min", "0");
|
||||
await expect(slider).toHaveAttribute("max", "4");
|
||||
});
|
||||
|
||||
test("forward speed sets the loop video's playbackRate", async ({ page }) => {
|
||||
test("forward speed sets the loop video's playbackRate (up to 4x)", async ({ page }) => {
|
||||
await page.emulateMedia({ reducedMotion: "no-preference" });
|
||||
await page.goto("/");
|
||||
await enter(page);
|
||||
await page.locator("#play-speed").fill("2");
|
||||
await page.locator("#play-speed").fill("4");
|
||||
await expect
|
||||
.poll(() => page.locator("#vid-loop").evaluate((v: HTMLVideoElement) => v.playbackRate))
|
||||
.toBe(2);
|
||||
.toBe(4);
|
||||
});
|
||||
|
||||
test("0x freezes the loop video", async ({ page }) => {
|
||||
@@ -79,23 +81,6 @@ test.describe("Task 5 — Playback speed slider (replaces Reduce motion)", () =>
|
||||
.toBe(true);
|
||||
});
|
||||
|
||||
test("negative speed plays the loop in reverse (manual frame-stepping)", async ({ page }) => {
|
||||
await page.emulateMedia({ reducedMotion: "no-preference" });
|
||||
await page.goto("/");
|
||||
await enter(page);
|
||||
await page.locator("#play-speed").fill("-1.5");
|
||||
await page.waitForTimeout(150);
|
||||
const a = await page.locator("#vid-loop").evaluate((v: HTMLVideoElement) => v.currentTime);
|
||||
const paused = await page.locator("#vid-loop").evaluate((v: HTMLVideoElement) => v.paused);
|
||||
await page.waitForTimeout(250);
|
||||
const b = await page.locator("#vid-loop").evaluate((v: HTMLVideoElement) => v.currentTime);
|
||||
// The reverse loop pauses the element and drives currentTime by hand — so the
|
||||
// element reads paused, yet currentTime keeps moving (≠ forward play, ≠ freeze).
|
||||
// (It may wrap loopStart→tail, so we assert movement, not a strict decrease.)
|
||||
expect(paused).toBe(true);
|
||||
expect(b).not.toBe(a);
|
||||
});
|
||||
|
||||
test("OS reduced-motion disables the slider and freezes the loop", async ({ page }) => {
|
||||
await page.emulateMedia({ reducedMotion: "reduce" });
|
||||
await page.goto("/");
|
||||
|
||||
Reference in New Issue
Block a user