"""Unit tests for the display-only ``display_name`` fallback on entities.""" from __future__ import annotations from otko.core import ( BeamWithHingesElement, CorotTrussElement, DispBeamColumn, ElasticBeamColumn, ElementBase, ForceBeamColumn, Node, QuadElement, TrussElement, ZeroLengthElement, ZeroLengthSectionElement, ) from otko.core._base import Entity _ALL_ELEMENT_TYPES = ( TrussElement, CorotTrussElement, ElasticBeamColumn, ForceBeamColumn, DispBeamColumn, ZeroLengthElement, ZeroLengthSectionElement, BeamWithHingesElement, QuadElement, ) class TestEntityBase: def test_base_fallback_is_empty(self) -> None: e = Entity(id=1) assert e.default_name == "" assert e.display_name == "" def test_display_name_is_not_persisted(self) -> None: assert "display_name" not in Entity(id=1).model_dump() assert "default_name" not in Entity(id=1).model_dump() assert "display_name" not in Node(id=1, coords=(0, 0, 0)).model_dump() class TestNodeDisplayName: def test_blank_name_falls_back(self) -> None: n = Node(id=1, coords=(0, 0, 0)) assert n.display_name == "N1" def test_explicit_name_is_returned(self) -> None: n = Node(id=1, name="Support A", coords=(0, 0, 0)) assert n.display_name == "Support A" def test_whitespace_only_name_falls_back(self) -> None: n = Node(id=2, name=" ", coords=(0, 0, 0)) assert n.display_name == "N2" def test_explicit_name_is_stripped(self) -> None: n = Node(id=1, name=" A1 ", coords=(0, 0, 0)) assert n.display_name == "A1" def test_display_only_never_writes_back(self) -> None: n = Node(id=1, coords=(0, 0, 0)) assert n.display_name == "N1" assert n.name == "" class TestElementDisplayName: def test_all_element_types_share_element_base(self) -> None: for cls in _ALL_ELEMENT_TYPES: assert issubclass(cls, ElementBase) def test_blank_truss_name_falls_back(self) -> None: t = TrussElement(id=1, nodes=(1, 2), area=0.01, material_id=1) assert t.display_name == "E1" def test_explicit_truss_name_is_returned(self) -> None: t = TrussElement(id=1, name="Chord", nodes=(1, 2), area=0.01, material_id=1) assert t.display_name == "Chord" def test_whitespace_only_truss_name_falls_back(self) -> None: t = TrussElement(id=3, name=" ", nodes=(1, 2), area=0.01, material_id=1) assert t.display_name == "E3" def test_blank_quad_name_falls_back(self) -> None: q = QuadElement(id=1, nodes=(1, 2, 3, 4), thickness=0.1, material_id=1) assert q.display_name == "E1" def test_display_only_never_writes_back(self) -> None: t = TrussElement(id=1, nodes=(1, 2), area=0.01, material_id=1) assert t.display_name == "E1" assert t.name == "" assert "display_name" not in t.model_dump()