diff --git a/src/Utility.cc b/src/Utility.cc index b65a3ef4..8195cf23 100644 --- a/src/Utility.cc +++ b/src/Utility.cc @@ -967,10 +967,17 @@ namespace ignition // Get the top level element. tinyxml2::XMLElement *modelElement = modelConfigDoc.FirstChildElement( "model"); + bool isModel = true; if (!modelElement) { - std::cerr << "Model config string does not contain a element\n"; - return false; + modelElement = modelConfigDoc.FirstChildElement("world"); + if (!modelElement) + { + std::cerr << "Model config string does not contain a " + << " or element\n"; + return false; + } + isModel = false; } // Read the name, which is a mandatory element. @@ -1044,23 +1051,34 @@ namespace ignition math::SemanticVersion ver(trimmed(verStr)); if (ver > maxVer) { - meta.mutable_model()->mutable_file_format()->set_name("sdf"); - ignition::msgs::Version *verMsg = - meta.mutable_model()->mutable_file_format()->mutable_version(); + ignition::msgs::Version *verMsg; + + if (isModel) + { + meta.mutable_model()->mutable_file_format()->set_name("sdf"); + verMsg = + meta.mutable_model()->mutable_file_format()->mutable_version(); + meta.mutable_model()->set_file(trimmed(elem->GetText())); + } + else + { + meta.mutable_world()->mutable_file_format()->set_name("sdf"); + verMsg = + meta.mutable_world()->mutable_file_format()->mutable_version(); + meta.mutable_world()->set_file(trimmed(elem->GetText())); + } verMsg->set_major(ver.Major()); verMsg->set_minor(ver.Minor()); verMsg->set_patch(ver.Patch()); verMsg->set_prerelease(ver.Prerelease()); verMsg->set_build(ver.Build()); - - meta.mutable_model()->set_file(trimmed(elem->GetText())); } } elem = elem->NextSiblingElement("sdf"); } - if (meta.model().file().empty()) + if (meta.model().file().empty() && meta.world().file().empty()) { std::cerr << "Model config string does not contain an element\n"; return false; diff --git a/src/Utility_TEST.cc b/src/Utility_TEST.cc index 78b00db3..9dd7a29f 100644 --- a/src/Utility_TEST.cc +++ b/src/Utility_TEST.cc @@ -321,30 +321,31 @@ TEST(UtilityTest, ConvertFloat) TEST(UtilityTest, ConvertFuelMetadata) { msgs::FuelMetadata metaMsg; - std::string modelConfigStr; + std::string modelConfigInput, worldConfigInput; // test ConvertFuelMetadata(string, msgs::FuelMetadata) { - EXPECT_FALSE(msgs::ConvertFuelMetadata(modelConfigStr, metaMsg)); + EXPECT_FALSE(msgs::ConvertFuelMetadata(modelConfigInput, metaMsg)); metaMsg.Clear(); - modelConfigStr = ""; - EXPECT_FALSE(msgs::ConvertFuelMetadata(modelConfigStr, metaMsg)); + modelConfigInput = ""; + EXPECT_FALSE(msgs::ConvertFuelMetadata(modelConfigInput, metaMsg)); metaMsg.Clear(); - modelConfigStr = "test"; - EXPECT_FALSE(msgs::ConvertFuelMetadata(modelConfigStr, metaMsg)); + modelConfigInput = "test"; + EXPECT_FALSE(msgs::ConvertFuelMetadata(modelConfigInput, metaMsg)); + // Test metaMsg.Clear(); - modelConfigStr = R"( + modelConfigInput = R"( test_model )"; - EXPECT_FALSE(msgs::ConvertFuelMetadata(modelConfigStr, metaMsg)); + EXPECT_FALSE(msgs::ConvertFuelMetadata(modelConfigInput, metaMsg)); metaMsg.Clear(); - modelConfigStr = R"( + modelConfigInput = R"( model.sdf test_model @@ -362,7 +363,7 @@ TEST(UtilityTest, ConvertFuelMetadata) )"; - EXPECT_TRUE(msgs::ConvertFuelMetadata(modelConfigStr, metaMsg)); + EXPECT_TRUE(msgs::ConvertFuelMetadata(modelConfigInput, metaMsg)); EXPECT_EQ("test_model", metaMsg.name()); EXPECT_EQ(3, metaMsg.version()); EXPECT_EQ("A model for testing", metaMsg.description()); @@ -375,16 +376,37 @@ TEST(UtilityTest, ConvertFuelMetadata) EXPECT_EQ("foo@bar.org", metaMsg.authors(0).email()); EXPECT_EQ(1, metaMsg.dependencies().size()); EXPECT_EQ("model://some_model", metaMsg.dependencies(0).uri()); + + // Test + metaMsg.Clear(); + worldConfigInput = R"( + + world.sdf + test_world + 2 + A world for testing + +)"; + EXPECT_TRUE(msgs::ConvertFuelMetadata(worldConfigInput, metaMsg)); + EXPECT_EQ("test_world", metaMsg.name()); + EXPECT_EQ(2, metaMsg.version()); + EXPECT_EQ("A world for testing", metaMsg.description()); + EXPECT_EQ("world.sdf", metaMsg.world().file()); + EXPECT_EQ("sdf", metaMsg.world().file_format().name()); + EXPECT_EQ(1, metaMsg.world().file_format().version().major()); + EXPECT_EQ(7, metaMsg.world().file_format().version().minor()); + EXPECT_EQ(0, metaMsg.authors().size()); + EXPECT_EQ(0, metaMsg.dependencies().size()); } // test ConvertFuelMetadata(msgs::FuelMetadata, string) { - std::string modelConfigOutput; + std::string modelConfig; // Test metaMsg.Clear(); metaMsg.mutable_world()->set_file("world.sdf"); - EXPECT_FALSE(msgs::ConvertFuelMetadata(metaMsg, modelConfigOutput)); + EXPECT_FALSE(msgs::ConvertFuelMetadata(metaMsg, modelConfig)); metaMsg.set_name("test_world"); metaMsg.set_description("A world for testing"); @@ -394,22 +416,14 @@ TEST(UtilityTest, ConvertFuelMetadata) ->mutable_version()->set_major(1); metaMsg.mutable_world()->mutable_file_format() ->mutable_version()->set_minor(7); - EXPECT_TRUE(msgs::ConvertFuelMetadata(metaMsg, modelConfigOutput)); + EXPECT_TRUE(msgs::ConvertFuelMetadata(metaMsg, modelConfig)); - std::string expectedOutput = R"( - - world.sdf - test_world - 2 - A world for testing - -)"; - EXPECT_EQ(expectedOutput, modelConfigOutput); + EXPECT_EQ(worldConfigInput, modelConfig); // Test metaMsg.Clear(); metaMsg.mutable_model()->set_file("model.sdf"); - EXPECT_FALSE(msgs::ConvertFuelMetadata(metaMsg, modelConfigOutput)); + EXPECT_FALSE(msgs::ConvertFuelMetadata(metaMsg, modelConfig)); metaMsg.set_name("test_model"); metaMsg.set_description("A model for testing"); @@ -419,13 +433,13 @@ TEST(UtilityTest, ConvertFuelMetadata) ->mutable_version()->set_major(1); metaMsg.mutable_model()->mutable_file_format() ->mutable_version()->set_minor(7); - EXPECT_TRUE(msgs::ConvertFuelMetadata(metaMsg, modelConfigOutput)); + EXPECT_TRUE(msgs::ConvertFuelMetadata(metaMsg, modelConfig)); metaMsg.add_authors()->set_name("Foo Bar"); metaMsg.mutable_authors(0)->set_email("foo@bar.org"); metaMsg.add_dependencies()->set_uri("model://some_model"); - EXPECT_TRUE(msgs::ConvertFuelMetadata(metaMsg, modelConfigOutput)); - EXPECT_EQ(modelConfigStr, modelConfigOutput); + EXPECT_TRUE(msgs::ConvertFuelMetadata(metaMsg, modelConfig)); + EXPECT_EQ(modelConfigInput, modelConfig); } }