import { Light, Line, Mesh, type Object3D, PerspectiveCamera, Points, Scene, Sprite, } from "three"; import { lerMapa } from "@/lib/jogo/mapa"; import { ESCRITORIO } from "@/lib/jogo/valores"; import { criarAmbiente } from "./ambiente"; beforeEach(() => { jest.spyOn(HTMLCanvasElement.prototype, "getContext").mockReturnValue(null); }); afterEach(() => { jest.restoreAllMocks(); }); function montar() { const cena = new Scene(); const camera = new PerspectiveCamera(); cena.add(camera); const ambiente = criarAmbiente(cena, lerMapa(ESCRITORIO), { camera, movimentoReduzido: false, }); return { cena, camera, ambiente }; } test("o escritório cabe em 12 objetos desenháveis", () => { const { cena } = montar(); let n = 0; cena.traverse((o) => { if ( o instanceof Mesh || o instanceof Sprite || o instanceof Line || o instanceof Points ) n++; }); expect(n).toBeGreaterThan(0); expect(n).toBeLessThanOrEqual(12); }); test("a lanterna presa à câmera é a única luz com sombra e desliga com o regulador", () => { const { cena, ambiente } = montar(); const comSombra = () => { const luzes: Object3D[] = []; cena.traverse((o) => { if (o instanceof Light && o.castShadow) luzes.push(o); }); return luzes; }; expect(comSombra()).toHaveLength(1); expect(comSombra()[0].parent).toBeInstanceOf(PerspectiveCamera); ambiente.definirSombras(false); expect(comSombra()).toHaveLength(0); }); test("descartar esvazia a cena e a câmera", () => { const { cena, camera, ambiente } = montar(); ambiente.descartar(); expect(cena.children).toEqual([camera]); expect(camera.children).toHaveLength(0); expect(cena.fog).toBeNull(); });