Files
portifolio-evandrodevbr/app/jogo/Hud.test.tsx
T
evandro 67b32fcab3
CI / audit (push) Successful in 10m48s
CI / verify (push) Successful in 19m2s
CI / deploy (push) Successful in 2m14s
CI / e2e (push) Failing after 36m15s
feat(jogo): expediente dos mortos, jogo de zumbis em primeira pessoa
Etapa 1 inteira (logica com 100% de cobertura, cena 3D, toque, sons, bancada de desempenho, e2e) e a base da etapa 2 (mapa novo no Tiled, texturas, imagens dos itens, sons conferidos, golpe recortado e medido). Pagina /jogo fora do menu e do sitemap ate a medicao no celular.
2026-11-10 19:37:10 -03:00

123 lines
4.3 KiB
TypeScript

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<Retrato> = {}, mudo = false) {
const acoes = {
aoAlternarMudo: jest.fn(),
aoContinuar: jest.fn(),
aoSair: jest.fn(),
};
render(<Hud retrato={{ ...base, ...parcial }} mudo={mudo} {...acoes} />);
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(
<Hud
retrato={base}
mudo={false}
aoAlternarMudo={jest.fn()}
aoContinuar={jest.fn()}
aoSair={jest.fn()}
/>,
);
expect(container.firstElementChild).toHaveClass("pointer-events-none");
expect(screen.getByRole("button")).toHaveClass("pointer-events-auto");
});
});