CanOpenWorkspace.cpp 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  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 <QPushButton>
  10. #include <QAction>
  11. #include <QtTest>
  12. #include <QToolBar>
  13. #include <QCheckBox>
  14. #include <Tests/UI/MenuUIFixture.h>
  15. #include <Tests/UI/ModalPopupHandler.h>
  16. #include <EMotionFX/Source/AnimGraphManager.h>
  17. #include <EMotionStudio/EMStudioSDK/Source/EMStudioManager.h>
  18. #include <EMotionStudio/EMStudioSDK/Source/SaveChangedFilesManager.h>
  19. #include <EMotionStudio/EMStudioSDK/Source/ResetSettingsDialog.h>
  20. #include <EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/AnimGraphPlugin.h>
  21. #include <EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/ParameterWindow.h>
  22. #include <EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/ParameterCreateEditWidget.h>
  23. #include <EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/BlendGraphViewWidget.h>
  24. #include <EMotionStudio/Plugins/StandardPlugins/Source/MotionSetsWindow/MotionSetsWindowPlugin.h>
  25. namespace EMotionFX
  26. {
  27. class CanOpenWorkspaceFixture
  28. : public MenuUIFixture
  29. {
  30. public:
  31. void SetUp() override
  32. {
  33. UIFixture::SetUp();
  34. GetEMotionFX().InitAssetFolderPaths();
  35. m_saveDataPath = CreateTempSaveFolder();
  36. EMStudio::GetManager()->SetSkipSourceControlCommands(true);
  37. }
  38. void TearDown() override
  39. {
  40. QDir(m_saveDataPath).removeRecursively();
  41. UIFixture::TearDown();
  42. }
  43. QString CreateTempSaveFolder() const
  44. {
  45. int fileIndex = 0;
  46. bool madeDir = false;
  47. const QString baseDir = GetEMotionFX().GetAssetCacheFolder().c_str();
  48. while(!madeDir)
  49. {
  50. const QString dirname = QString("tmpdata_%1").arg(fileIndex);
  51. const QString dirpath = QString("%1/%2").arg(baseDir, dirname);
  52. if (!QDir(dirpath).exists())
  53. {
  54. QDir().mkdir(dirpath);
  55. madeDir = true;
  56. return dirpath;
  57. }
  58. fileIndex++;
  59. }
  60. return nullptr;
  61. }
  62. QString GenerateTempAssetFile(const QString& filenamebase, const QString& extension) const
  63. {
  64. bool foundFilename = false;
  65. int fileIndex = 0;
  66. while (!foundFilename)
  67. {
  68. const QString filename = QString("%1_%2").arg(filenamebase).arg(fileIndex);
  69. const QString filepath = QString("%1/%2.%3").arg(m_saveDataPath, filename, extension);
  70. if (!QFile::exists(filepath))
  71. {
  72. return filepath;
  73. }
  74. fileIndex++;
  75. }
  76. return nullptr;
  77. }
  78. QString GenerateTempAnimGraphFilename() const
  79. {
  80. return GenerateTempAssetFile("tmpanimgraph", "animgraph");
  81. }
  82. QString GenerateTempWorkspaceFilename() const
  83. {
  84. return GenerateTempAssetFile("tmpworkspace", "emfxworkspace");
  85. }
  86. QString GenerateTempMotionSetFilename() const
  87. {
  88. return GenerateTempAssetFile("tmpmotionset", "motionset");
  89. }
  90. void ResetAll()
  91. {
  92. // Set up a callback to set the correct checkbox states when the ResetSettings dialog appears.
  93. WidgetActiveCallback resetSettingsCallback = [](QWidget* widget)
  94. {
  95. ASSERT_TRUE(widget) << "Failed to find Reset widget.";
  96. // Set all checkboxes
  97. QList<QCheckBox*>checkBoxes = widget->findChildren<QCheckBox*>();
  98. for (QCheckBox *checkBox : checkBoxes)
  99. {
  100. checkBox->setChecked(true);
  101. }
  102. // Press the Ok button
  103. QDialogButtonBox* buttonBox = widget->findChild< QDialogButtonBox*>();
  104. ASSERT_TRUE(buttonBox) << "Unable to find button box in ResetSettingsDialog";
  105. QAbstractButton* button = buttonBox->button(QDialogButtonBox::Ok);
  106. ASSERT_TRUE(button) << "Unable to find Ok button in ResetSettingsDialog";
  107. QTest::mouseClick(button, Qt::LeftButton);
  108. };
  109. // Setup a watcher to handle the save dirty settings dialog by pressing Discard.
  110. ModalPopupHandler saveDirtyPopupHandler;
  111. saveDirtyPopupHandler.WaitForPopupPressDialogButton< EMStudio::SaveDirtySettingsWindow*>(QDialogButtonBox::Discard);
  112. // Setup a handler to select the type to reset and press ok.
  113. ModalPopupHandler resetSettingsHandler;
  114. resetSettingsHandler.WaitForPopup<EMStudio::ResetSettingsDialog*>(resetSettingsCallback);
  115. QMenu* fileMenu = MenuUIFixture::FindMainMenuWithName("EMFX.MainWindow.FileMenu");
  116. ASSERT_TRUE(fileMenu) << "Unable to find file menu.";
  117. QAction* resetMenuAction = MenuUIFixture::FindMenuActionWithObjectName(fileMenu, "EMFX.MainWindow.ResetAction", fileMenu->objectName());
  118. ASSERT_TRUE(resetMenuAction) << "Unable to find reset menu action.";
  119. resetMenuAction->trigger();
  120. saveDirtyPopupHandler.WaitForCompletion();
  121. resetSettingsHandler.WaitForCompletion();
  122. ASSERT_EQ(EMotionFX::GetMotionManager().GetNumMotionSets(), 1) << "The default motion set should be present.";
  123. ASSERT_FALSE(m_animGraphPlugin->GetActiveAnimGraph()) << "Failed to reset AnimGraphs.";
  124. }
  125. void GenerateTestWorkspace()
  126. {
  127. // AnimGraph
  128. m_animGraphPlugin->GetViewWidget()->OnCreateAnimGraph();
  129. ASSERT_TRUE(m_animGraphPlugin->GetActiveAnimGraph()) << "Failed to create AnimGraph.";
  130. CreateAnimGraphParameter("TestParam1");
  131. CreateAnimGraphParameter("TestParam2");
  132. CreateAnimGraphParameter("TestParam3");
  133. // Motion
  134. EMotionFX::MotionSet* motionSet = EMotionFX::GetMotionManager().GetMotionSet(0);
  135. auto motionSetPlugin = static_cast<EMStudio::MotionSetsWindowPlugin*>(EMStudio::GetPluginManager()->FindActivePlugin(EMStudio::MotionSetsWindowPlugin::CLASS_ID));
  136. ASSERT_TRUE(motionSetPlugin) << "No motion sets plugin found";
  137. motionSetPlugin->SetSelectedSet(motionSet);
  138. const EMStudio::MotionSetWindow* motionSetWindow = motionSetPlugin->GetMotionSetWindow();
  139. ASSERT_TRUE(motionSetWindow) << "No motion set window found";
  140. QWidget* addMotionButton = GetWidgetWithNameFromNamedToolbar(motionSetWindow, "MotionSetWindow.ToolBar", "MotionSetWindow.ToolBar.AddANewEntry");
  141. ASSERT_TRUE(addMotionButton);
  142. QTest::mouseClick(addMotionButton, Qt::LeftButton);
  143. // Check there is now a motion.
  144. EXPECT_EQ(motionSet->GetNumMotionEntries(), 1);
  145. }
  146. void SaveAll()
  147. {
  148. // Set filenames for everything we can to avoid system file requestors.
  149. const QString motionsetFilename = GenerateTempMotionSetFilename();
  150. EMotionFX::MotionSet *motionSet = EMotionFX::GetMotionManager().GetMotionSet(0);
  151. motionSet->SetFilename(motionsetFilename.toUtf8().constData());
  152. EMStudio::Workspace* workspace = EMStudio::GetManager()->GetWorkspace();
  153. m_workspaceSavePath = GenerateTempWorkspaceFilename();
  154. workspace->SetFilename(m_workspaceSavePath.toUtf8().data());
  155. const QString animGraphFilename = GenerateTempAnimGraphFilename();
  156. EMotionFX::AnimGraph* animGraph = m_animGraphPlugin->GetActiveAnimGraph();
  157. animGraph->SetFileName(animGraphFilename.toUtf8().constData());
  158. const QMenu* fileMenu = MenuUIFixture::FindMainMenuWithName("EMFX.MainWindow.FileMenu");
  159. ASSERT_TRUE(fileMenu) << "Unable to find file menu.";
  160. ModalPopupHandler saveDirtyPopupHandler;
  161. saveDirtyPopupHandler.WaitForPopupPressDialogButton< EMStudio::SaveDirtySettingsWindow*>(QDialogButtonBox::Ok);
  162. QAction* saveAllAction = MenuUIFixture::FindMenuActionWithObjectName(fileMenu, "EMFX.MainWindow.SaveAllAction", fileMenu->objectName());
  163. ASSERT_TRUE(saveAllAction) << "Save All menu item not found";
  164. ASSERT_TRUE(saveAllAction->isEnabled());
  165. saveAllAction->trigger();
  166. }
  167. protected:
  168. QString m_saveDataPath;
  169. QString m_workspaceSavePath;
  170. };
  171. TEST_F(CanOpenWorkspaceFixture, CanAddAnimGraph)
  172. {
  173. RecordProperty("test_case_id", "C953542");
  174. GenerateTestWorkspace();
  175. SaveAll();
  176. ResetAll();
  177. //Check everything has gone.
  178. ASSERT_EQ(EMotionFX::GetMotionManager().GetNumMotionSets(), 1) << "The default motion set should be present.";
  179. ASSERT_FALSE(m_animGraphPlugin->GetActiveAnimGraph()) << "Failed to reset AnimGraphs.";
  180. // Reload the saved workspace and check everything reappears:
  181. // Discard any unsaved changes
  182. ModalPopupHandler saveDirtyPopupHandler;
  183. saveDirtyPopupHandler.WaitForPopupPressDialogButton< EMStudio::SaveDirtySettingsWindow*>(QDialogButtonBox::Discard);
  184. EMStudio::GetMainWindow()->LoadFile(m_workspaceSavePath.toUtf8().constData());
  185. // Check all the expected items are back
  186. ASSERT_EQ(EMotionFX::GetMotionManager().GetNumMotionSets(), 1) << "Failed to create MotionSets in workspace load.";
  187. ASSERT_TRUE(m_animGraphPlugin->GetActiveAnimGraph()) << "Failed to create AnimGraph in workspace load.""Failed to create parameters in workspace load.";
  188. ASSERT_EQ(m_animGraphPlugin->GetActiveAnimGraph()->GetNumParameters(), 3) << "Failed to create Parameters in workspace load.";
  189. }
  190. } // namespace EMotionFX