191 lines
6.9 KiB
Python
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() |