import { createRawSnippet, flushSync } from "svelte";
import { describe, expect, it, vi } from "vitest";
import { Carousel } from "./fixtures/media-presentation-consumer";
import { render, rendered } from "./mount";
const slides = ["Architecture", "Delivery", "Operations"].map((label) => ({
label,
content: createRawSnippet(() => ({ render: () => `
${label}
` })),
}));
describe("the Base Carousel", () => {
it("names its slide set and moves through it with canonical controls", () => {
const element = rendered(render(Carousel, {
label: "Platform capabilities",
slides,
}));
const panels = [...element.querySelectorAll("[data-carousel-slide]")];
const next = element.querySelector("[aria-label='Next slide']")!;
expect(element.getAttribute("role")).toBe("region");
expect(element.getAttribute("aria-roledescription")).toBe("carousel");
expect(element.getAttribute("aria-label")).toBe("Platform capabilities");
expect(panels.map((panel) => panel.hidden)).toEqual([false, true, true]);
expect(panels[0]?.getAttribute("aria-label")).toBe("1 of 3 — Architecture");
next.focus();
next.click();
flushSync();
expect(document.activeElement).toBe(next);
expect(panels.map((panel) => panel.hidden)).toEqual([true, false, true]);
});
it("makes opt-in rotation explicitly pausable", () => {
vi.useFakeTimers();
try {
const element = rendered(render(Carousel, {
label: "Platform capabilities",
slides,
autoplay: true,
interval: 1_000,
}));
const panels = [...element.querySelectorAll("[data-carousel-slide]")];
const viewport = element.querySelector("[data-carousel-viewport]")!;
const rotation = element.querySelector("[data-carousel-rotation]")!;
expect(rotation.getAttribute("aria-label")).toBe("Pause slide rotation");
expect(viewport.getAttribute("aria-live")).toBe("off");
vi.advanceTimersByTime(1_000);
flushSync();
expect(panels.map((panel) => panel.hidden)).toEqual([true, false, true]);
rotation.click();
flushSync();
expect(rotation.getAttribute("aria-label")).toBe("Resume slide rotation");
expect(viewport.getAttribute("aria-live")).toBe("polite");
vi.advanceTimersByTime(2_000);
flushSync();
expect(panels.map((panel) => panel.hidden)).toEqual([true, false, true]);
} finally {
vi.useRealTimers();
}
});
});