# -*- coding: utf-8 -*- """Verkehrszeichen headless pruefen: Katalog, lokale Grafiken, Palette, Rechenregeln. Aufruf (macOS, QGIS 4.2 im Bundle): APP=/Applications/QGIS-final-4_2_0.app; LIB="$APP/Contents/Resources/python3.12" QT_QPA_PLATFORM=offscreen PROJ_DATA="$APP/Contents/Resources/qgis/proj" \\ PYTHONPATH="$LIB:$LIB/lib-dynload:$LIB/site-packages" \\ "$APP/Contents/MacOS/python3.12" tools/headless_zeichen_test.py Braucht keinen Zugangsschluessel: Katalog und Grafiken sind oeffentlich (``/v2/zeichen/...``). Ohne Netz laeuft der Teil aus der lokalen Ablage; fehlt auch die, werden die betroffenen Pruefungen uebersprungen und gemeldet. """ import os import sys sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from qgis.core import QgsApplication app = QgsApplication([], True) QgsApplication.setPrefixPath("/Applications/QGIS-final-4_2_0.app/Contents/MacOS", True) QgsApplication.setPluginPath("/Applications/QGIS-final-4_2_0.app/Contents/PlugIns/qgis") app.initQgis() from qgis.PyQt.QtNetwork import QNetworkProxyFactory # noqa: E402 QNetworkProxyFactory.setUseSystemConfiguration(False) from vln_karten import zeichen_katalog as zk # noqa: E402 from vln_karten import zeichen_werkzeug as zw # noqa: E402 from vln_karten.api_client import KartenApiClient # noqa: E402 FEHLER = [] def pruefe(bed, text): print((" OK " if bed else " FEHL ") + text) if not bed: FEHLER.append(text) print("== Rechenregeln (Zwilling zu vz_geom.js) ==") pruefe(zw.richtung_grad((0, 0), (0, 10)) == 0.0, "Nord = 0") pruefe(zw.richtung_grad((0, 0), (10, 0)) == 90.0, "Ost = 90") pruefe(zw.richtung_grad((0, 0), (0, -10)) == 180.0, "Sued = 180") pruefe(zw.richtung_grad((0, 0), (-10, 0)) == 270.0, "West = 270") pruefe(zw.richtung_grad((0, 0), (10, 10)) == 45.0, "Nordost = 45") pruefe(zw.richtung_grad((5, 5), (5, 5)) == 0.0, "gleicher Punkt (Doppelklick) = 0") pruefe(zw.norm_grad(-90) == 270 and zw.norm_grad(450) == 90, "Normierung negativ/ueber 360") pruefe(zw.norm_grad("quatsch") == 0 and zw.norm_grad(None) == 0, "Unsinn wird 0") pruefe(zw.zusatz_ergaenzen([], "1020-30") == (["1020-30"], True), "erstes Zusatzzeichen") pruefe(zw.zusatz_ergaenzen(["1020-30"], "1020-30") == (["1020-30"], False), "kein Doppel") pruefe(zw.zusatz_ergaenzen(["a", "b"], "c") == (["a", "b"], False), "hoechstens zwei") pruefe(zw.zusatz_ergaenzen(None, " ") == ([], False), "leerer Code aendert nichts") print("== zusatz aus Text (QGIS fuehrt das Array als Textfeld) ==") pruefe(zk._liste('["1020-30","1040-30"]') == ["1020-30", "1040-30"], "JSON-Text") pruefe(zk._liste("1020-30, 1040-30") == ["1020-30", "1040-30"], "kommagetrennt") pruefe(zk._liste(["1020-30"]) == ["1020-30"], "echte Liste") pruefe(zk._liste(None) == [] and zk._liste("NULL") == [], "leer bleibt leer") print("== Katalog und Grafiken ==") client = KartenApiClient() kat = zk.katalog(client, frisch=True) if not kat.get("zeichen"): print(" ÜBERSPRUNGEN — weder Server noch lokale Ablage erreichbar") else: pruefe(len(kat["zeichen"]) > 800, "Katalog: %d Zeichen, Stand %s" % (len(kat["zeichen"]), kat.get("stand"))) pruefe(len(kat.get("kategorien", [])) >= 10, "Kategorien: %d" % len(kat.get("kategorien", []))) ein = zk.eintrag(kat, "250") pruefe(ein and ein["name"] and len(ein["groessen_mm"]) == 3, "Eintrag 250 vollstaendig") geholt, fehlend = zk.sichere_svgs(client, ["250", "260", "1020-30", "9999"]) pruefe("9999" in fehlend, "unbekannter Code wird als fehlend gemeldet") pruefe(os.path.isfile(os.path.join(zk.svg_ordner(), "250.svg")), "250.svg liegt lokal") wurzel = zk.pfad_registrieren() pruefe(os.path.isdir(os.path.join(wurzel, zk.ORDNER)), "SVG-Suchpfad eingetragen: " + wurzel) print("== Stil auf die lokale Ablage umschreiben ==") qml = "'https://api.flurneuordnung-sachsen.de/v2/zeichen/svg/' || \"vz\" || '.svg'" neu, ersetzt = zk.stil_lokalisieren(qml, "https://api.flurneuordnung-sachsen.de") pruefe(ersetzt and "vln/" in neu and "http" not in neu, "Adresse wird lokaler Name: " + neu) unberuehrt, ersetzt2 = zk.stil_lokalisieren("ohne Adresse", "https://api…") pruefe(not ersetzt2 and unberuehrt == "ohne Adresse", "fremder Stil bleibt, wie er ist") print("== Palette ==") palette = zw.ZeichenPalette() palette.setze_katalog(kat, None) pruefe(palette.kategorie.count() >= 12, "Kategorien in der Auswahl: %d" % palette.kategorie.count()) haeufig = palette.treffer() pruefe(0 < len(haeufig) <= zw.PALETTE_MAX, "haeufig verwendet: %d Kacheln" % len(haeufig)) palette.suche.setText("1020-30") pruefe([z["code"] for z in palette.treffer()] == ["1020-30"], "Suche nach der Nummer trifft genau") palette.suche.setText("vorfahrt") treffer = palette.treffer() pruefe(treffer and all("vorfahrt" in (z.get("suche") or "") for z in treffer), "Suche nach dem Namen: %d Treffer" % len(treffer)) palette.suche.clear() palette.kategorie.setCurrentIndex(1) pruefe(len(palette.treffer()) == zw.PALETTE_MAX, "Deckel bei %d Kacheln" % zw.PALETTE_MAX) pruefe(palette.aktueller_eintrag() == {}, "ohne Klick kein gewaehltes Zeichen") app.exitQgis() print("== Ergebnis: %d Fehler ==" % len(FEHLER)) for f in FEHLER: print(" -", f) sys.exit(1 if FEHLER else 0)