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