@@ -842,12 +842,23 @@ TEST_F(TestNode, set_parameter_undeclared_parameters_not_allowed) {
842842 EXPECT_EQ (node->get_parameter (name).get_value <int >(), 43 );
843843 }
844844 {
845- // normal use, change type
845+ // normal use, change type not allowed
846846 auto name = " parameter" _unq;
847847 EXPECT_FALSE (node->has_parameter (name));
848848 node->declare_parameter (name, 42 );
849849 EXPECT_TRUE (node->has_parameter (name));
850850 EXPECT_EQ (node->get_parameter (name).get_value <int >(), 42 );
851+ EXPECT_FALSE (node->set_parameter (rclcpp::Parameter (name, " not an integer" )).successful );
852+ }
853+ {
854+ // normal use, change type
855+ auto name = " parameter" _unq;
856+ EXPECT_FALSE (node->has_parameter (name));
857+ rcl_interfaces::msg::ParameterDescriptor descriptor;
858+ descriptor.static_typing = false ;
859+ node->declare_parameter (name, 42 , descriptor);
860+ EXPECT_TRUE (node->has_parameter (name));
861+ EXPECT_EQ (node->get_parameter (name).get_value <int >(), 42 );
851862 EXPECT_TRUE (node->set_parameter (rclcpp::Parameter (name, " not an integer" )).successful );
852863 EXPECT_EQ (node->get_parameter (name).get_value <std::string>(), std::string (" not an integer" ));
853864 }
@@ -864,8 +875,6 @@ TEST_F(TestNode, set_parameter_undeclared_parameters_not_allowed) {
864875 EXPECT_TRUE (node->has_parameter (name3));
865876
866877 EXPECT_EQ (node->get_parameter (name1).get_value <int >(), 42 );
867- EXPECT_TRUE (node->set_parameter (rclcpp::Parameter (name1, " not an integer" )).successful );
868- EXPECT_EQ (node->get_parameter (name1).get_value <std::string>(), std::string (" not an integer" ));
869878
870879 EXPECT_EQ (node->get_parameter (name2).get_value <bool >(), true );
871880 EXPECT_TRUE (node->set_parameter (rclcpp::Parameter (name2, false )).successful );
@@ -910,13 +919,26 @@ TEST_F(TestNode, set_parameter_undeclared_parameters_not_allowed) {
910919 EXPECT_EQ (value.get_type (), rclcpp::PARAMETER_NOT_SET);
911920 }
912921 {
913- // setting type of rclcpp::PARAMETER_NOT_SET, when already to another type, will undeclare
922+ // setting type of rclcpp::PARAMETER_NOT_SET, when already to another type, will fail
914923 auto name = " parameter" _unq;
915924 node->declare_parameter (name, 42 );
916925 EXPECT_TRUE (node->has_parameter (name));
917926 auto value = node->get_parameter (name);
918927 EXPECT_EQ (value.get_type (), rclcpp::PARAMETER_INTEGER);
919928
929+ EXPECT_FALSE (node->set_parameter (rclcpp::Parameter (name)).successful );
930+ }
931+ {
932+ // setting type of rclcpp::PARAMETER_NOT_SET,
933+ // when dynamic typing is allowing and already set to another type, will undeclare
934+ auto name = " parameter" _unq;
935+ rcl_interfaces::msg::ParameterDescriptor descriptor;
936+ descriptor.static_typing = false ;
937+ node->declare_parameter (name, 42 , descriptor);
938+ EXPECT_TRUE (node->has_parameter (name));
939+ auto value = node->get_parameter (name);
940+ EXPECT_EQ (value.get_type (), rclcpp::PARAMETER_INTEGER);
941+
920942 EXPECT_TRUE (node->set_parameter (rclcpp::Parameter (name)).successful );
921943
922944 EXPECT_FALSE (node->has_parameter (name));
@@ -1256,15 +1278,9 @@ TEST_F(TestNode, set_parameter_undeclared_parameters_not_allowed) {
12561278 auto name = " parameter" _unq;
12571279 rcl_interfaces::msg::ParameterDescriptor descriptor;
12581280 descriptor.type = rclcpp::PARAMETER_INTEGER;
1259- node->declare_parameter (name, 42 , descriptor);
1281+ node->declare_parameter (name, " asd " , descriptor);
12601282 EXPECT_TRUE (node->has_parameter (name));
12611283 auto value = node->get_parameter (name);
1262- EXPECT_EQ (value.get_type (), rclcpp::PARAMETER_INTEGER);
1263- EXPECT_EQ (value.get_value <int64_t >(), 42 );
1264-
1265- EXPECT_TRUE (node->set_parameter (rclcpp::Parameter (name, " asd" )).successful );
1266- EXPECT_TRUE (node->has_parameter (name));
1267- value = node->get_parameter (name);
12681284 EXPECT_EQ (value.get_type (), rclcpp::PARAMETER_STRING);
12691285 EXPECT_EQ (value.get_value <std::string>(), " asd" );
12701286 }
@@ -1422,13 +1438,26 @@ TEST_F(TestNode, set_parameters_undeclared_parameters_not_allowed) {
14221438 EXPECT_EQ (value.get_type (), rclcpp::PARAMETER_NOT_SET);
14231439 }
14241440 {
1425- // setting type of rclcpp::PARAMETER_NOT_SET, when already to another type, will undeclare
1441+ // setting type of rclcpp::PARAMETER_NOT_SET, when already to another type, will fail
14261442 auto name = " parameter" _unq;
14271443 node->declare_parameter (name, 42 );
14281444 EXPECT_TRUE (node->has_parameter (name));
14291445 auto value = node->get_parameter (name);
14301446 EXPECT_EQ (value.get_type (), rclcpp::PARAMETER_INTEGER);
14311447
1448+ EXPECT_FALSE (node->set_parameters ({rclcpp::Parameter (name)})[0 ].successful );
1449+ }
1450+ {
1451+ // setting type of rclcpp::PARAMETER_NOT_SET,
1452+ // when already to another type and dynamic typic allowed, will undeclare
1453+ auto name = " parameter" _unq;
1454+ rcl_interfaces::msg::ParameterDescriptor descriptor;
1455+ descriptor.static_typing = false ;
1456+ node->declare_parameter (name, 42 , descriptor);
1457+ EXPECT_TRUE (node->has_parameter (name));
1458+ auto value = node->get_parameter (name);
1459+ EXPECT_EQ (value.get_type (), rclcpp::PARAMETER_INTEGER);
1460+
14321461 EXPECT_TRUE (node->set_parameters ({rclcpp::Parameter (name)})[0 ].successful );
14331462
14341463 EXPECT_FALSE (node->has_parameter (name));
@@ -1596,13 +1625,26 @@ TEST_F(TestNode, set_parameters_atomically_undeclared_parameters_not_allowed) {
15961625 EXPECT_EQ (value.get_type (), rclcpp::PARAMETER_NOT_SET);
15971626 }
15981627 {
1599- // setting type of rclcpp::PARAMETER_NOT_SET, when already to another type, will undeclare
1628+ // setting type of rclcpp::PARAMETER_NOT_SET, when already to another type, will fail
16001629 auto name = " parameter" _unq;
16011630 node->declare_parameter (name, 42 );
16021631 EXPECT_TRUE (node->has_parameter (name));
16031632 auto value = node->get_parameter (name);
16041633 EXPECT_EQ (value.get_type (), rclcpp::PARAMETER_INTEGER);
16051634
1635+ EXPECT_FALSE (node->set_parameters_atomically ({rclcpp::Parameter (name)}).successful );
1636+ }
1637+ {
1638+ // setting type of rclcpp::PARAMETER_NOT_SET,
1639+ // when dynamic typing is allowed and already declared to another type, will undeclare
1640+ auto name = " parameter" _unq;
1641+ rcl_interfaces::msg::ParameterDescriptor descriptor;
1642+ descriptor.static_typing = false ;
1643+ node->declare_parameter (name, 42 , descriptor);
1644+ EXPECT_TRUE (node->has_parameter (name));
1645+ auto value = node->get_parameter (name);
1646+ EXPECT_EQ (value.get_type (), rclcpp::PARAMETER_INTEGER);
1647+
16061648 EXPECT_TRUE (node->set_parameters_atomically ({rclcpp::Parameter (name)}).successful );
16071649
16081650 EXPECT_FALSE (node->has_parameter (name));
0 commit comments