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()