VariableTests.cpp 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880
  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/VariableTests.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/EditorAutomationActions/ScriptCanvasActions/ElementInteractions.h>
  18. #include <ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationStates/EditorViewStates.h>
  19. #include <ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationStates/ElementInteractionStates.h>
  20. #include <ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationStates/GraphStates.h>
  21. #include <ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationStates/UtilityStates.h>
  22. #include <ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationStates/VariableStates.h>
  23. #if !defined(AZ_COMPILER_MSVC)
  24. #ifndef VK_RETURN
  25. #define VK_RETURN 0x0D
  26. #endif
  27. #endif
  28. namespace ScriptCanvas::Developer
  29. {
  30. ///////////////////////////////
  31. // ManuallyCreateVariableTest
  32. ///////////////////////////////
  33. AZStd::string GetModifierDescription(CreateVariableAction::CreationType creationType)
  34. {
  35. AZStd::string modifierDescription;
  36. switch (creationType)
  37. {
  38. case CreateVariableAction::CreationType::AutoComplete:
  39. break;
  40. case CreateVariableAction::CreationType::Palette:
  41. modifierDescription = "From Palette";
  42. break;
  43. case CreateVariableAction::CreationType::Programmatic:
  44. modifierDescription = "Programmatically";
  45. break;
  46. default:
  47. break;
  48. }
  49. return modifierDescription;
  50. }
  51. ManuallyCreateVariableTest::ManuallyCreateVariableTest(ScriptCanvas::Data::Type dataType, CreateVariableAction::CreationType creationType, AZStd::string variableName)
  52. : EditorAutomationTest(QString("Create %1 %2").arg(ScriptCanvas::Data::GetName(dataType).c_str()).arg(GetModifierDescription(creationType).c_str()))
  53. {
  54. AutomationStateModelId variableTypeId = "VariableDataType";
  55. SetStateData(variableTypeId, dataType);
  56. AutomationStateModelId variableNameId = "VariableName";
  57. SetStateData(variableNameId, variableName);
  58. constexpr bool errorOnNameMismatch = true;
  59. AddState(new CreateRuntimeGraphState());
  60. AddState(new CreateVariableState(variableTypeId, variableNameId, errorOnNameMismatch, creationType));
  61. AddState(new ForceCloseActiveGraphState());
  62. }
  63. ////////////////////////////
  64. // CreateNamedVariableTest
  65. ////////////////////////////
  66. CreateNamedVariableTest::CreateNamedVariableTest(ScriptCanvas::Data::Type dataType, AZStd::string name, CreateVariableAction::CreationType creationType)
  67. : ManuallyCreateVariableTest(dataType, creationType, name)
  68. {
  69. SetTestName(AZStd::string::format("Create %s with name %s", ScriptCanvas::Data::GetName(dataType).c_str(), name.c_str()).c_str());
  70. }
  71. //////////////////////////////
  72. // DuplicateVariableNameTest
  73. //////////////////////////////
  74. DuplicateVariableNameTest::CheckVariableForNameMismatchState::CheckVariableForNameMismatchState(AutomationStateModelId nameId, AutomationStateModelId variableId)
  75. : CustomActionState("CheckVariableForNameMismatchState")
  76. , m_nameId(nameId)
  77. , m_variableId(variableId)
  78. {
  79. SetStateName("CheckVariableForNameMismatchState");
  80. }
  81. void DuplicateVariableNameTest::CheckVariableForNameMismatchState::OnCustomAction()
  82. {
  83. const ScriptCanvas::ScriptCanvasId* scriptCanvasId = GetStateModel()->GetStateDataAs<ScriptCanvas::ScriptCanvasId>(StateModelIds::ScriptCanvasId);
  84. const ScriptCanvas::VariableId* variableId = GetStateModel()->GetStateDataAs<ScriptCanvas::VariableId>(m_variableId);
  85. const AZStd::string* variableName = GetStateModel()->GetStateDataAs<AZStd::string>(m_nameId);
  86. if (variableId && scriptCanvasId && variableName)
  87. {
  88. ScriptCanvas::GraphVariable* graphVariable = nullptr;
  89. ScriptCanvas::GraphVariableManagerRequestBus::EventResult(graphVariable, (*scriptCanvasId), &ScriptCanvas::GraphVariableManagerRequests::FindVariableById, (*variableId));
  90. QString testName = QString(variableName->c_str());
  91. if (testName.compare(graphVariable->GetVariableName().data(), Qt::CaseInsensitive) == 0)
  92. {
  93. ReportError(AZStd::string::format("Second Variable has duplicate name %s", testName.toUtf8().data()).c_str());
  94. }
  95. }
  96. else
  97. {
  98. if (variableId == nullptr)
  99. {
  100. ReportError(AZStd::string::format("%s is not a valid VariableId", m_variableId.c_str()));
  101. }
  102. if (variableName == nullptr)
  103. {
  104. ReportError(AZStd::string::format("%s is not a valid string", m_nameId.c_str()));
  105. }
  106. if (scriptCanvasId == nullptr)
  107. {
  108. ReportError(AZStd::string::format("%s is not a valid ScriptCanvas::ScriptCanvasId", StateModelIds::ScriptCanvasId));
  109. }
  110. }
  111. }
  112. DuplicateVariableNameTest::DuplicateVariableNameTest(ScriptCanvas::Data::Type firstType, ScriptCanvas::Data::Type secondType, AZStd::string variableName)
  113. : EditorAutomationTest(QString("Duplicate Variable name %1 Test").arg(variableName.c_str()))
  114. {
  115. AutomationStateModelId firstVariableTypeId = "VariableDataType::1";
  116. SetStateData(firstVariableTypeId, firstType);
  117. AutomationStateModelId secondVariableTypeId = "VariableDataType::2";
  118. SetStateData(secondVariableTypeId, secondType);
  119. AutomationStateModelId variableNameId = "VariableName";
  120. SetStateData(variableNameId, variableName);
  121. AddState(new CreateRuntimeGraphState());
  122. constexpr bool errorOnNameMismatch = true;
  123. AutomationStateModelId firstVariableId = "VariableId::1";
  124. AddState(new CreateVariableState(firstVariableTypeId, variableNameId, errorOnNameMismatch, CreateVariableAction::CreationType::AutoComplete, firstVariableId));
  125. AutomationStateModelId secondVariableId = "VariableId::2";
  126. AddState(new CreateVariableState(secondVariableTypeId, variableNameId, !errorOnNameMismatch, CreateVariableAction::CreationType::AutoComplete, secondVariableId));
  127. AddState(new CheckVariableForNameMismatchState(variableNameId, secondVariableId));
  128. AddState(new ForceCloseActiveGraphState());
  129. }
  130. namespace EditStringLike
  131. {
  132. VariableInPaletteState::VariableInPaletteState(AZStd::string value, AutomationStateModelId variableId, VariablePaletteValidator validator)
  133. : NamedAutomationState("EditStringLikeVariableInPaletteState")
  134. , m_stringValue(value)
  135. , m_variableId(variableId)
  136. , m_validator(validator)
  137. , m_clickAction(Qt::MouseButton::LeftButton)
  138. , m_typeStringAction(value.c_str())
  139. , m_typeReturnAction(VK_RETURN)
  140. {
  141. }
  142. void VariableInPaletteState::OnSetupStateActions(EditorAutomationActionRunner& actionRunner)
  143. {
  144. QTableView* graphPalette = nullptr;
  145. ScriptCanvasEditor::VariableAutomationRequestBus::BroadcastResult(graphPalette, &ScriptCanvasEditor::VariableAutomationRequests::GetGraphPaletteTableView);
  146. if (graphPalette)
  147. {
  148. // 0 is the row, we've only created the single variable in this test, so we can assume that.
  149. // 2 is the column, this is just the column we need to click on in order to enter the editing mode.
  150. QModelIndex tableIndex = graphPalette->model()->index(0, 2);
  151. QRectF visualRect = graphPalette->visualRect(tableIndex);
  152. QPoint targetPoint = graphPalette->mapToGlobal(visualRect.center().toPoint());
  153. m_moveToTableRow = aznew MouseMoveAction(targetPoint);
  154. actionRunner.AddAction(m_moveToTableRow);
  155. actionRunner.AddAction(&m_processEvents);
  156. actionRunner.AddAction(&m_clickAction);
  157. actionRunner.AddAction(&m_clickAction);
  158. actionRunner.AddAction(&m_processEvents);
  159. actionRunner.AddAction(&m_typeStringAction);
  160. actionRunner.AddAction(&m_typeReturnAction);
  161. actionRunner.AddAction(&m_processEvents);
  162. }
  163. else
  164. {
  165. ReportError("GraphPalette cannot be found in EditNumberInPaletteState");
  166. }
  167. }
  168. void VariableInPaletteState::OnStateActionsComplete()
  169. {
  170. const ScriptCanvas::ScriptCanvasId* scriptCanvasId = GetStateModel()->GetStateDataAs<ScriptCanvas::ScriptCanvasId>(StateModelIds::ScriptCanvasId);
  171. const ScriptCanvas::VariableId* variableId = GetStateModel()->GetStateDataAs<ScriptCanvas::VariableId>(m_variableId);
  172. if (scriptCanvasId)
  173. {
  174. ScriptCanvas::GraphVariable* graphVariable = nullptr;
  175. ScriptCanvas::GraphVariableManagerRequestBus::EventResult(graphVariable, (*scriptCanvasId), &ScriptCanvas::GraphVariableManagerRequests::FindVariableById, (*variableId));
  176. if (graphVariable)
  177. {
  178. AZ::Outcome<void, AZStd::string> validationResult = m_validator(graphVariable);
  179. if (!validationResult)
  180. {
  181. ReportError(validationResult.GetError());
  182. }
  183. }
  184. else
  185. {
  186. ReportError("Failed to find Created Variable");
  187. }
  188. }
  189. if (m_moveToTableRow)
  190. {
  191. delete m_moveToTableRow;
  192. m_moveToTableRow = nullptr;
  193. }
  194. }
  195. ValueInNodeState::ValueInNodeState(AZStd::string value, AutomationStateModelId endpointId, DatumValidator datumValidator)
  196. : NamedAutomationState("EditNumberInNodeState")
  197. , m_stringValue(value)
  198. , m_endpointId(endpointId)
  199. , m_datumValidator(datumValidator)
  200. , m_clickAction(Qt::MouseButton::LeftButton)
  201. , m_typeStringAction(value.c_str())
  202. , m_typeReturnAction(VK_RETURN)
  203. {
  204. }
  205. void ValueInNodeState::OnSetupStateActions(EditorAutomationActionRunner& actionRunner)
  206. {
  207. const GraphCanvas::Endpoint* targetEndpoint = GetStateModel()->GetStateDataAs<GraphCanvas::Endpoint>(m_endpointId);
  208. if (targetEndpoint)
  209. {
  210. m_moveToPropertyAction = aznew MouseToNodePropertyEditorAction(targetEndpoint->GetSlotId());
  211. actionRunner.AddAction(m_moveToPropertyAction);
  212. actionRunner.AddAction(&m_processEvents);
  213. actionRunner.AddAction(&m_clickAction);
  214. actionRunner.AddAction(&m_processEvents);
  215. actionRunner.AddAction(&m_typeStringAction);
  216. actionRunner.AddAction(&m_processEvents);
  217. actionRunner.AddAction(&m_typeReturnAction);
  218. actionRunner.AddAction(&m_processEvents);
  219. }
  220. else
  221. {
  222. ReportError(AZStd::string::format("%s is not a valid GraphCanvas::Endpoint", m_endpointId.c_str()));
  223. }
  224. }
  225. void ValueInNodeState::OnStateActionsComplete()
  226. {
  227. const GraphCanvas::Endpoint* targetEndpoint = GetStateModel()->GetStateDataAs<GraphCanvas::Endpoint>(m_endpointId);
  228. const ScriptCanvas::ScriptCanvasId* scriptCanvasId = GetStateModel()->GetStateDataAs<ScriptCanvas::ScriptCanvasId>(StateModelIds::ScriptCanvasId);
  229. if (targetEndpoint && scriptCanvasId)
  230. {
  231. ScriptCanvas::Endpoint scriptCanvasEndpoint;
  232. ScriptCanvasEditor::EditorGraphRequestBus::EventResult(scriptCanvasEndpoint, (*scriptCanvasId), &ScriptCanvasEditor::EditorGraphRequests::ConvertToScriptCanvasEndpoint, (*targetEndpoint));
  233. if (scriptCanvasEndpoint.IsValid())
  234. {
  235. const ScriptCanvas::Datum* datum = nullptr;
  236. ScriptCanvas::NodeRequestBus::EventResult(datum, scriptCanvasEndpoint.GetNodeId(), &ScriptCanvas::NodeRequests::FindDatum, scriptCanvasEndpoint.GetSlotId());
  237. AZ::Outcome<void, AZStd::string> datumValidation = m_datumValidator(datum);
  238. if (!datumValidation)
  239. {
  240. ReportError(datumValidation.GetError());
  241. }
  242. }
  243. else
  244. {
  245. ReportError("Failed to convert Graph Canvas endpoint to Script Canvas endpoint");
  246. }
  247. }
  248. }
  249. }
  250. ///////////////////////////
  251. // ModifyNumericInputTest
  252. ///////////////////////////
  253. ModifyNumericInputTest::ModifyNumericInputTest(double value)
  254. : EditorAutomationTest("Numeric Input Test")
  255. {
  256. auto paletteDataValidator = [value](const ScriptCanvas::GraphVariable* graphVariable) -> AZ::Outcome<void, AZStd::string>
  257. {
  258. const ScriptCanvas::Datum* datum = graphVariable->GetDatum();
  259. if (datum && datum->GetType() == ScriptCanvas::Data::Type::Number())
  260. {
  261. double currentValue = (*datum->GetAs<ScriptCanvas::Data::NumberType>());
  262. if (!AZ::IsClose(currentValue, value, DBL_EPSILON))
  263. {
  264. return AZ::Failure<AZStd::string>(AZStd::string::format("Expected value %f found %f", value, currentValue));
  265. }
  266. }
  267. else
  268. {
  269. return AZ::Failure<AZStd::string>("Datum is missing or incorrect type.");
  270. }
  271. return AZ::Success();
  272. };
  273. auto datumValidator = [value](const ScriptCanvas::Datum* datum) -> AZ::Outcome<void, AZStd::string>
  274. {
  275. if (datum && datum->GetType() == ScriptCanvas::Data::Type::Number())
  276. {
  277. const ScriptCanvas::Data::NumberType* numberType = datum->GetAs<ScriptCanvas::Data::NumberType>();
  278. if (numberType)
  279. {
  280. if (!AZ::IsClose(value, (*numberType), DBL_EPSILON))
  281. {
  282. return AZ::Failure<AZStd::string>(AZStd::string::format("Expected datum value to be %f, got %f", value, (*numberType)));
  283. }
  284. }
  285. }
  286. else
  287. {
  288. return AZ::Failure<AZStd::string>("Datum is missing or incorrect type.");
  289. }
  290. return AZ::Success();
  291. };
  292. AZStd::string inputString = AZStd::string::format("%f", value);
  293. AutomationStateModelId firstVariableTypeId = "VariableDataType";
  294. SetStateData(firstVariableTypeId, ScriptCanvas::Data::Type::Number());
  295. AutomationStateModelId variableNameId = "VariableName";
  296. SetStateData(variableNameId, AZStd::string("Numeric"));
  297. AddState(new CreateRuntimeGraphState());
  298. AutomationStateModelId variableId = "VariableId";
  299. AddState(new CreateVariableState(firstVariableTypeId, variableNameId, false, CreateVariableAction::CreationType::AutoComplete, variableId));
  300. AddState(new EditStringLike::VariableInPaletteState(inputString, variableId, paletteDataValidator));
  301. AutomationStateModelId viewCenter = "ViewCenter";
  302. AddState(new FindViewCenterState(viewCenter));
  303. AutomationStateModelId variableNodeId = "VariableNodeId";
  304. AddState(new CreateVariableNodeFromGraphPaletteState(variableNameId, viewCenter, Qt::KeyboardModifier::AltModifier, variableNodeId));
  305. AutomationStateModelId dataSlotId = "DataSlotId";
  306. AddState(new FindEndpointOfTypeState(variableNodeId, dataSlotId, GraphCanvas::ConnectionType::CT_Input, GraphCanvas::SlotTypes::DataSlot));
  307. AddState(new EditStringLike::ValueInNodeState(inputString, dataSlotId, datumValidator));
  308. AddState(new ForceCloseActiveGraphState());
  309. }
  310. //////////////////////////
  311. // ModifyStringInputTest
  312. //////////////////////////
  313. ModifyStringInputTest::ModifyStringInputTest(AZStd::string value)
  314. : EditorAutomationTest("String Input Test")
  315. {
  316. auto paletteDataValidator = [value](const ScriptCanvas::GraphVariable* graphVariable) -> AZ::Outcome<void, AZStd::string>
  317. {
  318. const ScriptCanvas::Datum* datum = graphVariable->GetDatum();
  319. if (datum && datum->GetType() == ScriptCanvas::Data::Type::String())
  320. {
  321. AZStd::string currentValue = (*datum->GetAs<ScriptCanvas::Data::StringType>());
  322. if (currentValue.compare(value) != 0)
  323. {
  324. return AZ::Failure<AZStd::string>(AZStd::string::format("Expected value %s found %s", value.c_str(), currentValue.c_str()));
  325. }
  326. }
  327. else
  328. {
  329. return AZ::Failure<AZStd::string>("Datum is missing or incorrect type.");
  330. }
  331. return AZ::Success();
  332. };
  333. auto datumValidator = [value](const ScriptCanvas::Datum* datum) -> AZ::Outcome<void, AZStd::string>
  334. {
  335. if (datum && datum->GetType() == ScriptCanvas::Data::Type::String())
  336. {
  337. const ScriptCanvas::Data::StringType* stringType = datum->GetAs<ScriptCanvas::Data::StringType>();
  338. if (stringType)
  339. {
  340. if (value.compare(stringType->c_str()) != 0)
  341. {
  342. return AZ::Failure<AZStd::string>(AZStd::string::format("Expected datum value to be %s, got %s", value.c_str(), (*stringType).c_str()));
  343. }
  344. }
  345. }
  346. else
  347. {
  348. return AZ::Failure<AZStd::string>("Datum is missing or incorrect type.");
  349. }
  350. return AZ::Success();
  351. };
  352. AutomationStateModelId firstVariableTypeId = "VariableDataType";
  353. SetStateData(firstVariableTypeId, ScriptCanvas::Data::Type::String());
  354. AutomationStateModelId variableNameId = "VariableName";
  355. SetStateData(variableNameId, AZStd::string("String"));
  356. AddState(new CreateRuntimeGraphState());
  357. AutomationStateModelId variableId = "VariableId";
  358. AddState(new CreateVariableState(firstVariableTypeId, variableNameId, false, CreateVariableAction::CreationType::AutoComplete, variableId));
  359. AddState(new EditStringLike::VariableInPaletteState(value, variableId, paletteDataValidator));
  360. AutomationStateModelId viewCenter = "ViewCenter";
  361. AddState(new FindViewCenterState(viewCenter));
  362. AutomationStateModelId variableNodeId = "VariableNodeId";
  363. AddState(new CreateVariableNodeFromGraphPaletteState(variableNameId, viewCenter, Qt::KeyboardModifier::AltModifier, variableNodeId));
  364. AutomationStateModelId dataSlotId = "DataSlotId";
  365. AddState(new FindEndpointOfTypeState(variableNodeId, dataSlotId, GraphCanvas::ConnectionType::CT_Input, GraphCanvas::SlotTypes::DataSlot));
  366. AddState(new EditStringLike::ValueInNodeState(value, dataSlotId, datumValidator));
  367. AddState(new ForceCloseActiveGraphState());
  368. }
  369. ////////////////////////
  370. // ToggleBoolInputTest
  371. ////////////////////////
  372. ToggleBoolInputTest::ToggleBoolInPaletteState::ToggleBoolInPaletteState(AutomationStateModelId variableId)
  373. : NamedAutomationState("ToggleBoolInPaletteState")
  374. , m_variableId(variableId)
  375. {
  376. SetStateName(AZStd::string::format("ToggleBoolInPaletteState::%s", m_variableId.c_str()));
  377. }
  378. void ToggleBoolInputTest::ToggleBoolInPaletteState::OnSetupStateActions(EditorAutomationActionRunner& actionRunner)
  379. {
  380. const ScriptCanvas::VariableId* variableId = GetStateModel()->GetStateDataAs<ScriptCanvas::VariableId>(m_variableId);
  381. const ScriptCanvas::ScriptCanvasId* scriptCanvasId = GetStateModel()->GetStateDataAs<ScriptCanvas::ScriptCanvasId>(StateModelIds::ScriptCanvasId);
  382. if (variableId && scriptCanvasId)
  383. {
  384. ScriptCanvas::GraphVariable* graphVariable = nullptr;
  385. ScriptCanvas::GraphVariableManagerRequestBus::EventResult(graphVariable, (*scriptCanvasId), &ScriptCanvas::GraphVariableManagerRequests::FindVariableById, (*variableId));
  386. if (graphVariable)
  387. {
  388. const ScriptCanvas::Datum* datum = graphVariable->GetDatum();
  389. if (datum && datum->GetType() == ScriptCanvas::Data::Type::Boolean())
  390. {
  391. m_originalValue = (*datum->GetAs<ScriptCanvas::Data::BooleanType>());
  392. }
  393. QTableView* graphPalette = nullptr;
  394. ScriptCanvasEditor::VariableAutomationRequestBus::BroadcastResult(graphPalette, &ScriptCanvasEditor::VariableAutomationRequests::GetGraphPaletteTableView);
  395. if (graphPalette)
  396. {
  397. // Assume that the variable will be the only element created in this state. So we can just use row 0.
  398. QModelIndex tableIndex = graphPalette->model()->index(0, 2);
  399. QRectF visualRect = graphPalette->visualRect(tableIndex);
  400. QPointF clickPoint = visualRect.center();
  401. clickPoint.setX(visualRect.left() + 15);
  402. QPoint targetPoint = graphPalette->mapToGlobal(clickPoint.toPoint());
  403. m_interactWithTableAction = aznew MouseClickAction(Qt::MouseButton::LeftButton, targetPoint);
  404. actionRunner.AddAction(m_interactWithTableAction);
  405. }
  406. actionRunner.AddAction(&m_processEvents);
  407. }
  408. else
  409. {
  410. ReportError("Failed to find Created Variable");
  411. }
  412. }
  413. else
  414. {
  415. if (variableId == nullptr)
  416. {
  417. ReportError(AZStd::string::format("%s is not a valid ScriptCanvas::VariableId", m_variableId.c_str()));
  418. }
  419. if (scriptCanvasId == nullptr)
  420. {
  421. ReportError(AZStd::string::format("%s is not a valid ScriptCanvasId", StateModelIds::ScriptCanvasId));
  422. }
  423. }
  424. }
  425. void ToggleBoolInputTest::ToggleBoolInPaletteState::OnStateActionsComplete()
  426. {
  427. const ScriptCanvas::VariableId* variableId = GetStateModel()->GetStateDataAs<ScriptCanvas::VariableId>(m_variableId);
  428. const ScriptCanvas::ScriptCanvasId* scriptCanvasId = GetStateModel()->GetStateDataAs<ScriptCanvas::ScriptCanvasId>(StateModelIds::ScriptCanvasId);
  429. if (variableId && scriptCanvasId)
  430. {
  431. ScriptCanvas::GraphVariable* graphVariable = nullptr;
  432. ScriptCanvas::GraphVariableManagerRequestBus::EventResult(graphVariable, (*scriptCanvasId), &ScriptCanvas::GraphVariableManagerRequests::FindVariableById, (*variableId));
  433. if (graphVariable)
  434. {
  435. const ScriptCanvas::Datum* datum = graphVariable->GetDatum();
  436. if (datum && datum->GetType() == ScriptCanvas::Data::Type::Boolean())
  437. {
  438. bool currentValue = (*datum->GetAs<ScriptCanvas::Data::BooleanType>());
  439. if (currentValue == m_originalValue)
  440. {
  441. ReportError("Failed to toggle Boolean value");
  442. }
  443. }
  444. }
  445. }
  446. }
  447. ToggleBoolInputTest::ToggleBoolInNodeState::ToggleBoolInNodeState(AutomationStateModelId endpointId)
  448. : NamedAutomationState("ToggleBoolInNodeState")
  449. , m_endpointId(endpointId)
  450. , m_clickAction(Qt::MouseButton::LeftButton)
  451. {
  452. SetStateName(AZStd::string::format("ToggleBoolInNodeState::%s", endpointId.c_str()));
  453. }
  454. void ToggleBoolInputTest::ToggleBoolInNodeState::OnSetupStateActions(EditorAutomationActionRunner& actionRunner)
  455. {
  456. m_scriptCanvasEndpoint = ScriptCanvas::Endpoint();
  457. const GraphCanvas::Endpoint* gcEndpoint = GetStateModel()->GetStateDataAs<GraphCanvas::Endpoint>(m_endpointId);
  458. const ScriptCanvas::ScriptCanvasId* scriptCanvasId = GetStateModel()->GetStateDataAs<ScriptCanvas::ScriptCanvasId>(StateModelIds::ScriptCanvasId);
  459. if (gcEndpoint && scriptCanvasId)
  460. {
  461. ScriptCanvasEditor::EditorGraphRequestBus::EventResult(m_scriptCanvasEndpoint, (*scriptCanvasId), &ScriptCanvasEditor::EditorGraphRequests::ConvertToScriptCanvasEndpoint, (*gcEndpoint));
  462. if (m_scriptCanvasEndpoint.IsValid())
  463. {
  464. const ScriptCanvas::Datum* datum = nullptr;
  465. ScriptCanvas::NodeRequestBus::EventResult(datum, m_scriptCanvasEndpoint.GetNodeId(), &ScriptCanvas::NodeRequests::FindDatum, m_scriptCanvasEndpoint.GetSlotId());
  466. if (datum && datum->GetType() == ScriptCanvas::Data::Type::Boolean())
  467. {
  468. const ScriptCanvas::Data::BooleanType* booleanType = datum->GetAs<ScriptCanvas::Data::BooleanType>();
  469. if (booleanType)
  470. {
  471. m_originalValue = (*booleanType);
  472. }
  473. }
  474. else
  475. {
  476. ReportError("Datum is missing or incorrect type.");
  477. }
  478. }
  479. else
  480. {
  481. ReportError("Failed to convert Graph Canvas endpoint to Script Canvas endpoint");
  482. }
  483. m_mouseToNodePropertyEditorAction = aznew MouseToNodePropertyEditorAction(gcEndpoint->GetSlotId());
  484. actionRunner.AddAction(m_mouseToNodePropertyEditorAction);
  485. actionRunner.AddAction(&m_processEvents);
  486. actionRunner.AddAction(&m_clickAction);
  487. actionRunner.AddAction(&m_processEvents);
  488. }
  489. }
  490. void ToggleBoolInputTest::ToggleBoolInNodeState::OnStateActionsComplete()
  491. {
  492. if (m_scriptCanvasEndpoint.IsValid())
  493. {
  494. const ScriptCanvas::Datum* datum = nullptr;
  495. ScriptCanvas::NodeRequestBus::EventResult(datum, m_scriptCanvasEndpoint.GetNodeId(), &ScriptCanvas::NodeRequests::FindDatum, m_scriptCanvasEndpoint.GetSlotId());
  496. if (datum && datum->GetType() == ScriptCanvas::Data::Type::Boolean())
  497. {
  498. const ScriptCanvas::Data::BooleanType* booleanType = datum->GetAs<ScriptCanvas::Data::BooleanType>();
  499. if (booleanType)
  500. {
  501. if ((*booleanType) == m_originalValue)
  502. {
  503. ReportError("Boolean datum did not toggle after interaction");
  504. }
  505. }
  506. }
  507. else
  508. {
  509. ReportError("Datum is missing or incorrect type.");
  510. }
  511. }
  512. }
  513. ToggleBoolInputTest::ToggleBoolInputTest()
  514. : EditorAutomationTest("Bool Input Test")
  515. {
  516. AutomationStateModelId firstVariableTypeId = "VariableDataType";
  517. SetStateData(firstVariableTypeId, ScriptCanvas::Data::Type::Boolean());
  518. AutomationStateModelId variableNameId = "VariableName";
  519. SetStateData(variableNameId, AZStd::string("Boolean"));
  520. AddState(new CreateRuntimeGraphState());
  521. AutomationStateModelId variableId = "VariableId";
  522. AddState(new CreateVariableState(firstVariableTypeId, variableNameId, false, CreateVariableAction::CreationType::AutoComplete, variableId));
  523. AddState(new ToggleBoolInPaletteState(variableId));
  524. AutomationStateModelId viewCenter = "ViewCenter";
  525. AddState(new FindViewCenterState(viewCenter));
  526. AutomationStateModelId variableNodeId = "VariableNodeId";
  527. AddState(new CreateVariableNodeFromGraphPaletteState(variableNameId, viewCenter, Qt::KeyboardModifier::AltModifier, variableNodeId));
  528. AutomationStateModelId dataSlotId = "DataSlotId";
  529. AddState(new FindEndpointOfTypeState(variableNodeId, dataSlotId, GraphCanvas::ConnectionType::CT_Input, GraphCanvas::SlotTypes::DataSlot));
  530. AddState(new ToggleBoolInNodeState(dataSlotId));
  531. AddState(new ForceCloseActiveGraphState());
  532. }
  533. //////////////////////////
  534. // VariableLifeCycleTest
  535. //////////////////////////
  536. VariableLifeCycleTest::VariableLifeCycleTest(AZStd::string name, AZStd::vector<ScriptCanvas::Data::Type> dataTypes, CreateVariableAction::CreationType creationType)
  537. : EditorAutomationTest(name.c_str())
  538. , m_typesToMake(dataTypes)
  539. {
  540. m_variableTypeId = "ActiveVariableTypeId";
  541. m_variableId = "ActiveVariableId";
  542. m_viewCenter = "ViewCenter";
  543. m_offsetCenter = "OffsetCenter";
  544. AutomationStateModelId variableNameId = "VariableName";
  545. AutomationStateModelId setNodeId = "SetNodeId";
  546. AutomationStateModelId getNodeId = "GetNodeId";
  547. SetStateData(variableNameId, AZStd::string("LifeCycle"));
  548. SetHasCustomTransitions(true);
  549. AddState(new CreateRuntimeGraphState());
  550. m_findViewCenterState = new FindViewCenterState(m_viewCenter);
  551. AddState(m_findViewCenterState);
  552. m_createVariableState = new CreateVariableState(m_variableTypeId, variableNameId, false, creationType, m_variableId);
  553. AddState(m_createVariableState);
  554. m_dragCreateGetNode = new CreateVariableNodeFromGraphPaletteState(variableNameId, m_viewCenter, Qt::KeyboardModifier::ShiftModifier, getNodeId);
  555. m_dragCreateSetNode = new CreateVariableNodeFromGraphPaletteState(variableNameId, m_offsetCenter, Qt::KeyboardModifier::AltModifier, setNodeId);
  556. AddState(m_dragCreateSetNode);
  557. AddState(m_dragCreateGetNode);
  558. m_createGetNode = new CreateNodeFromContextMenuState("Get LifeCycle", CreateNodeFromContextMenuState::CreationType::ScenePosition, m_viewCenter, getNodeId);
  559. m_createSetNode = new CreateNodeFromContextMenuState("Set LifeCycle", CreateNodeFromContextMenuState::CreationType::ScenePosition, m_offsetCenter, setNodeId);
  560. AddState(m_createGetNode);
  561. AddState(m_createSetNode);
  562. m_destroyGetNode = new AltClickSceneElementState(getNodeId);
  563. m_destroySetNode = new AltClickSceneElementState(setNodeId);
  564. AddState(m_destroyGetNode);
  565. AddState(m_destroySetNode);
  566. m_deleteVariableRowState = new DeleteVariableRowFromPaletteState(0);
  567. AddState(m_deleteVariableRowState);
  568. AddState(new ForceCloseActiveGraphState());
  569. SetInitialStateId<CreateRuntimeGraphStateId>();
  570. }
  571. void VariableLifeCycleTest::OnTestStarting()
  572. {
  573. m_activeIndex = -1;
  574. }
  575. int VariableLifeCycleTest::EvaluateTransition(int stateId)
  576. {
  577. if (stateId == ForceCloseActiveGraphStateId::StateID())
  578. {
  579. return EditorAutomationState::EXIT_STATE_ID;
  580. }
  581. else if (stateId == CreateRuntimeGraphStateId::StateID())
  582. {
  583. return m_findViewCenterState->GetStateId();
  584. }
  585. else if (stateId == m_findViewCenterState->GetStateId())
  586. {
  587. const AZ::Vector2* viewCenter = GetStateDataAs<AZ::Vector2>(m_viewCenter);
  588. if (viewCenter)
  589. {
  590. AZ::Vector2 offsetCenter = (*viewCenter);
  591. const AZ::Vector2* minorStep = GetStateDataAs<AZ::Vector2>(StateModelIds::MinorStep);
  592. if (minorStep)
  593. {
  594. offsetCenter -= (*minorStep);
  595. }
  596. SetStateData(m_offsetCenter, offsetCenter);
  597. }
  598. return SetupNextVariable();
  599. }
  600. else if (stateId == m_createVariableState->GetStateId())
  601. {
  602. if (m_createVariablesNodesViaContextMenu)
  603. {
  604. return m_createGetNode->GetStateId();
  605. }
  606. else
  607. {
  608. return m_dragCreateGetNode->GetStateId();
  609. }
  610. }
  611. else if (stateId == m_createGetNode->GetStateId())
  612. {
  613. return m_createSetNode->GetStateId();
  614. }
  615. else if (stateId == m_dragCreateGetNode->GetStateId())
  616. {
  617. return m_dragCreateSetNode->GetStateId();
  618. }
  619. else if (stateId == m_createSetNode->GetStateId()
  620. || stateId == m_dragCreateSetNode->GetStateId())
  621. {
  622. return m_destroySetNode->GetStateId();
  623. }
  624. else if (stateId == m_destroySetNode->GetStateId())
  625. {
  626. return m_destroyGetNode->GetStateId();
  627. }
  628. else if (stateId == m_destroyGetNode->GetStateId())
  629. {
  630. return m_deleteVariableRowState->GetStateId();
  631. }
  632. else if (stateId == m_deleteVariableRowState->GetStateId())
  633. {
  634. return SetupNextVariable();
  635. }
  636. return EditorAutomationState::EXIT_STATE_ID;
  637. }
  638. int VariableLifeCycleTest::SetupNextVariable()
  639. {
  640. ++m_activeIndex;
  641. if (m_activeIndex < m_typesToMake.size())
  642. {
  643. SetStateData(m_variableTypeId, m_typesToMake[m_activeIndex]);
  644. SetStateData(m_variableId, ScriptCanvas::VariableId());
  645. return m_createVariableState->GetStateId();
  646. }
  647. return ForceCloseActiveGraphStateId::StateID();
  648. }
  649. //////////////////////////////////////
  650. // RapidVariableCreationDeletionTest
  651. //////////////////////////////////////
  652. RapidVariableCreationDeletionTest::RapidVariableCreationDeletionTest()
  653. : EditorAutomationTest("Mass Create/Destroy Variable Test")
  654. , m_variableType("Variable Type")
  655. {
  656. SetHasCustomTransitions(true);
  657. AddState(new CreateRuntimeGraphState());
  658. m_createVariableState = new CreateVariableState(m_variableType, "", false, CreateVariableAction::CreationType::Programmatic);
  659. AddState(m_createVariableState);
  660. m_deleteVariableRowState = new DeleteVariableRowFromPaletteState(0);
  661. AddState(m_deleteVariableRowState);
  662. AddState(new ForceCloseActiveGraphState());
  663. SetInitialStateId<CreateRuntimeGraphStateId>();
  664. }
  665. void RapidVariableCreationDeletionTest::OnTestStarting()
  666. {
  667. m_activeIndex = 0;
  668. ScriptCanvasEditor::VariableAutomationRequestBus::BroadcastResult(m_variableTypes, &ScriptCanvasEditor::VariableAutomationRequests::GetVariableTypes);
  669. ScriptCanvasEditor::VariableAutomationRequestBus::BroadcastResult(m_graphPalette, &ScriptCanvasEditor::VariableAutomationRequests::GetGraphPaletteTableView);
  670. }
  671. int RapidVariableCreationDeletionTest::EvaluateTransition(int stateId)
  672. {
  673. if (stateId == CreateRuntimeGraphStateId::StateID()
  674. || stateId == m_createVariableState->GetStateId())
  675. {
  676. return SetupNextVariable();
  677. }
  678. else if (stateId == m_deleteVariableRowState->GetStateId())
  679. {
  680. if (m_graphPalette->model()->rowCount() > 0)
  681. {
  682. return m_deleteVariableRowState->GetStateId();
  683. }
  684. else
  685. {
  686. return ForceCloseActiveGraphStateId::StateID();
  687. }
  688. }
  689. return EditorAutomationState::EXIT_STATE_ID;
  690. }
  691. int RapidVariableCreationDeletionTest::SetupNextVariable()
  692. {
  693. if (m_activeIndex >= m_variableTypes.size())
  694. {
  695. m_graphPalette->scrollToTop();
  696. return m_deleteVariableRowState->GetStateId();
  697. }
  698. else
  699. {
  700. SetStateData(m_variableType, m_variableTypes[m_activeIndex]);
  701. ++m_activeIndex;
  702. return m_createVariableState->GetStateId();
  703. }
  704. }
  705. }