import { fireEvent, render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { describe, expect, it, vi } from "vitest"; import { Art, Button, Meter, ScreenHeader, Sheet, spriteUrl } from "../src/ui"; describe("UI kit (Step 10E.2)", () => { it("buttons default to type=button and forward disabled and clicks", async () => { const onClick = vi.fn(); const { rerender } = render(); const button = screen.getByRole("button", { name: "Go" }); expect(button).toHaveAttribute("type", "button"); await userEvent.click(button); expect(onClick).toHaveBeenCalledOnce(); rerender( , ); expect(screen.getByRole("button", { name: "Go" })).toBeDisabled(); }); it("meters expose their range and value", () => { render(); const bar = screen.getByRole("progressbar", { name: "Duty" }); expect(bar).toHaveAttribute("aria-valuemin", "0"); expect(bar).toHaveAttribute("aria-valuemax", "14"); expect(bar).toHaveAttribute("aria-valuenow", "9"); }); it("sheets are modal dialogs labelled by their title", () => { render(

Body

, ); const dialog = screen.getByRole("dialog", { name: "Deliver to which HQ?" }); expect(dialog).toHaveAttribute("aria-modal", "true"); expect(screen.getByRole("heading", { level: 2, name: "Deliver to which HQ?" })).toBeVisible(); }); it("the screen header is the level-1 heading", () => { render(); expect(screen.getByRole("heading", { level: 1, name: "Fleet" })).toBeInTheDocument(); }); it("art loads the generated sprite and hides itself if it fails", () => { const { container } = render(); const img = container.querySelector("img")!; expect(img).toHaveAttribute("src", spriteUrl("ship-courier", "1x")); expect(img).toHaveAttribute("alt", ""); expect(img.getAttribute("srcset")).toContain("/assets/map-gen/ship-courier@2x.png 2x"); fireEvent.error(img); expect(container.querySelector("img")).toBeNull(); }); });