File size: 1,713 Bytes
9de795a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import { describe, expect, it } from "vitest";
import { dressingBauteile, DRESSING_TYPEN } from "./dressing3d-kits";
import { passtInBbox } from "./moebel3d.tsx";

// Reale Deko-Masse (Meter) aus data/dressing/bad.json + extreme Seitenverhältnisse.
const MASSE: [number, number, number][] = [
  [0.07, 0.07, 0.18], // Seifenspender
  [0.08, 0.08, 0.11], // Zahnputzbecher
  [0.3, 0.22, 0.14], // Handtuchstapel (flach, breit)
  [0.28, 0.16, 0.2], // Ablage-Tray
  [0.24, 0.24, 0.55], // Zimmerpflanze (schmal, hoch)
  [0.28, 0.09, 0.13], // Gewürzgläser-Set (sehr flach in d)
  [0.2, 0.28, 0.34], // Kaffeemaschine (tief)
  [0.3, 0.22, 0.06], // Geschirrtuch (extrem flach in h)
  [0.5, 0.5, 0.5], // Würfel-Kontrolle
];

describe("dressingBauteile – bbox-Treue", () => {
  it("hält jeden Deko-Bausatz vollständig innerhalb der bbox w×d×h", () => {
    for (const typ of DRESSING_TYPEN) {
      for (const [w, d, h] of MASSE) {
        const teile = dressingBauteile(typ, w, d, h);
        expect(teile.length, `${typ} liefert Bauteile`).toBeGreaterThan(0);
        expect(passtInBbox(teile, w, d, h), `${typ} bleibt in bbox`).toBe(true);
      }
    }
  });

  it("formt bekannte Deko-Typen mehrteilig (nicht als nackte Box)", () => {
    for (const typ of DRESSING_TYPEN) {
      expect(dressingBauteile(typ, 0.3, 0.2, 0.4).length, `${typ} ist mehrteilig`).toBeGreaterThan(
        1,
      );
    }
  });
});

describe("dressingBauteile – Fallback", () => {
  it("gibt für unbekannte Typen genau die volle Box zurück", () => {
    expect(dressingBauteile("gibtsnicht", 0.2, 0.3, 0.4)).toEqual([
      { form: "box", groesse: [0.2, 0.4, 0.3], pos: [0, 0, 0], rolle: "koerper" },
    ]);
  });
});