@@ -97,7 +97,29 @@ TEST(URDF_UNIT_TEST, parse_capsule_geometry_ignored_version_1_0)
9797 EXPECT_TRUE (link->visual_array .empty ());
9898}
9999
100- TEST (URDF_UNIT_TEST, parse_capsule_geometry_zero_values)
100+ TEST (URDF_UNIT_TEST, parse_capsule_geometry_zero_values_fails_v1_2)
101+ {
102+ std::string urdf_str = R"urdf(
103+ <robot name="capsule_zero_test" version="1.2">
104+ <link name="link1">
105+ <visual>
106+ <geometry>
107+ <capsule radius="0.0" length="0.0"/>
108+ </geometry>
109+ </visual>
110+ </link>
111+ </robot>
112+ )urdf" ;
113+
114+ urdf::ModelInterfaceSharedPtr urdf = urdf::parseURDF (urdf_str);
115+ // Invalid radius/length causes geometry parsing to fail for version >= 1.2
116+ ASSERT_NE (nullptr , urdf);
117+ urdf::LinkConstSharedPtr link = urdf->getLink (" link1" );
118+ ASSERT_NE (nullptr , link);
119+ EXPECT_TRUE (link->visual_array .empty ());
120+ }
121+
122+ TEST (URDF_UNIT_TEST, parse_capsule_geometry_zero_values_allowed_pre_v1_2)
101123{
102124 std::string urdf_str = R"urdf(
103125 <robot name="capsule_zero_test" version="1.1">
@@ -112,16 +134,99 @@ TEST(URDF_UNIT_TEST, parse_capsule_geometry_zero_values)
112134 )urdf" ;
113135
114136 urdf::ModelInterfaceSharedPtr urdf = urdf::parseURDF (urdf_str);
137+ // Zero radius/length is allowed for version < 1.2
138+ ASSERT_NE (nullptr , urdf);
139+ urdf::LinkConstSharedPtr link = urdf->getLink (" link1" );
140+ ASSERT_NE (nullptr , link);
141+ EXPECT_FALSE (link->visual_array .empty ());
142+ }
143+
144+ TEST (URDF_UNIT_TEST, parse_capsule_geometry_negative_radius_fails_v1_2)
145+ {
146+ std::string urdf_str = R"urdf(
147+ <robot name="capsule_negative_test" version="1.2">
148+ <link name="link1">
149+ <visual>
150+ <geometry>
151+ <capsule radius="-0.05" length="0.5"/>
152+ </geometry>
153+ </visual>
154+ </link>
155+ </robot>
156+ )urdf" ;
115157
158+ urdf::ModelInterfaceSharedPtr urdf = urdf::parseURDF (urdf_str);
159+ // Negative radius causes geometry parsing to fail for version >= 1.2
116160 ASSERT_NE (nullptr , urdf);
117161 urdf::LinkConstSharedPtr link = urdf->getLink (" link1" );
118162 ASSERT_NE (nullptr , link);
163+ EXPECT_TRUE (link->visual_array .empty ());
164+ }
119165
120- std::shared_ptr<urdf::Capsule> capsule =
121- std::dynamic_pointer_cast<urdf::Capsule>(link->visual_array [0 ]->geometry );
122- ASSERT_NE (nullptr , capsule);
123- EXPECT_DOUBLE_EQ (0.0 , capsule->radius );
124- EXPECT_DOUBLE_EQ (0.0 , capsule->length );
166+ TEST (URDF_UNIT_TEST, parse_capsule_geometry_negative_radius_allowed_pre_v1_2)
167+ {
168+ std::string urdf_str = R"urdf(
169+ <robot name="capsule_negative_test" version="1.1">
170+ <link name="link1">
171+ <visual>
172+ <geometry>
173+ <capsule radius="-0.05" length="0.5"/>
174+ </geometry>
175+ </visual>
176+ </link>
177+ </robot>
178+ )urdf" ;
179+
180+ urdf::ModelInterfaceSharedPtr urdf = urdf::parseURDF (urdf_str);
181+ // Negative radius is allowed for version < 1.2
182+ ASSERT_NE (nullptr , urdf);
183+ urdf::LinkConstSharedPtr link = urdf->getLink (" link1" );
184+ ASSERT_NE (nullptr , link);
185+ EXPECT_FALSE (link->visual_array .empty ());
186+ }
187+
188+ TEST (URDF_UNIT_TEST, parse_capsule_geometry_negative_length_fails_v1_2)
189+ {
190+ std::string urdf_str = R"urdf(
191+ <robot name="capsule_negative_length_test" version="1.2">
192+ <link name="link1">
193+ <visual>
194+ <geometry>
195+ <capsule radius="0.05" length="-0.5"/>
196+ </geometry>
197+ </visual>
198+ </link>
199+ </robot>
200+ )urdf" ;
201+
202+ urdf::ModelInterfaceSharedPtr urdf = urdf::parseURDF (urdf_str);
203+ // Negative length causes geometry parsing to fail for version >= 1.2
204+ ASSERT_NE (nullptr , urdf);
205+ urdf::LinkConstSharedPtr link = urdf->getLink (" link1" );
206+ ASSERT_NE (nullptr , link);
207+ EXPECT_TRUE (link->visual_array .empty ());
208+ }
209+
210+ TEST (URDF_UNIT_TEST, parse_capsule_geometry_negative_length_allowed_pre_v1_2)
211+ {
212+ std::string urdf_str = R"urdf(
213+ <robot name="capsule_negative_length_test" version="1.1">
214+ <link name="link1">
215+ <visual>
216+ <geometry>
217+ <capsule radius="0.05" length="-0.5"/>
218+ </geometry>
219+ </visual>
220+ </link>
221+ </robot>
222+ )urdf" ;
223+
224+ urdf::ModelInterfaceSharedPtr urdf = urdf::parseURDF (urdf_str);
225+ // Negative length is allowed for version < 1.2
226+ ASSERT_NE (nullptr , urdf);
227+ urdf::LinkConstSharedPtr link = urdf->getLink (" link1" );
228+ ASSERT_NE (nullptr , link);
229+ EXPECT_FALSE (link->visual_array .empty ());
125230}
126231
127232TEST (URDF_UNIT_TEST, parse_capsule_geometry_missing_radius_fails)
@@ -183,7 +288,7 @@ TEST(URDF_UNIT_TEST, parse_capsule_geometry_inf_value_fails)
183288 )urdf" ;
184289
185290 urdf::ModelInterfaceSharedPtr urdf = urdf::parseURDF (urdf_str);
186- // Infinity value causes geometry parsing to fail, visual is empty
291+ // "inf" is not parseable by strToDouble, so geometry parsing always fails
187292 ASSERT_NE (nullptr , urdf);
188293 urdf::LinkConstSharedPtr link = urdf->getLink (" link1" );
189294 ASSERT_NE (nullptr , link);
0 commit comments