diff --git a/src/urdf_parser_py/urdf.py b/src/urdf_parser_py/urdf.py index 2b08437..0b24f4f 100644 --- a/src/urdf_parser_py/urdf.py +++ b/src/urdf_parser_py/urdf.py @@ -533,6 +533,23 @@ def get_root(self): assert root is not None, "No roots detected, invalid URDF." return root + def post_read_xml(self): + if self.version is None: + self.version = "1.0" + + split = self.version.split(".") + if len(split) != 2: + raise ValueError("The version attribute should be in the form 'x.y'") + + if split[0] == '' or split[1] == '': + raise ValueError("Empty major or minor number is not allowed") + + if int(split[0]) < 0 or int(split[1]) < 0: + raise ValueError("Version number must be positive") + + if self.version != "1.0": + raise ValueError("Invalid version; only 1.0 is supported") + @classmethod def from_parameter_server(cls, key='robot_description'): """ @@ -547,7 +564,8 @@ def from_parameter_server(cls, key='robot_description'): xmlr.reflect(Robot, tag='robot', params=[ - xmlr.Attribute('name', str, False), # Is 'name' a required attribute? + xmlr.Attribute('name', str), + xmlr.Attribute('version', str, False), xmlr.AggregateElement('link', Link), xmlr.AggregateElement('joint', Joint), xmlr.AggregateElement('gazebo', xmlr.RawType()), diff --git a/test/test_urdf.py b/test/test_urdf.py index 55344b4..0f40107 100644 --- a/test/test_urdf.py +++ b/test/test_urdf.py @@ -33,7 +33,7 @@ def parse_and_compare(self, orig): def test_new_transmission(self): xml = ''' - + transmission_interface/SimpleTransmission @@ -48,7 +48,7 @@ def test_new_transmission(self): def test_new_transmission_multiple_joints(self): xml = ''' - + transmission_interface/SimpleTransmission @@ -67,7 +67,7 @@ def test_new_transmission_multiple_joints(self): def test_new_transmission_multiple_actuators(self): xml = ''' - + transmission_interface/SimpleTransmission @@ -83,16 +83,16 @@ def test_new_transmission_multiple_actuators(self): def test_new_transmission_missing_joint(self): xml = ''' - + transmission_interface/SimpleTransmission ''' - self.assertRaises(Exception, self.parse, xml) + self.assertRaises(xmlr.core.ParseError, self.parse, xml) def test_new_transmission_missing_actuator(self): xml = ''' - + transmission_interface/SimpleTransmission @@ -100,11 +100,11 @@ def test_new_transmission_missing_actuator(self): ''' - self.assertRaises(Exception, self.parse, xml) + self.assertRaises(xmlr.core.ParseError, self.parse, xml) def test_old_transmission(self): xml = ''' - + @@ -115,7 +115,7 @@ def test_old_transmission(self): def test_link_material_missing_color_and_texture(self): xml = ''' - + @@ -129,7 +129,7 @@ def test_link_material_missing_color_and_texture(self): def test_robot_material(self): xml = ''' - + @@ -138,14 +138,14 @@ def test_robot_material(self): def test_robot_material_missing_color_and_texture(self): xml = ''' - + ''' - self.assertRaises(ParseException, self.parse, xml) + self.assertRaises(xmlr.core.ParseError, self.parse, xml) def test_link_multiple_visual(self): xml = ''' - + @@ -165,7 +165,7 @@ def test_link_multiple_visual(self): def test_link_multiple_collision(self): xml = ''' - + @@ -181,6 +181,77 @@ def test_link_multiple_collision(self): ''' self.parse_and_compare(xml) + def test_version_attribute_not_enough_dots(self): + xml = ''' + +''' + self.assertRaises(ValueError, self.parse, xml) + + def test_version_attribute_too_many_dots(self): + xml = ''' + +''' + self.assertRaises(ValueError, self.parse, xml) + + def test_version_attribute_not_enough_numbers(self): + xml = ''' + +''' + self.assertRaises(ValueError, self.parse, xml) + + def test_version_attribute_no_major_number(self): + xml = ''' + +''' + self.assertRaises(ValueError, self.parse, xml) + + def test_version_attribute_negative_major_number(self): + xml = ''' + +''' + self.assertRaises(ValueError, self.parse, xml) + + def test_version_attribute_negative_minor_number(self): + xml = ''' + +''' + self.assertRaises(ValueError, self.parse, xml) + + def test_version_attribute_dots_no_numbers(self): + xml = ''' + +''' + self.assertRaises(ValueError, self.parse, xml) + + def test_version_attribute_dots_one_number(self): + xml = ''' + +''' + self.assertRaises(ValueError, self.parse, xml) + + def test_version_attribute_trailing_junk(self): + xml = ''' + +''' + self.assertRaises(ValueError, self.parse, xml) + + def test_version_attribute_correct(self): + xml = ''' + +''' + self.parse_and_compare(xml) + + def test_version_attribute_invalid(self): + xml = ''' + +''' + self.assertRaises(ValueError, self.parse, xml) + + def test_version_attribute_invalid_version(self): + xml = ''' + +''' + self.assertRaises(ValueError, self.parse, xml) class LinkOriginTestCase(unittest.TestCase): @mock.patch('urdf_parser_py.xml_reflection.on_error',