/* * Copyright 2015 Open Source Robotics Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #include #include "sdf/sdf.hh" #include "sdf/Converter.hh" #include "test_config.h" const std::string CONVERT_DOC = std::string(PROJECT_SOURCE_PATH) + "/sdf/1.6/1_5.convert"; ///////////////////////////////////////////////// /// Test conversion of imu in 1.5 to 1.6 TEST(ConverterIntegration, IMU_15_to_16) { // The imu noise in 1.5 format std::string xmlString = R"( gaussian 0 0.0002 7.5e-06 8e-07 0 0.017 0.1 0.001 )"; TiXmlDocument xmlDoc; xmlDoc.Parse(xmlString.c_str()); // Convert TiXmlDocument convertXmlDoc; convertXmlDoc.LoadFile(CONVERT_DOC); sdf::Converter::Convert(&xmlDoc, &convertXmlDoc); // Check some basic elements TiXmlElement *convertedElem = xmlDoc.FirstChildElement(); EXPECT_EQ(convertedElem->ValueStr(), "sdf"); convertedElem = convertedElem->FirstChildElement(); EXPECT_EQ(convertedElem->ValueStr(), "world"); convertedElem = convertedElem->FirstChildElement(); EXPECT_EQ(convertedElem->ValueStr(), "model"); convertedElem = convertedElem->FirstChildElement(); EXPECT_EQ(convertedElem->ValueStr(), "link"); convertedElem = convertedElem->FirstChildElement(); EXPECT_EQ(convertedElem->ValueStr(), "sensor"); // Get the imu TiXmlElement *imuElem = convertedElem->FirstChildElement(); EXPECT_EQ(imuElem->ValueStr(), "imu"); // Get the angular_velocity TiXmlElement *angVelElem = imuElem->FirstChildElement(); EXPECT_EQ(angVelElem->ValueStr(), "angular_velocity"); // Get the linear_acceleration TiXmlElement *linAccElem = angVelElem->NextSiblingElement(); EXPECT_EQ(linAccElem->ValueStr(), "linear_acceleration"); std::array axis = {'x', 'y', 'z'}; TiXmlElement *angVelAxisElem = angVelElem->FirstChildElement(); TiXmlElement *linAccAxisElem = linAccElem->FirstChildElement(); // Iterate over , , and elements under and // for (auto const &a : axis) { EXPECT_EQ(angVelAxisElem->Value()[0], a); EXPECT_EQ(linAccAxisElem->Value()[0], a); TiXmlElement *angVelAxisNoiseElem = angVelAxisElem->FirstChildElement(); TiXmlElement *linAccAxisNoiseElem = linAccAxisElem->FirstChildElement(); EXPECT_EQ(angVelAxisNoiseElem->ValueStr(), "noise"); EXPECT_EQ(linAccAxisNoiseElem->ValueStr(), "noise"); EXPECT_STREQ(angVelAxisNoiseElem->Attribute("type"), "gaussian"); EXPECT_STREQ(linAccAxisNoiseElem->Attribute("type"), "gaussian"); EXPECT_STREQ(angVelAxisNoiseElem->FirstChildElement("mean")->GetText(), "0"); EXPECT_STREQ(linAccAxisNoiseElem->FirstChildElement("mean")->GetText(), "0"); EXPECT_STREQ(angVelAxisNoiseElem->FirstChildElement("stddev")->GetText(), "0.0002"); EXPECT_STREQ(linAccAxisNoiseElem->FirstChildElement("stddev")->GetText(), "0.017"); EXPECT_STREQ(angVelAxisNoiseElem->FirstChildElement("bias_mean")->GetText(), "7.5e-06"); EXPECT_STREQ(linAccAxisNoiseElem->FirstChildElement("bias_mean")->GetText(), "0.1"); EXPECT_STREQ(angVelAxisNoiseElem->FirstChildElement( "bias_stddev")->GetText(), "8e-07"); EXPECT_STREQ(linAccAxisNoiseElem->FirstChildElement( "bias_stddev")->GetText(), "0.001"); angVelAxisElem = angVelAxisElem->NextSiblingElement(); linAccAxisElem = linAccAxisElem->NextSiblingElement(); } } ///////////////////////////////////////////////// /// Test conversion using the parser sdf file converter interface. TEST(ConverterIntegration, ParserFileConverter) { std::string filename = std::string(PROJECT_SOURCE_PATH) + "/test/integration/audio.sdf"; sdf::SDFPtr sdf(new sdf::SDF()); sdf::init(sdf); EXPECT_TRUE(sdf::convertFile(filename, "1.6", sdf)); sdf::ElementPtr rootElem = sdf->Root(); ASSERT_TRUE(rootElem != NULL); EXPECT_EQ(rootElem->Get("version"), "1.6"); sdf::ElementPtr modelElem = rootElem->GetElement("model"); ASSERT_TRUE(modelElem != NULL); EXPECT_EQ(modelElem->Get("name"), "full_audio_parameters"); sdf::ElementPtr linkElem = modelElem->GetElement("link"); ASSERT_TRUE(linkElem != NULL); EXPECT_EQ(linkElem->Get("name"), "link"); sdf::ElementPtr collElem = linkElem->GetElement("collision"); ASSERT_TRUE(collElem != NULL); EXPECT_EQ(collElem->Get("name"), "collision"); sdf::ElementPtr sinkElem = linkElem->GetElement("audio_sink"); ASSERT_TRUE(sinkElem != NULL); sdf::ElementPtr sourceElem = linkElem->GetElement("audio_source"); ASSERT_TRUE(sourceElem != NULL); } ///////////////////////////////////////////////// /// Test conversion using the parser sdf string converter interface. TEST(ConverterIntegration, ParserStringConverter) { // The gravity and magnetic_field in 1.5 format std::string xmlString = R"( 0 0 -9.8 1 2 3 )"; sdf::SDFPtr sdf(new sdf::SDF()); sdf::init(sdf); EXPECT_TRUE(sdf::convertString(xmlString, "1.6", sdf)); ASSERT_TRUE(sdf->Root() != NULL); EXPECT_EQ(sdf->Root()->GetName(), "sdf"); sdf::ElementPtr worldElem = sdf->Root()->GetElement("world"); ASSERT_TRUE(worldElem != NULL); EXPECT_EQ(worldElem->Get("name"), "default"); sdf::ElementPtr physicsElem = worldElem->GetElement("physics"); ASSERT_TRUE(physicsElem != NULL); EXPECT_EQ(physicsElem->Get("name"), "default_physics"); EXPECT_EQ(physicsElem->Get("type"), "ode"); sdf::ElementPtr gravityElem = worldElem->GetElement("gravity"); ASSERT_TRUE(gravityElem != NULL); EXPECT_EQ(gravityElem->Get(), ignition::math::Vector3d(0, 0, -9.8)); sdf::ElementPtr magElem = worldElem->GetElement("magnetic_field"); ASSERT_TRUE(magElem != NULL); EXPECT_EQ(magElem->Get(), ignition::math::Vector3d(1, 2, 3)); } ///////////////////////////////////////////////// /// Test conversion of gravity, magnetic_field in 1.5 to 1.6 TEST(ConverterIntegration, World_15_to_16) { // The gravity and magnetic_field in 1.5 format std::string xmlString = R"( 0 0 -9.8 1 2 3 )"; TiXmlDocument xmlDoc; xmlDoc.Parse(xmlString.c_str()); // Convert TiXmlDocument convertXmlDoc; convertXmlDoc.LoadFile(CONVERT_DOC); sdf::Converter::Convert(&xmlDoc, &convertXmlDoc); // Check some basic elements TiXmlElement *convertedElem = xmlDoc.FirstChildElement(); EXPECT_EQ(convertedElem->ValueStr(), "sdf"); convertedElem = convertedElem->FirstChildElement(); EXPECT_EQ(convertedElem->ValueStr(), "world"); convertedElem = convertedElem->FirstChildElement(); EXPECT_EQ(convertedElem->ValueStr(), "physics"); // Get the gravity TiXmlElement *gravityElem = convertedElem->NextSiblingElement("gravity"); ASSERT_TRUE(gravityElem != NULL); EXPECT_STREQ(gravityElem->GetText(), "0 0 -9.8"); // Get the magnetic_field TiXmlElement *magneticFieldElem = convertedElem->NextSiblingElement("magnetic_field"); ASSERT_TRUE(magneticFieldElem != NULL); EXPECT_STREQ(magneticFieldElem->GetText(), "1 2 3"); }