/* * Copyright (C) 2014 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 #include "gazebo/math/Box.hh" #include "gazebo/math/Vector3.hh" #include "gazebo/math/Pose.hh" #include "gazebo/msgs/msgs.hh" #include "gazebo/gui/GuiIface.hh" #include "gazebo/gui/ConfigWidget.hh" #include "gazebo/gui/ConfigWidget_TEST.hh" #include "test_config.h" ///////////////////////////////////////////////// void ConfigWidget_TEST::EmptyMsgWidget() { gazebo::gui::ConfigWidget *visualConfigWidget = new gazebo::gui::ConfigWidget; gazebo::msgs::Visual visualMsg; visualConfigWidget->Load(&visualMsg); gazebo::msgs::Visual *retVisualMsg = dynamic_cast(visualConfigWidget->Msg()); QVERIFY(retVisualMsg != NULL); delete visualConfigWidget; gazebo::gui::ConfigWidget *collisionConfigWidget = new gazebo::gui::ConfigWidget; gazebo::msgs::Collision collisionMsg; collisionConfigWidget->Load(&collisionMsg); gazebo::msgs::Collision *retCollisionMsg = dynamic_cast(collisionConfigWidget->Msg()); QVERIFY(retCollisionMsg != NULL); delete collisionConfigWidget; } ///////////////////////////////////////////////// void ConfigWidget_TEST::JointMsgWidget() { gazebo::gui::ConfigWidget *jointConfigWidget = new gazebo::gui::ConfigWidget; gazebo::msgs::Joint jointMsg; { // joint jointMsg.set_name("test_joint"); jointMsg.set_id(1122u); jointMsg.set_parent("test_joint_parent"); jointMsg.set_parent_id(212121u); jointMsg.set_child("test_joint_child"); jointMsg.set_child_id(454545u); // type jointMsg.set_type(gazebo::msgs::ConvertJointType("revolute")); // pose ignition::math::Vector3d pos(4.0, -1.0, 3.5); ignition::math::Quaterniond quat(0.0, 1.57, 0.0); gazebo::msgs::Set(jointMsg.mutable_pose(), ignition::math::Pose3d(pos, quat)); // axis1 gazebo::msgs::Axis *axisMsg = jointMsg.mutable_axis1(); gazebo::msgs::Set(axisMsg->mutable_xyz(), ignition::math::Vector3d::UnitX); axisMsg->set_use_parent_model_frame(false); axisMsg->set_limit_lower(-999.0); axisMsg->set_limit_upper(999.0); axisMsg->set_limit_effort(-1.0); axisMsg->set_limit_velocity(-1.0); axisMsg->set_damping(0.0); // other joint physics properties jointMsg.set_cfm(0.2); jointMsg.set_bounce(0.3); jointMsg.set_velocity(0.4); jointMsg.set_fudge_factor(0.5); jointMsg.set_limit_cfm(0.6); jointMsg.set_limit_erp(0.7); jointMsg.set_suspension_cfm(0.8); jointMsg.set_suspension_erp(0.9); } jointConfigWidget->Load(&jointMsg); // retrieve the message from the config widget and // verify that all values have not been changed. { gazebo::msgs::Joint *retJointMsg = dynamic_cast(jointConfigWidget->Msg()); QVERIFY(retJointMsg != NULL); // joint QVERIFY(retJointMsg->name() == "test_joint"); QCOMPARE(retJointMsg->id(), 1122u); QVERIFY(retJointMsg->parent() == "test_joint_parent"); QCOMPARE(retJointMsg->parent_id(), 212121u); QVERIFY(retJointMsg->child() == "test_joint_child"); QCOMPARE(retJointMsg->child_id(), 454545u); // type QCOMPARE(retJointMsg->type(), gazebo::msgs::ConvertJointType("revolute")); // pose const gazebo::msgs::Pose poseMsg = retJointMsg->pose(); const gazebo::msgs::Vector3d posMsg = poseMsg.position(); QCOMPARE(posMsg.x(), 4.0); QCOMPARE(posMsg.y(), -1.0); QCOMPARE(posMsg.z(), 3.5); const gazebo::msgs::Quaternion quatMsg = poseMsg.orientation(); gazebo::math::Quaternion quat(quatMsg.w(), quatMsg.x(), quatMsg.y(), quatMsg.z()); QCOMPARE(quat.GetAsEuler().x, 0.0); QCOMPARE(quat.GetAsEuler().y, 1.57); QCOMPARE(quat.GetAsEuler().z, 0.0); // axis1 gazebo::msgs::Axis *axisMsg = jointMsg.mutable_axis1(); QCOMPARE(axisMsg->xyz().x(), 1.0); QCOMPARE(axisMsg->xyz().y(), 0.0); QCOMPARE(axisMsg->xyz().z(), 0.0); QCOMPARE(axisMsg->use_parent_model_frame(), false); QCOMPARE(axisMsg->limit_lower(), -999.0); QCOMPARE(axisMsg->limit_upper(), 999.0); QCOMPARE(axisMsg->limit_effort(), -1.0); QCOMPARE(axisMsg->limit_velocity(), -1.0); QCOMPARE(axisMsg->damping(), 0.0); // other joint physics properties QCOMPARE(retJointMsg->cfm(), 0.2); QCOMPARE(retJointMsg->bounce(), 0.3); QCOMPARE(retJointMsg->velocity(), 0.4); QCOMPARE(retJointMsg->fudge_factor(), 0.5); QCOMPARE(retJointMsg->limit_cfm(), 0.6); QCOMPARE(retJointMsg->limit_erp(), 0.7); QCOMPARE(retJointMsg->suspension_cfm(), 0.8); QCOMPARE(retJointMsg->suspension_erp(), 0.9); } // update fields in the config widget and // verify that the new message contains the updated values. // Joint type revolute -> universal { // joint jointConfigWidget->SetStringWidgetValue("name", "test_joint_updated"); jointConfigWidget->SetUIntWidgetValue("id", 9999999u); jointConfigWidget->SetStringWidgetValue("parent", "test_joint_parent_updated"); jointConfigWidget->SetUIntWidgetValue("parent_id", 1u); jointConfigWidget->SetStringWidgetValue("child", "test_joint_child_updated"); jointConfigWidget->SetUIntWidgetValue("child_id", 2u); // type jointConfigWidget->SetEnumWidgetValue("type", gazebo::msgs::Joint_Type_Name( gazebo::msgs::Joint_Type_UNIVERSAL)); // pose ignition::math::Vector3d pos(2.0, 9.0, -4.0); ignition::math::Quaterniond quat(0.0, 0.0, 1.57); jointConfigWidget->SetPoseWidgetValue("pose", ignition::math::Pose3d(pos, quat)); // axis1 jointConfigWidget->SetVector3dWidgetValue("axis1::xyz", ignition::math::Vector3d::UnitY); jointConfigWidget->SetBoolWidgetValue("axis1::use_parent_model_frame", true); jointConfigWidget->SetDoubleWidgetValue("axis1::limit_lower", -1.2); jointConfigWidget->SetDoubleWidgetValue("axis1::limit_upper", -1.0); jointConfigWidget->SetDoubleWidgetValue("axis1::limit_effort", 1.0); jointConfigWidget->SetDoubleWidgetValue("axis1::limit_velocity", 100.0); jointConfigWidget->SetDoubleWidgetValue("axis1::damping", 0.9); // axis2 jointConfigWidget->SetVector3dWidgetValue("axis2::xyz", ignition::math::Vector3d::UnitZ); jointConfigWidget->SetBoolWidgetValue("axis2::use_parent_model_frame", true); jointConfigWidget->SetDoubleWidgetValue("axis2::limit_lower", -3.2); jointConfigWidget->SetDoubleWidgetValue("axis2::limit_upper", -3.0); jointConfigWidget->SetDoubleWidgetValue("axis2::limit_effort", 3.0); jointConfigWidget->SetDoubleWidgetValue("axis2::limit_velocity", 300.0); jointConfigWidget->SetDoubleWidgetValue("axis2::damping", 3.9); // other joint physics properties jointConfigWidget->SetDoubleWidgetValue("cfm", 0.9); jointConfigWidget->SetDoubleWidgetValue("bounce", 0.8); jointConfigWidget->SetDoubleWidgetValue("velocity", 0.7); jointConfigWidget->SetDoubleWidgetValue("fudge_factor", 0.6); jointConfigWidget->SetDoubleWidgetValue("limit_cfm", 0.5); jointConfigWidget->SetDoubleWidgetValue("limit_erp", 0.4); jointConfigWidget->SetDoubleWidgetValue("suspension_cfm", 0.3); jointConfigWidget->SetDoubleWidgetValue("suspension_erp", 0.2); } // verify widget values { // joint QVERIFY(jointConfigWidget->StringWidgetValue("name") == "test_joint_updated"); QCOMPARE(jointConfigWidget->UIntWidgetValue("id"), 9999999u); QVERIFY(jointConfigWidget->StringWidgetValue("parent") == "test_joint_parent_updated"); QCOMPARE(jointConfigWidget->UIntWidgetValue("parent_id"), 1u); QVERIFY(jointConfigWidget->StringWidgetValue("child") == "test_joint_child_updated"); QCOMPARE(jointConfigWidget->UIntWidgetValue("child_id"), 2u); // type QCOMPARE(jointConfigWidget->EnumWidgetValue("type"), gazebo::msgs::Joint_Type_Name( gazebo::msgs::Joint_Type_UNIVERSAL)); // pose ignition::math::Vector3d pos(2.0, 9.0, -4.0); ignition::math::Quaterniond quat(0.0, 0.0, 1.57); QCOMPARE(jointConfigWidget->PoseWidgetValue("pose"), ignition::math::Pose3d(pos, quat)); // axis1 QCOMPARE(jointConfigWidget->Vector3dWidgetValue("axis1::xyz"), ignition::math::Vector3d::UnitY); QCOMPARE(jointConfigWidget->BoolWidgetValue( "axis1::use_parent_model_frame"), true); QCOMPARE(jointConfigWidget->DoubleWidgetValue("axis1::limit_lower"), -1.2); QCOMPARE(jointConfigWidget->DoubleWidgetValue("axis1::limit_upper"), -1.0); QCOMPARE(jointConfigWidget->DoubleWidgetValue("axis1::limit_effort"), 1.0); QCOMPARE(jointConfigWidget->DoubleWidgetValue("axis1::limit_velocity"), 100.0); QCOMPARE(jointConfigWidget->DoubleWidgetValue("axis1::damping"), 0.9); // axis2 QCOMPARE(jointConfigWidget->Vector3dWidgetValue("axis2::xyz"), ignition::math::Vector3d::UnitZ); QCOMPARE(jointConfigWidget->BoolWidgetValue( "axis1::use_parent_model_frame"), true); QCOMPARE(jointConfigWidget->DoubleWidgetValue("axis2::limit_lower"), -3.2); QCOMPARE(jointConfigWidget->DoubleWidgetValue("axis2::limit_upper"), -3.0); QCOMPARE(jointConfigWidget->DoubleWidgetValue("axis2::limit_effort"), 3.0); QCOMPARE(jointConfigWidget->DoubleWidgetValue("axis2::limit_velocity"), 300.0); QCOMPARE(jointConfigWidget->DoubleWidgetValue("axis2::damping"), 3.9); // other joint physics properties QCOMPARE(jointConfigWidget->DoubleWidgetValue("cfm"), 0.9); QCOMPARE(jointConfigWidget->DoubleWidgetValue("bounce"), 0.8); QCOMPARE(jointConfigWidget->DoubleWidgetValue("velocity"), 0.7); QCOMPARE(jointConfigWidget->DoubleWidgetValue("fudge_factor"), 0.6); QCOMPARE(jointConfigWidget->DoubleWidgetValue("limit_cfm"), 0.5); QCOMPARE(jointConfigWidget->DoubleWidgetValue("limit_erp"), 0.4); QCOMPARE(jointConfigWidget->DoubleWidgetValue("suspension_cfm"), 0.3); QCOMPARE(jointConfigWidget->DoubleWidgetValue("suspension_erp"), 0.2); } // verify updates in new msg { gazebo::msgs::Joint *retJointMsg = dynamic_cast(jointConfigWidget->Msg()); QVERIFY(retJointMsg != NULL); // joint QVERIFY(retJointMsg->name() == "test_joint_updated"); QCOMPARE(retJointMsg->id(), 9999999u); QVERIFY(retJointMsg->parent() == "test_joint_parent_updated"); QCOMPARE(retJointMsg->parent_id(), 1u); QVERIFY(retJointMsg->child() == "test_joint_child_updated"); QCOMPARE(retJointMsg->child_id(), 2u); // type QCOMPARE(retJointMsg->type(), gazebo::msgs::ConvertJointType("universal")); // pose const gazebo::msgs::Pose poseMsg = retJointMsg->pose(); const gazebo::msgs::Vector3d posMsg = poseMsg.position(); QCOMPARE(posMsg.x(), 2.0); QCOMPARE(posMsg.y(), 9.0); QCOMPARE(posMsg.z(), -4.0); const gazebo::msgs::Quaternion quatMsg = poseMsg.orientation(); gazebo::math::Quaternion quat(quatMsg.w(), quatMsg.x(), quatMsg.y(), quatMsg.z()); QCOMPARE(quat.GetAsEuler().x, 0.0); QCOMPARE(quat.GetAsEuler().y, 0.0); QCOMPARE(quat.GetAsEuler().z, 1.57); // axis1 gazebo::msgs::Axis *axisMsg = retJointMsg->mutable_axis1(); QCOMPARE(axisMsg->xyz().x(), 0.0); QCOMPARE(axisMsg->xyz().y(), 1.0); QCOMPARE(axisMsg->xyz().z(), 0.0); QCOMPARE(axisMsg->use_parent_model_frame(), true); QCOMPARE(axisMsg->limit_lower(), -1.2); QCOMPARE(axisMsg->limit_upper(), -1.0); QCOMPARE(axisMsg->limit_effort(), 1.0); QCOMPARE(axisMsg->limit_velocity(), 100.0); QCOMPARE(axisMsg->damping(), 0.9); // axis2 gazebo::msgs::Axis *axis2Msg = retJointMsg->mutable_axis2(); QCOMPARE(axis2Msg->xyz().x(), 0.0); QCOMPARE(axis2Msg->xyz().y(), 0.0); QCOMPARE(axis2Msg->xyz().z(), 1.0); QCOMPARE(axis2Msg->use_parent_model_frame(), true); QCOMPARE(axis2Msg->limit_lower(), -3.2); QCOMPARE(axis2Msg->limit_upper(), -3.0); QCOMPARE(axis2Msg->limit_effort(), 3.0); QCOMPARE(axis2Msg->limit_velocity(), 300.0); QCOMPARE(axis2Msg->damping(), 3.9); // other joint physics properties QCOMPARE(retJointMsg->cfm(), 0.9); QCOMPARE(retJointMsg->bounce(), 0.8); QCOMPARE(retJointMsg->velocity(), 0.7); QCOMPARE(retJointMsg->fudge_factor(), 0.6); QCOMPARE(retJointMsg->limit_cfm(), 0.5); QCOMPARE(retJointMsg->limit_erp(), 0.4); QCOMPARE(retJointMsg->suspension_cfm(), 0.3); QCOMPARE(retJointMsg->suspension_erp(), 0.2); } // update fields in the config widget and // verify that the new message contains the updated values. // Joint type universal -> ball { // joint jointConfigWidget->SetStringWidgetValue("name", "test_joint_updated2"); jointConfigWidget->SetUIntWidgetValue("id", 2222222u); jointConfigWidget->SetStringWidgetValue("parent", "test_joint_parent_updated2"); jointConfigWidget->SetUIntWidgetValue("parent_id", 10u); jointConfigWidget->SetStringWidgetValue("child", "test_joint_child_updated2"); jointConfigWidget->SetUIntWidgetValue("child_id", 20u); // type jointConfigWidget->SetEnumWidgetValue("type", gazebo::msgs::Joint_Type_Name( gazebo::msgs::Joint_Type_BALL)); // pose ignition::math::Vector3d pos(-2.0, 1.0, 2.0); ignition::math::Quaterniond quat(0.0, 0.0, 0.0); jointConfigWidget->SetPoseWidgetValue("pose", ignition::math::Pose3d(pos, quat)); // other joint physics properties jointConfigWidget->SetDoubleWidgetValue("cfm", 0.19); jointConfigWidget->SetDoubleWidgetValue("bounce", 0.18); jointConfigWidget->SetDoubleWidgetValue("velocity", 2.7); jointConfigWidget->SetDoubleWidgetValue("fudge_factor", 0.26); jointConfigWidget->SetDoubleWidgetValue("limit_cfm", 0.15); jointConfigWidget->SetDoubleWidgetValue("limit_erp", 0.24); jointConfigWidget->SetDoubleWidgetValue("suspension_cfm", 0.13); jointConfigWidget->SetDoubleWidgetValue("suspension_erp", 0.12); } // verify widget values { // joint QVERIFY(jointConfigWidget->StringWidgetValue("name") == "test_joint_updated2"); QCOMPARE(jointConfigWidget->UIntWidgetValue("id"), 2222222u); QVERIFY(jointConfigWidget->StringWidgetValue("parent") == "test_joint_parent_updated2"); QCOMPARE(jointConfigWidget->UIntWidgetValue("parent_id"), 10u); QVERIFY(jointConfigWidget->StringWidgetValue("child") == "test_joint_child_updated2"); QCOMPARE(jointConfigWidget->UIntWidgetValue("child_id"), 20u); // type QCOMPARE(jointConfigWidget->EnumWidgetValue("type"), gazebo::msgs::Joint_Type_Name( gazebo::msgs::Joint_Type_BALL)); // pose ignition::math::Vector3d pos(-2.0, 1.0, 2.0); ignition::math::Quaterniond quat(0.0, 0.0, 0.0); QCOMPARE(jointConfigWidget->PoseWidgetValue("pose"), ignition::math::Pose3d(pos, quat)); // other joint physics properties QCOMPARE(jointConfigWidget->DoubleWidgetValue("cfm"), 0.19); QCOMPARE(jointConfigWidget->DoubleWidgetValue("bounce"), 0.18); QCOMPARE(jointConfigWidget->DoubleWidgetValue("velocity"), 2.7); QCOMPARE(jointConfigWidget->DoubleWidgetValue("fudge_factor"), 0.26); QCOMPARE(jointConfigWidget->DoubleWidgetValue("limit_cfm"), 0.15); QCOMPARE(jointConfigWidget->DoubleWidgetValue("limit_erp"), 0.24); QCOMPARE(jointConfigWidget->DoubleWidgetValue("suspension_cfm"), 0.13); QCOMPARE(jointConfigWidget->DoubleWidgetValue("suspension_erp"), 0.12); } // verify updates in new msg { gazebo::msgs::Joint *retJointMsg = dynamic_cast(jointConfigWidget->Msg()); QVERIFY(retJointMsg != NULL); // joint QVERIFY(retJointMsg->name() == "test_joint_updated2"); QCOMPARE(retJointMsg->id(), 2222222u); QVERIFY(retJointMsg->parent() == "test_joint_parent_updated2"); QCOMPARE(retJointMsg->parent_id(), 10u); QVERIFY(retJointMsg->child() == "test_joint_child_updated2"); QCOMPARE(retJointMsg->child_id(), 20u); // type QCOMPARE(retJointMsg->type(), gazebo::msgs::ConvertJointType("ball")); // pose const gazebo::msgs::Pose poseMsg = retJointMsg->pose(); const gazebo::msgs::Vector3d posMsg = poseMsg.position(); QCOMPARE(posMsg.x(), -2.0); QCOMPARE(posMsg.y(), 1.0); QCOMPARE(posMsg.z(), 2.0); const gazebo::msgs::Quaternion quatMsg = poseMsg.orientation(); gazebo::math::Quaternion quat(quatMsg.w(), quatMsg.x(), quatMsg.y(), quatMsg.z()); QCOMPARE(quat.GetAsEuler().x, 0.0); QCOMPARE(quat.GetAsEuler().y, 0.0); QCOMPARE(quat.GetAsEuler().z, 0.0); // other joint physics properties QCOMPARE(retJointMsg->cfm(), 0.19); QCOMPARE(retJointMsg->bounce(), 0.18); QCOMPARE(retJointMsg->velocity(), 2.7); QCOMPARE(retJointMsg->fudge_factor(), 0.26); QCOMPARE(retJointMsg->limit_cfm(), 0.15); QCOMPARE(retJointMsg->limit_erp(), 0.24); QCOMPARE(retJointMsg->suspension_cfm(), 0.13); QCOMPARE(retJointMsg->suspension_erp(), 0.12); } } ///////////////////////////////////////////////// void ConfigWidget_TEST::VisualMsgWidget() { // create a visual message with test values // leave out plugin field for now gazebo::gui::ConfigWidget *visualConfigWidget = new gazebo::gui::ConfigWidget; gazebo::msgs::Visual visualMsg; { // visual visualMsg.set_name("test_visual"); visualMsg.set_id(12345u); visualMsg.set_parent_name("test_visual_parent"); visualMsg.set_parent_id(54321u); visualMsg.set_cast_shadows(true); visualMsg.set_transparency(0.0); visualMsg.set_visible(true); visualMsg.set_delete_me(false); visualMsg.set_is_static(false); gazebo::msgs::Set(visualMsg.mutable_scale(), ignition::math::Vector3d(1.0, 1.0, 1.0)); // pose ignition::math::Vector3d pos(2.0, 3.0, 4.0); ignition::math::Quaterniond quat(1.57, 0.0, 0.0); gazebo::msgs::Set(visualMsg.mutable_pose(), ignition::math::Pose3d(pos, quat)); // geometry gazebo::msgs::Geometry *geometryMsg = visualMsg.mutable_geometry(); geometryMsg->set_type(gazebo::msgs::Geometry::CYLINDER); gazebo::msgs::CylinderGeom *cylinderGeomMsg = geometryMsg->mutable_cylinder(); cylinderGeomMsg->set_radius(3.0); cylinderGeomMsg->set_length(0.2); // material gazebo::msgs::Material *materialMsg = visualMsg.mutable_material(); materialMsg->set_shader_type( gazebo::msgs::Material::Material::VERTEX); materialMsg->set_normal_map("test_normal_map"); gazebo::msgs::Set(materialMsg->mutable_ambient(), gazebo::common::Color(0.0, 1.0, 0.0, 1.0)); gazebo::msgs::Set(materialMsg->mutable_diffuse(), gazebo::common::Color(0.0, 1.0, 1.0, 0.4)); gazebo::msgs::Set(materialMsg->mutable_specular(), gazebo::common::Color(1.0, 1.0, 1.0, 0.6)); gazebo::msgs::Set(materialMsg->mutable_emissive(), gazebo::common::Color(0.0, 0.5, 0.2, 1.0)); materialMsg->set_lighting(true); // material::script gazebo::msgs::Material::Script *scriptMsg = materialMsg->mutable_script(); scriptMsg->add_uri("test_script_uri_0"); scriptMsg->add_uri("test_script_uri_1"); scriptMsg->set_name("test_script_name"); } visualConfigWidget->Load(&visualMsg); // retrieve the message from the config widget and // verify that all values have not been changed. { gazebo::msgs::Visual *retVisualMsg = dynamic_cast(visualConfigWidget->Msg()); QVERIFY(retVisualMsg != NULL); // visual QVERIFY(retVisualMsg->name() == "test_visual"); QCOMPARE(retVisualMsg->id(), 12345u); QVERIFY(retVisualMsg->parent_name() == "test_visual_parent"); QCOMPARE(retVisualMsg->parent_id(), 54321u); QCOMPARE(retVisualMsg->cast_shadows(), true); QCOMPARE(retVisualMsg->transparency(), 0.0); QCOMPARE(retVisualMsg->visible(), true); QCOMPARE(retVisualMsg->delete_me(), false); QCOMPARE(retVisualMsg->is_static(), false); const gazebo::msgs::Vector3d scaleMsg = retVisualMsg->scale(); QCOMPARE(scaleMsg.x(), 1.0); QCOMPARE(scaleMsg.y(), 1.0); QCOMPARE(scaleMsg.z(), 1.0); // pose const gazebo::msgs::Pose poseMsg = retVisualMsg->pose(); const gazebo::msgs::Vector3d posMsg = poseMsg.position(); QCOMPARE(posMsg.x(), 2.0); QCOMPARE(posMsg.y(), 3.0); QCOMPARE(posMsg.z(), 4.0); const gazebo::msgs::Quaternion quatMsg = poseMsg.orientation(); gazebo::math::Quaternion quat(quatMsg.w(), quatMsg.x(), quatMsg.y(), quatMsg.z()); QCOMPARE(quat.GetAsEuler().x, 1.57); QCOMPARE(quat.GetAsEuler().y, 0.0); QCOMPARE(quat.GetAsEuler().z, 0.0); // geometry const gazebo::msgs::Geometry geometryMsg = retVisualMsg->geometry(); QCOMPARE(geometryMsg.type(), gazebo::msgs::Geometry::CYLINDER); const gazebo::msgs::CylinderGeom cylinderGeomMsg = geometryMsg.cylinder(); QCOMPARE(cylinderGeomMsg.radius(), 3.0); QCOMPARE(cylinderGeomMsg.length(), 0.2); // material const gazebo::msgs::Material materialMsg = retVisualMsg->material(); QCOMPARE(materialMsg.shader_type(), gazebo::msgs::Material::Material::VERTEX); QVERIFY(materialMsg.normal_map() == "test_normal_map"); const gazebo::msgs::Color ambientMsg = materialMsg.ambient(); QCOMPARE(ambientMsg.r(), 0.0f); QCOMPARE(ambientMsg.g(), 1.0f); QCOMPARE(ambientMsg.b(), 0.0f); QCOMPARE(ambientMsg.a(), 1.0f); const gazebo::msgs::Color diffuseMsg = materialMsg.diffuse(); QCOMPARE(diffuseMsg.r(), 0.0f); QCOMPARE(diffuseMsg.g(), 1.0f); QCOMPARE(diffuseMsg.b(), 1.0f); QCOMPARE(diffuseMsg.a(), 0.4f); const gazebo::msgs::Color specularMsg = materialMsg.specular(); QCOMPARE(specularMsg.r(), 1.0f); QCOMPARE(specularMsg.g(), 1.0f); QCOMPARE(specularMsg.b(), 1.0f); QCOMPARE(specularMsg.a(), 0.6f); const gazebo::msgs::Color emissiveMsg = materialMsg.emissive(); QCOMPARE(emissiveMsg.r(), 0.0f); QCOMPARE(emissiveMsg.g(), 0.5f); QCOMPARE(emissiveMsg.b(), 0.2f); QCOMPARE(emissiveMsg.a(), 1.0f); QCOMPARE(materialMsg.lighting(), true); // material::script const gazebo::msgs::Material::Script scriptMsg = materialMsg.script(); QVERIFY(scriptMsg.uri(0) == "test_script_uri_0"); QVERIFY(scriptMsg.uri(1) == "test_script_uri_1"); QVERIFY(scriptMsg.name() == "test_script_name"); } // update fields in the config widget and // verify that the new message contains the updated values. { // visual visualConfigWidget->SetStringWidgetValue("name", "test_visual_updated"); visualConfigWidget->SetUIntWidgetValue("id", 11111u); visualConfigWidget->SetStringWidgetValue("parent_name", "test_visual_parent_updated"); visualConfigWidget->SetUIntWidgetValue("parent_id", 55555u); visualConfigWidget->SetBoolWidgetValue("cast_shadows", false); visualConfigWidget->SetDoubleWidgetValue("transparency", 1.0); visualConfigWidget->SetBoolWidgetValue("visible", false); visualConfigWidget->SetBoolWidgetValue("delete_me", true); visualConfigWidget->SetBoolWidgetValue("is_static", true); visualConfigWidget->SetVector3dWidgetValue("scale", ignition::math::Vector3d(2.0, 1.5, 0.5)); // pose ignition::math::Vector3d pos(-2.0, -3.0, -4.0); ignition::math::Quaterniond quat(0.0, 1.57, 0.0); visualConfigWidget->SetPoseWidgetValue("pose", ignition::math::Pose3d(pos, quat)); // geometry visualConfigWidget->SetGeometryWidgetValue("geometry", "box", ignition::math::Vector3d(5.0, 3.0, 4.0)); // material visualConfigWidget->SetStringWidgetValue("material::normal_map", "test_normal_map_updated"); visualConfigWidget->SetColorWidgetValue("material::ambient", gazebo::common::Color(0.2, 0.3, 0.4, 0.5)); visualConfigWidget->SetColorWidgetValue("material::diffuse", gazebo::common::Color(0.1, 0.8, 0.6, 0.4)); visualConfigWidget->SetColorWidgetValue("material::specular", gazebo::common::Color(0.5, 0.4, 0.3, 0.2)); visualConfigWidget->SetColorWidgetValue("material::emissive", gazebo::common::Color(0.4, 0.6, 0.8, 0.1)); visualConfigWidget->SetBoolWidgetValue("material::lighting", false); // material::script visualConfigWidget->SetStringWidgetValue("material::script::name", "test_script_name_updated"); } // verify widget values { QVERIFY(visualConfigWidget->StringWidgetValue("name") == "test_visual_updated"); QCOMPARE(visualConfigWidget->UIntWidgetValue("id"), 11111u); QVERIFY(visualConfigWidget->StringWidgetValue("parent_name") == "test_visual_parent_updated"); QCOMPARE(visualConfigWidget->UIntWidgetValue("parent_id"), 55555u); QCOMPARE(visualConfigWidget->BoolWidgetValue("cast_shadows"), false); QCOMPARE(visualConfigWidget->DoubleWidgetValue("transparency"), 1.0); QCOMPARE(visualConfigWidget->BoolWidgetValue("visible"), false); QCOMPARE(visualConfigWidget->BoolWidgetValue("delete_me"), true); QCOMPARE(visualConfigWidget->BoolWidgetValue("is_static"), true); QCOMPARE(visualConfigWidget->Vector3dWidgetValue("scale"), ignition::math::Vector3d(2.0, 1.5, 0.5)); // pose ignition::math::Vector3d pos(-2.0, -3.0, -4.0); ignition::math::Quaterniond quat(0.0, 1.57, 0.0); QCOMPARE(visualConfigWidget->PoseWidgetValue("pose"), ignition::math::Pose3d(pos, quat)); // geometry ignition::math::Vector3d dimensions; std::string uri; QVERIFY(visualConfigWidget->GeometryWidgetValue("geometry", dimensions, uri) == "box"); QCOMPARE(dimensions, ignition::math::Vector3d(5.0, 3.0, 4.0)); // material QVERIFY(visualConfigWidget->StringWidgetValue("material::normal_map") == "test_normal_map_updated"); QCOMPARE(visualConfigWidget->ColorWidgetValue("material::ambient"), gazebo::common::Color(0.2, 0.3, 0.4, 0.5)); QCOMPARE(visualConfigWidget->ColorWidgetValue("material::diffuse"), gazebo::common::Color(0.1, 0.8, 0.6, 0.4)); QCOMPARE(visualConfigWidget->ColorWidgetValue("material::specular"), gazebo::common::Color(0.5, 0.4, 0.3, 0.2)); QCOMPARE(visualConfigWidget->ColorWidgetValue("material::emissive"), gazebo::common::Color(0.4, 0.6, 0.8, 0.1)); QCOMPARE(visualConfigWidget->BoolWidgetValue("material::lighting"), false); // material::script QVERIFY(visualConfigWidget->StringWidgetValue("material::script::name") == "test_script_name_updated"); } // verify updates in new msg { gazebo::msgs::Visual *retVisualMsg = dynamic_cast(visualConfigWidget->Msg()); QVERIFY(retVisualMsg != NULL); // visual QVERIFY(retVisualMsg->name() == "test_visual_updated"); QCOMPARE(retVisualMsg->id(), 11111u); QVERIFY(retVisualMsg->parent_name() == "test_visual_parent_updated"); QCOMPARE(retVisualMsg->parent_id(), 55555u); QCOMPARE(retVisualMsg->cast_shadows(), false); QCOMPARE(retVisualMsg->transparency(), 1.0); QCOMPARE(retVisualMsg->visible(), false); QCOMPARE(retVisualMsg->delete_me(), true); QCOMPARE(retVisualMsg->is_static(), true); const gazebo::msgs::Vector3d scaleMsg = retVisualMsg->scale(); QCOMPARE(scaleMsg.x(), 2.0); QCOMPARE(scaleMsg.y(), 1.5); QCOMPARE(scaleMsg.z(), 0.5); // pose const gazebo::msgs::Pose poseMsg = retVisualMsg->pose(); const gazebo::msgs::Vector3d posMsg = poseMsg.position(); QCOMPARE(posMsg.x(), -2.0); QCOMPARE(posMsg.y(), -3.0); QCOMPARE(posMsg.z(), -4.0); const gazebo::msgs::Quaternion quatMsg = poseMsg.orientation(); gazebo::math::Quaternion quat(quatMsg.w(), quatMsg.x(), quatMsg.y(), quatMsg.z()); QCOMPARE(quat.GetAsEuler().x, 0.0); QCOMPARE(quat.GetAsEuler().y, 1.57); QCOMPARE(quat.GetAsEuler().z, 0.0); // geometry const gazebo::msgs::Geometry geometryMsg = retVisualMsg->geometry(); QCOMPARE(geometryMsg.type(), gazebo::msgs::Geometry::BOX); const gazebo::msgs::BoxGeom boxGeomMsg = geometryMsg.box(); const gazebo::msgs::Vector3d boxGeomSizeMsg = boxGeomMsg.size(); QCOMPARE(boxGeomSizeMsg.x(), 5.0); QCOMPARE(boxGeomSizeMsg.y(), 3.0); QCOMPARE(boxGeomSizeMsg.z(), 4.0); // material const gazebo::msgs::Material materialMsg = retVisualMsg->material(); QCOMPARE(materialMsg.shader_type(), gazebo::msgs::Material::Material::VERTEX); QVERIFY(materialMsg.normal_map() == "test_normal_map_updated"); const gazebo::msgs::Color ambientMsg = materialMsg.ambient(); QCOMPARE(ambientMsg.r(), 0.2f); QCOMPARE(ambientMsg.g(), 0.3f); QCOMPARE(ambientMsg.b(), 0.4f); QCOMPARE(ambientMsg.a(), 0.5f); const gazebo::msgs::Color diffuseMsg = materialMsg.diffuse(); QCOMPARE(diffuseMsg.r(), 0.1f); QCOMPARE(diffuseMsg.g(), 0.8f); QCOMPARE(diffuseMsg.b(), 0.6f); QCOMPARE(diffuseMsg.a(), 0.4f); const gazebo::msgs::Color specularMsg = materialMsg.specular(); QCOMPARE(specularMsg.r(), 0.5f); QCOMPARE(specularMsg.g(), 0.4f); QCOMPARE(specularMsg.b(), 0.3f); QCOMPARE(specularMsg.a(), 0.2f); const gazebo::msgs::Color emissiveMsg = materialMsg.emissive(); QCOMPARE(emissiveMsg.r(), 0.4f); QCOMPARE(emissiveMsg.g(), 0.6f); QCOMPARE(emissiveMsg.b(), 0.8f); QCOMPARE(emissiveMsg.a(), 0.1f); QCOMPARE(materialMsg.lighting(), false); // material::script const gazebo::msgs::Material::Script scriptMsg = materialMsg.script(); QVERIFY(scriptMsg.uri(0) == "test_script_uri_0"); QVERIFY(scriptMsg.uri(1) == "test_script_uri_1"); QVERIFY(scriptMsg.name() == "test_script_name_updated"); } delete visualConfigWidget; } ///////////////////////////////////////////////// void ConfigWidget_TEST::PluginMsgWidget() { // create a plugin message with test values gazebo::gui::ConfigWidget *pluginConfigWidget = new gazebo::gui::ConfigWidget; gazebo::msgs::Plugin pluginMsg; { // plugin pluginMsg.set_name("test_plugin"); pluginMsg.set_filename("test_plugin_filename"); pluginMsg.set_innerxml("1\n"); } pluginConfigWidget->Load(&pluginMsg); // retrieve the message from the config widget and // verify that all values have not been changed. { gazebo::msgs::Plugin *retPluginMsg = dynamic_cast(pluginConfigWidget->Msg()); QVERIFY(retPluginMsg != NULL); // plugin QVERIFY(retPluginMsg->name() == "test_plugin"); QVERIFY(retPluginMsg->filename() == "test_plugin_filename"); QVERIFY(retPluginMsg->innerxml() == "1\n"); } // update fields in the config widget and // verify that the new message contains the updated values. { // plugin pluginConfigWidget->SetStringWidgetValue("name", "test_plugin_updated"); pluginConfigWidget->SetStringWidgetValue("filename", "test_plugin_filename_updated"); pluginConfigWidget->SetStringWidgetValue("innerxml", "new_param\n"); } // verify widget values { QVERIFY(pluginConfigWidget->StringWidgetValue("name") == "test_plugin_updated"); QVERIFY(pluginConfigWidget->StringWidgetValue("filename") == "test_plugin_filename_updated"); QVERIFY(pluginConfigWidget->StringWidgetValue("innerxml") == "new_param\n"); } // verify updates in new msg { gazebo::msgs::Plugin *retPluginMsg = dynamic_cast(pluginConfigWidget->Msg()); QVERIFY(retPluginMsg != NULL); // plugin QVERIFY(retPluginMsg->name() == "test_plugin_updated"); QVERIFY(retPluginMsg->filename() == "test_plugin_filename_updated"); QVERIFY(retPluginMsg->innerxml() == "new_param\n"); } delete pluginConfigWidget; } ///////////////////////////////////////////////// void ConfigWidget_TEST::ConfigWidgetVisible() { gazebo::gui::ConfigWidget *visualConfigWidget = new gazebo::gui::ConfigWidget; gazebo::msgs::Visual visualMsg; { // visual visualMsg.set_id(12345u); // pose ignition::math::Vector3d pos(2.0, 3.0, 4.0); ignition::math::Quaterniond quat(1.57, 0.0, 0.0); gazebo::msgs::Set(visualMsg.mutable_pose(), ignition::math::Pose3d(pos, quat)); // geometry gazebo::msgs::Geometry *geometryMsg = visualMsg.mutable_geometry(); geometryMsg->set_type(gazebo::msgs::Geometry::CYLINDER); gazebo::msgs::CylinderGeom *cylinderGeomMsg = geometryMsg->mutable_cylinder(); cylinderGeomMsg->set_radius(3.0); cylinderGeomMsg->set_length(0.2); // material gazebo::msgs::Material *materialMsg = visualMsg.mutable_material(); gazebo::msgs::Set(materialMsg->mutable_ambient(), gazebo::common::Color(0.0, 1.0, 0.0, 1.0)); gazebo::msgs::Set(materialMsg->mutable_diffuse(), gazebo::common::Color(0.0, 1.0, 1.0, 0.4)); // material::script gazebo::msgs::Material::Script *scriptMsg = materialMsg->mutable_script(); scriptMsg->set_name("test_script_name"); } visualConfigWidget->Load(&visualMsg); visualConfigWidget->show(); // set different types of widgets to be not visibile { // primitive widget visualConfigWidget->SetWidgetVisible("id", false); // custom pose message widget visualConfigWidget->SetWidgetVisible("pose", false); // custom geometry message widget visualConfigWidget->SetWidgetVisible("geometry", false); // widget inside a group widget visualConfigWidget->SetWidgetVisible("material::diffuse", false); // widget two levels deep visualConfigWidget->SetWidgetVisible("material::script::name", false); // group widget visualConfigWidget->SetWidgetVisible("material", false); QCOMPARE(visualConfigWidget->WidgetVisible("id"), false); QCOMPARE(visualConfigWidget->WidgetVisible("pose"), false); QCOMPARE(visualConfigWidget->WidgetVisible("geometry"), false); QCOMPARE(visualConfigWidget->WidgetVisible("material::diffuse"), false); QCOMPARE(visualConfigWidget->WidgetVisible("material::script::name"), false); QCOMPARE(visualConfigWidget->WidgetVisible("material"), false); } // set visible back to true { visualConfigWidget->SetWidgetVisible("id", true); visualConfigWidget->SetWidgetVisible("pose", true); visualConfigWidget->SetWidgetVisible("geometry", true); visualConfigWidget->SetWidgetVisible("material::diffuse", true); visualConfigWidget->SetWidgetVisible("material::script::name", true); visualConfigWidget->SetWidgetVisible("material", true); QCOMPARE(visualConfigWidget->WidgetVisible("id"), true); QCOMPARE(visualConfigWidget->WidgetVisible("pose"), true); QCOMPARE(visualConfigWidget->WidgetVisible("geometry"), true); QCOMPARE(visualConfigWidget->WidgetVisible("material::diffuse"), true); QCOMPARE(visualConfigWidget->WidgetVisible("material::script::name"), true); QCOMPARE(visualConfigWidget->WidgetVisible("material"), true); } delete visualConfigWidget; } ///////////////////////////////////////////////// void ConfigWidget_TEST::CustomConfigWidgetReadOnly() { auto configWidget = new gazebo::gui::ConfigWidget; auto configLayout = new QVBoxLayout(); // Create a child widget { auto vecWidget = configWidget->CreateVector3dWidget("vector3d", 0); auto stringWidget = configWidget->CreateStringWidget("string", 0); QVERIFY(configWidget->AddConfigChildWidget("vector3d", vecWidget)); QVERIFY(configWidget->AddConfigChildWidget("string", stringWidget)); auto *childLayout = new QVBoxLayout(); childLayout->addWidget(vecWidget); childLayout->addWidget(stringWidget); auto childWidget = new gazebo::gui::ConfigChildWidget(); childWidget->setLayout(childLayout); auto groupWidget = configWidget->CreateGroupWidget("group", childWidget, 0); configLayout->addWidget(groupWidget); } // Create a custom child widget { auto customLabel = new QLabel("custom label"); customLabel->setObjectName("label"); auto custom1 = new QToolButton(); auto custom2 = new QDoubleSpinBox(); auto custom3 = new QLineEdit(); auto customLayout = new QGridLayout(); customLayout->addWidget(customLabel, 0, 0); customLayout->addWidget(custom1, 0, 1); customLayout->addWidget(custom2, 0, 2); customLayout->addWidget(custom3, 0, 3); auto customLayout2 = new QVBoxLayout(); customLayout2->addLayout(customLayout); auto customWidget = new gazebo::gui::ConfigChildWidget(); customWidget->setLayout(customLayout2); QVERIFY(configWidget->AddConfigChildWidget("custom", customWidget)); auto customGroupWidget = configWidget->CreateGroupWidget("custom group", customWidget, 0); configLayout->addWidget(customGroupWidget); } configWidget->setLayout(configLayout); // set to be read-only { configWidget->SetWidgetReadOnly("vector3d", true); configWidget->SetWidgetReadOnly("string", true); configWidget->SetWidgetReadOnly("custom", true); QCOMPARE(configWidget->WidgetReadOnly("vector3d"), true); QCOMPARE(configWidget->WidgetReadOnly("string"), true); QCOMPARE(configWidget->WidgetReadOnly("custom"), true); { auto childWidgets = configWidget->ConfigChildWidgetByName("custom")-> findChildren(); QCOMPARE(childWidgets.size(), 5); for (auto it : childWidgets) QCOMPARE(it->isEnabled(), false); } } // set read-only back to false { configWidget->SetWidgetReadOnly("vector3d", false); configWidget->SetWidgetReadOnly("string", false); configWidget->SetWidgetReadOnly("custom", false); QCOMPARE(configWidget->WidgetReadOnly("vector3d"), false); QCOMPARE(configWidget->WidgetReadOnly("string"), false); QCOMPARE(configWidget->WidgetReadOnly("custom"), false); { auto childWidgets = configWidget->ConfigChildWidgetByName("custom")-> findChildren(); QCOMPARE(childWidgets.size(), 5); for (auto it : childWidgets) QCOMPARE(it->isEnabled(), true); } } // set read-only back to true { configWidget->SetWidgetReadOnly("vector3d", true); configWidget->SetWidgetReadOnly("string", true); configWidget->SetWidgetReadOnly("custom", true); QCOMPARE(configWidget->WidgetReadOnly("vector3d"), true); QCOMPARE(configWidget->WidgetReadOnly("string"), true); QCOMPARE(configWidget->WidgetReadOnly("custom"), true); { auto childWidgets = configWidget->ConfigChildWidgetByName("custom")-> findChildren(); QCOMPARE(childWidgets.size(), 5); for (auto it : childWidgets) QCOMPARE(it->isEnabled(), false); } } delete configWidget; } ///////////////////////////////////////////////// void ConfigWidget_TEST::ConfigWidgetReadOnly() { gazebo::gui::ConfigWidget *visualConfigWidget = new gazebo::gui::ConfigWidget; gazebo::msgs::Visual visualMsg; { // visual visualMsg.set_id(12345u); // pose ignition::math::Vector3d pos(2.0, 3.0, 4.0); ignition::math::Quaterniond quat(1.57, 0.0, 0.0); gazebo::msgs::Set(visualMsg.mutable_pose(), ignition::math::Pose3d(pos, quat)); // geometry gazebo::msgs::Geometry *geometryMsg = visualMsg.mutable_geometry(); geometryMsg->set_type(gazebo::msgs::Geometry::CYLINDER); gazebo::msgs::CylinderGeom *cylinderGeomMsg = geometryMsg->mutable_cylinder(); cylinderGeomMsg->set_radius(3.0); cylinderGeomMsg->set_length(0.2); // material gazebo::msgs::Material *materialMsg = visualMsg.mutable_material(); gazebo::msgs::Set(materialMsg->mutable_ambient(), gazebo::common::Color(0.0, 1.0, 0.0, 1.0)); gazebo::msgs::Set(materialMsg->mutable_diffuse(), gazebo::common::Color(0.0, 1.0, 1.0, 0.4)); // material::script gazebo::msgs::Material::Script *scriptMsg = materialMsg->mutable_script(); scriptMsg->set_name("test_script_name"); } visualConfigWidget->Load(&visualMsg); // set different types of widgets to be read-only { // primitive widget visualConfigWidget->SetWidgetReadOnly("id", true); // custom pose message widget visualConfigWidget->SetWidgetReadOnly("pose", true); // custom geometry message widget visualConfigWidget->SetWidgetReadOnly("geometry", true); // widget inside a group widget visualConfigWidget->SetWidgetReadOnly("material::diffuse", true); // widget two levels deep visualConfigWidget->SetWidgetReadOnly("material::script::name", true); // group widget visualConfigWidget->SetWidgetReadOnly("material", true); QCOMPARE(visualConfigWidget->WidgetReadOnly("id"), true); QCOMPARE(visualConfigWidget->WidgetReadOnly("pose"), true); QCOMPARE(visualConfigWidget->WidgetReadOnly("geometry"), true); QCOMPARE(visualConfigWidget->WidgetReadOnly("material::diffuse"), true); QCOMPARE(visualConfigWidget->WidgetReadOnly("material::script::name"), true); QCOMPARE(visualConfigWidget->WidgetReadOnly("material"), true); } // set read-only back to false { visualConfigWidget->SetWidgetReadOnly("id", false); visualConfigWidget->SetWidgetReadOnly("pose", false); visualConfigWidget->SetWidgetReadOnly("geometry", false); visualConfigWidget->SetWidgetReadOnly("material::diffuse", false); visualConfigWidget->SetWidgetReadOnly("material::script::name", false); visualConfigWidget->SetWidgetReadOnly("material", false); QCOMPARE(visualConfigWidget->WidgetReadOnly("id"), false); QCOMPARE(visualConfigWidget->WidgetReadOnly("pose"), false); QCOMPARE(visualConfigWidget->WidgetReadOnly("geometry"), false); QCOMPARE(visualConfigWidget->WidgetReadOnly("material::diffuse"), false); QCOMPARE(visualConfigWidget->WidgetReadOnly("material::script::name"), false); QCOMPARE(visualConfigWidget->WidgetReadOnly("material"), false); } delete visualConfigWidget; } ///////////////////////////////////////////////// void ConfigWidget_TEST::CreatedExternally() { gazebo::gui::ConfigWidget *configWidget = new gazebo::gui::ConfigWidget; // Create predefined child widgets gazebo::gui::ConfigChildWidget *uintWidget = configWidget->CreateUIntWidget("uint", 0); gazebo::gui::ConfigChildWidget *intWidget = configWidget->CreateIntWidget("int", 0); gazebo::gui::ConfigChildWidget *doubleWidget = configWidget->CreateDoubleWidget("double", 1); gazebo::gui::ConfigChildWidget *stringWidget = configWidget->CreateStringWidget("string", 1); gazebo::gui::ConfigChildWidget *boolWidget = configWidget->CreateBoolWidget("bool", 2); gazebo::gui::ConfigChildWidget *vector3dWidget = configWidget->CreateVector3dWidget("vector3d", 2); gazebo::gui::ConfigChildWidget *colorWidget = configWidget->CreateColorWidget("color", 3); gazebo::gui::ConfigChildWidget *poseWidget = configWidget->CreatePoseWidget("pose", 3); std::vector enumValues; enumValues.push_back("value1"); enumValues.push_back("value2"); enumValues.push_back("value3"); gazebo::gui::ConfigChildWidget *enumWidget = configWidget->CreateEnumWidget("enum", enumValues, 4); QVERIFY(uintWidget != NULL); QVERIFY(intWidget != NULL); QVERIFY(doubleWidget != NULL); QVERIFY(stringWidget != NULL); QVERIFY(boolWidget != NULL); QVERIFY(vector3dWidget != NULL); QVERIFY(colorWidget != NULL); QVERIFY(poseWidget != NULL); QVERIFY(enumWidget != NULL); // Create a custom child widget QLabel *customLabel = new QLabel("custom label"); QLineEdit *customLineEdit = new QLineEdit(); QHBoxLayout *customLayout = new QHBoxLayout(); customLayout->addWidget(customLabel); customLayout->addWidget(customLineEdit); gazebo::gui::ConfigChildWidget *customWidget = new gazebo::gui::ConfigChildWidget(); customWidget->setLayout(customLayout); customWidget->widgets.push_back(customLineEdit); // Add child widgets to config widget QCOMPARE(configWidget->ConfigChildWidgetCount(), 0u); QVERIFY(configWidget->AddConfigChildWidget("uint", uintWidget)); QVERIFY(configWidget->AddConfigChildWidget("int", intWidget)); QVERIFY(configWidget->AddConfigChildWidget("double", doubleWidget)); QVERIFY(configWidget->AddConfigChildWidget("string", stringWidget)); QVERIFY(configWidget->AddConfigChildWidget("bool", boolWidget)); QVERIFY(configWidget->AddConfigChildWidget("vector3d", vector3dWidget)); QVERIFY(configWidget->AddConfigChildWidget("color", colorWidget)); QVERIFY(configWidget->AddConfigChildWidget("pose", poseWidget)); QVERIFY(configWidget->AddConfigChildWidget("enum", enumWidget)); QVERIFY(configWidget->AddConfigChildWidget("custom", customWidget)); QCOMPARE(configWidget->ConfigChildWidgetCount(), 10u); // Fail to add invalid children QCOMPARE(configWidget->AddConfigChildWidget("", uintWidget), false); QCOMPARE(configWidget->AddConfigChildWidget("validName", NULL), false); QCOMPARE(configWidget->AddConfigChildWidget("uint", intWidget), false); QCOMPARE(configWidget->ConfigChildWidgetCount(), 10u); // Check that checking visibility works QCOMPARE(configWidget->WidgetVisible("uint"), uintWidget->isVisible()); QCOMPARE(configWidget->WidgetVisible("int"), intWidget->isVisible()); QCOMPARE(configWidget->WidgetVisible("double"), doubleWidget->isVisible()); QCOMPARE(configWidget->WidgetVisible("string"), stringWidget->isVisible()); QCOMPARE(configWidget->WidgetVisible("bool"), boolWidget->isVisible()); QCOMPARE(configWidget->WidgetVisible("vector3d"), vector3dWidget->isVisible()); QCOMPARE(configWidget->WidgetVisible("color"), colorWidget->isVisible()); QCOMPARE(configWidget->WidgetVisible("pose"), poseWidget->isVisible()); QCOMPARE(configWidget->WidgetVisible("enum"), enumWidget->isVisible()); QCOMPARE(configWidget->WidgetVisible("custom"), customWidget->isVisible()); // Set widgets values unsigned int uintValue = 123; int intValue = -456; double doubleValue = 123.456; std::string stringValue("123"); bool boolValue = true; ignition::math::Vector3d vector3dValue(1, 2, 3); gazebo::common::Color colorValue(0.1, 0.2, 0.3, 0.4); ignition::math::Pose3d poseValue(1, 2, 3, 0.1, 0.2, 0.3); std::string enumValue("value2"); std::string customValue("123456789"); QVERIFY(configWidget->SetUIntWidgetValue("uint", uintValue)); QVERIFY(configWidget->SetIntWidgetValue("int", intValue)); QVERIFY(configWidget->SetDoubleWidgetValue("double", doubleValue)); QVERIFY(configWidget->SetStringWidgetValue("string", stringValue)); QVERIFY(configWidget->SetBoolWidgetValue("bool", boolValue)); QVERIFY(configWidget->SetVector3dWidgetValue("vector3d", ignition::math::Vector3d(vector3dValue))); QVERIFY(configWidget->SetColorWidgetValue("color", colorValue)); QVERIFY(configWidget->SetPoseWidgetValue("pose", poseValue)); QVERIFY(configWidget->SetEnumWidgetValue("enum", enumValue)); QVERIFY(configWidget->SetStringWidgetValue("custom", customValue)); // Get widgets values QCOMPARE(configWidget->UIntWidgetValue("uint"), uintValue); QCOMPARE(configWidget->IntWidgetValue("int"), intValue); QCOMPARE(configWidget->DoubleWidgetValue("double"), doubleValue); QCOMPARE(configWidget->StringWidgetValue("string"), stringValue); QCOMPARE(configWidget->BoolWidgetValue("bool"), boolValue); QCOMPARE(configWidget->Vector3dWidgetValue("vector3d"), ignition::math::Vector3d(vector3dValue)); QCOMPARE(configWidget->ColorWidgetValue("color"), colorValue); QCOMPARE(configWidget->PoseWidgetValue("pose"), ignition::math::Pose3d(poseValue)); QCOMPARE(configWidget->EnumWidgetValue("enum"), enumValue); QCOMPARE(configWidget->StringWidgetValue("custom"), customValue); // Group some widgets QVBoxLayout *groupLayout = new QVBoxLayout(); groupLayout->addWidget(uintWidget); groupLayout->addWidget(intWidget); groupLayout->addWidget(doubleWidget); QGroupBox *groupBox = new QGroupBox(); groupBox->setLayout(groupLayout); QVBoxLayout *groupChildWidgetLayout = new QVBoxLayout(); groupChildWidgetLayout->addWidget(groupBox); gazebo::gui::ConfigChildWidget *groupChildWidget = new gazebo::gui::ConfigChildWidget(); groupChildWidget->setLayout(groupChildWidgetLayout); groupChildWidget->widgets.push_back(groupBox); gazebo::gui::GroupWidget *groupWidget = configWidget->CreateGroupWidget("groupWidget", groupChildWidget, 0); QVERIFY(groupWidget != NULL); QVERIFY(groupWidget->childWidget != NULL); } ///////////////////////////////////////////////// void ConfigWidget_TEST::EnumConfigWidget() { // Create a parent widget gazebo::gui::ConfigWidget *configWidget = new gazebo::gui::ConfigWidget(); QVERIFY(configWidget != NULL); // Create an enum child widget std::vector enumValues; enumValues.push_back("value1"); enumValues.push_back("value2"); enumValues.push_back("value3"); gazebo::gui::ConfigChildWidget *enumWidget = configWidget->CreateEnumWidget("Enum Label", enumValues); QVERIFY(enumWidget != NULL); // Add it to parent QVERIFY(configWidget->AddConfigChildWidget("enumWidgetName", enumWidget)); // Check that all items can be selected QVERIFY(configWidget->SetEnumWidgetValue("enumWidgetName", "value1")); QVERIFY(configWidget->SetEnumWidgetValue("enumWidgetName", "value2")); QVERIFY(configWidget->SetEnumWidgetValue("enumWidgetName", "value3")); // Check that an inexistent item cannot be selected QVERIFY(configWidget->SetEnumWidgetValue("enumWidgetName", "value4") == false); // Check the number of items QComboBox *comboBox = enumWidget->findChild(); QVERIFY(comboBox != NULL); QCOMPARE(comboBox->count(), 3); // Add an item and check count QVERIFY(configWidget->AddItemEnumWidget("enumWidgetName", "value4")); QCOMPARE(comboBox->count(), 4); // Check that the new item can be selected QVERIFY(configWidget->SetEnumWidgetValue("enumWidgetName", "value4")); // Remove an item and check count QVERIFY(configWidget->RemoveItemEnumWidget("enumWidgetName", "value2")); QCOMPARE(comboBox->count(), 3); // Check that the removed item cannot be selected QVERIFY(configWidget->SetEnumWidgetValue("enumWidgetName", "value2") == false); // Clear all items and check count QVERIFY(configWidget->ClearEnumWidget("enumWidgetName")); QCOMPARE(comboBox->count(), 0); // Check that none of the previous items can be selected QVERIFY(configWidget->SetEnumWidgetValue("enumWidgetName", "value1") == false); QVERIFY(configWidget->SetEnumWidgetValue("enumWidgetName", "value2") == false); QVERIFY(configWidget->SetEnumWidgetValue("enumWidgetName", "value3") == false); QVERIFY(configWidget->SetEnumWidgetValue("enumWidgetName", "value4") == false); } ///////////////////////////////////////////////// void ConfigWidget_TEST::ChildUIntSignal() { gazebo::gui::ConfigWidget *configWidget = new gazebo::gui::ConfigWidget; // Create child uint widget gazebo::gui::ConfigChildWidget *uintWidget = configWidget->CreateUIntWidget("uint"); QVERIFY(uintWidget != NULL); // Add to config widget QVERIFY(configWidget->AddConfigChildWidget("uint", uintWidget)); // Connect signals connect(configWidget, SIGNAL(UIntValueChanged(const QString, uint)), this, SLOT(OnUIntValueChanged(const QString, uint))); // Check default uint QVERIFY(configWidget->UIntWidgetValue("uint") == 0u); // Get signal emitting widgets QList spins = uintWidget->findChildren(); QCOMPARE(spins.size(), 1); // Change the value and check new uint at OnUIntValueChanged spins[0]->setValue(3); QTest::keyClick(spins[0], Qt::Key_Enter); QVERIFY(g_uIntSignalReceived == true); delete configWidget; } ///////////////////////////////////////////////// void ConfigWidget_TEST::OnUIntValueChanged(const QString &_name, const unsigned int _uint) { QVERIFY(_name == "uint"); QVERIFY(_uint == 3); g_uIntSignalReceived = true; } ///////////////////////////////////////////////// void ConfigWidget_TEST::ChildIntSignal() { gazebo::gui::ConfigWidget *configWidget = new gazebo::gui::ConfigWidget; // Create child int widget gazebo::gui::ConfigChildWidget *intWidget = configWidget->CreateIntWidget("int"); QVERIFY(intWidget != NULL); // Add to config widget QVERIFY(configWidget->AddConfigChildWidget("int", intWidget)); // Connect signals connect(configWidget, SIGNAL(IntValueChanged(const QString, int)), this, SLOT(OnIntValueChanged(const QString, int))); // Check default int QCOMPARE(configWidget->IntWidgetValue("int"), 0); // Get signal emitting widgets QList spins = intWidget->findChildren(); QCOMPARE(spins.size(), 1); // Change the value and check new int at OnIntValueChanged spins[0]->setValue(-2); QTest::keyClick(spins[0], Qt::Key_Enter); QVERIFY(g_intSignalReceived == true); delete configWidget; } ///////////////////////////////////////////////// void ConfigWidget_TEST::OnIntValueChanged(const QString &_name, const int _int) { QVERIFY(_name == "int"); QVERIFY(_int == -2); g_intSignalReceived = true; } ///////////////////////////////////////////////// void ConfigWidget_TEST::ChildDoubleSignal() { gazebo::gui::ConfigWidget *configWidget = new gazebo::gui::ConfigWidget; // Create child double widget gazebo::gui::ConfigChildWidget *doubleWidget = configWidget->CreateDoubleWidget("double"); QVERIFY(doubleWidget != NULL); // Add to config widget QVERIFY(configWidget->AddConfigChildWidget("double", doubleWidget)); // Connect signals connect(configWidget, SIGNAL(DoubleValueChanged(const QString, double)), this, SLOT(OnDoubleValueChanged(const QString, double))); // Check default double QCOMPARE(configWidget->DoubleWidgetValue("double"), 0.0); // Get signal emitting widgets QList spins = doubleWidget->findChildren(); QCOMPARE(spins.size(), 1); // Change the value and check new double at OnDoubleValueChanged spins[0]->setValue(1.5); QTest::keyClick(spins[0], Qt::Key_Enter); QVERIFY(g_doubleSignalReceived == true); delete configWidget; } ///////////////////////////////////////////////// void ConfigWidget_TEST::OnDoubleValueChanged(const QString &_name, const double _double) { QVERIFY(_name == "double"); QVERIFY(fabs(_double - 1.5) < 0.00001); g_doubleSignalReceived = true; } ///////////////////////////////////////////////// void ConfigWidget_TEST::ChildBoolSignal() { gazebo::gui::ConfigWidget *configWidget = new gazebo::gui::ConfigWidget; // Create child bool widget gazebo::gui::ConfigChildWidget *boolWidget = configWidget->CreateBoolWidget("bool"); QVERIFY(boolWidget != NULL); // Add to config widget QVERIFY(configWidget->AddConfigChildWidget("bool", boolWidget)); // Connect signals connect(configWidget, SIGNAL(BoolValueChanged(const QString, bool)), this, SLOT(OnBoolValueChanged(const QString, bool))); // Check default bool QCOMPARE(configWidget->BoolWidgetValue("bool"), false); // Get signal emitting widgets QList radios = boolWidget->findChildren(); QCOMPARE(radios.size(), 2); // Change the value and check new bool at OnBoolValueChanged radios[0]->setChecked(true); radios[1]->setChecked(false); QTest::keyClick(radios[0], Qt::Key_Enter); QVERIFY(g_boolSignalReceived == true); delete configWidget; } ///////////////////////////////////////////////// void ConfigWidget_TEST::OnBoolValueChanged(const QString &_name, const bool _bool) { QVERIFY(_name == "bool"); QVERIFY(_bool == true); g_boolSignalReceived = true; } ///////////////////////////////////////////////// void ConfigWidget_TEST::ChildStringSignal() { gazebo::gui::ConfigWidget *configWidget = new gazebo::gui::ConfigWidget; // Create child string widget gazebo::gui::ConfigChildWidget *stringWidget = configWidget->CreateStringWidget("string"); QVERIFY(stringWidget != NULL); // Add to config widget QVERIFY(configWidget->AddConfigChildWidget("string", stringWidget)); // Connect signals connect(configWidget, SIGNAL(StringValueChanged(const QString, std::string)), this, SLOT(OnStringValueChanged(const QString, std::string))); // Check default string QVERIFY(configWidget->StringWidgetValue("string") == ""); // Get signal emitting widgets QList lineEdits = stringWidget->findChildren(); QCOMPARE(lineEdits.size(), 1); // Change the value and check new string at OnStringValueChanged lineEdits[0]->setText("new text"); QTest::keyClick(lineEdits[0], Qt::Key_Enter); QVERIFY(g_stringSignalReceived == true); delete configWidget; } ///////////////////////////////////////////////// void ConfigWidget_TEST::OnStringValueChanged(const QString &_name, const std::string &_string) { QVERIFY(_name == "string"); QVERIFY(_string == "new text"); g_stringSignalReceived = true; } ///////////////////////////////////////////////// void ConfigWidget_TEST::ChildVector3dSignal() { gazebo::gui::ConfigWidget *configWidget = new gazebo::gui::ConfigWidget; // Create child vector3 widget gazebo::gui::ConfigChildWidget *vector3Widget = configWidget->CreateVector3dWidget("vector3"); QVERIFY(vector3Widget != NULL); // Add to config widget QVERIFY(configWidget->AddConfigChildWidget("vector3", vector3Widget)); // Connect signals connect(configWidget, SIGNAL(Vector3dValueChanged(const QString, ignition::math::Vector3d)), this, SLOT(OnVector3dValueChanged(const QString, ignition::math::Vector3d))); // Check default vector3 QVERIFY(configWidget->Vector3dWidgetValue("vector3") == ignition::math::Vector3d()); // Get axes spins QList spins = vector3Widget->findChildren(); QCOMPARE(spins.size(), 3); // Get preset combo auto combos = vector3Widget->findChildren(); QCOMPARE(combos.size(), 1); // Change the X value and check new vector3 at OnVector3dValueChanged QVERIFY(g_vector3SignalCount == 0); spins[0]->setValue(2.5); QTest::keyClick(spins[0], Qt::Key_Enter); QVERIFY(g_vector3SignalCount == 1); // Change the preset value and check new vector3 at OnVector3dValueChanged combos[0]->setCurrentIndex(4); QTest::keyClick(combos[0], Qt::Key_Enter); QVERIFY(g_vector3SignalCount == 2); delete configWidget; } ///////////////////////////////////////////////// void ConfigWidget_TEST::OnVector3dValueChanged(const QString &_name, const ignition::math::Vector3d &_vector3) { QVERIFY(_name == "vector3"); // From spins if (g_vector3SignalCount == 0) { QVERIFY(_vector3 == ignition::math::Vector3d(2.5, 0, 0)); g_vector3SignalCount++; } // From preset combo else if (g_vector3SignalCount == 1) { QVERIFY(_vector3 == ignition::math::Vector3d(0, -1, 0)); g_vector3SignalCount++; } } ///////////////////////////////////////////////// void ConfigWidget_TEST::ChildColorSignal() { gazebo::gui::ConfigWidget *configWidget = new gazebo::gui::ConfigWidget; // Create child color widget gazebo::gui::ConfigChildWidget *colorWidget = configWidget->CreateColorWidget("color"); QVERIFY(colorWidget != NULL); // Add to config widget QVERIFY(configWidget->AddConfigChildWidget("color", colorWidget)); // Connect signals connect(configWidget, SIGNAL(ColorValueChanged(const QString, const gazebo::common::Color)), this, SLOT(OnColorValueChanged(const QString, const gazebo::common::Color))); // Check default color QVERIFY(configWidget->ColorWidgetValue("color") == gazebo::common::Color()); // Get signal emitting widgets QList spins = colorWidget->findChildren(); QCOMPARE(spins.size(), 4); // Change the X value and check new color at OnColorValueChanged spins[0]->setValue(0.5); QTest::keyClick(spins[0], Qt::Key_Enter); QVERIFY(g_colorSignalReceived == true); delete configWidget; } ///////////////////////////////////////////////// void ConfigWidget_TEST::OnColorValueChanged(const QString &_name, const gazebo::common::Color &_color) { QVERIFY(_name == "color"); QVERIFY(_color == gazebo::common::Color(0.5, 0.0, 0.0, 0.0)); g_colorSignalReceived = true; } ///////////////////////////////////////////////// void ConfigWidget_TEST::ChildPoseSignal() { gazebo::gui::ConfigWidget *configWidget = new gazebo::gui::ConfigWidget; // Create child pose widget gazebo::gui::ConfigChildWidget *poseWidget = configWidget->CreatePoseWidget("pose"); QVERIFY(poseWidget != NULL); // Add to config widget QVERIFY(configWidget->AddConfigChildWidget("pose", poseWidget)); // Connect signals connect(configWidget, SIGNAL(PoseValueChanged(const QString, const ignition::math::Pose3d)), this, SLOT(OnPoseValueChanged(const QString, const ignition::math::Pose3d))); // Check default pose QVERIFY(configWidget->PoseWidgetValue("pose") == ignition::math::Pose3d()); // Get signal emitting widgets QList spins = poseWidget->findChildren(); QCOMPARE(spins.size(), 6); // Change the X value and check new pose at OnPoseValueChanged spins[0]->setValue(1.0); QTest::keyClick(spins[0], Qt::Key_Enter); QVERIFY(g_poseSignalReceived == true); delete configWidget; } ///////////////////////////////////////////////// void ConfigWidget_TEST::OnPoseValueChanged(const QString &_name, const ignition::math::Pose3d &_value) { QVERIFY(_name == "pose"); QVERIFY(_value == ignition::math::Pose3d(1, 0, 0, 0, 0, 0)); g_poseSignalReceived = true; } ///////////////////////////////////////////////// void ConfigWidget_TEST::ChildGeometrySignal() { gazebo::gui::ConfigWidget *configWidget = new gazebo::gui::ConfigWidget; // Create child widget gazebo::gui::ConfigChildWidget *geometryWidget = configWidget->CreateGeometryWidget("geometry"); QVERIFY(geometryWidget != NULL); // Add to config widget QVERIFY(configWidget->AddConfigChildWidget("geometry", geometryWidget)); // Connect signals connect(configWidget, SIGNAL(GeometryValueChanged(const std::string &, const std::string &, const ignition::math::Vector3d &, const std::string &)), this, SLOT(OnGeometryValueChanged(const std::string &, const std::string &, const ignition::math::Vector3d &, const std::string &))); // Check default ignition::math::Vector3d dimensions; std::string uri; std::string value = configWidget->GeometryWidgetValue("geometry", dimensions, uri); QVERIFY(value == "box"); QVERIFY(dimensions == ignition::math::Vector3d(1, 1, 1)); QVERIFY(uri == ""); // Get signal emitting widgets QList spins = geometryWidget->findChildren(); QCOMPARE(spins.size(), 5); // Change the value and check new pose at OnGeometryValueChanged spins[2]->setValue(2.0); QTest::keyClick(spins[2], Qt::Key_Enter); QVERIFY(g_geometrySignalReceived == true); delete configWidget; } ///////////////////////////////////////////////// void ConfigWidget_TEST::OnGeometryValueChanged(const std::string &_name, const std::string &_value, const ignition::math::Vector3d &_dimensions, const std::string &_uri) { QVERIFY(_name == "geometry"); QVERIFY(_value == "box"); QVERIFY(_dimensions == ignition::math::Vector3d(2, 1, 1)); QVERIFY(_uri == ""); g_geometrySignalReceived = true; } ///////////////////////////////////////////////// void ConfigWidget_TEST::ChildEnumSignal() { gazebo::gui::ConfigWidget *configWidget = new gazebo::gui::ConfigWidget; // Create child pose widget std::vector enumValues; enumValues.push_back("value1"); enumValues.push_back("value2"); enumValues.push_back("value3"); gazebo::gui::ConfigChildWidget *enumWidget = configWidget->CreateEnumWidget("enum", enumValues); QVERIFY(enumWidget != NULL); // Add to config widget QVERIFY(configWidget->AddConfigChildWidget("enum", enumWidget)); // Connect signals connect(configWidget, SIGNAL(EnumValueChanged(const QString, const QString)), this, SLOT(OnEnumValueChanged(const QString, const QString))); // Check default pose QVERIFY(configWidget->EnumWidgetValue("enum") == "value1"); // Get signal emitting widgets QList comboBoxes = enumWidget->findChildren(); QCOMPARE(comboBoxes.size(), 1); // Change the value and check new pose at OnPoseValueChanged comboBoxes[0]->setCurrentIndex(2); QTest::keyClick(comboBoxes[0], Qt::Key_Enter); QVERIFY(g_enumSignalReceived == true); delete configWidget; } ///////////////////////////////////////////////// void ConfigWidget_TEST::OnEnumValueChanged(const QString &_name, const QString &_value) { QVERIFY(_name == "enum"); QVERIFY(_value == "value3"); g_enumSignalReceived = true; } ///////////////////////////////////////////////// void ConfigWidget_TEST::GetChildWidgetByName() { // Create config widget and check it has no children gazebo::gui::ConfigWidget *configWidget = new gazebo::gui::ConfigWidget; QVERIFY(configWidget != NULL); QCOMPARE(configWidget->ConfigChildWidgetCount(), 0u); // Try to get a child widget by name gazebo::gui::ConfigChildWidget *widget = configWidget->ConfigChildWidgetByName("child_widget"); QVERIFY(widget == NULL); widget = configWidget->ConfigChildWidgetByName(""); QVERIFY(widget == NULL); // Create child widget gazebo::gui::ConfigChildWidget *childWidget = configWidget->CreateBoolWidget("child_widget"); QVERIFY(childWidget != NULL); // Add to config widget QVERIFY(configWidget->AddConfigChildWidget("child_widget", childWidget)); QCOMPARE(configWidget->ConfigChildWidgetCount(), 1u); // Get the widget by name widget = configWidget->ConfigChildWidgetByName("child_widget"); QVERIFY(widget != NULL); // Check that a bad name returns NULL widget = configWidget->ConfigChildWidgetByName("bad_name"); QVERIFY(widget == NULL); delete configWidget; } // Generate a main function for the test QTEST_MAIN(ConfigWidget_TEST)