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.
123 lines
4.3 KiB
TypeScript
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");
|
|
});
|
|
});
|