pxmlw6n2f/Gazebo_Distributed_TCP/gazebo/gui/model/ModelCreator_TEST.cc

708 lines
22 KiB
C++

/*
* Copyright (C) 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 "gazebo/gui/Actions.hh"
#include "gazebo/gui/GuiIface.hh"
#include "gazebo/gui/GLWidget.hh"
#include "gazebo/gui/MainWindow.hh"
#include "gazebo/gui/model/ModelData.hh"
#include "gazebo/gui/model/ModelEditorEvents.hh"
#include "gazebo/gui/model/ModelCreator.hh"
#include "gazebo/gui/model/ModelCreator_TEST.hh"
using namespace gazebo;
/////////////////////////////////////////////////
std::string NestedModelSDFString()
{
// nested model - two top level links, one joint, and a nested model
std::stringstream nestedModelSdfStream;
nestedModelSdfStream << "<sdf version='" << SDF_VERSION << "'>"
<< "<model name ='model_00'>"
<< " <pose>0 0 1 0 0 0</pose>"
<< " <link name ='link_00'>"
<< " <pose>1 0 0 0 0 0</pose>"
<< " <collision name ='collision_01'>"
<< " <geometry>"
<< " <box><size>1 1 1</size></box>"
<< " </geometry>"
<< " </collision>"
<< " <visual name ='visual_01'>"
<< " <geometry>"
<< " <box><size>1 1 1</size></box>"
<< " </geometry>"
<< " </visual>"
<< " </link>"
<< " <link name ='link_01'>"
<< " <pose>-1 0 0 0 0 0</pose>"
<< " <collision name ='collision_02'>"
<< " <geometry>"
<< " <cylinder>"
<< " <radius>0.5</radius>"
<< " <length>1.0</length>"
<< " </cylinder>"
<< " </geometry>"
<< " </collision>"
<< " <visual name ='visual_02'>"
<< " <geometry>"
<< " <cylinder>"
<< " <radius>0.5</radius>"
<< " <length>1.0</length>"
<< " </cylinder>"
<< " </geometry>"
<< " </visual>"
<< " </link>"
<< " <joint name ='joint_01' type='prismatic'>"
<< " <pose>0 1 0 0 0 0</pose>"
<< " <parent>link_00</parent>"
<< " <child>link_01</child>"
<< " <axis>"
<< " <xyz>0 0 1</xyz>"
<< " </axis>"
<< " </joint>"
<< " <model name ='model_01'>"
<< " <pose>0 1 0 0 0 0</pose>"
<< " <link name ='link_01'>"
<< " <pose>1 0 0 0 0 0</pose>"
<< " <collision name ='collision_01'>"
<< " <geometry>"
<< " <box><size>1 1 1</size></box>"
<< " </geometry>"
<< " </collision>"
<< " <visual name ='visual_01'>"
<< " <geometry>"
<< " <box><size>1 1 1</size></box>"
<< " </geometry>"
<< " </visual>"
<< " </link>"
<< " </model>"
<< "</model>"
<< "</sdf>";
return nestedModelSdfStream.str();
}
/////////////////////////////////////////////////
void ModelCreator_TEST::NestedModel()
{
this->resMaxPercentChange = 5.0;
this->shareMaxPercentChange = 2.0;
this->Load("worlds/empty.world", false, false, false);
// Create the main window.
gazebo::gui::MainWindow *mainWindow = new gazebo::gui::MainWindow();
QVERIFY(mainWindow != NULL);
mainWindow->Load();
mainWindow->Init();
mainWindow->show();
this->ProcessEventsAndDraw(mainWindow);
// Get the user camera and scene
gazebo::rendering::UserCameraPtr cam = gazebo::gui::get_active_camera();
QVERIFY(cam != NULL);
gazebo::rendering::ScenePtr scene = cam->GetScene();
QVERIFY(scene != NULL);
// Create a model creator
gui::ModelCreator *modelCreator = new gui::ModelCreator();
QVERIFY(modelCreator != NULL);
// Create a box model and add it to the model creator
double mass = 1.0;
ignition::math::Vector3d size = ignition::math::Vector3d::One;
msgs::Model model;
model.set_name("box_model");
msgs::AddBoxLink(model, mass, size);
sdf::ElementPtr boxModelSDF = msgs::ModelToSDF(model);
modelCreator->AddEntity(boxModelSDF);
// Verify it has been added
gazebo::rendering::VisualPtr boxModelVis =
scene->GetVisual("ModelPreview_0_0::box_model");
QVERIFY(boxModelVis != NULL);
QCOMPARE(2u, boxModelVis->GetDepth());
// test loading nested model from sdf
sdf::ElementPtr modelSDF(new sdf::Element);
sdf::initFile("model.sdf", modelSDF);
sdf::readString(NestedModelSDFString(), modelSDF);
modelCreator->AddEntity(modelSDF);
// verify the model with joint has been added
gazebo::rendering::VisualPtr modelVis =
scene->GetVisual("ModelPreview_0_0::model_00");
QVERIFY(modelVis != NULL);
QCOMPARE(2u, modelVis->GetDepth());
gazebo::rendering::VisualPtr link00Vis =
scene->GetVisual("ModelPreview_0_0::model_00::link_00");
QVERIFY(link00Vis != NULL);
QCOMPARE(3u, link00Vis->GetDepth());
gazebo::rendering::VisualPtr link01Vis =
scene->GetVisual("ModelPreview_0_0::model_00::link_01");
QVERIFY(link01Vis != NULL);
QCOMPARE(3u, link01Vis->GetDepth());
gazebo::rendering::VisualPtr model01Vis =
scene->GetVisual("ModelPreview_0_0::model_00::model_01");
QVERIFY(model01Vis != NULL);
QCOMPARE(3u, model01Vis->GetDepth());
// remove box model and verify
modelCreator->RemoveEntity(boxModelVis->GetName());
boxModelVis = scene->GetVisual("ModelPreview_0_0::box_model");
QVERIFY(boxModelVis == NULL);
// remove nested model and verify
modelCreator->RemoveEntity(modelVis->GetName());
modelVis = scene->GetVisual("ModelPreview_0_0::model_00");
QVERIFY(modelVis == NULL);
link00Vis = scene->GetVisual("ModelPreview_0_0::model_00::link_00");
QVERIFY(link00Vis == NULL);
link01Vis = scene->GetVisual("ModelPreview_0_0::model_00::link_01");
QVERIFY(link01Vis == NULL);
model01Vis = scene->GetVisual("ModelPreview_0_0::model_00::model_01");
QVERIFY(model01Vis == NULL);
delete modelCreator;
modelCreator = NULL;
mainWindow->close();
delete mainWindow;
mainWindow = NULL;
}
/////////////////////////////////////////////////
void ModelCreator_TEST::SaveState()
{
this->resMaxPercentChange = 5.0;
this->shareMaxPercentChange = 2.0;
this->Load("worlds/empty.world", false, false, false);
// Create the main window.
gazebo::gui::MainWindow *mainWindow = new gazebo::gui::MainWindow();
QVERIFY(mainWindow != NULL);
mainWindow->Load();
mainWindow->Init();
mainWindow->show();
this->ProcessEventsAndDraw(mainWindow);
// Get the user camera and scene
gazebo::rendering::UserCameraPtr cam = gazebo::gui::get_active_camera();
QVERIFY(cam != NULL);
gazebo::rendering::ScenePtr scene = cam->GetScene();
QVERIFY(scene != NULL);
// Start never saved
gui::ModelCreator *modelCreator = new gui::ModelCreator();
QCOMPARE(modelCreator->CurrentSaveState(), gui::ModelCreator::NEVER_SAVED);
// Inserting a link and it still is never saved
modelCreator->AddShape(gui::ModelCreator::ENTITY_CYLINDER);
gazebo::rendering::VisualPtr cylinder =
scene->GetVisual("ModelPreview_0_0::link_0");
QVERIFY(cylinder != NULL);
QCOMPARE(modelCreator->CurrentSaveState(),
gui::ModelCreator::NEVER_SAVED);
// Save all changes
modelCreator->SaveModelFiles();
QCOMPARE(modelCreator->CurrentSaveState(),
gui::ModelCreator::ALL_SAVED);
// Insert another link to have unsaved changes
modelCreator->AddShape(gui::ModelCreator::ENTITY_BOX);
QCOMPARE(modelCreator->CurrentSaveState(),
gui::ModelCreator::UNSAVED_CHANGES);
// Save all changes
modelCreator->SaveModelFiles();
QCOMPARE(modelCreator->CurrentSaveState(),
gui::ModelCreator::ALL_SAVED);
// Move a link to have unsaved changes
cylinder->SetWorldPose(math::Pose(1, 2, 3, 4, 5, 6));
this->ProcessEventsAndDraw(mainWindow);
QCOMPARE(modelCreator->CurrentSaveState(),
gui::ModelCreator::UNSAVED_CHANGES);
// Save all changes
modelCreator->SaveModelFiles();
QCOMPARE(modelCreator->CurrentSaveState(),
gui::ModelCreator::ALL_SAVED);
// Remove a link to have unsaved changes
modelCreator->RemoveEntity(cylinder->GetName());
QCOMPARE(modelCreator->CurrentSaveState(),
gui::ModelCreator::UNSAVED_CHANGES);
// Save all changes
modelCreator->SaveModelFiles();
QCOMPARE(modelCreator->CurrentSaveState(),
gui::ModelCreator::ALL_SAVED);
delete modelCreator;
modelCreator = NULL;
mainWindow->close();
delete mainWindow;
mainWindow = NULL;
}
/////////////////////////////////////////////////
void ModelCreator_TEST::Selection()
{
this->resMaxPercentChange = 5.0;
this->shareMaxPercentChange = 2.0;
this->Load("worlds/empty.world", false, false, false);
// Create the main window.
gazebo::gui::MainWindow *mainWindow = new gazebo::gui::MainWindow();
QVERIFY(mainWindow != NULL);
mainWindow->Load();
mainWindow->Init();
mainWindow->show();
this->ProcessEventsAndDraw(mainWindow);
// Get the user camera and scene
gazebo::rendering::UserCameraPtr cam = gazebo::gui::get_active_camera();
QVERIFY(cam != NULL);
gazebo::rendering::ScenePtr scene = cam->GetScene();
QVERIFY(scene != NULL);
// Start never saved
gui::ModelCreator *modelCreator = new gui::ModelCreator();
QVERIFY(modelCreator);
// Inserting a few links
modelCreator->AddShape(gui::ModelCreator::ENTITY_CYLINDER);
gazebo::rendering::VisualPtr cylinder =
scene->GetVisual("ModelPreview_0_0::link_0");
QVERIFY(cylinder != NULL);
modelCreator->AddShape(gui::ModelCreator::ENTITY_BOX);
gazebo::rendering::VisualPtr box =
scene->GetVisual("ModelPreview_0_0::link_1");
QVERIFY(box != NULL);
modelCreator->AddShape(gui::ModelCreator::ENTITY_SPHERE);
gazebo::rendering::VisualPtr sphere =
scene->GetVisual("ModelPreview_0_0::link_2");
QVERIFY(sphere != NULL);
// verify initial selected state
QVERIFY(!cylinder->GetHighlighted());
QVERIFY(!box->GetHighlighted());
QVERIFY(!sphere->GetHighlighted());
// select the shapes and verify that they are selected
modelCreator->SetSelected(cylinder, true);
QVERIFY(cylinder->GetHighlighted());
modelCreator->SetSelected(box, true);
QVERIFY(box->GetHighlighted());
modelCreator->SetSelected(sphere, true);
QVERIFY(sphere->GetHighlighted());
// deselect and verify
modelCreator->SetSelected(cylinder, false);
QVERIFY(!cylinder->GetHighlighted());
modelCreator->SetSelected(box, false);
QVERIFY(!box->GetHighlighted());
modelCreator->SetSelected(sphere, false);
QVERIFY(!sphere->GetHighlighted());
// select one and verify all
modelCreator->SetSelected(cylinder, true);
QVERIFY(cylinder->GetHighlighted());
QVERIFY(!box->GetHighlighted());
QVERIFY(!sphere->GetHighlighted());
delete modelCreator;
modelCreator = NULL;
mainWindow->close();
delete mainWindow;
mainWindow = NULL;
}
/////////////////////////////////////////////////
void ModelCreator_TEST::ModelPlugin()
{
this->resMaxPercentChange = 5.0;
this->shareMaxPercentChange = 2.0;
this->Load("worlds/empty.world", false, false, false);
// Create the main window.
gazebo::gui::MainWindow *mainWindow = new gazebo::gui::MainWindow();
QVERIFY(mainWindow != NULL);
mainWindow->Load();
mainWindow->Init();
mainWindow->show();
this->ProcessEventsAndDraw(mainWindow);
// Get the user camera and scene
gazebo::rendering::UserCameraPtr cam = gazebo::gui::get_active_camera();
QVERIFY(cam != NULL);
gazebo::rendering::ScenePtr scene = cam->GetScene();
QVERIFY(scene != NULL);
// Start never saved
gui::ModelCreator *modelCreator = new gui::ModelCreator();
QVERIFY(modelCreator);
// Inserting a few links
modelCreator->AddShape(gui::ModelCreator::ENTITY_CYLINDER);
gazebo::rendering::VisualPtr cylinder =
scene->GetVisual("ModelPreview_0_0::link_0");
QVERIFY(cylinder != NULL);
// add model plugin
modelCreator->OnAddModelPlugin("test_name", "test_filename",
"<data>test</data>");
gazebo::gui::ModelPluginData *modelPluginData =
modelCreator->ModelPlugin("test_name");
QVERIFY(modelPluginData != NULL);
sdf::ElementPtr modelPluginSDF = modelPluginData->modelPluginSDF;
QCOMPARE(modelPluginSDF->Get<std::string>("name"), std::string("test_name"));
QCOMPARE(modelPluginSDF->Get<std::string>("filename"),
std::string("test_filename"));
QVERIFY(modelPluginSDF->HasElement("data"));
QCOMPARE(modelPluginSDF->Get<std::string>("data"), std::string("test"));
// remove the model plugin
modelCreator->RemoveModelPlugin("test_name");
modelPluginData = modelCreator->ModelPlugin("test_name");
QVERIFY(modelPluginData == NULL);
delete modelCreator;
modelCreator = NULL;
mainWindow->close();
delete mainWindow;
mainWindow = NULL;
}
/////////////////////////////////////////////////
void ModelCreator_TEST::NestedModelSelection()
{
this->resMaxPercentChange = 5.0;
this->shareMaxPercentChange = 2.0;
this->Load("worlds/empty.world", false, false, true);
// Create the main window.
gazebo::gui::MainWindow *mainWindow = new gazebo::gui::MainWindow();
QVERIFY(mainWindow != NULL);
mainWindow->Load();
mainWindow->Init();
mainWindow->show();
this->ProcessEventsAndDraw(mainWindow);
// Get the user camera and scene
gazebo::rendering::UserCameraPtr cam = gazebo::gui::get_active_camera();
QVERIFY(cam != NULL);
gazebo::rendering::ScenePtr scene = cam->GetScene();
QVERIFY(scene != NULL);
// Create a model creator
gui::ModelCreator *modelCreator = new gui::ModelCreator();
QVERIFY(modelCreator != NULL);
// a link
modelCreator->AddShape(gui::ModelCreator::ENTITY_CYLINDER);
gazebo::rendering::VisualPtr cylinder =
scene->GetVisual("ModelPreview_0_0::link_0");
QVERIFY(cylinder != NULL);
// Add various models and links into the editor
// a box nested model
double mass = 1.0;
ignition::math::Vector3d size = ignition::math::Vector3d::One;
msgs::Model model;
model.set_name("box_model");
msgs::AddBoxLink(model, mass, size);
sdf::ElementPtr boxModelSDF = msgs::ModelToSDF(model);
modelCreator->AddModel(boxModelSDF);
/// Verify it has been added
gazebo::rendering::VisualPtr boxModelVis =
scene->GetVisual("ModelPreview_0_0::box_model");
QVERIFY(boxModelVis != NULL);
this->ProcessEventsAndDraw(mainWindow);
// a more complicated a nested model loaded from from sdf
sdf::ElementPtr modelSDF(new sdf::Element);
sdf::initFile("model.sdf", modelSDF);
sdf::readString(NestedModelSDFString(), modelSDF);
modelCreator->AddModel(modelSDF);
this->ProcessEventsAndDraw(mainWindow);
// verify the model has been added
gazebo::rendering::VisualPtr modelVis =
scene->GetVisual("ModelPreview_0_0::model_00");
QVERIFY(modelVis != NULL);
gazebo::rendering::VisualPtr link00Vis =
scene->GetVisual("ModelPreview_0_0::model_00::link_00");
QVERIFY(link00Vis != NULL);
gazebo::rendering::VisualPtr link01Vis =
scene->GetVisual("ModelPreview_0_0::model_00::link_01");
QVERIFY(link01Vis != NULL);
gazebo::rendering::VisualPtr model01Vis =
scene->GetVisual("ModelPreview_0_0::model_00::model_01");
QVERIFY(model01Vis != NULL);
this->ProcessEventsAndDraw(mainWindow);
// verify initial selected state
QVERIFY(!cylinder->GetHighlighted());
QVERIFY(!boxModelVis->GetHighlighted());
QVERIFY(!modelVis->GetHighlighted());
QVERIFY(!link00Vis->GetHighlighted());
QVERIFY(!link01Vis->GetHighlighted());
QVERIFY(!model01Vis->GetHighlighted());
// test selecting links and nested models
modelCreator->SetSelected(cylinder, true);
QVERIFY(cylinder->GetHighlighted());
QVERIFY(!boxModelVis->GetHighlighted());
QVERIFY(!modelVis->GetHighlighted());
QVERIFY(!link00Vis->GetHighlighted());
QVERIFY(!link01Vis->GetHighlighted());
QVERIFY(!model01Vis->GetHighlighted());
modelCreator->SetSelected(boxModelVis, true);
QVERIFY(cylinder->GetHighlighted());
QVERIFY(boxModelVis->GetHighlighted());
QVERIFY(!modelVis->GetHighlighted());
QVERIFY(!link00Vis->GetHighlighted());
QVERIFY(!link01Vis->GetHighlighted());
QVERIFY(!model01Vis->GetHighlighted());
modelCreator->SetSelected(modelVis, true);
QVERIFY(cylinder->GetHighlighted());
QVERIFY(boxModelVis->GetHighlighted());
QVERIFY(modelVis->GetHighlighted());
QVERIFY(!link00Vis->GetHighlighted());
QVERIFY(!link01Vis->GetHighlighted());
QVERIFY(!model01Vis->GetHighlighted());
modelCreator->SetSelected(link00Vis, true);
QVERIFY(cylinder->GetHighlighted());
QVERIFY(boxModelVis->GetHighlighted());
QVERIFY(modelVis->GetHighlighted());
QVERIFY(link00Vis->GetHighlighted());
QVERIFY(!link01Vis->GetHighlighted());
QVERIFY(!model01Vis->GetHighlighted());
modelCreator->SetSelected(link01Vis, true);
QVERIFY(cylinder->GetHighlighted());
QVERIFY(boxModelVis->GetHighlighted());
QVERIFY(modelVis->GetHighlighted());
QVERIFY(link00Vis->GetHighlighted());
QVERIFY(link01Vis->GetHighlighted());
QVERIFY(!model01Vis->GetHighlighted());
modelCreator->SetSelected(model01Vis, true);
QVERIFY(cylinder->GetHighlighted());
QVERIFY(boxModelVis->GetHighlighted());
QVERIFY(modelVis->GetHighlighted());
QVERIFY(link00Vis->GetHighlighted());
QVERIFY(link01Vis->GetHighlighted());
QVERIFY(model01Vis->GetHighlighted());
modelCreator->SetSelected(cylinder, false);
QVERIFY(!cylinder->GetHighlighted());
QVERIFY(boxModelVis->GetHighlighted());
QVERIFY(modelVis->GetHighlighted());
QVERIFY(link00Vis->GetHighlighted());
QVERIFY(link01Vis->GetHighlighted());
QVERIFY(model01Vis->GetHighlighted());
modelCreator->SetSelected(boxModelVis, false);
QVERIFY(!cylinder->GetHighlighted());
QVERIFY(!boxModelVis->GetHighlighted());
QVERIFY(modelVis->GetHighlighted());
QVERIFY(link00Vis->GetHighlighted());
QVERIFY(link01Vis->GetHighlighted());
QVERIFY(model01Vis->GetHighlighted());
modelCreator->SetSelected(modelVis, false);
QVERIFY(!cylinder->GetHighlighted());
QVERIFY(!boxModelVis->GetHighlighted());
QVERIFY(!modelVis->GetHighlighted());
QVERIFY(link00Vis->GetHighlighted());
QVERIFY(link01Vis->GetHighlighted());
QVERIFY(model01Vis->GetHighlighted());
modelCreator->SetSelected(link00Vis, false);
QVERIFY(!cylinder->GetHighlighted());
QVERIFY(!boxModelVis->GetHighlighted());
QVERIFY(!modelVis->GetHighlighted());
QVERIFY(!link00Vis->GetHighlighted());
QVERIFY(link01Vis->GetHighlighted());
QVERIFY(model01Vis->GetHighlighted());
modelCreator->SetSelected(link01Vis, false);
QVERIFY(!cylinder->GetHighlighted());
QVERIFY(!boxModelVis->GetHighlighted());
QVERIFY(!modelVis->GetHighlighted());
QVERIFY(!link00Vis->GetHighlighted());
QVERIFY(!link01Vis->GetHighlighted());
QVERIFY(model01Vis->GetHighlighted());
modelCreator->SetSelected(model01Vis, false);
QVERIFY(!cylinder->GetHighlighted());
QVERIFY(!boxModelVis->GetHighlighted());
QVERIFY(!modelVis->GetHighlighted());
QVERIFY(!link00Vis->GetHighlighted());
QVERIFY(!link01Vis->GetHighlighted());
QVERIFY(!model01Vis->GetHighlighted());
delete modelCreator;
modelCreator = NULL;
mainWindow->close();
delete mainWindow;
mainWindow = NULL;
}
/////////////////////////////////////////////////
void ModelCreator_TEST::CopyPaste()
{
this->resMaxPercentChange = 5.0;
this->shareMaxPercentChange = 2.0;
this->Load("worlds/empty.world", false, false, true);
// Create the main window.
gazebo::gui::MainWindow *mainWindow = new gazebo::gui::MainWindow();
QVERIFY(mainWindow != NULL);
mainWindow->Load();
mainWindow->Init();
mainWindow->show();
this->ProcessEventsAndDraw(mainWindow);
// Get the user camera and scene
gazebo::rendering::UserCameraPtr cam = gazebo::gui::get_active_camera();
QVERIFY(cam != NULL);
gazebo::rendering::ScenePtr scene = cam->GetScene();
QVERIFY(scene != NULL);
gui::ModelCreator *modelCreator = new gui::ModelCreator();
QVERIFY(modelCreator);
QVERIFY(gazebo::gui::g_copyAct != NULL);
QVERIFY(gazebo::gui::g_pasteAct != NULL);
QVERIFY(gui::g_editModelAct != NULL);
// switch to editor mode
gui::g_editModelAct->toggle();
// Inserting a link and it still is never saved
modelCreator->AddShape(gui::ModelCreator::ENTITY_CYLINDER);
gazebo::rendering::VisualPtr cylinder =
scene->GetVisual("ModelPreview_0_0::link_0");
QVERIFY(cylinder != NULL);
// Add various models and links into the editor
// a box nested model
double mass = 1.0;
ignition::math::Vector3d size = ignition::math::Vector3d::One;
msgs::Model model;
model.set_name("box_model");
msgs::AddBoxLink(model, mass, size);
sdf::ElementPtr boxModelSDF = msgs::ModelToSDF(model);
modelCreator->AddModel(boxModelSDF);
/// Verify it has been added
gazebo::rendering::VisualPtr boxModel =
scene->GetVisual("ModelPreview_0_0::box_model");
QVERIFY(boxModel != NULL);
this->ProcessEventsAndDraw(mainWindow);
// copy and paste cylinder link
modelCreator->SetSelected(cylinder, true);
QVERIFY(cylinder->GetHighlighted());
gui::g_copyAct->trigger();
// Get GLWidget
gazebo::gui::GLWidget *glWidget =
mainWindow->findChild<gazebo::gui::GLWidget *>("GLWidget");
QVERIFY(glWidget != NULL);
// Move to center of the screen
QPoint moveTo(glWidget->width() * 0.5, glWidget->height() * 0.5);
QTest::mouseMove(glWidget, moveTo, 100);
gui::g_pasteAct->trigger();
QCoreApplication::processEvents();
// Verify there is a clone of the cylinder link
rendering::VisualPtr cylinderClone =
scene->GetVisual(cylinder->GetName() + "_clone");
QVERIFY(cylinderClone != NULL);
// copy and paste box model
modelCreator->SetSelected(boxModel, true);
QVERIFY(boxModel->GetHighlighted());
gui::g_copyAct->trigger();
// Move to center of the screen
QTest::mouseMove(glWidget, moveTo, 100);
gui::g_pasteAct->trigger();
QCoreApplication::processEvents();
// Verify there is a clone of the box model
rendering::VisualPtr boxModelClone =
scene->GetVisual(boxModel->GetName() + "_clone");
QVERIFY(boxModelClone != NULL);
this->ProcessEventsAndDraw(mainWindow);
delete modelCreator;
modelCreator = NULL;
mainWindow->close();
delete mainWindow;
mainWindow = NULL;
}
// Generate a main function for the test
QTEST_MAIN(ModelCreator_TEST)