diff --git a/src/czml3/properties.py b/src/czml3/properties.py index f554467..fece7c4 100644 --- a/src/czml3/properties.py +++ b/src/czml3/properties.py @@ -993,33 +993,14 @@ def checks(self): self.cartesian, self.cartographicDegrees, self.cartographicRadians, + self.references, ) ) != 1 ): raise TypeError( - "One of cartesian, cartographicDegrees, cartographicRadians or reference must be given" + "One of cartesian, cartographicDegrees, cartographicRadians or references must be given" ) - if isinstance(self.references, ReferenceListOfListsValue): - if isinstance(self.cartesian, Cartesian3ListOfListsValue): - v = self.cartesian.values - elif isinstance( - self.cartographicDegrees, CartographicDegreesListOfListsValue - ): - v = self.cartographicDegrees.values - elif isinstance( - self.cartographicRadians, CartographicRadiansListOfListsValue - ): - v = self.cartographicRadians.values - else: - raise TypeError - if len(self.references.values) != len(v): - raise TypeError("Number of references must equal number of coordinates") - for r, v1 in zip(self.references.values, v, strict=False): - if len(r) != len(v1) // 3: - raise TypeError( - "Number of references must equal number of coordinates in each list" - ) return self @@ -1086,6 +1067,7 @@ class PositionList(BaseCZMLObject, Deletable): def checks(self): if self.delete: return self + if ( sum( val is not None @@ -1093,24 +1075,15 @@ def checks(self): self.cartesian, self.cartographicDegrees, self.cartographicRadians, + self.references, ) ) != 1 ): raise TypeError( - "One of cartesian, cartographicDegrees, cartographicRadians or reference must be given" + "One of cartesian, cartographicDegrees, cartographicRadians or references must be given" ) - if isinstance(self.references, ReferenceListValue): - if isinstance(self.cartesian, Cartesian3ListValue): - v = self.cartesian.values - elif isinstance(self.cartographicDegrees, CartographicDegreesListValue): - v = self.cartographicDegrees.values - elif isinstance(self.cartographicRadians, CartographicRadiansListValue): - v = self.cartographicRadians.values - else: - raise TypeError - if len(self.references.values) != len(v) // 3: - raise TypeError("Number of references must equal number of coordinates") + return self @field_validator("references") diff --git a/tests/test_properties.py b/tests/test_properties.py index 67e7aff..81d52f0 100644 --- a/tests/test_properties.py +++ b/tests/test_properties.py @@ -655,7 +655,7 @@ def test_position_list_of_lists_no_values_raises_error(): PositionListOfLists() assert ( - "One of cartesian, cartographicDegrees, cartographicRadians or reference must be given" + "One of cartesian, cartographicDegrees, cartographicRadians or references must be given" in exc.exconly() ) @@ -665,7 +665,7 @@ def test_position_list_no_values_raises_error(): PositionList() assert ( - "One of cartesian, cartographicDegrees, cartographicRadians or reference must be given" + "One of cartesian, cartographicDegrees, cartographicRadians or references must be given" in exc.exconly() ) @@ -1475,165 +1475,139 @@ def test_bad_Position(): Position(cartographicDegrees=[0, 0, 0, 0, 0]) -def test_position_list_with_references(): +def test_position_list_with_cartesian(): expected_result = """{ - "cartographicDegrees": [ - 20.0, - 30.0, - 10.0 - ], - "references": [ - "1#this" + "cartesian": [ + 1.0, + 2.0, + 3.0, + 4.0, + 5.0, + 6.0 ] }""" + + p1 = PositionList(cartesian=Cartesian3ListValue(values=[1, 2, 3, 4, 5, 6])) + assert str(p1) == expected_result + + +def test_position_list_with_cartographicRadians(): + expected_result = """{ + "cartographicRadians": [ + 1.0, + 2.0, + 3.0 + ] +}""" + p1 = PositionList( - cartographicDegrees=CartographicDegreesListValue(values=[20, 30, 10]), - references=["1#this"], + cartographicRadians=CartographicRadiansListValue(values=[1, 2, 3]) ) - p2 = PositionList( - cartographicDegrees=CartographicDegreesListValue(values=[20, 30, 10]), - references=ReferenceListValue(values=["1#this"]), + assert str(p1) == expected_result + + +def test_position_list_with_cartographicDegrees(): + expected_result = """{ + "cartographicDegrees": [ + 1.0, + 2.0, + 3.0 + ] +}""" + + p1 = PositionList( + cartographicDegrees=CartographicDegreesListValue(values=[1, 2, 3]) ) - assert str(p1) == str(p2) == expected_result + assert str(p1) == expected_result + + +def test_position_list_with_references(): expected_result = """{ - "cartographicRadians": [ - 20.0, - 30.0, - 10.0 - ], "references": [ "1#this" ] }""" p1 = PositionList( - cartographicRadians=CartographicRadiansListValue(values=[20, 30, 10]), references=["1#this"], ) p2 = PositionList( - cartographicRadians=CartographicRadiansListValue(values=[20, 30, 10]), references=ReferenceListValue(values=["1#this"]), ) assert str(p1) == str(p2) == expected_result expected_result = """{ - "cartesian": [ - 20.0, - 30.0, - 10.0 - ], "references": [ "1#this" ] }""" - p1 = PositionList( - cartesian=Cartesian3ListValue(values=[20, 30, 10]), references=["1#this"] - ) - p2 = PositionList( - cartesian=Cartesian3ListValue(values=[20, 30, 10]), - references=ReferenceListValue(values=["1#this"]), - ) - assert str(p1) == str(p2) == expected_result -def test_position_list_of_lists_with_references(): +def test_position_list_with_references_extra_arguments(): + with pytest.raises(TypeError): + PositionList( + references=ReferenceListValue(values=["1#this"]), + cartesian=[0, 0, 0], + ) + + +def test_position_list_with_bad_references(): + with pytest.raises(TypeError): + PositionList( + cartographicDegrees=CartographicDegreesListValue(values=[20, 30, 10]), + references=["1#this", "1#this"], + ) + + +def test_position_list_of_lists_with_cartesian(): expected_result = """{ - "cartographicDegrees": [ - [ - 20.0, - 30.0, - 10.0 - ], + "cartesian": [ [ - 20.0, - 30.0, - 10.0 + 1.0, + 2.0, + 3.0 ] - ], - "references": [ - [ - "1#this" - ], + ] +}""" + + p1 = PositionListOfLists(cartesian=Cartesian3ListOfListsValue(values=[[1, 2, 3]])) + assert str(p1) == expected_result + + +def test_position_list_of_lists_with_cartographicRadians(): + expected_result = """{ + "cartographicRadians": [ [ - "1#this" + 1.0, + 2.0, + 3.0 ] ] }""" + p1 = PositionListOfLists( - cartographicDegrees=CartographicDegreesListOfListsValue( - values=[[20, 30, 10], [20, 30, 10]] - ), - references=[["1#this"], ["1#this"]], + cartographicRadians=CartographicRadiansListOfListsValue(values=[[1, 2, 3]]) ) - p2 = PositionListOfLists( - cartographicDegrees=CartographicDegreesListOfListsValue( - values=[[20, 30, 10], [20, 30, 10]] - ), - references=ReferenceListOfListsValue(values=[["1#this"], ["1#this"]]), - ) - p3 = PositionListOfLists( - cartographicDegrees=[[20, 30, 10], [20, 30, 10]], - references=[["1#this"], ["1#this"]], - ) - p4 = PositionListOfLists( - cartographicDegrees=[[20, 30, 10], [20, 30, 10]], - references=ReferenceListOfListsValue(values=[["1#this"], ["1#this"]]), - ) - assert str(p1) == str(p2) == str(p3) == str(p4) == expected_result + assert str(p1) == expected_result + + +def test_position_list_of_lists_with_cartographicDegrees(): expected_result = """{ - "cartographicRadians": [ - [ - 20.0, - 30.0, - 10.0 - ], - [ - 20.0, - 30.0, - 10.0 - ] - ], - "references": [ - [ - "1#this" - ], + "cartographicDegrees": [ [ - "1#this" + 1.0, + 2.0, + 3.0 ] ] }""" + p1 = PositionListOfLists( - cartographicRadians=CartographicRadiansListOfListsValue( - values=[[20, 30, 10], [20, 30, 10]] - ), - references=[["1#this"], ["1#this"]], + cartographicDegrees=CartographicDegreesListOfListsValue(values=[[1, 2, 3]]) ) - p2 = PositionListOfLists( - cartographicRadians=CartographicRadiansListOfListsValue( - values=[[20, 30, 10], [20, 30, 10]] - ), - references=ReferenceListOfListsValue(values=[["1#this"], ["1#this"]]), - ) - p3 = PositionListOfLists( - cartographicRadians=[[20, 30, 10], [20, 30, 10]], - references=[["1#this"], ["1#this"]], - ) - p4 = PositionListOfLists( - cartographicRadians=[[20, 30, 10], [20, 30, 10]], - references=ReferenceListOfListsValue(values=[["1#this"], ["1#this"]]), - ) - assert str(p1) == str(p2) == str(p3) == str(p4) == expected_result + assert str(p1) == expected_result + + +def test_position_list_of_lists_with_references(): expected_result = """{ - "cartesian": [ - [ - 20.0, - 30.0, - 10.0 - ], - [ - 20.0, - 30.0, - 10.0 - ] - ], "references": [ [ "1#this" @@ -1644,30 +1618,12 @@ def test_position_list_of_lists_with_references(): ] }""" p1 = PositionListOfLists( - cartesian=Cartesian3ListOfListsValue(values=[[20, 30, 10], [20, 30, 10]]), references=[["1#this"], ["1#this"]], ) p2 = PositionListOfLists( - cartesian=Cartesian3ListOfListsValue(values=[[20, 30, 10], [20, 30, 10]]), references=ReferenceListOfListsValue(values=[["1#this"], ["1#this"]]), ) - p3 = PositionListOfLists( - cartesian=[[20, 30, 10], [20, 30, 10]], - references=[["1#this"], ["1#this"]], - ) - p4 = PositionListOfLists( - cartesian=[[20, 30, 10], [20, 30, 10]], - references=ReferenceListOfListsValue(values=[["1#this"], ["1#this"]]), - ) - assert str(p1) == str(p2) == str(p3) == str(p4) == expected_result - - -def test_position_list_with_bad_references(): - with pytest.raises(TypeError): - PositionList( - cartographicDegrees=CartographicDegreesListValue(values=[20, 30, 10]), - references=["1#this", "1#this"], - ) + assert str(p1) == str(p2) == expected_result def test_position_list_of_lists_with_bad_references():