You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Gems/EMotionFX/Code/Tests/ProvidesUI/AnimGraph/StateMachine/EntryStateTests.cpp

100 lines
5.3 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#include <gtest/gtest.h>
#include <QAction>
#include <QtTest/QtTest>
#include <qtoolbar.h>
#include <QWidget>
#include <QComboBox>
#include <qrect.h>
#include <Tests/UI/AnimGraphUIFixture.h>
#include <EMotionFX/Source/AnimGraphMotionNode.h>
#include <EMotionFX/Source/AnimGraphEntryNode.h>
#include <EMotionFX/Source/AnimGraphHubNode.h>
#include <EMotionFX/Source/AnimGraphManager.h>
#include <EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/NodeGraph.h>
#include <EMotionStudio/EMStudioSDK/Source/EMStudioManager.h>
#include <EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/AnimGraphPlugin.h>
#include <EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/BlendGraphViewWidget.h>
#include <EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/BlendGraphWidget.h>
#include <EMotionFX/Source/AnimGraphStateMachine.h>
namespace EMotionFX
{
TEST_F(UIFixture, CanSetEntryState)
{
// This test checks that you can set the entry state of motion nodes in an animgraph
RecordProperty("test_case_id", "C1559146");
AnimGraph* animGraph = nullptr;
EMStudio::AnimGraphPlugin* animGraphPlugin = nullptr;
{
// Set up an empty animgraph with two motion nodes
const AZ::u32 animGraphId = 64;
MCore::CommandGroup group;
// Create empty anim graph, add a motion, entry, hub, and blend tree node.
group.AddCommandString(AZStd::string::format("CreateAnimGraph -animGraphID %d", animGraphId));
group.AddCommandString(AZStd::string::format("AnimGraphCreateNode -animGraphID %d -type %s -parentName Root -xPos 200 -yPos 200 -name motionNodeA",
animGraphId, azrtti_typeid<AnimGraphMotionNode>().ToString<AZStd::string>().c_str()));
group.AddCommandString(AZStd::string::format("AnimGraphCreateNode -animGraphID %d -type %s -parentName Root -xPos 0 -yPos 0 -name motionNodeB",
animGraphId, azrtti_typeid<AnimGraphMotionNode>().ToString<AZStd::string>().c_str()));
// Run Commands
AZStd::string commandResult;
EXPECT_TRUE(CommandSystem::GetCommandManager()->ExecuteCommandGroup(group, commandResult)) << commandResult.c_str();
// Get useful components
animGraphPlugin = static_cast<EMStudio::AnimGraphPlugin*>(EMStudio::GetPluginManager()->FindActivePlugin(EMStudio::AnimGraphPlugin::CLASS_ID));
ASSERT_NE(animGraphPlugin, nullptr) << "Anim graph plugin not found.";
animGraph = GetAnimGraphManager().FindAnimGraphByID(animGraphId);
ASSERT_NE(animGraph, nullptr) << "Cannot find newly created anim graph.";
}
// Create Needed Objects
const AnimGraphMotionNode* motionNodeA = static_cast<AnimGraphMotionNode*>(animGraph->RecursiveFindNodeByName("motionNodeA"));
const AnimGraphMotionNode* motionNodeB = static_cast<AnimGraphMotionNode*>(animGraph->RecursiveFindNodeByName("motionNodeB"));
EMStudio::BlendGraphWidget* graphWidget = animGraphPlugin->GetGraphWidget();
const EMStudio::GraphNode* graphNodeForMotionNodeB = graphWidget->GetActiveGraph()->FindGraphNode(motionNodeB);
EMotionFX::AnimGraphStateMachine* stateMachine = static_cast<EMotionFX::AnimGraphStateMachine*>(motionNodeA->GetParentNode());
// Ensure that motionNodeA is the entry node
ASSERT_EQ(motionNodeA->GetId(), stateMachine->GetEntryStateId()) << "motionNodeA does not start as set entry state.";
// Select motionNodeB
EMStudio::NodeGraph* nodeGraph = graphWidget->GetActiveGraph();
nodeGraph->FitGraphOnScreen(graphWidget->geometry().width(), graphWidget->geometry().height(), graphWidget->GetMousePos(), true);
const QRect nodeRect = graphNodeForMotionNodeB->GetFinalRect();
QTest::mouseClick(static_cast<QWidget*>(graphWidget), Qt::LeftButton, Qt::NoModifier, nodeRect.center());
ASSERT_EQ(nodeGraph->GetSelectedAnimGraphNodes().size(), 1) << "No node is selected";
ASSERT_EQ(nodeGraph->GetSelectedAnimGraphNodes()[0]->GetNameString(), "motionNodeB") << "Motion Node B was not selected";
// Right click on motionNodeB
const AZStd::vector<EMotionFX::AnimGraphNode*> selectedAnimGraphNodes = nodeGraph->GetSelectedAnimGraphNodes();
graphWidget->OnContextMenuEvent(graphWidget, nodeRect.center(), graphWidget->LocalToGlobal(nodeRect.center()), animGraphPlugin, selectedAnimGraphNodes, true, false, animGraphPlugin->GetActionFilter());
// Click "Set As Entry State" button
QAction* setAsEntryPointButton = UIFixture::GetNamedAction(graphWidget, "Set As Entry State");
ASSERT_TRUE(setAsEntryPointButton) << "Set as entry state button not found.";
setAsEntryPointButton->trigger();
// Verify motionNodeA is no longer the entry node
ASSERT_NE(motionNodeA->GetId(), stateMachine->GetEntryStateId()) << "motionNodeA is still set as entry state.";
// Verify motionNodeB is the entry node
ASSERT_EQ(motionNodeB->GetId(), stateMachine->GetEntryStateId()) << "motionNodeB is not set as entry state.";
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
}
}