Files
Plugin_SN_Basis/tests/test_print_logic.py
T
2026-04-17 16:52:53 +02:00

191 lines
6.9 KiB
Python

import unittest
from unittest.mock import MagicMock, patch
from sn_basis.modules.print_logic import (
PrintLogic,
DRUCKBEREICH_RECHTECK,
DRUCKBEREICH_WIE_KARTENFENSTER,
ENDLOSROLLE_MAX_BREITE_MM,
)
class _FakeExtent:
def __init__(self, width: float = 100.0, height: float = 80.0) -> None:
self._width = width
self._height = height
def width(self) -> float:
return self._width
def height(self) -> float:
return self._height
def isNull(self) -> bool:
return False
class _FakeCanvas:
def __init__(self, extent: object | None) -> None:
self._extent = extent
def extent(self) -> object | None:
return self._extent
class TestPrintLogic(unittest.TestCase):
def setUp(self) -> None:
self.logic = PrintLogic(pruefmanager=MagicMock())
def test_get_baufreigabe_page_dimensions_prefers_a4_for_small_extent(self):
din_format, page_w, page_h, map_w, map_h, fallback = self.logic._get_baufreigabe_page_dimensions(80.0, 120.0)
self.assertEqual(din_format, "DIN A4")
self.assertEqual((page_w, page_h), (297.0, 210.0))
self.assertEqual((map_w, map_h), (187.0, 190.0))
self.assertFalse(fallback)
def test_get_baufreigabe_page_dimensions_escalates_to_a3(self):
din_format, page_w, page_h, map_w, map_h, fallback = self.logic._get_baufreigabe_page_dimensions(200.0, 180.0)
self.assertEqual(din_format, "DIN A3")
self.assertEqual((page_w, page_h), (420.0, 297.0))
self.assertEqual((map_w, map_h), (310.0, 277.0))
self.assertFalse(fallback)
def test_get_baufreigabe_page_dimensions_respects_a4_as_maximum_with_fallback(self):
din_format, page_w, page_h, map_w, map_h, fallback = self.logic._get_baufreigabe_page_dimensions(
200.0,
180.0,
max_format="DIN A4",
)
self.assertEqual(din_format, "DIN A4")
self.assertEqual((page_w, page_h), (297.0, 210.0))
self.assertEqual((map_w, map_h), (187.0, 190.0))
self.assertTrue(fallback)
def test_get_baufreigabe_page_dimensions_falls_back_to_a3_for_oversize_extent(self):
din_format, page_w, page_h, map_w, map_h, fallback = self.logic._get_baufreigabe_page_dimensions(400.0, 300.0)
self.assertEqual(din_format, "DIN A3")
self.assertEqual((page_w, page_h), (420.0, 297.0))
self.assertEqual((map_w, map_h), (310.0, 277.0))
self.assertTrue(fallback)
def test_select_standard_page_layout_uses_a4_as_minimum_sheet(self):
selected = self.logic._select_standard_page_layout(60.0, 100.0, max_format="DIN A3")
self.assertEqual(selected, (297.0, 210.0, 87.0, 190.0))
def test_select_standard_page_layout_limits_hauptkarte_to_a3(self):
selected = self.logic._select_standard_page_layout(120.0, 240.0, max_format="DIN A3")
self.assertEqual(selected, (420.0, 297.0, 210.0, 277.0))
def test_select_standard_page_layout_returns_none_if_a3_is_too_small(self):
selected = self.logic._select_standard_page_layout(260.0, 280.0, max_format="DIN A3")
self.assertIsNone(selected)
def test_get_standard_layout_dimensions_uses_a4_and_forces_fit_for_small_extent(self):
page_w, page_h, map_w, map_h, force_fit = self.logic._get_standard_layout_dimensions(
60.0,
100.0,
max_format="DIN A3",
formfaktor=False,
)
self.assertEqual((page_w, page_h), (297.0, 210.0))
self.assertEqual((map_w, map_h), (87.0, 190.0))
self.assertTrue(force_fit)
def test_get_standard_layout_dimensions_caps_endlosrolle_width_at_2000_mm(self):
page_w, page_h, map_w, map_h, force_fit = self.logic._get_standard_layout_dimensions(
2500.0,
100.0,
max_format="DIN A0",
formfaktor=True,
)
self.assertEqual(page_w, ENDLOSROLLE_MAX_BREITE_MM)
self.assertEqual(page_h, 210.0)
self.assertEqual((map_w, map_h), (2500.0, 190.0))
self.assertTrue(force_fit)
def test_apply_standard_minimum_a4_fallback_for_small_page(self):
page_w, page_h, map_w, map_h, forced = self.logic._apply_standard_minimum_a4_fallback(
250.0,
180.0,
40.0,
20.0,
)
self.assertTrue(forced)
self.assertEqual((page_w, page_h), (297.0, 210.0))
self.assertEqual((map_w, map_h), (87.0, 190.0))
def test_apply_standard_minimum_a4_fallback_keeps_large_page(self):
page_w, page_h, map_w, map_h, forced = self.logic._apply_standard_minimum_a4_fallback(
420.0,
297.0,
210.0,
277.0,
)
self.assertFalse(forced)
self.assertEqual((page_w, page_h), (420.0, 297.0))
self.assertEqual((map_w, map_h), (210.0, 277.0))
def test_does_plot_fit_page_true_for_standard_a4(self):
fits = self.logic._does_plot_fit_page(297.0, 210.0, 87.0, 190.0, 210.0, 20.0)
self.assertTrue(fits)
def test_does_plot_fit_page_false_if_objects_exceed_page(self):
fits = self.logic._does_plot_fit_page(297.0, 210.0, 120.0, 190.0, 210.0, 20.0)
self.assertFalse(fits)
@patch("sn_basis.modules.print_logic.set_variable")
def test_set_druckbereich_accepts_wie_kartenfenster(self, mock_set_variable):
self.logic.set_druckbereich_for_auswahl(DRUCKBEREICH_WIE_KARTENFENSTER)
mock_set_variable.assert_called_once_with("druckbereich", DRUCKBEREICH_WIE_KARTENFENSTER, scope="project")
@patch("sn_basis.modules.print_logic.iface")
def test_get_canvas_extent_returns_valid_extent(self, mock_iface):
extent = _FakeExtent(120.0, 90.0)
mock_iface.mapCanvas.return_value = _FakeCanvas(extent)
result = self.logic._get_canvas_extent()
self.assertIs(result, extent)
@patch.object(PrintLogic, "_buffer_extent")
@patch.object(PrintLogic, "_get_canvas_extent")
def test_resolve_extent_uses_canvas_extent_without_buffer(self, mock_get_canvas_extent, mock_buffer_extent):
extent = _FakeExtent(120.0, 90.0)
mock_get_canvas_extent.return_value = extent
result_extent, result_layer = self.logic._resolve_extent(None, DRUCKBEREICH_WIE_KARTENFENSTER, 5000.0)
self.assertIs(result_extent, extent)
self.assertIsNone(result_layer)
mock_buffer_extent.assert_not_called()
@patch.object(PrintLogic, "_buffer_extent")
@patch.object(PrintLogic, "_get_druckrechteck_extent")
def test_resolve_extent_uses_rectangle_extent_without_buffer(self, mock_get_rect_extent, mock_buffer_extent):
extent = _FakeExtent(120.0, 90.0)
mock_get_rect_extent.return_value = extent
result_extent, result_layer = self.logic._resolve_extent(None, DRUCKBEREICH_RECHTECK, 5000.0)
self.assertIs(result_extent, extent)
self.assertIsNone(result_layer)
mock_buffer_extent.assert_not_called()
if __name__ == "__main__":
unittest.main()