import { render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import type { Retrato } from "./contrato"; import Hud from "./Hud"; const base: Retrato = { fase: "horda", horda: 1, problemaAtual: "site-que-ninguem-acha", restantes: 7, vida: 80, arma: 0, municao: 30, placar: { jogador: 4, drones: 2 }, feed: [{ passo: 1, texto: "Site que aparece no Google eliminou um zumbi" }], drones: [{ problemaId: "site-que-ninguem-acha", eliminacoes: 2 }], pausado: false, }; function montar(parcial: Partial = {}, mudo = false) { const acoes = { aoAlternarMudo: jest.fn(), aoContinuar: jest.fn(), aoSair: jest.fn(), }; render(); return acoes; } describe("Hud", () => { it("na horda mostra horda, problema, faltam, placar, vida, arma, feed e drones", () => { montar(); expect( screen.getByText( "Horda 2 de 3 · Site que ninguém acha no Google · faltam 7", ), ).toBeInTheDocument(); expect(screen.getByText("Você 4 · Drones 2")).toBeInTheDocument(); expect(screen.getByRole("progressbar", { name: "Vida" })).toHaveAttribute( "aria-valuenow", "80", ); expect(screen.getByText("Pistola · ∞")).toBeInTheDocument(); const feed = screen.getByRole("list", { name: "Últimas eliminações" }); expect(feed).toHaveAttribute("aria-live", "polite"); expect(feed).toHaveTextContent("eliminou um zumbi"); expect(screen.getByText("2 eliminações")).toBeInTheDocument(); expect(screen.queryByText(/Resolvido:/)).not.toBeInTheDocument(); expect(screen.queryByText("Pausado")).not.toBeInTheDocument(); }); it("mostra a munição da automática", () => { montar({ arma: 1, municao: 17 }); expect(screen.getByText("Automática · 17")).toBeInTheDocument(); }); it("no chefão mostra Chefão e o nome", () => { montar({ fase: "chefao", horda: 3 }); expect( screen.getByText("Chefão · Site que ninguém acha no Google"), ).toBeInTheDocument(); }); it("na pausa entre hordas mostra o cartão Resolvido", () => { montar({ fase: "pausa", restantes: 0 }); expect( screen.getByText("Resolvido: Site que ninguém acha no Google"), ).toBeInTheDocument(); expect( screen.getByText("Site que aparece no Google entrou para o seu time"), ).toBeInTheDocument(); }); it("no cartão Resolvido o feed fica apagado para não passar por baixo dele", () => { montar({ fase: "pausa" }); const feed = screen.getByRole("list", { name: "Últimas eliminações" }); expect(feed).toHaveClass("opacity-0"); expect(feed).toHaveTextContent("eliminou um zumbi"); }); it.each(["inicio", "vitoria", "derrota"] as const)( "na fase %s não mostra horda nem cartão", (fase) => { montar({ fase }); expect(screen.queryByText(/Horda \d/)).not.toBeInTheDocument(); expect(screen.queryByText(/Resolvido:/)).not.toBeInTheDocument(); }, ); it("pausado mostra o painel com Continuar, Som e Sair", async () => { const acoes = montar({ pausado: true }); expect(screen.getByRole("dialog", { name: "Pausado" })).toBeInTheDocument(); const continuar = screen.getByRole("button", { name: "Continuar" }); expect(continuar).toHaveFocus(); await userEvent.click(continuar); await userEvent.click(screen.getByRole("button", { name: "Som ligado" })); await userEvent.click(screen.getByRole("button", { name: "Sair" })); expect(acoes.aoContinuar).toHaveBeenCalledTimes(1); expect(acoes.aoAlternarMudo).toHaveBeenCalledTimes(1); expect(acoes.aoSair).toHaveBeenCalledTimes(1); }); it("o botão de mudo do canto está sempre à vista", async () => { const acoes = montar({}, true); await userEvent.click(screen.getByRole("button", { name: "Ligar o som" })); expect(acoes.aoAlternarMudo).toHaveBeenCalledTimes(1); }); it("só os botões capturam o ponteiro", () => { const { container } = render( , ); expect(container.firstElementChild).toHaveClass("pointer-events-none"); expect(screen.getByRole("button")).toHaveClass("pointer-events-auto"); }); });