import { describe, expect, it } from "vitest"; import { MATERIAL_KEYS, TEXTURES, waterNormalData } from "../src/world/materials.js"; import { buildChunkGeometry } from "../src/world/geometry.js"; describe("materials", () => { it("deckt genau die Geometrie-Teile ab", () => { const chunk = { chunk: [0, 0], origin: [0, 0], land: [], roads: [], centerlines: [], buildings: [], palms: [] }; expect(Object.keys(buildChunkGeometry(chunk)).sort()).toEqual([...MATERIAL_KEYS].sort()); }); it("nennt für jedes Material eine Textur", () => { for (const key of MATERIAL_KEYS) expect(TEXTURES[key]).toBeTruthy(); }); it("deckt Strand und Park mit eigenen Materialien ab", () => { expect(MATERIAL_KEYS).toContain("sand"); expect(MATERIAL_KEYS).toContain("park"); }); it("gibt Brücken dieselbe Textur wie Straßen, damit an der Übergangsnaht kein Farbsprung entsteht (Ruling 56)", () => { // Brücken sind in den Daten dasselbe Straßenstück, nur über Wasser // (geometry.js trennt sie einzig über roads.filter(r => r.bridge)). expect(TEXTURES.bridges).toBe(TEXTURES.roads); }); it("erzeugt eine Wellen-Normalmap mit neutraler Grundfarbe", () => { const data = waterNormalData(32); expect(data.length).toBe(32 * 32 * 4); // Normalen zeigen im Mittel nach oben: Blaukanal nahe 255. const blue = [...data].filter((_, i) => i % 4 === 2); expect(blue.reduce((a, b) => a + b, 0) / blue.length).toBeGreaterThan(200); }); });