@@ -497,3 +497,109 @@ TEST_F(TestComponentParser, successfully_parse_valid_urdf_actuator_only)
497497 ASSERT_THAT (hardware_info.transmissions [0 ].parameters , SizeIs (1 ));
498498 EXPECT_EQ (hardware_info.transmissions [0 ].parameters .at (" joint_to_actuator" ), " ${1024/PI}" );
499499}
500+
501+ TEST_F (TestComponentParser, successfully_parse_valid_urdf_system_robot_with_gpio)
502+ {
503+ std::string urdf_to_test =
504+ std::string (ros2_control_test_assets::urdf_head) +
505+ ros2_control_test_assets::valid_urdf_ros2_control_system_robot_with_gpio +
506+ ros2_control_test_assets::urdf_tail;
507+ const auto control_hardware = parse_control_resources_from_urdf (urdf_to_test);
508+ ASSERT_THAT (control_hardware, SizeIs (1 ));
509+ auto hardware_info = control_hardware.front ();
510+
511+ EXPECT_EQ (hardware_info.name , " RRBotSystemWithGPIO" );
512+ EXPECT_EQ (hardware_info.type , " system" );
513+ EXPECT_EQ (
514+ hardware_info.hardware_class_type ,
515+ " ros2_control_demo_hardware/RRBotSystemWithGPIOHardware" );
516+
517+ ASSERT_THAT (hardware_info.joints , SizeIs (2 ));
518+
519+ EXPECT_EQ (hardware_info.joints [0 ].name , " joint1" );
520+ EXPECT_EQ (hardware_info.joints [0 ].type , " joint" );
521+
522+ EXPECT_EQ (hardware_info.joints [1 ].name , " joint2" );
523+ EXPECT_EQ (hardware_info.joints [1 ].type , " joint" );
524+
525+ ASSERT_THAT (hardware_info.gpios , SizeIs (2 ));
526+
527+ EXPECT_EQ (hardware_info.gpios [0 ].name , " flange_analog_IOs" );
528+ EXPECT_EQ (hardware_info.gpios [0 ].type , " gpio" );
529+ EXPECT_THAT (hardware_info.gpios [0 ].state_interfaces , SizeIs (3 ));
530+ EXPECT_THAT (hardware_info.gpios [0 ].command_interfaces , SizeIs (1 ));
531+ EXPECT_EQ (hardware_info.gpios [0 ].state_interfaces [0 ].name , " analog_output1" );
532+ EXPECT_EQ (hardware_info.gpios [0 ].state_interfaces [1 ].name , " analog_input1" );
533+ EXPECT_EQ (hardware_info.gpios [0 ].state_interfaces [2 ].name , " analog_input2" );
534+
535+ EXPECT_EQ (hardware_info.gpios [1 ].name , " flange_vacuum" );
536+ EXPECT_EQ (hardware_info.gpios [1 ].type , " gpio" );
537+ EXPECT_THAT (hardware_info.gpios [1 ].state_interfaces , SizeIs (1 ));
538+ EXPECT_THAT (hardware_info.gpios [1 ].command_interfaces , SizeIs (1 ));
539+ EXPECT_EQ (hardware_info.gpios [1 ].state_interfaces [0 ].name , " vacuum" );
540+ EXPECT_EQ (hardware_info.gpios [1 ].command_interfaces [0 ].name , " vacuum" );
541+ }
542+
543+ TEST_F (TestComponentParser, successfully_parse_valid_urdf_system_with_size_and_data_type)
544+ {
545+ std::string urdf_to_test =
546+ std::string (ros2_control_test_assets::urdf_head) +
547+ ros2_control_test_assets::valid_urdf_ros2_control_system_robot_with_size_and_data_type +
548+ ros2_control_test_assets::urdf_tail;
549+ const auto control_hardware = parse_control_resources_from_urdf (urdf_to_test);
550+ ASSERT_THAT (control_hardware, SizeIs (1 ));
551+ auto hardware_info = control_hardware.front ();
552+
553+ EXPECT_EQ (hardware_info.name , " RRBotSystemWithSizeAndDataType" );
554+ EXPECT_EQ (hardware_info.type , " system" );
555+ EXPECT_EQ (
556+ hardware_info.hardware_class_type ,
557+ " ros2_control_demo_hardware/RRBotSystemWithSizeAndDataType" );
558+
559+ ASSERT_THAT (hardware_info.joints , SizeIs (1 ));
560+
561+ EXPECT_EQ (hardware_info.joints [0 ].name , " joint1" );
562+ EXPECT_EQ (hardware_info.joints [0 ].type , " joint" );
563+ EXPECT_THAT (hardware_info.joints [0 ].command_interfaces , SizeIs (1 ));
564+ EXPECT_EQ (hardware_info.joints [0 ].command_interfaces [0 ].name , HW_IF_POSITION);
565+ EXPECT_EQ (hardware_info.joints [0 ].command_interfaces [0 ].data_type , " double" );
566+ EXPECT_EQ (hardware_info.joints [0 ].command_interfaces [0 ].size , 1 );
567+ EXPECT_THAT (hardware_info.joints [0 ].state_interfaces , SizeIs (1 ));
568+ EXPECT_EQ (hardware_info.joints [0 ].state_interfaces [0 ].name , HW_IF_POSITION);
569+ EXPECT_EQ (hardware_info.joints [0 ].state_interfaces [0 ].data_type , " double" );
570+ EXPECT_EQ (hardware_info.joints [0 ].state_interfaces [0 ].size , 1 );
571+
572+ ASSERT_THAT (hardware_info.gpios , SizeIs (1 ));
573+
574+ EXPECT_EQ (hardware_info.gpios [0 ].name , " flange_IOS" );
575+ EXPECT_EQ (hardware_info.gpios [0 ].type , " gpio" );
576+ EXPECT_THAT (hardware_info.gpios [0 ].command_interfaces , SizeIs (1 ));
577+ EXPECT_EQ (hardware_info.gpios [0 ].command_interfaces [0 ].name , " digital_output" );
578+ EXPECT_EQ (hardware_info.gpios [0 ].command_interfaces [0 ].data_type , " bool" );
579+ EXPECT_EQ (hardware_info.gpios [0 ].command_interfaces [0 ].size , 2 );
580+ EXPECT_THAT (hardware_info.gpios [0 ].state_interfaces , SizeIs (2 ));
581+ EXPECT_EQ (hardware_info.gpios [0 ].state_interfaces [0 ].name , " analog_input" );
582+ EXPECT_EQ (hardware_info.gpios [0 ].state_interfaces [0 ].data_type , " double" );
583+ EXPECT_EQ (hardware_info.gpios [0 ].state_interfaces [0 ].size , 3 );
584+ EXPECT_EQ (hardware_info.gpios [0 ].state_interfaces [1 ].name , " image" );
585+ EXPECT_EQ (hardware_info.gpios [0 ].state_interfaces [1 ].data_type , " cv::Mat" );
586+ EXPECT_EQ (hardware_info.gpios [0 ].state_interfaces [1 ].size , 1 );
587+ }
588+
589+ TEST_F (TestComponentParser, negative_size_throws_error)
590+ {
591+ std::string urdf_to_test =
592+ std::string (ros2_control_test_assets::urdf_head) +
593+ ros2_control_test_assets::invalid_urdf2_ros2_control_illegal_size +
594+ ros2_control_test_assets::urdf_tail;
595+ ASSERT_THROW (parse_control_resources_from_urdf (urdf_to_test), std::runtime_error);
596+ }
597+
598+ TEST_F (TestComponentParser, noninteger_size_throws_error)
599+ {
600+ std::string urdf_to_test =
601+ std::string (ros2_control_test_assets::urdf_head) +
602+ ros2_control_test_assets::invalid_urdf2_ros2_control_illegal_size2 +
603+ ros2_control_test_assets::urdf_tail;
604+ ASSERT_THROW (parse_control_resources_from_urdf (urdf_to_test), std::runtime_error);
605+ }
0 commit comments