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.
This commit is contained in:
1 parent
c7d09d63d4
commit
67b32fcab3
118 files changed
+16730
No files matched your search
@@ -0,0 +1,122 @@
|
||||
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");
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user