ScriptCanvas_Variables.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  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 <Source/Framework/ScriptCanvasTestFixture.h>
  9. #include <Source/Framework/ScriptCanvasTestUtilities.h>
  10. #include <AzCore/Serialization/Utils.h>
  11. #include <AzCore/std/string/string.h>
  12. #include <AzCore/std/containers/vector.h>
  13. #include <AzCore/RTTI/ReflectContext.h>
  14. #include <ScriptCanvas/Variable/GraphVariableManagerComponent.h>
  15. namespace ScriptCanvasTests
  16. {
  17. using namespace ScriptCanvasEditor;
  18. class StringArray
  19. {
  20. public:
  21. AZ_TYPE_INFO(StringArray, "{0240E221-3800-4BD3-91F3-0304F097F9A7}");
  22. StringArray() = default;
  23. static AZStd::string StringArrayToString(AZStd::vector<AZStd::string> inputArray, AZStd::string_view separator = " ")
  24. {
  25. if (inputArray.empty())
  26. {
  27. return "";
  28. }
  29. AZStd::string value;
  30. auto currentIt = inputArray.begin();
  31. auto lastIt = inputArray.end();
  32. for (value = *currentIt; currentIt != lastIt; ++currentIt)
  33. {
  34. value += separator;
  35. value += *currentIt;
  36. }
  37. return value;
  38. }
  39. static void Reflect(AZ::ReflectContext* context)
  40. {
  41. if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
  42. {
  43. serializeContext->Class<StringArray>()
  44. ->Version(0)
  45. ;
  46. }
  47. if (auto behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context))
  48. {
  49. behaviorContext->Class<StringArray>("StringArray")
  50. ->Method("StringArrayToString", &StringArray::StringArrayToString)
  51. ->Method("Equal", [](const StringArray&, const StringArray&) -> bool {return true; }, { {} })
  52. ->Attribute(AZ::Script::Attributes::Operator, AZ::Script::Attributes::OperatorType::Equal)
  53. ;
  54. }
  55. }
  56. };
  57. }
  58. using namespace ScriptCanvasTests;
  59. TEST_F(ScriptCanvasTestFixture, CreateVariableTest)
  60. {
  61. StringArray::Reflect(m_serializeContext);
  62. StringArray::Reflect(m_behaviorContext);
  63. TestBehaviorContextObject::Reflect(m_serializeContext);
  64. TestBehaviorContextObject::Reflect(m_behaviorContext);
  65. {
  66. using namespace ScriptCanvas;
  67. ScriptCanvas::ScriptCanvasId scriptCanvasId = AZ::Entity::MakeId();
  68. AZStd::unique_ptr<AZ::Entity> propertyEntity = AZStd::make_unique<AZ::Entity>("PropertyGraph");
  69. propertyEntity->CreateComponent<GraphVariableManagerComponent>(scriptCanvasId);
  70. propertyEntity->Init();
  71. propertyEntity->Activate();
  72. auto vector3Datum1 = Datum(Data::Vector3Type(1.1f, 2.0f, 3.6f));
  73. auto vector3Datum2 = Datum(Data::Vector3Type(0.0f, -86.654f, 134.23f));
  74. auto vector4Datum = Datum(Data::Vector4Type(6.0f, 17.5f, -41.75f, 400.875f));
  75. TestBehaviorContextObject testObject;
  76. auto behaviorMatrix4x4Datum = Datum(testObject);
  77. auto stringArrayDatum = Datum(StringArray());
  78. AZ::Outcome<VariableId, AZStd::string> addPropertyOutcome(AZ::Failure(AZStd::string("Uninitialized")));
  79. GraphVariableManagerRequestBus::EventResult(addPropertyOutcome, scriptCanvasId, &GraphVariableManagerRequests::AddVariable, "FirstVector3", vector3Datum1, false);
  80. EXPECT_TRUE(addPropertyOutcome);
  81. EXPECT_TRUE(addPropertyOutcome.GetValue().IsValid());
  82. addPropertyOutcome = AZ::Failure(AZStd::string("Uninitialized"));
  83. GraphVariableManagerRequestBus::EventResult(addPropertyOutcome, scriptCanvasId, &GraphVariableManagerRequests::AddVariable, "SecondVector3", vector3Datum2, false);
  84. EXPECT_TRUE(addPropertyOutcome);
  85. EXPECT_TRUE(addPropertyOutcome.GetValue().IsValid());
  86. addPropertyOutcome = AZ::Failure(AZStd::string("Uninitialized"));
  87. GraphVariableManagerRequestBus::EventResult(addPropertyOutcome, scriptCanvasId, &GraphVariableManagerRequests::AddVariable, "FirstVector4", vector4Datum, false);
  88. EXPECT_TRUE(addPropertyOutcome);
  89. EXPECT_TRUE(addPropertyOutcome.GetValue().IsValid());
  90. addPropertyOutcome = AZ::Failure(AZStd::string("Uninitialized"));
  91. GraphVariableManagerRequestBus::EventResult(addPropertyOutcome, scriptCanvasId, &GraphVariableManagerRequests::AddVariable, "ProjectionMatrix", behaviorMatrix4x4Datum, false);
  92. EXPECT_TRUE(addPropertyOutcome);
  93. EXPECT_TRUE(addPropertyOutcome.GetValue().IsValid());
  94. addPropertyOutcome = AZ::Failure(AZStd::string("Uninitialized"));
  95. GraphVariableManagerRequestBus::EventResult(addPropertyOutcome, scriptCanvasId, &GraphVariableManagerRequests::AddVariable, "My String Array", stringArrayDatum, false);
  96. EXPECT_TRUE(addPropertyOutcome);
  97. EXPECT_TRUE(addPropertyOutcome.GetValue().IsValid());
  98. AZStd::vector<AZ::Outcome<VariableId, AZStd::string>> addVariablesOutcome;
  99. AZStd::vector<AZStd::pair<AZStd::string_view, Datum>> datumsToAdd;
  100. datumsToAdd.emplace_back("FirstBoolean", Datum(true));
  101. datumsToAdd.emplace_back("FirstString", Datum(AZStd::string("Test")));
  102. GraphVariableManagerRequestBus::EventResult(addVariablesOutcome, scriptCanvasId, &GraphVariableManagerRequests::AddVariables<decltype(datumsToAdd)::iterator>, datumsToAdd.begin(), datumsToAdd.end());
  103. EXPECT_EQ(2, addVariablesOutcome.size());
  104. EXPECT_TRUE(addVariablesOutcome[0]);
  105. EXPECT_TRUE(addVariablesOutcome[0].GetValue().IsValid());
  106. EXPECT_TRUE(addVariablesOutcome[1]);
  107. EXPECT_TRUE(addVariablesOutcome[1].GetValue().IsValid());
  108. propertyEntity.reset();
  109. }
  110. m_serializeContext->EnableRemoveReflection();
  111. m_behaviorContext->EnableRemoveReflection();
  112. StringArray::Reflect(m_serializeContext);
  113. StringArray::Reflect(m_behaviorContext);
  114. TestBehaviorContextObject::Reflect(m_serializeContext);
  115. TestBehaviorContextObject::Reflect(m_behaviorContext);
  116. m_serializeContext->DisableRemoveReflection();
  117. m_behaviorContext->DisableRemoveReflection();
  118. }
  119. TEST_F(ScriptCanvasTestFixture, AddVariableFailTest)
  120. {
  121. using namespace ScriptCanvas;
  122. ScriptCanvasId scriptCanvasId = AZ::Entity::MakeId();
  123. AZStd::unique_ptr<AZ::Entity> propertyEntity = AZStd::make_unique<AZ::Entity>("PropertyGraph");
  124. propertyEntity->CreateComponent<GraphVariableManagerComponent>(scriptCanvasId);
  125. propertyEntity->Init();
  126. propertyEntity->Activate();
  127. auto vector3Datum1 = Datum(Data::Vector3Type(1.1f, 2.0f, 3.6f));
  128. auto vector3Datum2 = Datum(Data::Vector3Type(0.0f, -86.654f, 134.23f));
  129. const AZStd::string_view propertyName = "SameName";
  130. AZ::Outcome<VariableId, AZStd::string> addPropertyOutcome(AZ::Failure(AZStd::string("Uninitialized")));
  131. GraphVariableManagerRequestBus::EventResult(addPropertyOutcome, scriptCanvasId, &GraphVariableManagerRequests::AddVariable, propertyName, vector3Datum1, false);
  132. EXPECT_TRUE(addPropertyOutcome);
  133. EXPECT_TRUE(addPropertyOutcome.GetValue().IsValid());
  134. addPropertyOutcome = AZ::Failure(AZStd::string("Uninitialized"));
  135. GraphVariableManagerRequestBus::EventResult(addPropertyOutcome, scriptCanvasId, &GraphVariableManagerRequests::AddVariable, propertyName, vector3Datum2, false);
  136. EXPECT_FALSE(addPropertyOutcome);
  137. propertyEntity.reset();
  138. }
  139. TEST_F(ScriptCanvasTestFixture, RemoveVariableTest)
  140. {
  141. StringArray::Reflect(m_serializeContext);
  142. StringArray::Reflect(m_behaviorContext);
  143. TestBehaviorContextObject::Reflect(m_serializeContext);
  144. TestBehaviorContextObject::Reflect(m_behaviorContext);
  145. {
  146. using namespace ScriptCanvas;
  147. ScriptCanvasId scriptCanvasId = AZ::Entity::MakeId();
  148. AZStd::unique_ptr<AZ::Entity> propertyEntity = AZStd::make_unique<AZ::Entity>("PropertyGraph");
  149. propertyEntity->CreateComponent<GraphVariableManagerComponent>(scriptCanvasId);
  150. propertyEntity->Init();
  151. propertyEntity->Activate();
  152. auto vector3Datum1 = Datum(Data::Vector3Type(1.1f, 2.0f, 3.6f));
  153. auto vector3Datum2 = Datum(Data::Vector3Type(0.0f, -86.654f, 134.23f));
  154. auto vector4Datum = Datum(Data::Vector4Type(6.0f, 17.5f, -41.75f, 400.875f));
  155. TestBehaviorContextObject testObject;
  156. auto behaviorMatrix4x4Datum = Datum(testObject);
  157. auto stringArrayDatum = Datum(StringArray());
  158. size_t numVariablesAdded = 0U;
  159. AZ::Outcome<VariableId, AZStd::string> addPropertyOutcome(AZ::Failure(AZStd::string("Uninitialized")));
  160. GraphVariableManagerRequestBus::EventResult(addPropertyOutcome, scriptCanvasId, &GraphVariableManagerRequests::AddVariable, "FirstVector3", vector3Datum1, false);
  161. EXPECT_TRUE(addPropertyOutcome);
  162. EXPECT_TRUE(addPropertyOutcome.GetValue().IsValid());
  163. ++numVariablesAdded;
  164. addPropertyOutcome = AZ::Failure(AZStd::string("Uninitialized"));
  165. GraphVariableManagerRequestBus::EventResult(addPropertyOutcome, scriptCanvasId, &GraphVariableManagerRequests::AddVariable, "SecondVector3", vector3Datum2, false);
  166. EXPECT_TRUE(addPropertyOutcome);
  167. EXPECT_TRUE(addPropertyOutcome.GetValue().IsValid());
  168. ++numVariablesAdded;
  169. addPropertyOutcome = AZ::Failure(AZStd::string("Uninitialized"));
  170. GraphVariableManagerRequestBus::EventResult(addPropertyOutcome, scriptCanvasId, &GraphVariableManagerRequests::AddVariable, "FirstVector4", vector4Datum, false);
  171. EXPECT_TRUE(addPropertyOutcome);
  172. EXPECT_TRUE(addPropertyOutcome.GetValue().IsValid());
  173. ++numVariablesAdded;
  174. addPropertyOutcome = AZ::Failure(AZStd::string("Uninitialized"));
  175. GraphVariableManagerRequestBus::EventResult(addPropertyOutcome, scriptCanvasId, &GraphVariableManagerRequests::AddVariable, "ProjectionMatrix", behaviorMatrix4x4Datum, false);
  176. EXPECT_TRUE(addPropertyOutcome);
  177. EXPECT_TRUE(addPropertyOutcome.GetValue().IsValid());
  178. ++numVariablesAdded;
  179. addPropertyOutcome = AZ::Failure(AZStd::string("Uninitialized"));
  180. GraphVariableManagerRequestBus::EventResult(addPropertyOutcome, scriptCanvasId, &GraphVariableManagerRequests::AddVariable, "My String Array", stringArrayDatum, false);
  181. EXPECT_TRUE(addPropertyOutcome);
  182. EXPECT_TRUE(addPropertyOutcome.GetValue().IsValid());
  183. const VariableId stringArrayId = addPropertyOutcome.GetValue();
  184. ++numVariablesAdded;
  185. AZStd::vector<AZ::Outcome<VariableId, AZStd::string>> addVariablesOutcome;
  186. AZStd::vector<AZStd::pair<AZStd::string_view, Datum>> datumsToAdd;
  187. datumsToAdd.emplace_back("FirstBoolean", Datum(true));
  188. datumsToAdd.emplace_back("FirstString", Datum(AZStd::string("Test")));
  189. GraphVariableManagerRequestBus::EventResult(addVariablesOutcome, scriptCanvasId, &GraphVariableManagerRequests::AddVariables<decltype(datumsToAdd)::iterator>, datumsToAdd.begin(), datumsToAdd.end());
  190. EXPECT_EQ(2, addVariablesOutcome.size());
  191. EXPECT_TRUE(addVariablesOutcome[0]);
  192. EXPECT_TRUE(addVariablesOutcome[0].GetValue().IsValid());
  193. EXPECT_TRUE(addVariablesOutcome[1]);
  194. EXPECT_TRUE(addVariablesOutcome[1].GetValue().IsValid());
  195. numVariablesAdded += addVariablesOutcome.size();
  196. const AZStd::unordered_map<VariableId, GraphVariable>* properties = nullptr;
  197. GraphVariableManagerRequestBus::EventResult(properties, scriptCanvasId, &GraphVariableManagerRequests::GetVariables);
  198. ASSERT_NE(nullptr, properties);
  199. EXPECT_EQ(numVariablesAdded, (*properties).size());
  200. {
  201. // Remove Property By Id
  202. bool removePropertyResult = false;
  203. GraphVariableManagerRequestBus::EventResult(removePropertyResult, scriptCanvasId, &GraphVariableManagerRequests::RemoveVariable, stringArrayId);
  204. EXPECT_TRUE(removePropertyResult);
  205. properties = {};
  206. GraphVariableManagerRequestBus::EventResult(properties, scriptCanvasId, &GraphVariableManagerRequests::GetVariables);
  207. ASSERT_NE(nullptr, properties);
  208. EXPECT_EQ(numVariablesAdded, (*properties).size() + 1);
  209. // Attempt to remove already removed property
  210. GraphVariableManagerRequestBus::EventResult(removePropertyResult, scriptCanvasId, &GraphVariableManagerRequests::RemoveVariable, stringArrayId);
  211. EXPECT_FALSE(removePropertyResult);
  212. }
  213. {
  214. // Remove Property by name
  215. size_t numVariablesRemoved = 0U;
  216. GraphVariableManagerRequestBus::EventResult(numVariablesRemoved, scriptCanvasId, &GraphVariableManagerRequests::RemoveVariableByName, "ProjectionMatrix");
  217. EXPECT_EQ(1U, numVariablesRemoved);
  218. properties = {};
  219. GraphVariableManagerRequestBus::EventResult(properties, scriptCanvasId, &GraphVariableManagerRequests::GetVariables);
  220. ASSERT_NE(nullptr, properties);
  221. EXPECT_EQ(numVariablesAdded, (*properties).size() + 2);
  222. // Attempt to remove property again.
  223. GraphVariableManagerRequestBus::EventResult(numVariablesRemoved, scriptCanvasId, &GraphVariableManagerRequests::RemoveVariableByName, "ProjectionMatrix");
  224. EXPECT_EQ(0U, numVariablesRemoved);
  225. }
  226. {
  227. // Re-add removed Property
  228. addPropertyOutcome = AZ::Failure(AZStd::string("Uninitialized"));
  229. GraphVariableManagerRequestBus::EventResult(addPropertyOutcome, scriptCanvasId, &GraphVariableManagerRequests::AddVariable, "ProjectionMatrix", behaviorMatrix4x4Datum, false);
  230. EXPECT_TRUE(addPropertyOutcome);
  231. EXPECT_TRUE(addPropertyOutcome.GetValue().IsValid());
  232. properties = {};
  233. GraphVariableManagerRequestBus::EventResult(properties, scriptCanvasId, &GraphVariableManagerRequests::GetVariables);
  234. EXPECT_EQ(numVariablesAdded, (*properties).size() + 1);
  235. }
  236. propertyEntity.reset();
  237. }
  238. m_serializeContext->EnableRemoveReflection();
  239. m_behaviorContext->EnableRemoveReflection();
  240. StringArray::Reflect(m_serializeContext);
  241. StringArray::Reflect(m_behaviorContext);
  242. TestBehaviorContextObject::Reflect(m_serializeContext);
  243. TestBehaviorContextObject::Reflect(m_behaviorContext);
  244. m_serializeContext->DisableRemoveReflection();
  245. m_behaviorContext->DisableRemoveReflection();
  246. }
  247. TEST_F(ScriptCanvasTestFixture, FindVariableTest)
  248. {
  249. using namespace ScriptCanvas;
  250. ScriptCanvasId scriptCanvasId = AZ::Entity::MakeId();
  251. AZStd::unique_ptr<AZ::Entity> propertyEntity = AZStd::make_unique<AZ::Entity>("PropertyGraph");
  252. propertyEntity->CreateComponent<GraphVariableManagerComponent>(scriptCanvasId);
  253. propertyEntity->Init();
  254. propertyEntity->Activate();
  255. auto stringVariableDatum = Datum(Data::StringType("SABCDQPE"));
  256. const AZStd::string_view propertyName = "StringProperty";
  257. AZ::Outcome<VariableId, AZStd::string> addPropertyOutcome(AZ::Failure(AZStd::string("Uninitialized")));
  258. GraphVariableManagerRequestBus::EventResult(addPropertyOutcome, scriptCanvasId, &GraphVariableManagerRequests::AddVariable, propertyName, stringVariableDatum, false);
  259. EXPECT_TRUE(addPropertyOutcome);
  260. EXPECT_TRUE(addPropertyOutcome.GetValue().IsValid());
  261. const VariableId stringVariableId = addPropertyOutcome.GetValue();
  262. GraphVariable* variableByName = nullptr;
  263. {
  264. // Find Property by name
  265. GraphVariableManagerRequestBus::EventResult(variableByName, scriptCanvasId, &GraphVariableManagerRequests::FindVariable, propertyName);
  266. ASSERT_NE(nullptr, variableByName);
  267. EXPECT_EQ(variableByName->GetVariableId(), stringVariableId);
  268. EXPECT_EQ(stringVariableDatum, (*variableByName->GetDatum()));
  269. }
  270. GraphVariable* variableById = nullptr;
  271. {
  272. // Find Property by id
  273. GraphVariableManagerRequestBus::EventResult(variableById, scriptCanvasId, &GraphVariableManagerRequests::FindVariableById, stringVariableId);
  274. ASSERT_NE(nullptr, variableById);
  275. EXPECT_EQ(stringVariableDatum, (*variableById->GetDatum()));
  276. }
  277. {
  278. // Remove Property
  279. size_t numVariablesRemoved = false;
  280. GraphVariableManagerRequestBus::EventResult(numVariablesRemoved, scriptCanvasId, &GraphVariableManagerRequests::RemoveVariableByName, propertyName);
  281. EXPECT_EQ(1U, numVariablesRemoved);
  282. }
  283. {
  284. // Attempt to re-lookup property
  285. GraphVariable* propertyVariable = nullptr;
  286. GraphVariableManagerRequestBus::EventResult(propertyVariable, scriptCanvasId, &GraphVariableManagerRequests::FindVariable, propertyName);
  287. EXPECT_EQ(nullptr, propertyVariable);
  288. GraphVariable* stringVariable = nullptr;
  289. GraphVariableManagerRequestBus::EventResult(stringVariable, scriptCanvasId, &GraphVariableManagerRequests::FindVariableById, stringVariableId);
  290. EXPECT_EQ(nullptr, stringVariable);
  291. }
  292. propertyEntity.reset();
  293. }
  294. TEST_F(ScriptCanvasTestFixture, ModifyVariableTest)
  295. {
  296. using namespace ScriptCanvas;
  297. ScriptCanvasId scriptCanvasId = AZ::Entity::MakeId();
  298. AZStd::unique_ptr<AZ::Entity> propertyEntity = AZStd::make_unique<AZ::Entity>("PropertyGraph");
  299. propertyEntity->CreateComponent<GraphVariableManagerComponent>(scriptCanvasId);
  300. propertyEntity->Init();
  301. propertyEntity->Activate();
  302. auto stringVariableDatum = Datum(Data::StringType("Test1"));
  303. const AZStd::string_view propertyName = "StringProperty";
  304. AZ::Outcome<VariableId, AZStd::string> addPropertyOutcome(AZ::Failure(AZStd::string("Uninitialized")));
  305. GraphVariableManagerRequestBus::EventResult(addPropertyOutcome, scriptCanvasId, &GraphVariableManagerRequests::AddVariable, propertyName, stringVariableDatum, false);
  306. EXPECT_TRUE(addPropertyOutcome);
  307. EXPECT_TRUE(addPropertyOutcome.GetValue().IsValid());
  308. const VariableId stringVariableId = addPropertyOutcome.GetValue();
  309. GraphVariable* propertyDatum = nullptr;
  310. GraphVariableManagerRequestBus::EventResult(propertyDatum, scriptCanvasId, &GraphVariableManagerRequests::FindVariable, propertyName);
  311. ASSERT_NE(nullptr, propertyDatum);
  312. // Modify the added property
  313. AZStd::string_view modifiedString = "High Functioning S... *<silenced>";
  314. {
  315. ModifiableDatumView datumView;
  316. propertyDatum->ConfigureDatumView(datumView);
  317. ASSERT_TRUE(datumView.IsValid());
  318. ASSERT_TRUE(datumView.GetDataType() == Data::Type::String());
  319. datumView.SetAs(ScriptCanvas::Data::StringType(modifiedString));
  320. }
  321. {
  322. // Re-lookup Property and test against modifiedString
  323. GraphVariable* stringVariable = nullptr;
  324. GraphVariableManagerRequestBus::EventResult(stringVariable, scriptCanvasId, &GraphVariableManagerRequests::FindVariableById, stringVariableId);
  325. ASSERT_NE(nullptr, stringVariable);
  326. ModifiableDatumView datumView;
  327. stringVariable->ConfigureDatumView(datumView);
  328. ASSERT_TRUE(datumView.IsValid());
  329. ASSERT_TRUE(datumView.GetDataType() == Data::Type::String());
  330. auto resultString = datumView.GetAs<Data::StringType>();
  331. EXPECT_EQ(modifiedString, (*resultString));
  332. }
  333. }
  334. TEST_F(ScriptCanvasTestFixture, SerializationTest)
  335. {
  336. StringArray::Reflect(m_serializeContext);
  337. StringArray::Reflect(m_behaviorContext);
  338. using namespace ScriptCanvas;
  339. {
  340. ScriptCanvasId scriptCanvasId = AZ::Entity::MakeId();
  341. AZStd::unique_ptr<AZ::Entity> propertyEntity = AZStd::make_unique<AZ::Entity>("PropertyGraph");
  342. propertyEntity->CreateComponent<GraphVariableManagerComponent>(scriptCanvasId);
  343. propertyEntity->Init();
  344. propertyEntity->Activate();
  345. auto stringArrayDatum = Datum(StringArray());
  346. AZ::Outcome<VariableId, AZStd::string> addPropertyOutcome(AZ::Failure(AZStd::string("Uninitialized")));
  347. GraphVariableManagerRequestBus::EventResult(addPropertyOutcome, scriptCanvasId, &GraphVariableManagerRequests::AddVariable, "My String Array", stringArrayDatum, false);
  348. EXPECT_TRUE(addPropertyOutcome);
  349. EXPECT_TRUE(addPropertyOutcome.GetValue().IsValid());
  350. GraphVariable* stringArrayVariable = nullptr;
  351. GraphVariableManagerRequestBus::EventResult(stringArrayVariable, scriptCanvasId, &GraphVariableManagerRequests::FindVariable, "My String Array");
  352. ASSERT_NE(nullptr, stringArrayVariable);
  353. EXPECT_EQ(stringArrayDatum, (*stringArrayVariable->GetDatum()));
  354. const VariableId stringArrayVariableId = stringArrayVariable->GetVariableId();
  355. // Save Property Component Entity
  356. AZStd::vector<AZ::u8> binaryBuffer;
  357. AZ::IO::ByteContainerStream<decltype(binaryBuffer)> byteStream(&binaryBuffer);
  358. const bool objectSaved = AZ::Utils::SaveObjectToStream(byteStream, AZ::DataStream::ST_BINARY, propertyEntity.get(), m_serializeContext);
  359. EXPECT_TRUE(objectSaved);
  360. // Delete the Property Component
  361. propertyEntity.reset();
  362. // Load Variable Component Entity
  363. {
  364. byteStream.Seek(0U, AZ::IO::GenericStream::ST_SEEK_BEGIN);
  365. propertyEntity.reset(AZ::Utils::LoadObjectFromStream<AZ::Entity>(byteStream, m_serializeContext));
  366. ASSERT_TRUE(propertyEntity);
  367. propertyEntity->Init();
  368. propertyEntity->Activate();
  369. GraphVariableManagerComponent* component = propertyEntity->FindComponent<GraphVariableManagerComponent>();
  370. if (component)
  371. {
  372. component->ConfigureScriptCanvasId(scriptCanvasId);
  373. }
  374. }
  375. // Attempt to lookup the My String Array property after loading from object stream
  376. stringArrayVariable = nullptr;
  377. GraphVariableManagerRequestBus::EventResult(stringArrayVariable, scriptCanvasId, &GraphVariableManagerRequests::FindVariable, "My String Array");
  378. ASSERT_NE(nullptr, stringArrayVariable);
  379. EXPECT_EQ(stringArrayVariableId, stringArrayVariable->GetVariableId());
  380. auto identityMatrixDatum = Datum(Data::Matrix3x3Type::CreateIdentity());
  381. addPropertyOutcome = AZ::Failure(AZStd::string("Uninitialized"));
  382. GraphVariableManagerRequestBus::EventResult(addPropertyOutcome, scriptCanvasId, &GraphVariableManagerRequests::AddVariable, "Super Matrix Bros", identityMatrixDatum, false);
  383. EXPECT_TRUE(addPropertyOutcome);
  384. EXPECT_TRUE(addPropertyOutcome.GetValue().IsValid());
  385. GraphVariable* matrixVariable = nullptr;
  386. GraphVariableManagerRequestBus::EventResult(matrixVariable, scriptCanvasId, &GraphVariableManagerRequests::FindVariableById, addPropertyOutcome.GetValue());
  387. ASSERT_NE(nullptr, matrixVariable);
  388. const Datum* matrix3x3Datum = matrixVariable->GetDatum();
  389. EXPECT_EQ(identityMatrixDatum, (*matrix3x3Datum));
  390. propertyEntity.reset();
  391. }
  392. m_serializeContext->EnableRemoveReflection();
  393. m_behaviorContext->EnableRemoveReflection();
  394. StringArray::Reflect(m_serializeContext);
  395. StringArray::Reflect(m_behaviorContext);
  396. m_serializeContext->DisableRemoveReflection();
  397. m_behaviorContext->DisableRemoveReflection();
  398. }
  399. TEST_F(ScriptCanvasTestFixture, Vector2AllNodes)
  400. {
  401. RunUnitTestGraph("LY_SC_UnitTest_Vector2_AllNodes", ExecutionMode::Interpreted);
  402. }
  403. TEST_F(ScriptCanvasTestFixture, Vector3_GetNode)
  404. {
  405. RunUnitTestGraph("LY_SC_UnitTest_Vector3_Variable_GetNode", ExecutionMode::Interpreted);
  406. }
  407. TEST_F(ScriptCanvasTestFixture, Vector3_SetNode)
  408. {
  409. RunUnitTestGraph("LY_SC_UnitTest_Vector3_Variable_SetNode", ExecutionMode::Interpreted);
  410. }