From 1e448328168489dc71fad20c1a5e37103f4165af Mon Sep 17 00:00:00 2001 From: Blake DeHaas Date: Mon, 1 Jun 2026 14:32:51 -0600 Subject: [PATCH 1/2] Add unit tests for EnumeratedParameterType UnitSet serialization, fix namespace handling, removed broken pre-commit hook" --- .pre-commit-config.yaml | 4 -- space_packet_parser/xtce/parameter_types.py | 8 ++-- tests/unit/test_xtce/test_parameter_types.py | 49 ++++++++++++++++++++ 3 files changed, 54 insertions(+), 7 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 57117b2..a13d685 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -41,7 +41,3 @@ repos: - pyyaml - tomli always_run: true - - repo: https://github.com/mashi/codecov-validator - rev: 1.0.1 - hooks: - - id: ccv diff --git a/space_packet_parser/xtce/parameter_types.py b/space_packet_parser/xtce/parameter_types.py index e8b71b3..7e46645 100644 --- a/space_packet_parser/xtce/parameter_types.py +++ b/space_packet_parser/xtce/parameter_types.py @@ -126,8 +126,7 @@ def get_units(parameter_type_element: ElementTree.Element) -> str | tuple[str, . """ # Assume we are not parsing a Time Parameter Type, which stores units differently - units = parameter_type_element.findall("UnitSet/Unit") - units = [u.text for u in units if u.text] + units = parameter_type_element.xpath('.//*[local-name()="UnitSet"]/*[local-name()="Unit"]/text()') if not units: # Units are optional so return None if they aren't specified @@ -293,12 +292,15 @@ def to_xml(self, *, elmaker: ElementMaker) -> ElementTree.Element: """ param_type_element = getattr(elmaker, self.__class__.__name__)(name=self.name) - + print("HIT PARAMETER TYPE UNIT BLOCK") if self.unit: + print("Entered PARAMETER TYPE UNIT BLOCK") if isinstance(self.unit, tuple): + print("Entered IF PARAMETER TYPE UNIT BLOCK") unit_elements = [elmaker.Unit(u) for u in self.unit] param_type_element.append(elmaker.UnitSet(*unit_elements)) else: + print("Entered ELSE PARAMETER TYPE UNIT BLOCK") param_type_element.append(elmaker.UnitSet(elmaker.Unit(self.unit))) param_type_element.append(self.encoding.to_xml(elmaker=elmaker)) diff --git a/tests/unit/test_xtce/test_parameter_types.py b/tests/unit/test_xtce/test_parameter_types.py index 2665438..fb65335 100644 --- a/tests/unit/test_xtce/test_parameter_types.py +++ b/tests/unit/test_xtce/test_parameter_types.py @@ -170,6 +170,21 @@ def test_string_parameter_type(elmaker, xtce_parser, xml_string: str, expectatio ), ( f""" + + + km + + + +""", + parameter_types.IntegerParameterType( + name="TEST_INT_Type", + unit="km", + encoding=encodings.IntegerDataEncoding(size_in_bits=16, encoding="unsigned"), + ), + ), + ( + f""" m @@ -196,11 +211,14 @@ def test_integer_parameter_type(elmaker, xtce_parser, xml_string: str, expectati else: result = parameter_types.IntegerParameterType.from_xml(element) assert result == expectation + # Recover XML and re-parse it to check it's recoverable result_string = ElementTree.tostring(result.to_xml(elmaker=elmaker), pretty_print=True).decode() + full_circle = parameter_types.IntegerParameterType.from_xml( ElementTree.fromstring(result_string, parser=xtce_parser) ) + assert full_circle == expectation @@ -843,3 +861,34 @@ def test_absolute_time_parameter_type(elmaker, xtce_parser, xml_string, expectat ElementTree.fromstring(result_string, parser=xtce_parser) ) assert full_circle == expectation + + +def test_parameter_type_to_xml_unit_serialization(elmaker): + """Test serialization of UnitSet in ParameterType.to_xml""" + + encoding = encodings.IntegerDataEncoding(size_in_bits=16, encoding="unsigned") + ns = {"xtce": XTCE_1_2_XMLNS} + + # Single unit + param = parameter_types.IntegerParameterType( + name="TEST_PARAM_Type", + unit="km", + encoding=encoding, + ) + element = param.to_xml(elmaker=elmaker) + + units = element.findall(".//xtce:Unit", namespaces=ns) + assert len(units) == 1 + assert units[0].text == "km" + + # Multiple units + param = parameter_types.IntegerParameterType( + name="TEST_PARAM_Type", + unit=("m", "s"), + encoding=encoding, + ) + element = param.to_xml(elmaker=elmaker) + + units = element.findall(".//xtce:Unit", namespaces=ns) + assert len(units) == 2 + assert [u.text for u in units] == ["m", "s"] From e15b767a69827afc3d18287bbaacda4511a66fc7 Mon Sep 17 00:00:00 2001 From: Blake DeHaas Date: Tue, 16 Jun 2026 19:18:16 +0000 Subject: [PATCH 2/2] Removed temporary print statements --- space_packet_parser/xtce/parameter_types.py | 4 ---- tests/unit/test_xtce/test_parameter_types.py | 3 --- 2 files changed, 7 deletions(-) diff --git a/space_packet_parser/xtce/parameter_types.py b/space_packet_parser/xtce/parameter_types.py index 7e46645..f20ad6b 100644 --- a/space_packet_parser/xtce/parameter_types.py +++ b/space_packet_parser/xtce/parameter_types.py @@ -292,15 +292,11 @@ def to_xml(self, *, elmaker: ElementMaker) -> ElementTree.Element: """ param_type_element = getattr(elmaker, self.__class__.__name__)(name=self.name) - print("HIT PARAMETER TYPE UNIT BLOCK") if self.unit: - print("Entered PARAMETER TYPE UNIT BLOCK") if isinstance(self.unit, tuple): - print("Entered IF PARAMETER TYPE UNIT BLOCK") unit_elements = [elmaker.Unit(u) for u in self.unit] param_type_element.append(elmaker.UnitSet(*unit_elements)) else: - print("Entered ELSE PARAMETER TYPE UNIT BLOCK") param_type_element.append(elmaker.UnitSet(elmaker.Unit(self.unit))) param_type_element.append(self.encoding.to_xml(elmaker=elmaker)) diff --git a/tests/unit/test_xtce/test_parameter_types.py b/tests/unit/test_xtce/test_parameter_types.py index fb65335..58ead87 100644 --- a/tests/unit/test_xtce/test_parameter_types.py +++ b/tests/unit/test_xtce/test_parameter_types.py @@ -211,14 +211,11 @@ def test_integer_parameter_type(elmaker, xtce_parser, xml_string: str, expectati else: result = parameter_types.IntegerParameterType.from_xml(element) assert result == expectation - # Recover XML and re-parse it to check it's recoverable result_string = ElementTree.tostring(result.to_xml(elmaker=elmaker), pretty_print=True).decode() - full_circle = parameter_types.IntegerParameterType.from_xml( ElementTree.fromstring(result_string, parser=xtce_parser) ) - assert full_circle == expectation