diff --git a/src/omotes_simulator_core/adapter/transforms/esdl_asset_mappers/pipe_mapper.py b/src/omotes_simulator_core/adapter/transforms/esdl_asset_mappers/pipe_mapper.py index 3ab12336..041ea135 100644 --- a/src/omotes_simulator_core/adapter/transforms/esdl_asset_mappers/pipe_mapper.py +++ b/src/omotes_simulator_core/adapter/transforms/esdl_asset_mappers/pipe_mapper.py @@ -13,6 +13,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . """Module containing the Esdl to Pipe asset mapper class.""" + import logging from typing import Any @@ -102,26 +103,25 @@ def _get_diameter(esdl_asset: EsdlAssetObject) -> float: the insulation schedule must be provided; in this case, it is assumed to be 1. """ - inner_diameter = esdl_asset.get_property("innerDiameter", 0) - dn_diameter = esdl_asset.get_property("diameter", None) # Use default schedule since schedule is not a valid ESDL Pipe attribute # TODO add method to get schedule from esdl if it becomes available. schedule = PIPE_DEFAULTS.default_schedule - if inner_diameter == 0: - if dn_diameter is not None: - esdl_object = EsdlAssetPipeMapper._get_esdl_object_from_edr( - dn_diameter.name, schedule - ) - logger.info( - f"Property innerDiameter is not set for: {esdl_asset.get_name()}, " - f"Schedule S1 is assumed for retrieval of pipe diameter from EDR list." - ) - return float(esdl_object.innerDiameter) - else: - return PIPE_DEFAULTS.diameter - else: - return float(inner_diameter) + if esdl_asset.esdl_asset.eIsSet("innerDiameter"): + inner_diameter = float(esdl_asset.get_property("innerDiameter", PIPE_DEFAULTS.diameter)) + if inner_diameter != 0: + return inner_diameter + + dn_diameter = esdl_asset.get_property("diameter", PIPE_DEFAULTS.diameter) + if dn_diameter is PIPE_DEFAULTS.diameter: + return PIPE_DEFAULTS.diameter + + esdl_object = EsdlAssetPipeMapper._get_esdl_object_from_edr(dn_diameter.name, schedule) + logger.info( + f"Property innerDiameter is not set for: {esdl_asset.get_name()}, " + f"Schedule S1 is assumed for retrieval of pipe inner diameter from EDR list." + ) + return float(esdl_object.innerDiameter) @staticmethod def _get_esdl_object_from_edr( diff --git a/unit_test/adapters/transforms/esdl_asset_mappers/test_esdl_asset_pipe_mapper.py b/unit_test/adapters/transforms/esdl_asset_mappers/test_esdl_asset_pipe_mapper.py index f167aa13..6167e29b 100644 --- a/unit_test/adapters/transforms/esdl_asset_mappers/test_esdl_asset_pipe_mapper.py +++ b/unit_test/adapters/transforms/esdl_asset_mappers/test_esdl_asset_pipe_mapper.py @@ -14,6 +14,7 @@ # along with this program. If not, see . """Test pipe mapper.""" + import typing import unittest from pathlib import Path @@ -138,6 +139,7 @@ def mock_get_property(key, default=None): return default esdl_asset_mock.get_property = mock_get_property + esdl_asset_mock.esdl_asset.eIsSet.side_effect = lambda key: key == "innerDiameter" # Act diameter = EsdlAssetPipeMapper._get_diameter(esdl_asset_mock) @@ -160,6 +162,7 @@ def mock_get_property(key, default=None): return default esdl_asset_mock.get_property = mock_get_property + esdl_asset_mock.esdl_asset.eIsSet.side_effect = lambda key: key == "diameter" edr_object_mock = Mock() edr_object_mock.innerDiameter = 0.42 @@ -172,6 +175,37 @@ def mock_get_property(key, default=None): # Assert self.assertEqual(diameter, 0.42) + def test_get_diameter_with_inner_diameter_zero_uses_edr(self): + """Falls back to EDR when innerDiameter is set to 0 but a DN diameter is provided.""" + # Arrange + esdl_asset_mock = Mock() + dn_mock = Mock() + dn_mock.name = "DN125" + + def mock_get_property(key, default=None): + if key == "innerDiameter": + return 0 + if key == "diameter": + return dn_mock + return default + + esdl_asset_mock.get_property = mock_get_property + esdl_asset_mock.esdl_asset.eIsSet.side_effect = lambda key: key in ( + "innerDiameter", + "diameter", + ) + edr_object_mock = Mock() + edr_object_mock.innerDiameter = 0.1273 + + with patch.object( + EsdlAssetPipeMapper, "_get_esdl_object_from_edr", return_value=edr_object_mock + ): + # Act + diameter = EsdlAssetPipeMapper._get_diameter(esdl_asset_mock) + + # Assert + self.assertEqual(diameter, 0.1273) + def test_get_diameter_default_when_none_provided(self): """Returns default diameter when both innerDiameter is 0 and diameter is None.""" # Arrange @@ -180,11 +214,10 @@ def test_get_diameter_default_when_none_provided(self): def mock_get_property(key, default=None): if key == "innerDiameter": return 0 - if key == "diameter": - return None return default esdl_asset_mock.get_property = mock_get_property + esdl_asset_mock.esdl_asset.eIsSet.return_value = False # Act diameter = EsdlAssetPipeMapper._get_diameter(esdl_asset_mock) @@ -224,6 +257,7 @@ def mock_get_property(key, default=None): return default esdl_asset_mock.get_property = mock_get_property + esdl_asset_mock.esdl_asset.eIsSet.side_effect = lambda key: key == "diameter" edr_object_mock = Mock() edr_object_mock.innerDiameter = 0.08