ScriptCanvasTestNodes.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  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 "ScriptCanvasTestNodes.h"
  9. #include <ScriptCanvas/Core/Core.h>
  10. #include <ScriptCanvas/Core/Graph.h>
  11. #include <ScriptCanvas/Core/SlotConfigurationDefaults.h>
  12. #include <gtest/gtest.h>
  13. namespace TestNodes
  14. {
  15. //////////////////////////////////////////////////////////////////////////////
  16. void TestResult::OnInit()
  17. {
  18. Node::AddSlot(ScriptCanvas::CommonSlots::GeneralInSlot());
  19. Node::AddSlot(ScriptCanvas::CommonSlots::GeneralOutSlot());
  20. ScriptCanvas::DynamicDataSlotConfiguration slotConfiguration;
  21. slotConfiguration.m_name = "Value";
  22. slotConfiguration.m_dynamicDataType = ScriptCanvas::DynamicDataType::Any;
  23. slotConfiguration.SetConnectionType(ScriptCanvas::ConnectionType::Input);
  24. AddSlot(slotConfiguration);
  25. }
  26. void TestResult::Reflect(AZ::ReflectContext* context)
  27. {
  28. AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context);
  29. if (serializeContext)
  30. {
  31. serializeContext->Class<TestResult, Node>()
  32. ->Version(5)
  33. ->Field("m_string", &TestResult::m_string)
  34. ;
  35. AZ::EditContext* editContext = serializeContext->GetEditContext();
  36. if (editContext)
  37. {
  38. editContext->Class<TestResult>("TestResult", "Development node, will be replaced by a Log node")
  39. ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  40. ->Attribute(AZ::Edit::Attributes::Icon, "Icons/ScriptCanvas/TestResult.png")
  41. ->DataElement(AZ::Edit::UIHandlers::Default, &TestResult::m_string, "String", "")
  42. ->Attribute(AZ::Edit::Attributes::AutoExpand, true)
  43. ;
  44. }
  45. }
  46. }
  47. //////////////////////////////////////////////////////////////////////////////
  48. void ContractNode::Reflect(AZ::ReflectContext* reflection)
  49. {
  50. AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(reflection);
  51. if (serializeContext)
  52. {
  53. serializeContext->Class<ContractNode, Node>()
  54. ->Version(1)
  55. ;
  56. }
  57. }
  58. void ContractNode::OnInit()
  59. {
  60. using namespace ScriptCanvas;
  61. SlotId inSlotId = Node::AddSlot(ScriptCanvas::CommonSlots::GeneralInSlot());
  62. Node::AddSlot(ScriptCanvas::CommonSlots::GeneralOutSlot());
  63. auto func = []() { return aznew DisallowReentrantExecutionContract{}; };
  64. ContractDescriptor descriptor{ AZStd::move(func) };
  65. GetSlot(inSlotId)->AddContract(descriptor);
  66. AddSlot(ScriptCanvas::DataSlotConfiguration(Data::Type::String(), "Set String", ScriptCanvas::ConnectionType::Input));
  67. AddSlot(ScriptCanvas::DataSlotConfiguration(Data::Type::String(), "Get String", ScriptCanvas::ConnectionType::Output));
  68. AddSlot(ScriptCanvas::DataSlotConfiguration(Data::Type::Number(), "Set Number", ScriptCanvas::ConnectionType::Input));
  69. AddSlot(ScriptCanvas::DataSlotConfiguration(Data::Type::Number(), "Get Number", ScriptCanvas::ConnectionType::Output));
  70. }
  71. //////////////////////////////////////////////////////////////////////////////
  72. void InfiniteLoopNode::Reflect(AZ::ReflectContext* reflection)
  73. {
  74. if (AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(reflection))
  75. {
  76. serializeContext->Class<InfiniteLoopNode, Node>()
  77. ->Version(0)
  78. ;
  79. }
  80. }
  81. void InfiniteLoopNode::OnInit()
  82. {
  83. AddSlot(ScriptCanvas::CommonSlots::GeneralInSlot());
  84. AddSlot(ScriptCanvas::ExecutionSlotConfiguration("Before Infinity", ScriptCanvas::ConnectionType::Output));
  85. AddSlot(ScriptCanvas::ExecutionSlotConfiguration("After Infinity", ScriptCanvas::ConnectionType::Output));
  86. }
  87. //////////////////////////////////////////////////////////////////////////////
  88. void UnitTestErrorNode::Reflect(AZ::ReflectContext* reflection)
  89. {
  90. if (AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(reflection))
  91. {
  92. serializeContext->Class<UnitTestErrorNode, Node>()
  93. ->Version(0)
  94. ;
  95. }
  96. }
  97. void UnitTestErrorNode::OnInit()
  98. {
  99. AddSlot(ScriptCanvas::CommonSlots::GeneralInSlot());
  100. AddSlot(ScriptCanvas::CommonSlots::GeneralOutSlot());
  101. ScriptCanvas::DynamicDataSlotConfiguration slotConfiguration;
  102. slotConfiguration.SetConnectionType(ScriptCanvas::ConnectionType::Output);
  103. slotConfiguration.m_name = "This";
  104. slotConfiguration.m_dynamicDataType = ScriptCanvas::DynamicDataType::Any;
  105. AddSlot(slotConfiguration);
  106. }
  107. //////////////////////////////////////////////////////////////////////////////
  108. void AddNodeWithRemoveSlot::Reflect(AZ::ReflectContext* reflection)
  109. {
  110. if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(reflection))
  111. {
  112. serializeContext->Class<AddNodeWithRemoveSlot, ScriptCanvas::Node>()
  113. ->Version(0)
  114. ->Field("m_dynamicSlotIds", &AddNodeWithRemoveSlot::m_dynamicSlotIds)
  115. ;
  116. }
  117. }
  118. ScriptCanvas::SlotId AddNodeWithRemoveSlot::AddSlot(AZStd::string_view slotName)
  119. {
  120. ScriptCanvas::SlotId addedSlotId = FindSlotIdForDescriptor(slotName, ScriptCanvas::SlotDescriptors::DataIn());
  121. if (!addedSlotId.IsValid())
  122. {
  123. ScriptCanvas::DataSlotConfiguration slotConfiguration;
  124. slotConfiguration.m_name = slotName;
  125. slotConfiguration.SetDefaultValue(0.0);
  126. slotConfiguration.SetConnectionType(ScriptCanvas::ConnectionType::Input);
  127. addedSlotId = Node::AddSlot(slotConfiguration);
  128. m_dynamicSlotIds.push_back(addedSlotId);
  129. }
  130. return addedSlotId;
  131. }
  132. bool AddNodeWithRemoveSlot::RemoveSlot(const ScriptCanvas::SlotId& slotId, bool emitWarning /*= true*/)
  133. {
  134. AZStd::erase_if(m_dynamicSlotIds, [slotId](const ScriptCanvas::SlotId& sId) { return (sId == slotId); });
  135. return Node::RemoveSlot(slotId, true, emitWarning);
  136. }
  137. void AddNodeWithRemoveSlot::OnInit()
  138. {
  139. Node::AddSlot(ScriptCanvas::CommonSlots::GeneralInSlot());
  140. Node::AddSlot(ScriptCanvas::CommonSlots::GeneralOutSlot());
  141. for (AZStd::string slotName : {"A", "B", "C"})
  142. {
  143. ScriptCanvas::SlotId slotId = FindSlotIdForDescriptor(slotName, ScriptCanvas::SlotDescriptors::DataIn());
  144. if (!slotId.IsValid())
  145. {
  146. ScriptCanvas::DataSlotConfiguration slotConfiguration;
  147. slotConfiguration.m_name = slotName;
  148. slotConfiguration.SetDefaultValue(0);
  149. slotConfiguration.SetConnectionType(ScriptCanvas::ConnectionType::Input);
  150. m_dynamicSlotIds.push_back(Node::AddSlot(slotConfiguration));
  151. }
  152. }
  153. {
  154. ScriptCanvas::DataSlotConfiguration slotConfiguration;
  155. slotConfiguration.m_name = "Result";
  156. slotConfiguration.SetType(ScriptCanvas::Data::Type::Number());
  157. slotConfiguration.SetConnectionType(ScriptCanvas::ConnectionType::Output);
  158. m_resultSlotId = Node::AddSlot(slotConfiguration);
  159. }
  160. }
  161. void StringView::OnInit()
  162. {
  163. AddSlot(ScriptCanvas::CommonSlots::GeneralInSlot());
  164. AddSlot(ScriptCanvas::CommonSlots::GeneralOutSlot());
  165. {
  166. ScriptCanvas::DataSlotConfiguration slotConfiguration;
  167. slotConfiguration.m_name = "View";
  168. slotConfiguration.m_toolTip = "Input string_view object";
  169. slotConfiguration.ConfigureDatum(AZStd::move(ScriptCanvas::Datum(ScriptCanvas::Data::Type::String(), ScriptCanvas::Datum::eOriginality::Copy)));
  170. slotConfiguration.SetConnectionType(ScriptCanvas::ConnectionType::Input);
  171. AddSlot(slotConfiguration);
  172. }
  173. {
  174. ScriptCanvas::DataSlotConfiguration slotConfiguration;
  175. slotConfiguration.m_name = "Result";
  176. slotConfiguration.m_toolTip = "Output string object";
  177. slotConfiguration.SetAZType<AZStd::string>();
  178. slotConfiguration.SetConnectionType(ScriptCanvas::ConnectionType::Output);
  179. m_resultSlotId = AddSlot(slotConfiguration);
  180. }
  181. }
  182. //////////////////////////////////////////////////////////////////////////////
  183. void StringView::Reflect(AZ::ReflectContext* context)
  184. {
  185. AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context);
  186. if (serializeContext)
  187. {
  188. serializeContext->Class<StringView, Node>()
  189. ->Version(0)
  190. ;
  191. }
  192. }
  193. //////////////////////////////////////////////////////////////////////////////
  194. void InsertSlotConcatNode::Reflect(AZ::ReflectContext* reflection)
  195. {
  196. if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(reflection))
  197. {
  198. serializeContext->Class<InsertSlotConcatNode, ScriptCanvas::Node>()
  199. ->Version(0)
  200. ;
  201. }
  202. }
  203. ScriptCanvas::SlotId InsertSlotConcatNode::InsertSlot(AZ::s64 index, AZStd::string_view slotName)
  204. {
  205. using namespace ScriptCanvas;
  206. SlotId addedSlotId = FindSlotIdForDescriptor(slotName, ScriptCanvas::SlotDescriptors::DataIn());
  207. if (!addedSlotId.IsValid())
  208. {
  209. DataSlotConfiguration dataConfig;
  210. dataConfig.m_name = slotName;
  211. dataConfig.m_toolTip = "";
  212. dataConfig.SetConnectionType(ScriptCanvas::ConnectionType::Input);
  213. dataConfig.SetDefaultValue(Data::StringType());
  214. addedSlotId = Node::InsertSlot(index, dataConfig);
  215. }
  216. return addedSlotId;
  217. }
  218. void InsertSlotConcatNode::OnInit()
  219. {
  220. Node::AddSlot(ScriptCanvas::CommonSlots::GeneralInSlot());
  221. Node::AddSlot(ScriptCanvas::CommonSlots::GeneralOutSlot());
  222. Node::AddSlot(ScriptCanvas::DataSlotConfiguration(ScriptCanvas::Data::Type::String(), "Result", ScriptCanvas::ConnectionType::Output));
  223. }
  224. /////////////////////////////
  225. // ConfigurableUnitTestNode
  226. /////////////////////////////
  227. void ConfigurableUnitTestNode::Reflect(AZ::ReflectContext* reflection)
  228. {
  229. if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(reflection))
  230. {
  231. serializeContext->Class<ConfigurableUnitTestNode, ScriptCanvas::Node>()
  232. ->Version(0)
  233. ;
  234. }
  235. }
  236. ScriptCanvas::Slot* ConfigurableUnitTestNode::AddTestingSlot(const ScriptCanvas::SlotConfiguration& slotConfiguration)
  237. {
  238. ScriptCanvas::SlotId slotId = AddSlot(slotConfiguration);
  239. return GetSlot(slotId);
  240. }
  241. ScriptCanvas::Slot* ConfigurableUnitTestNode::InsertTestingSlot(int index, const ScriptCanvas::SlotConfiguration& slotConfiguration)
  242. {
  243. ScriptCanvas::SlotId slotId = InsertSlot(index, slotConfiguration);
  244. return GetSlot(slotId);
  245. }
  246. AZStd::vector< const ScriptCanvas::Slot* > ConfigurableUnitTestNode::FindSlotsByDescriptor(const ScriptCanvas::SlotDescriptor& slotDescriptor) const
  247. {
  248. return GetAllSlotsByDescriptor(slotDescriptor);
  249. }
  250. void ConfigurableUnitTestNode::TestClearDisplayType(const AZ::Crc32& dynamicGroup)
  251. {
  252. ClearDisplayType(dynamicGroup);
  253. }
  254. void ConfigurableUnitTestNode::TestSetDisplayType(const AZ::Crc32& dynamicGroup, const ScriptCanvas::Data::Type& dataType)
  255. {
  256. SetDisplayType(dynamicGroup, dataType);
  257. }
  258. bool ConfigurableUnitTestNode::TestHasConcreteDisplayType(const AZ::Crc32& dynamicGroup) const
  259. {
  260. return FindConcreteDisplayType(dynamicGroup).IsValid();
  261. }
  262. bool ConfigurableUnitTestNode::TestIsSlotConnectedToConcreteDisplayType(const ScriptCanvas::Slot& slot, ExploredDynamicGroupCache& exploredGroupCache) const
  263. {
  264. return FindConnectedConcreteDisplayType(slot, exploredGroupCache).IsValid();
  265. }
  266. void ConfigurableUnitTestNode::SetSlotExecutionMap(ScriptCanvas::SlotExecution::Map* executionMap)
  267. {
  268. m_slotExecutionMap = executionMap;
  269. }
  270. const ScriptCanvas::SlotExecution::Map* ConfigurableUnitTestNode::GetSlotExecutionMap() const
  271. {
  272. return m_slotExecutionMap;
  273. }
  274. }