test(world): ersetzte Grundrisse und feste Materialien je Ort strenger prüfen
Behebt Befunde 2-6 aus dem Abschluss-Review: der replaces-Test prüft jetzt zusätzlich jede Ecke des getroffenen Grundrisses gegen die Außenmaße plus REPLACED_OVERHANG (5 m), der Verteilungstest vergleicht als Mengen und bekommt eine Gegenrichtung je Datei, BUMP_BY_PLACE erzwingt eine Zeile je Ort statt sie mit "?? []" zu verdecken, ein Gebäude an einer Chunkgrenze bekommt einen Test über zwei Chunks samt JSDoc-Hinweis, und der Rückwand-Messwert in der Spec nennt Kapselmitte, Wandfläche und Radius einzeln. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
14fd9cefde
commit
237a4ed389
5 files changed
+59
-12
No files matched your search
@@ -5,7 +5,7 @@ import { NodeIO } from "@gltf-transform/core";
|
||||
import { ALL_EXTENSIONS } from "@gltf-transform/extensions";
|
||||
import { getBounds } from "@gltf-transform/functions";
|
||||
import { MeshoptDecoder } from "meshoptimizer";
|
||||
import { PLACES, SOLID_MATERIALS } from "../src/world/places.js";
|
||||
import { isSolidMaterial, PLACES, SOLID_MATERIALS } from "../src/world/places.js";
|
||||
import { EXT_MATERIALS_BUMP, EXTMaterialsBump } from "../tools/assets/bumpExtension.mjs";
|
||||
|
||||
// Feste Materialien je Ort. SOLID_MATERIALS gilt für alle Orte zusammen, aber keine Datei enthält alle
|
||||
@@ -26,16 +26,20 @@ const SOLID_BY_PLACE = {
|
||||
// Materialien, deren Relief nur aus EXT_materials_bump kommt. Die Tribüne hat keine Bump-Maps.
|
||||
const BUMP_BY_PLACE = {
|
||||
"hood-yard": ["cont_a_side", "cont_a_end", "cont_b_side", "cont_b_end", "cont_c_side", "cont_c_end"],
|
||||
tribuene: [],
|
||||
};
|
||||
|
||||
// Bruch: ein festes Material steht in keiner Zeile — die Datei seines Orts würde nie darauf geprüft.
|
||||
// Bruch: ein festes Material steht in keiner Zeile — die Datei seines Orts würde nie darauf geprüft. Als
|
||||
// Mengen verglichen, damit ein Name, der in zwei Orten fest ist, keinen Fehlalarm auslöst.
|
||||
it("verteilt SOLID_MATERIALS vollständig auf die Orte", () => {
|
||||
expect(Object.values(SOLID_BY_PLACE).flat().sort()).toEqual([...SOLID_MATERIALS].sort());
|
||||
expect(new Set(Object.values(SOLID_BY_PLACE).flat())).toEqual(new Set(SOLID_MATERIALS));
|
||||
});
|
||||
|
||||
describe.each(PLACES.map((place) => [place.id, place]))("%s.glb", (id, place) => {
|
||||
const file = fileURLToPath(new URL(`../public/${place.url.slice(2)}`, import.meta.url));
|
||||
const bump = BUMP_BY_PLACE[id] ?? [];
|
||||
// Kein "?? []": eine fehlende Zeile soll die Prüfung darunter rot machen (Bruch), nicht still
|
||||
// durchlaufen. it.runIf gleich unten sichert nur seine eigene Bedingung gegen "undefined" ab.
|
||||
const bump = BUMP_BY_PLACE[id];
|
||||
let document;
|
||||
beforeAll(async () => {
|
||||
await MeshoptDecoder.ready;
|
||||
@@ -65,9 +69,15 @@ describe.each(PLACES.map((place) => [place.id, place]))("%s.glb", (id, place) =>
|
||||
}
|
||||
});
|
||||
|
||||
// Bruch: der Ort hat keine Zeile in BUMP_BY_PLACE — ohne diesen Test liefe die Bump-Prüfung darunter
|
||||
// per it.runIf(bump?.length > 0) einfach übersprungen durch, statt rot zu werden.
|
||||
it("hat eine Zeile in BUMP_BY_PLACE", () => {
|
||||
expect(bump).toBeDefined();
|
||||
});
|
||||
|
||||
// Bruch: die Aufbereitung verwirft EXT_materials_bump (wie die gltf-transform-CLI) — das Wellblech der
|
||||
// Container wäre flach.
|
||||
it.runIf(bump.length > 0)("gibt den Bump-Materialien ihre Bump-Textur", () => {
|
||||
it.runIf((bump ?? []).length > 0)("gibt den Bump-Materialien ihre Bump-Textur", () => {
|
||||
const used = document.getRoot().listExtensionsUsed().map((extension) => extension.extensionName);
|
||||
const materials = new Map(document.getRoot().listMaterials().map((material) => [material.getName(), material]));
|
||||
|
||||
@@ -86,6 +96,15 @@ describe.each(PLACES.map((place) => [place.id, place]))("%s.glb", (id, place) =>
|
||||
expect(SOLID_BY_PLACE[id].filter((name) => !names.includes(name))).toEqual([]);
|
||||
});
|
||||
|
||||
// Bruch: ein Material der Datei ist laut isSolidMaterial fest (weil sein Name anderswo fest ist), ohne
|
||||
// in der Zeile seines Orts zu stehen — es würde hier still mitkollidieren, ungeprüft von SOLID_BY_PLACE.
|
||||
it("hat kein fremdes festes Material ohne Zeile in SOLID_BY_PLACE", () => {
|
||||
const names = document.getRoot().listMaterials().map((material) => material.getName());
|
||||
const ownSolid = new Set(SOLID_BY_PLACE[id]);
|
||||
|
||||
expect(names.filter((name) => isSolidMaterial(name) && !ownSolid.has(name))).toEqual([]);
|
||||
});
|
||||
|
||||
// Bruch: bounds in PLACES passt nicht mehr zur Datei — der Datentest prüfte dann die falsche Fläche.
|
||||
it("passt auf 5 cm zu den Außenmaßen in PLACES", () => {
|
||||
const { min, max } = getBounds(document.getRoot().listScenes()[0]);
|
||||
|
||||
Reference in new issue
Block a user