@@ -332,6 +332,57 @@ TEST(URDF_UNIT_TEST, parse_color_doubles)
332332 EXPECT_EQ (0.908 , urdf->links_ [" l1" ]->inertial ->izz );
333333}
334334
335+ TEST (URDF_UNIT_TEST, parse_duplicate_materials)
336+ {
337+ std::string urdf_str =
338+ " <robot name=\" test\" >"
339+ " <material name=\" red\" >"
340+ " <color rgba=\" 1 0 0 1\" />"
341+ " </material>"
342+ " <material name=\" red\" >"
343+ " <color rgba=\" 1 0 0 1\" />"
344+ " </material>"
345+ " <link name=\" dummy\" />"
346+ " </robot>" ;
347+
348+ urdf::ModelInterfaceSharedPtr urdf = urdf::parseURDF (urdf_str);
349+ EXPECT_TRUE (static_cast <bool >(urdf)); // identical materials are fine
350+
351+ urdf_str =
352+ " <robot name=\" test\" >"
353+ " <material name=\" red\" >"
354+ " <color rgba=\" 1 0 0 1\" />"
355+ " </material>"
356+ " <material name=\" red\" >"
357+ " <color rgba=\" 0 1 0 1\" />"
358+ " </material>"
359+ " <link name=\" dummy\" />"
360+ " </robot>" ;
361+ urdf = urdf::parseURDF (urdf_str);
362+ EXPECT_FALSE (static_cast <bool >(urdf)); // different materials cause failure
363+ }
364+
365+ TEST (URDF_UNIT_TEST, parse_invalid_materials)
366+ {
367+ std::string urdf_str =
368+ " <robot name=\" test\" >"
369+ " <material missing_name=\" red\" >"
370+ " <color rgba=\" 1 0 0 1\" />"
371+ " </material>"
372+ " <link name=\" dummy\" />"
373+ " </robot>" ;
374+
375+ urdf::ModelInterfaceSharedPtr urdf = urdf::parseURDF (urdf_str);
376+ EXPECT_FALSE (static_cast <bool >(urdf));
377+
378+ urdf_str =
379+ " <robot name=\" test\" >"
380+ " <material name=\" red\" />"
381+ " <link name=\" dummy\" />"
382+ " </robot>" ;
383+ urdf = urdf::parseURDF (urdf_str);
384+ EXPECT_FALSE (static_cast <bool >(urdf)); // different materials cause failure
385+ }
335386
336387int main (int argc, char **argv)
337388{
0 commit comments