InteractionTests.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  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 <qpushbutton.h>
  9. #include <GraphCanvas/Components/GridBus.h>
  10. #include <GraphCanvas/Components/Nodes/Group/NodeGroupBus.h>
  11. #include <EditorAutomationTests/InteractionTests.h>
  12. #include <Editor/GraphCanvas/GraphCanvasEditorNotificationBusId.h>
  13. #include <ScriptCanvas/GraphCanvas/MappingBus.h>
  14. #include <ScriptCanvas/Core/Node.h>
  15. #include <ScriptCanvas/Core/NodeBus.h>
  16. #include <ScriptCanvas/Bus/EditorScriptCanvasBus.h>
  17. #include <ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationStates/EditorViewStates.h>
  18. #include <ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationStates/ElementInteractionStates.h>
  19. #include <ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationStates/GraphStates.h>
  20. #include <ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationStates/UtilityStates.h>
  21. namespace ScriptCanvas::Developer
  22. {
  23. ///////////////////////
  24. // AltClickDeleteTest
  25. ///////////////////////
  26. AltClickDeleteTest::AltClickDeleteTest()
  27. : EditorAutomationTest("Alt Click Deletion Test")
  28. {
  29. AddState(new CreateRuntimeGraphState());
  30. AutomationStateModelId onGraphStartTargetPointId = "OnGraphStartScenePoint";
  31. AutomationStateModelId onGraphStartId = "OnGraphStartId";
  32. AddState(new FindViewCenterState(onGraphStartTargetPointId));
  33. AddState(new CreateNodeFromContextMenuState("On Graph Start", CreateNodeFromContextMenuState::CreationType::ScenePosition, onGraphStartTargetPointId, onGraphStartId));
  34. AutomationStateModelId onGraphStartEndpoint = "OnGraphStart::ExecutionEndpoint";
  35. AddState(new FindEndpointOfTypeState(onGraphStartId, onGraphStartEndpoint, GraphCanvas::CT_Output, GraphCanvas::SlotTypes::ExecutionSlot));
  36. AutomationStateModelId buildStringNodeId = "BuildStringId";
  37. AddState(new CreateNodeFromProposalState("Build String", onGraphStartEndpoint, "", buildStringNodeId));
  38. AutomationStateModelId buildStringEndpoint = "BuildString::ExecutionEndpoint";
  39. AddState(new FindEndpointOfTypeState(buildStringNodeId, buildStringEndpoint, GraphCanvas::CT_Output, GraphCanvas::SlotTypes::ExecutionSlot));
  40. AutomationStateModelId printNodeId = "PrintNodeId";
  41. AddState(new CreateNodeFromProposalState("Print", buildStringEndpoint, "", printNodeId));
  42. AddState(new AltClickSceneElementState(buildStringNodeId));
  43. AutomationStateModelId altClickConnectionTarget = "ConnectionTarget";
  44. AddState(new GetLastConnection(onGraphStartEndpoint, altClickConnectionTarget));
  45. AddState(new AltClickSceneElementState(altClickConnectionTarget));
  46. AddState(new ForceCloseActiveGraphState());
  47. }
  48. //////////////////////////////
  49. // CutCopyPasteDuplicateTest
  50. //////////////////////////////
  51. CutCopyPasteDuplicateTest::CheckpointState::CheckpointState(AZStd::string checkPoint)
  52. : CustomActionState(checkPoint.c_str())
  53. {
  54. }
  55. CutCopyPasteDuplicateTest::CutCopyPasteDuplicateTest(QString nodeName)
  56. : EditorAutomationTest(QString("Cut/Copy/Paste/Duplicate %1 Test").arg(nodeName))
  57. , m_originalNodeId("OriginalNodeId")
  58. {
  59. AddState(new CreateRuntimeGraphState());
  60. AutomationStateModelId viewCenter = "ViewCenter";
  61. AddState(new FindViewCenterState(viewCenter));
  62. m_createNodeState = new CreateNodeFromContextMenuState(nodeName, CreateNodeFromContextMenuState::CreationType::ScenePosition, viewCenter, m_originalNodeId);
  63. AddState(m_createNodeState);
  64. AddState(new SelectSceneElementState(m_originalNodeId));
  65. AddState(new TriggerHotKey(QChar('x'), "CutOriginal"));
  66. AddState(new TriggerHotKey(QChar('v'), "PasteOriginal"));
  67. m_cutPasteCheckpoint = new CheckpointState("Confirm Cut/Paste");
  68. AddState(m_cutPasteCheckpoint);
  69. AddState(new TriggerHotKey(QChar('c'), "CopyOriginal"));
  70. AddState(new TriggerHotKey(QChar('v'), "PasteCopied"));
  71. m_copyPasteCheckpoint = new CheckpointState("Confirm Copy/Paste");
  72. AddState(m_copyPasteCheckpoint);
  73. AddState(new TriggerHotKey(QChar('c'), "CopyCopied"));
  74. AddState(new TriggerHotKey(QChar('v'), "PasteCopiedCopied"));
  75. m_copyPasteCopyCheckpoint = new CheckpointState("Confirm Copy/Paste for Copy");
  76. AddState(m_copyPasteCopyCheckpoint);
  77. AddState(new TriggerHotKey(QChar('d'), "Duplicate"));
  78. m_duplicateCheckpoint = new CheckpointState("Confirm Duplication");
  79. AddState(m_duplicateCheckpoint);
  80. AddState(new ForceCloseActiveGraphState());
  81. }
  82. void CutCopyPasteDuplicateTest::OnNodeAdded(const AZ::EntityId& nodeId, bool)
  83. {
  84. m_createdSet.insert(nodeId);
  85. }
  86. void CutCopyPasteDuplicateTest::OnNodeRemoved(const AZ::EntityId& nodeId)
  87. {
  88. if (nodeId == m_removalTarget)
  89. {
  90. m_removalTarget.SetInvalid();
  91. }
  92. }
  93. void CutCopyPasteDuplicateTest::OnStateComplete(int stateId)
  94. {
  95. if (stateId == CreateRuntimeGraphStateId::StateID())
  96. {
  97. const GraphCanvas::GraphId* graphId = GetStateDataAs<GraphCanvas::GraphId>(StateModelIds::GraphCanvasId);
  98. if (graphId)
  99. {
  100. GraphCanvas::SceneNotificationBus::Handler::BusConnect((*graphId));
  101. }
  102. }
  103. else if (stateId == m_createNodeState->GetStateId())
  104. {
  105. const GraphCanvas::NodeId* nodeId = GetStateDataAs<GraphCanvas::GraphId>(m_originalNodeId);
  106. if (nodeId)
  107. {
  108. m_removalTarget = (*nodeId);
  109. m_createdSet.clear();
  110. }
  111. }
  112. else if (stateId == m_cutPasteCheckpoint->GetStateId())
  113. {
  114. if (m_removalTarget.IsValid())
  115. {
  116. AddError("Cut failed to remove original element from the scene.");
  117. }
  118. else if (m_createdSet.empty())
  119. {
  120. AddError("Paste failed to add element to the scene.");
  121. }
  122. else
  123. {
  124. ProcessCreationSet();
  125. }
  126. }
  127. else if (stateId == m_copyPasteCheckpoint->GetStateId()
  128. || stateId == m_copyPasteCopyCheckpoint->GetStateId())
  129. {
  130. if (m_createdSet.empty())
  131. {
  132. AddError("Paste failed to add element to the scene.");
  133. }
  134. else
  135. {
  136. ProcessCreationSet();
  137. }
  138. }
  139. else if (stateId == m_duplicateCheckpoint->GetStateId())
  140. {
  141. if (m_createdSet.empty())
  142. {
  143. AddError("Duplicate failed to add element to the scene.");
  144. }
  145. else
  146. {
  147. ProcessCreationSet();
  148. }
  149. }
  150. else if (stateId == ForceCloseActiveGraphStateId::StateID())
  151. {
  152. GraphCanvas::SceneNotificationBus::Handler::BusDisconnect();
  153. }
  154. }
  155. void CutCopyPasteDuplicateTest::ProcessCreationSet()
  156. {
  157. AZ::EntityId testId;
  158. for (GraphCanvas::NodeId nodeId : m_createdSet)
  159. {
  160. if (GraphCanvas::GraphUtils::IsNodeWrapped(nodeId))
  161. {
  162. continue;
  163. }
  164. testId = nodeId;
  165. break;
  166. }
  167. m_createdSet.clear();
  168. bool isSelected = false;
  169. GraphCanvas::SceneMemberUIRequestBus::EventResult(isSelected, testId, &GraphCanvas::SceneMemberUIRequests::IsSelected);
  170. if (!isSelected)
  171. {
  172. AddError("Pasted node is not selected by default.");
  173. }
  174. }
  175. /*
  176. bool CutCopyPasteDuplicateTest::TransitionToState(int state)
  177. {
  178. if (state == CutOriginalNode)
  179. {
  180. delete m_selectElement;
  181. m_selectElement = aznew SelectSceneElementAction(m_target);
  182. m_removalTarget = m_target;
  183. m_actionRunner.AddAction(m_selectElement);
  184. m_actionRunner.AddAction(&m_pressCtrlAction);
  185. m_actionRunner.AddAction(&m_processEvents);
  186. m_actionRunner.AddAction(&m_typeX);
  187. m_actionRunner.AddAction(&m_processEvents);
  188. m_actionRunner.AddAction(&m_releaseCtrlAction);
  189. m_actionRunner.AddAction(&m_processEvents);
  190. }
  191. else if (state == PasteOriginalNode)
  192. {
  193. m_actionRunner.AddAction(&m_pressCtrlAction);
  194. m_actionRunner.AddAction(&m_processEvents);
  195. m_actionRunner.AddAction(&m_typeV);
  196. m_actionRunner.AddAction(&m_processEvents);
  197. m_actionRunner.AddAction(&m_releaseCtrlAction);
  198. m_actionRunner.AddAction(&m_processEvents);
  199. }
  200. else if (state == CopyPasteOriginalNodeState)
  201. {
  202. m_actionRunner.AddAction(&m_pressCtrlAction);
  203. m_actionRunner.AddAction(&m_processEvents);
  204. m_actionRunner.AddAction(&m_typeC);
  205. m_actionRunner.AddAction(&m_processEvents);
  206. m_actionRunner.AddAction(&m_typeV);
  207. m_actionRunner.AddAction(&m_processEvents);
  208. m_actionRunner.AddAction(&m_releaseCtrlAction);
  209. m_actionRunner.AddAction(&m_processEvents);
  210. }
  211. else if (state == CopyPasteDuplicatedNodeState)
  212. {
  213. m_actionRunner.AddAction(&m_pressCtrlAction);
  214. m_actionRunner.AddAction(&m_processEvents);
  215. m_actionRunner.AddAction(&m_typeC);
  216. m_actionRunner.AddAction(&m_processEvents);
  217. m_actionRunner.AddAction(&m_typeV);
  218. m_actionRunner.AddAction(&m_processEvents);
  219. m_actionRunner.AddAction(&m_releaseCtrlAction);
  220. m_actionRunner.AddAction(&m_processEvents);
  221. }
  222. else if (state == DuplicateNodeState)
  223. {
  224. m_actionRunner.AddAction(&m_pressCtrlAction);
  225. m_actionRunner.AddAction(&m_processEvents);
  226. m_actionRunner.AddAction(&m_typeD);
  227. m_actionRunner.AddAction(&m_processEvents);
  228. m_actionRunner.AddAction(&m_releaseCtrlAction);
  229. m_actionRunner.AddAction(&m_processEvents);
  230. }
  231. else if (state == ForceCloseGraphState)
  232. {
  233. m_actionRunner.AddAction(&m_forceCloseGraphAction);
  234. }
  235. return m_actionRunner.HasActions();
  236. }
  237. void CutCopyPasteDuplicateTest::OnTestComplete()
  238. {
  239. delete m_createFromContextMenu;
  240. m_createFromContextMenu = nullptr;
  241. GraphCanvas::SceneNotificationBus::Handler::BusDisconnect();
  242. }
  243. void CutCopyPasteDuplicateTest::OnStateComplete(int state)
  244. {
  245. if (state == CreateGraphState)
  246. {
  247. m_graphId = m_createNewGraphAction.GetGraphId();
  248. GraphCanvas::SceneNotificationBus::Handler::BusConnect(m_graphId);
  249. }
  250. else if (state == CreateNodeState)
  251. {
  252. m_target = m_createFromContextMenu->GetCreatedNodeId();
  253. m_createdSet.clear();
  254. }
  255. else if (state == CutOriginalNode)
  256. {
  257. if (m_removalTarget.IsValid())
  258. {
  259. AddError(QString("Failed to cut %1").arg(m_nodeName).toUtf8().data());
  260. }
  261. }
  262. else if (state == PasteOriginalNode)
  263. {
  264. if (m_createdSet.empty())
  265. {
  266. AddError(QString("Failed to cut and paste original %1").arg(m_nodeName).toUtf8().data());
  267. }
  268. else
  269. {
  270. for (GraphCanvas::NodeId nodeId : m_createdSet)
  271. {
  272. if (GraphCanvas::GraphUtils::IsNodeWrapped(nodeId))
  273. {
  274. continue;
  275. }
  276. m_target = nodeId;
  277. break;
  278. }
  279. m_createdSet.clear();
  280. bool isSelected = false;
  281. GraphCanvas::SceneMemberUIRequestBus::EventResult(isSelected, m_target, &GraphCanvas::SceneMemberUIRequests::IsSelected);
  282. if (!isSelected)
  283. {
  284. AddError("Pasted node is not selected by default.");
  285. }
  286. }
  287. }
  288. else if (state == CopyPasteOriginalNodeState)
  289. {
  290. if (m_createdSet.empty())
  291. {
  292. AddError(QString("Failed to copy and paste original %1").arg(m_nodeName).toUtf8().data());
  293. }
  294. else
  295. {
  296. for (GraphCanvas::NodeId nodeId : m_createdSet)
  297. {
  298. if (GraphCanvas::GraphUtils::IsNodeWrapped(nodeId))
  299. {
  300. continue;
  301. }
  302. m_target = nodeId;
  303. break;
  304. }
  305. m_createdSet.clear();
  306. bool isSelected = false;
  307. GraphCanvas::SceneMemberUIRequestBus::EventResult(isSelected, m_target, &GraphCanvas::SceneMemberUIRequests::IsSelected);
  308. if (!isSelected)
  309. {
  310. AddError("Pasted node is not selected by default.");
  311. }
  312. }
  313. }
  314. else if (state == CopyPasteDuplicatedNodeState)
  315. {
  316. if (m_createdSet.empty())
  317. {
  318. AddError(QString("Failed to copy and paste duplicated %1").arg(m_nodeName).toUtf8().data());
  319. }
  320. else
  321. {
  322. for (GraphCanvas::NodeId nodeId : m_createdSet)
  323. {
  324. if (GraphCanvas::GraphUtils::IsNodeWrapped(nodeId))
  325. {
  326. continue;
  327. }
  328. m_target = nodeId;
  329. break;
  330. }
  331. m_createdSet.clear();
  332. bool isSelected = false;
  333. GraphCanvas::SceneMemberUIRequestBus::EventResult(isSelected, m_target, &GraphCanvas::SceneMemberUIRequests::IsSelected);
  334. if (!isSelected)
  335. {
  336. AddError("Pasted node is not selected by default.");
  337. }
  338. }
  339. }
  340. else if (state == DuplicateNodeState)
  341. {
  342. if (m_createdSet.empty())
  343. {
  344. AddError(QString("Failed to duplicate %1").arg(m_nodeName).toUtf8().data());
  345. }
  346. else
  347. {
  348. m_createdSet.clear();
  349. }
  350. }
  351. }
  352. bool CutCopyPasteDuplicateTest::CleanupAfterErrorState()
  353. {
  354. if (m_createNewGraphAction.GetGraphId().IsValid())
  355. {
  356. m_actionRunner.AddAction(&m_forceCloseGraphAction);
  357. }
  358. return m_actionRunner.HasActions();
  359. }
  360. */
  361. }