diff --git a/src/xml_parsing.cpp b/src/xml_parsing.cpp index b74b1ddb4..931707f59 100644 --- a/src/xml_parsing.cpp +++ b/src/xml_parsing.cpp @@ -659,7 +659,7 @@ TreeNode::Ptr XMLParser::PImpl::createNodeFromXML(const XMLElement* element, "] is found in the XML, but not in the " "providedPorts()")); } - else + else if(!port_value.empty()) { const auto& port_model = port_model_it->second; bool is_blacbkboard = port_value.size() >= 3 && port_value.front() == '{' && diff --git a/tests/gtest_ports.cpp b/tests/gtest_ports.cpp index 8ba750919..cb3032657 100644 --- a/tests/gtest_ports.cpp +++ b/tests/gtest_ports.cpp @@ -679,29 +679,36 @@ TEST(PortTest, Default_Issues_767) "default nullptr")); } -TEST(PortTest, DefaultWronglyOverriden) +TEST(PortTest, AllowEmptyValues) { BT::BehaviorTreeFactory factory; + factory.registerNodeType("NodeWithPorts"); factory.registerNodeType("NodeWithDefaultNullptr"); - std::string xml_txt_wrong = R"( + std::string xml_txt_empty_number = R"( + + + + + )"; + + std::string xml_txt_empty_pointer = R"( )"; - std::string xml_txt_correct = R"( + std::string xml_txt_empty_default = R"( )"; - // this should throw, because we are NOT using the default, - // but overriding it with an empty string instead. - // See issue 768 for reference - ASSERT_ANY_THROW(auto tree = factory.createTreeFromText(xml_txt_wrong)); - // This is correct - ASSERT_NO_THROW(auto tree = factory.createTreeFromText(xml_txt_correct)); + // All are correct, as we allow empty strings that will get retrieved as std::nullopt + // Note that this is the opposite request on issue 768 + ASSERT_NO_THROW(auto tree = factory.createTreeFromText(xml_txt_empty_number)); + ASSERT_NO_THROW(auto tree = factory.createTreeFromText(xml_txt_empty_pointer)); + ASSERT_NO_THROW(auto tree = factory.createTreeFromText(xml_txt_empty_default)); }