AddTransitionCondition.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <gtest/gtest.h>
  9. #include <QAction>
  10. #include <QtTest>
  11. #include <QWidget>
  12. #include <qrect.h>
  13. #include <EMotionFX/Source/AnimGraphMotionNode.h>
  14. #include <EMotionFX/Source/AnimGraphEntryNode.h>
  15. #include <EMotionFX/Source/AnimGraphHubNode.h>
  16. #include <EMotionFX/Source/AnimGraphManager.h>
  17. #include <EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/NodeGraph.h>
  18. #include <EMotionStudio/EMStudioSDK/Source/EMStudioManager.h>
  19. #include <EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/AnimGraphPlugin.h>
  20. #include <EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/AttributesWindow.h>
  21. #include <EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/BlendGraphViewWidget.h>
  22. #include <EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/BlendGraphWidget.h>
  23. #include <EMotionFX/Source/MotionManager.h>
  24. #include <EMotionFX/Source/AnimGraphStateMachine.h>
  25. #include <Tests/UI/AnimGraphUIFixture.h>
  26. namespace QTest
  27. {
  28. extern int Q_TESTLIB_EXPORT defaultMouseDelay();
  29. } // namespace QTest
  30. namespace EMotionFX
  31. {
  32. TEST_F(AnimGraphUIFixture, CanAddTransitionCondition)
  33. {
  34. // This test checks that you can edit a transition between nodes of an animgraph
  35. RecordProperty("test_case_id", "C21948785");
  36. // Set up animgraph
  37. EMotionFX::AnimGraph* animGraph = AnimGraphUIFixture::CreateAnimGraph();
  38. {
  39. MCore::CommandGroup group;
  40. // Add two motion nodes to animgraph
  41. group.AddCommandString(AZStd::string::format("AnimGraphCreateNode -animGraphID %d -type %s -parentName Root -xPos 200 -yPos 200 -name motionNodeA",
  42. animGraph->GetID(), azrtti_typeid<AnimGraphMotionNode>().ToString<AZStd::string>().c_str()));
  43. group.AddCommandString(AZStd::string::format("AnimGraphCreateNode -animGraphID %d -type %s -parentName Root -xPos 0 -yPos 0 -name motionNodeB",
  44. animGraph->GetID(), azrtti_typeid<AnimGraphMotionNode>().ToString<AZStd::string>().c_str()));
  45. // Run Commands
  46. AZStd::string commandResult;
  47. EXPECT_TRUE(CommandSystem::GetCommandManager()->ExecuteCommandGroup(group, commandResult)) << commandResult.c_str();
  48. }
  49. // Create Needed Objects
  50. AnimGraphMotionNode* motionNodeA = static_cast<AnimGraphMotionNode*>(animGraph->RecursiveFindNodeByName("motionNodeA"));
  51. AnimGraphMotionNode* motionNodeB = static_cast<AnimGraphMotionNode*>(animGraph->RecursiveFindNodeByName("motionNodeB"));
  52. EMStudio::NodeGraph* nodeGraph = AnimGraphUIFixture::GetActiveNodeGraph();
  53. const EMStudio::GraphNode* graphNodeForMotionNode0 = nodeGraph->FindGraphNode(motionNodeA);
  54. const EMStudio::GraphNode* graphNodeForMotionNode1 = nodeGraph->FindGraphNode(motionNodeB);
  55. EMStudio::AnimGraphModel& model = m_animGraphPlugin->GetAnimGraphModel();
  56. // Resize blend graph window to show both nodes
  57. m_blendGraphWidget->resize(500, 500);
  58. m_animGraphPlugin->GetViewWidget()->ZoomSelected();
  59. // Add transition between two nodes
  60. const QPoint begin(graphNodeForMotionNode0->GetFinalRect().topRight() + QPoint(-2, 2));
  61. const QPoint end(graphNodeForMotionNode1->GetFinalRect().topLeft() + QPoint(2, 2));
  62. QTest::mousePress(static_cast<QWidget*>(m_blendGraphWidget), Qt::LeftButton, Qt::NoModifier, begin);
  63. {
  64. // QTest::mouseMove uses QCursor::setPos to generate a MouseMove
  65. QMouseEvent moveEvent(QMouseEvent::MouseMove, end, Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
  66. moveEvent.setTimestamp(QTest::lastMouseTimestamp += QTest::defaultMouseDelay());
  67. QApplication::instance()->notify(m_blendGraphWidget, &moveEvent);
  68. }
  69. QTest::mouseRelease(static_cast<QWidget*>(m_blendGraphWidget), Qt::LeftButton, Qt::NoModifier, end);
  70. // Ensure the transition was added to the root state machine
  71. ASSERT_EQ(animGraph->GetRootStateMachine()->GetNumTransitions(), 1);
  72. // Ensure the transition is in the AnimGraphModel
  73. AnimGraphStateTransition* transition = animGraph->GetRootStateMachine()->GetTransition(0);
  74. ASSERT_TRUE(transition) << "Transition was made incorrectly";
  75. const QModelIndexList matches = model.match(
  76. /* starting index = */ model.index(0, 0, model.index(0, 0)),
  77. /* role = */ EMStudio::AnimGraphModel::ROLE_POINTER,
  78. /* value = */ QVariant::fromValue(static_cast<void*>(transition)),
  79. /* hits =*/ 1,
  80. Qt::MatchExactly
  81. );
  82. ASSERT_EQ(matches.size(), 1);
  83. // Ensure that the transition has not condinditions on creation
  84. ASSERT_EQ(transition->GetNumConditions(), 0) << "Transition starts with conditions";
  85. // Select Transition
  86. QPoint transitionCenter;
  87. transitionCenter.setX((((end.x() - begin.x()) / 2) + begin.x()));
  88. transitionCenter.setY((((end.y() - begin.y()) / 2) + begin.y()));
  89. QTest::mouseClick(static_cast<QWidget*>(m_blendGraphWidget), Qt::LeftButton, Qt::NoModifier, transitionCenter);
  90. // Make sure transition was selected
  91. ASSERT_EQ(nodeGraph->GetSelectedNodeConnections().size(), 1) << "Transition was not selected";
  92. // Find and "click" on Add Condition button
  93. EMStudio::AddConditionButton* addConditionButton = m_animGraphPlugin->GetAttributesWindow()->GetAddConditionButton();
  94. ASSERT_TRUE(addConditionButton) << "Add Condition button was not found";
  95. addConditionButton->OnCreateContextMenu();
  96. // Add a specific condition
  97. QAction* addStateConditionButton = AnimGraphUIFixture::GetNamedAction(m_animGraphPlugin->GetAttributesWindow(), "State Condition");
  98. ASSERT_TRUE(addStateConditionButton) << "'State Condition' button was not found";
  99. addStateConditionButton->trigger();
  100. // Verify that the condition has been added to the transition.
  101. ASSERT_EQ(transition->GetNumConditions(), 1) << "Transition doesn't have one condition";
  102. QApplication::processEvents();
  103. }
  104. }