"""Die ausgelieferten Straßen, festgehalten (Entwurf, Abschnitt Tests: Integrationslauf). Der Test liest die committeten Chunks, nicht den Lauf — die Kacheln liegen nicht im Repository. Die Zahlen sind beim Neuerzeugen gemessen. Ändert sich die Extraktion absichtlich, gehören die neuen Zahlen hierher, mit einem Satz im Commit, warum. Die Kreuzungszahl fehlt, weil die Chunks keine Knoten tragen; sie steht in den Messwerten des Entwurfs. """ from __future__ import annotations import json from collections import Counter from pathlib import Path from shapely.geometry import LineString, Point, Polygon ROOT = Path(__file__).resolve().parents[3] / "public" / "data" / "vice-a" def _chunks() -> list[dict]: return [json.loads(p.read_text(encoding="utf-8")) for p in sorted(ROOT.glob("chunk_*.json"))] def _flaeche(chunks, key) -> float: return sum(Polygon(i["poly"][0], i["poly"][1:]).area for c in chunks for i in c.get(key, [])) def test_kantenstuecke_je_klasse(): assert dict(Counter(e["klasse"] for c in _chunks() for e in c["edges"])) == { "boulevard": 270, "wohnstrasse": 537, "gasse": 1010, "hauptstrasse": 401, } def test_markierungsstuecke_je_art(): assert dict(Counter(m["art"] for c in _chunks() for m in c["markings"])) == { "gelb_doppelt": 1216, "gelb_gestrichelt": 2370, "haltelinie": 1553, "weiss_gestrichelt": 2066, "weiss_rand": 1219, "zebra": 14832, } def test_restflaechen_und_bordsteinstuecke(): chunks = _chunks() assert sum(len(c["lots"]) for c in chunks) == 282 # „lots" aus „Stücke, je Chunk gezählt" assert sum(len(c["curb"]) for c in chunks) == 1415 # „curb" aus „Stücke, je Chunk gezählt" def test_flaechen_und_bordsteinlaenge(): chunks = _chunks() assert round(_flaeche(chunks, "carriageway") / 1e6, 4) == 0.9076 # aus „Flächen km²" assert round(_flaeche(chunks, "sidewalk") / 1e6, 4) == 0.2982 assert round(_flaeche(chunks, "lots") / 1e6, 4) == 0.0972 laenge = sum(LineString(line).length for c in chunks for line in c["curb"]) assert round(laenge / 1e3, 2) == 120.28 # aus „Bordstein km" def test_keine_palme_auf_der_fahrbahn(): for c in _chunks(): fahrbahn = [Polygon(i["poly"][0], i["poly"][1:]) for i in c["carriageway"]] auf = [p for p in c["palms"] if any(f.contains(Point(p)) for f in fahrbahn)] assert auf == [], f"Chunk {c['chunk']}"