60 lines
2.4 KiB
Python
60 lines
2.4 KiB
Python
"""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']}"
|