diff --git a/tests/geometry.test.js b/tests/geometry.test.js index 541e326..43b8f56 100644 --- a/tests/geometry.test.js +++ b/tests/geometry.test.js @@ -195,4 +195,42 @@ describe("geometry", () => { } expect([deckel, aussen, innen]).toEqual([8, 8, 8]); }); + + describe("Bodenplatte mit vielen Löchern (Risiko aus dem Entwurf, Teil 2)", () => { + // 250-m-Chunk mit einem Raster aus 100 rechteckigen Löchern: die Größenordnung, die die + // Fahrbahnlöcher im dichtesten Stadtchunk erzeugen. Gemessen wird die Zeit, die + // triangulateShape dafür braucht — sie läuft beim Nachladen im Hauptthread. + const plateWithHoles = (count) => { + const outer = [[0, 0], [250, 0], [250, -250], [0, -250]]; + const holes = []; + const side = Math.ceil(Math.sqrt(count)); + for (let k = 0; k < count; k++) { + const x = 5 + (k % side) * (240 / side), z = -5 - Math.floor(k / side) * (240 / side); + const w = 240 / side - 6; + holes.push([[x, z], [x + w, z], [x + w, z - w], [x, z - w]]); + } + return [[outer, ...holes]]; + }; + + it("baut eine Platte mit 100 Löchern in unter 50 ms", () => { + const chunk = { chunk: [0, 0], origin: [0, 0], land: plateWithHoles(100), + roads: [], centerlines: [], buildings: [], palms: [] }; + const start = performance.now(); + const geo = buildChunkGeometry(chunk).ground; + const ms = performance.now() - start; + console.log(`ZEITMESSUNG: ${ms.toFixed(2)} ms`); + expect(geo).not.toBeNull(); + // Jedes Loch bringt vier Wandvierecke; die Deckfläche kommt dazu. + expect(geo.getAttribute("position").count).toBeGreaterThan(100 * 16); + expect(ms).toBeLessThan(50); + }); + + it("lässt kein Loch verschwinden", () => { + const chunk = { chunk: [0, 0], origin: [0, 0], land: plateWithHoles(25), + roads: [], centerlines: [], buildings: [], palms: [] }; + const geo = buildChunkGeometry(chunk).ground; + // Ohne Löcher hätte die Platte 4 Ringpunkte für die Wände plus 4 für die Decke. + expect(geo.getAttribute("position").count).toBeGreaterThan(25 * 16); + }); + }); });