Die Basemap-Styles „Platz“ (Verkehrsfläche, weitere Nutzung) haben eine rein weiße Füllung ohne Umrandung und waren auf dem weißen Legendenhintergrund unsichtbar. baue_symbole gibt solchen Flächensymbolen jetzt in der Legende eine dünne graue Randlinie (0,15 mm). Erkannt wird das an Füllfarbe und fehlender Kontur (braucht_legendenrand), nicht an Style-Namen; der Basemap-Layer in der Karte bleibt unverändert. Wrapper: QgsSimpleLineSymbolLayer. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
103 lines
4.3 KiB
Python
103 lines
4.3 KiB
Python
"""
|
|
Tests für den Legendenrand weißer Basemap-Flächen (Basis #92).
|
|
|
|
Weiße Flächen ohne Umrandung (z. B. „Platz“) verschwinden auf dem weißen Legendenhintergrund.
|
|
Das Legendensymbol bekommt dann einen dünnen grauen Rand; die Karte bleibt unverändert.
|
|
Das Aussehen in der Legende ist im QGIS-Test geprüft.
|
|
"""
|
|
import unittest
|
|
from unittest.mock import patch
|
|
|
|
from sn_basis.modules import basemap_legende_layout as bll
|
|
from sn_basis.modules.basemap_legende_layout import braucht_legendenrand, ergaenze_legendenrand
|
|
|
|
WEISS = (255, 255, 255, 255)
|
|
GRUEN = (200, 230, 160, 255)
|
|
GRAU = (120, 120, 120, 255)
|
|
|
|
|
|
class TestBrauchtLegendenrand(unittest.TestCase):
|
|
|
|
def test_weisse_flaeche_ohne_rand(self):
|
|
"""Prüft, dass eine weiße Fläche ohne Umrandung einen Legendenrand braucht."""
|
|
self.assertTrue(braucht_legendenrand([{"art": "fuellung", "farbe": WEISS, "rand": None}]))
|
|
|
|
def test_farbige_flaeche_oder_flaeche_mit_kontur(self):
|
|
"""Prüft, dass farbige Flächen und weiße Flächen mit dunkler Kontur oder eigener Konturlinie keinen Rand bekommen."""
|
|
self.assertFalse(braucht_legendenrand([{"art": "fuellung", "farbe": GRUEN, "rand": None}]))
|
|
self.assertFalse(braucht_legendenrand([{"art": "fuellung", "farbe": WEISS, "rand": GRAU}]))
|
|
self.assertFalse(braucht_legendenrand([{"art": "fuellung", "farbe": WEISS, "rand": None},
|
|
{"art": "linie", "farbe": GRAU}]))
|
|
|
|
def test_heller_rand_und_fast_weiss_zaehlen_als_unsichtbar(self):
|
|
"""Prüft, dass fast weiße Füllungen und helle oder durchsichtige Ränder als unsichtbar gelten."""
|
|
self.assertTrue(braucht_legendenrand([{"art": "fuellung", "farbe": (250, 248, 245, 255),
|
|
"rand": (255, 255, 255, 255)}]))
|
|
self.assertTrue(braucht_legendenrand([{"art": "fuellung", "farbe": WEISS, "rand": (0, 0, 0, 0)}]))
|
|
|
|
def test_andere_ebenen_und_leeres_symbol(self):
|
|
"""Prüft, dass Symbole mit anderen Ebenen (Muster, Punkte) und leere Symbole keinen Rand bekommen."""
|
|
self.assertFalse(braucht_legendenrand([{"art": "sonst", "farbe": WEISS}]))
|
|
self.assertFalse(braucht_legendenrand([]))
|
|
|
|
|
|
class _Farbe:
|
|
def __init__(self, r, g, b, a=255): self.w = (r, g, b, a)
|
|
def red(self): return self.w[0]
|
|
def green(self): return self.w[1]
|
|
def blue(self): return self.w[2]
|
|
def alpha(self): return self.w[3]
|
|
|
|
|
|
class _Fuellung:
|
|
def __init__(self, farbe, rand_stil=0, rand=(0, 0, 0, 255)):
|
|
self._farbe, self._rand_stil, self._rand = _Farbe(*farbe), rand_stil, _Farbe(*rand)
|
|
|
|
def layerType(self): return "SimpleFill"
|
|
def color(self): return self._farbe
|
|
def strokeStyle(self): return self._rand_stil
|
|
def strokeColor(self): return self._rand
|
|
|
|
|
|
class _Symbol:
|
|
def __init__(self, typ, *ebenen):
|
|
self._typ, self.ebenen = typ, list(ebenen)
|
|
|
|
def type(self): return self._typ
|
|
def symbolLayers(self): return list(self.ebenen)
|
|
def appendSymbolLayer(self, ebene): self.ebenen.append(ebene)
|
|
|
|
|
|
class _Linienebene:
|
|
erzeugt = []
|
|
|
|
@classmethod
|
|
def create(cls, eigenschaften):
|
|
cls.erzeugt.append(eigenschaften)
|
|
return ("Rand", eigenschaften)
|
|
|
|
|
|
@patch.object(bll, "QgsSimpleLineSymbolLayer", _Linienebene)
|
|
class TestErgaenzeLegendenrand(unittest.TestCase):
|
|
|
|
def test_weisse_flaeche_bekommt_grauen_rand(self):
|
|
"""Prüft, dass eine weiße Fläche ohne Kontur eine graue Randlinie als oberste Ebene bekommt."""
|
|
symbol = _Symbol(2, _Fuellung(WEISS))
|
|
self.assertTrue(ergaenze_legendenrand(symbol))
|
|
self.assertEqual(len(symbol.ebenen), 2)
|
|
eigenschaften = symbol.ebenen[-1][1]
|
|
self.assertEqual(eigenschaften["line_width"], str(bll.LEGENDENRAND_BREITE_MM))
|
|
self.assertEqual(eigenschaften["line_color"], bll.LEGENDENRAND_FARBE)
|
|
|
|
def test_farbige_flaeche_und_linien_bleiben_unveraendert(self):
|
|
"""Prüft, dass farbige Flächen, Flächen mit Kontur und Liniensymbole keinen Rand bekommen."""
|
|
for symbol in (_Symbol(2, _Fuellung(GRUEN)), _Symbol(2, _Fuellung(WEISS, rand_stil=1, rand=GRAU)),
|
|
_Symbol(1, _Fuellung(WEISS))):
|
|
anzahl = len(symbol.ebenen)
|
|
self.assertFalse(ergaenze_legendenrand(symbol))
|
|
self.assertEqual(len(symbol.ebenen), anzahl)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|