SceneManifestTests.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  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 <AzTest/AzTest.h>
  9. #include <AzCore/Memory/SystemAllocator.h>
  10. #include <AzCore/std/smart_ptr/make_shared.h>
  11. #include <AzCore/Debug/TraceMessageBus.h>
  12. #include <AzCore/IO/FileIO.h>
  13. #include <AzCore/IO/SystemFile.h>
  14. #include <AzCore/Serialization/Json/RegistrationContext.h>
  15. #include <AzCore/Serialization/Json/JsonSystemComponent.h>
  16. #include <AzCore/Serialization/Json/JsonUtils.h>
  17. #include <AzCore/Serialization/Utils.h>
  18. #include <AzCore/UnitTest/TestTypes.h>
  19. #include <AzToolsFramework/Application/ToolsApplication.h>
  20. #include <SceneAPI/SceneCore/Containers/SceneManifest.h>
  21. #include <SceneAPI/SceneCore/DataTypes/IManifestObject.h>
  22. #include <string>
  23. extern "C" AZ_DLL_EXPORT void CleanUpSceneCoreGenericClassInfo();
  24. namespace AZ
  25. {
  26. namespace SceneAPI
  27. {
  28. namespace Containers
  29. {
  30. const int BUFFER_SIZE = 64 * 1024;
  31. static decltype(SceneManifest::s_invalidIndex) INVALID_INDEX(SceneManifest::s_invalidIndex); // gtest cannot compare static consts
  32. class MockManifestInt : public DataTypes::IManifestObject
  33. {
  34. public:
  35. AZ_RTTI(MockManifestInt, "{D6F96B49-4E6F-4EE8-A5A3-959B76F90DA8}", IManifestObject);
  36. AZ_CLASS_ALLOCATOR(MockManifestInt, AZ::SystemAllocator);
  37. MockManifestInt()
  38. : m_value(0)
  39. {
  40. }
  41. MockManifestInt(int64_t value)
  42. : m_value(value)
  43. {
  44. }
  45. int64_t GetValue() const
  46. {
  47. return m_value;
  48. }
  49. void SetValue(int64_t value)
  50. {
  51. m_value = value;
  52. }
  53. static void Reflect(AZ::ReflectContext* context)
  54. {
  55. AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context);
  56. if (serializeContext)
  57. {
  58. serializeContext->
  59. Class<MockManifestInt, IManifestObject>()->
  60. Version(1)->
  61. Field("value", &MockManifestInt::m_value);
  62. }
  63. }
  64. protected:
  65. int64_t m_value;
  66. };
  67. class MockSceneManifest
  68. : public SceneManifest
  69. {
  70. public:
  71. AZ_RTTI(MockSceneManifest, "{E6B3247F-1B48-49F8-B514-18FAC77C0F94}", SceneManifest);
  72. AZ_CLASS_ALLOCATOR(MockSceneManifest, AZ::SystemAllocator);
  73. AZ::Outcome<void, AZStd::string> LoadFromString(const AZStd::string& fileContents, SerializeContext* context, JsonRegistrationContext* registrationContext, bool loadXml = false)
  74. {
  75. return SceneManifest::LoadFromString(fileContents, context, registrationContext, loadXml);
  76. }
  77. AZ::Outcome<rapidjson::Document, AZStd::string> SaveToJsonDocument(SerializeContext* context, JsonRegistrationContext* registrationContext)
  78. {
  79. return SceneManifest::SaveToJsonDocument(context, registrationContext);
  80. }
  81. static void Reflect(AZ::ReflectContext* context)
  82. {
  83. AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context);
  84. if (serializeContext)
  85. {
  86. serializeContext->
  87. Class<MockSceneManifest, SceneManifest>()->
  88. Version(1);
  89. }
  90. }
  91. };
  92. class SceneManifestTest
  93. : public UnitTest::LeakDetectionFixture
  94. , public AZ::Debug::TraceMessageBus::Handler
  95. {
  96. public:
  97. SceneManifestTest()
  98. {
  99. m_firstDataObject = AZStd::make_shared<MockManifestInt>(1);
  100. m_secondDataObject = AZStd::make_shared<MockManifestInt>(2);
  101. m_testDataObject = AZStd::make_shared<MockManifestInt>(3);
  102. m_testManifest.AddEntry(m_firstDataObject);
  103. m_testManifest.AddEntry(m_secondDataObject);
  104. m_testManifest.AddEntry(m_testDataObject);
  105. }
  106. void SetUp() override
  107. {
  108. m_serializeContext = AZStd::make_unique<SerializeContext>();
  109. m_jsonRegistrationContext = AZStd::make_unique<JsonRegistrationContext>();
  110. m_jsonSystemComponent = AZStd::make_unique<JsonSystemComponent>();
  111. m_jsonSystemComponent->Reflect(m_jsonRegistrationContext.get());
  112. DataTypes::IManifestObject::Reflect(m_serializeContext.get());
  113. MockManifestInt::Reflect(m_serializeContext.get());
  114. SceneManifest::Reflect(m_serializeContext.get());
  115. MockSceneManifest::Reflect(m_serializeContext.get());
  116. BusConnect();
  117. }
  118. void TearDown() override
  119. {
  120. BusDisconnect();
  121. m_jsonRegistrationContext->EnableRemoveReflection();
  122. m_jsonSystemComponent->Reflect(m_jsonRegistrationContext.get());
  123. m_jsonRegistrationContext->DisableRemoveReflection();
  124. m_serializeContext->EnableRemoveReflection();
  125. DataTypes::IManifestObject::Reflect(m_serializeContext.get());
  126. MockManifestInt::Reflect(m_serializeContext.get());
  127. SceneManifest::Reflect(m_serializeContext.get());
  128. MockSceneManifest::Reflect(m_serializeContext.get());
  129. m_serializeContext->DisableRemoveReflection();
  130. m_serializeContext.reset();
  131. m_jsonRegistrationContext.reset();
  132. m_jsonSystemComponent.reset();
  133. CleanUpSceneCoreGenericClassInfo();
  134. }
  135. bool OnPreAssert(const char* /*message*/, int /*line*/, const char* /*func*/, const char* /*message*/) override
  136. {
  137. m_assertTriggered = true;
  138. return true;
  139. }
  140. bool m_assertTriggered = false;
  141. AZStd::shared_ptr<MockManifestInt> m_firstDataObject;
  142. AZStd::shared_ptr<MockManifestInt> m_secondDataObject;
  143. AZStd::shared_ptr<MockManifestInt> m_testDataObject;
  144. MockSceneManifest m_testManifest;
  145. AZStd::unique_ptr<SerializeContext> m_serializeContext;
  146. AZStd::unique_ptr<JsonRegistrationContext> m_jsonRegistrationContext;
  147. AZStd::unique_ptr<JsonSystemComponent> m_jsonSystemComponent;
  148. };
  149. TEST_F(SceneManifestTest, IsEmpty_Empty_True)
  150. {
  151. SceneManifest testManifest;
  152. EXPECT_TRUE(testManifest.IsEmpty());
  153. }
  154. TEST_F(SceneManifestTest, AddEntry_AddNewValue_ResultTrue)
  155. {
  156. SceneManifest testManifest;
  157. AZStd::shared_ptr<MockManifestInt> testDataObject = AZStd::make_shared<MockManifestInt>(100);
  158. bool result = testManifest.AddEntry(testDataObject);
  159. EXPECT_TRUE(result);
  160. }
  161. TEST_F(SceneManifestTest, AddEntry_MoveNewValue_ResultTrueAndPointerClear)
  162. {
  163. SceneManifest testManifest;
  164. AZStd::shared_ptr<MockManifestInt> testDataObject = AZStd::make_shared<MockManifestInt>(100);
  165. bool result = testManifest.AddEntry(AZStd::move(testDataObject));
  166. EXPECT_TRUE(result);
  167. EXPECT_EQ(nullptr, testDataObject.get());
  168. }
  169. //dependent on AddEntry
  170. TEST_F(SceneManifestTest, IsEmpty_NotEmpty_False)
  171. {
  172. SceneManifest testManifest;
  173. AZStd::shared_ptr<MockManifestInt> testDataObject = AZStd::make_shared<MockManifestInt>(100);
  174. testManifest.AddEntry(AZStd::move(testDataObject));
  175. EXPECT_FALSE(testManifest.IsEmpty());
  176. }
  177. //dependent on AddEntry and IsEmpty
  178. TEST_F(SceneManifestTest, Clear_NotEmpty_EmptyTrue)
  179. {
  180. SceneManifest testManifest;
  181. AZStd::shared_ptr<MockManifestInt> testDataObject = AZStd::make_shared<MockManifestInt>(100);
  182. testManifest.AddEntry(AZStd::move(testDataObject));
  183. EXPECT_FALSE(testManifest.IsEmpty());
  184. testManifest.Clear();
  185. EXPECT_TRUE(testManifest.IsEmpty());
  186. }
  187. //RemoveEntry
  188. TEST_F(SceneManifestTest, RemoveEntry_NameInList_ResultTrueAndNotStillInList)
  189. {
  190. SceneManifest testManifest;
  191. AZStd::shared_ptr<MockManifestInt> testDataObject = AZStd::make_shared<MockManifestInt>(1);
  192. testManifest.AddEntry(testDataObject);
  193. bool result = testManifest.RemoveEntry(testDataObject);
  194. EXPECT_TRUE(result);
  195. }
  196. TEST_F(SceneManifestTest, RemoveEntry_NameNotInList_ResultFalse)
  197. {
  198. SceneManifest testManifest;
  199. AZStd::shared_ptr<MockManifestInt> testDataObject = AZStd::make_shared<MockManifestInt>(1);
  200. testManifest.RemoveEntry(testDataObject);
  201. EXPECT_TRUE(m_assertTriggered);
  202. }
  203. // GetEntryCount
  204. TEST_F(SceneManifestTest, GetEntryCount_EmptyManifest_CountIsZero)
  205. {
  206. SceneManifest testManifest;
  207. EXPECT_TRUE(testManifest.IsEmpty());
  208. EXPECT_EQ(0, testManifest.GetEntryCount());
  209. }
  210. TEST_F(SceneManifestTest, GetEntryCount_FilledManifest_CountIsThree)
  211. {
  212. EXPECT_EQ(3, m_testManifest.GetEntryCount());
  213. }
  214. // GetValue
  215. TEST_F(SceneManifestTest, GetValue_ValidIndex_ReturnsInt2)
  216. {
  217. AZStd::shared_ptr<MockManifestInt> result = azrtti_cast<MockManifestInt*>(m_testManifest.GetValue(1));
  218. ASSERT_TRUE(result);
  219. EXPECT_EQ(2, result->GetValue());
  220. }
  221. TEST_F(SceneManifestTest, GetValue_InvalidIndex_ReturnsNullPtr)
  222. {
  223. EXPECT_EQ(nullptr, m_testManifest.GetValue(42));
  224. }
  225. // FindIndex
  226. TEST_F(SceneManifestTest, FindIndex_ValidValue_ResultIsOne)
  227. {
  228. EXPECT_EQ(1, m_testManifest.FindIndex(m_secondDataObject.get()));
  229. }
  230. TEST_F(SceneManifestTest, FindIndex_InvalidValueFromSharedPtr_ResultIsInvalidIndex)
  231. {
  232. AZStd::shared_ptr<DataTypes::IManifestObject> invalid = AZStd::make_shared<MockManifestInt>(42);
  233. EXPECT_EQ(INVALID_INDEX, m_testManifest.FindIndex(invalid.get()));
  234. }
  235. TEST_F(SceneManifestTest, FindIndex_InvalidValueFromNullptr_ResultIsInvalidIndex)
  236. {
  237. DataTypes::IManifestObject* invalid = nullptr;
  238. EXPECT_EQ(INVALID_INDEX, m_testManifest.FindIndex(invalid));
  239. }
  240. // RemoveEntry - continued
  241. TEST_F(SceneManifestTest, RemoveEntry_IndexAdjusted_IndexReduced)
  242. {
  243. SceneManifest testManifest;
  244. AZStd::shared_ptr<MockManifestInt> testDataObject1 = AZStd::make_shared<MockManifestInt>(1);
  245. AZStd::shared_ptr<MockManifestInt> testDataObject2 = AZStd::make_shared<MockManifestInt>(2);
  246. AZStd::shared_ptr<MockManifestInt> testDataObject3 = AZStd::make_shared<MockManifestInt>(3);
  247. testManifest.AddEntry(testDataObject1);
  248. testManifest.AddEntry(testDataObject2);
  249. testManifest.AddEntry(testDataObject3);
  250. bool result = testManifest.RemoveEntry(testDataObject2);
  251. ASSERT_TRUE(result);
  252. EXPECT_EQ(1, azrtti_cast<MockManifestInt*>(testManifest.GetValue(0))->GetValue());
  253. EXPECT_EQ(3, azrtti_cast<MockManifestInt*>(testManifest.GetValue(1))->GetValue());
  254. EXPECT_EQ(0, testManifest.FindIndex(testDataObject1));
  255. EXPECT_EQ(INVALID_INDEX, testManifest.FindIndex(testDataObject2));
  256. EXPECT_EQ(1, testManifest.FindIndex(testDataObject3));
  257. }
  258. // SaveToJsonObject
  259. TEST_F(SceneManifestTest, SaveToJsonDocument_SaveFilledManifestToString_ReturnsTrue)
  260. {
  261. auto result = m_testManifest.SaveToJsonDocument(m_serializeContext.get(), m_jsonRegistrationContext.get());
  262. EXPECT_TRUE(result.IsSuccess());
  263. }
  264. TEST_F(SceneManifestTest, SaveToJsonDocument_SaveEmptyManifestToString_ReturnsTrue)
  265. {
  266. MockSceneManifest empty;
  267. auto result = empty.SaveToJsonDocument(m_serializeContext.get(), m_jsonRegistrationContext.get());
  268. EXPECT_TRUE(result.IsSuccess());
  269. }
  270. // LoadFromString
  271. TEST_F(SceneManifestTest, LoadFromString_LoadEmptyManifestFromString_ReturnsTrue)
  272. {
  273. MockSceneManifest empty;
  274. auto writeToJsonResult = empty.SaveToJsonDocument(m_serializeContext.get(), m_jsonRegistrationContext.get());
  275. ASSERT_TRUE(writeToJsonResult.IsSuccess());
  276. AZStd::string jsonText;
  277. auto writeToStringResult = AZ::JsonSerializationUtils::WriteJsonString(writeToJsonResult.GetValue(), jsonText);
  278. ASSERT_TRUE(writeToStringResult.IsSuccess());
  279. MockSceneManifest loaded;
  280. auto loadFromStringResult = loaded.LoadFromString(jsonText, m_serializeContext.get(), m_jsonRegistrationContext.get());
  281. EXPECT_TRUE(loadFromStringResult.IsSuccess());
  282. EXPECT_TRUE(loaded.IsEmpty());
  283. }
  284. TEST_F(SceneManifestTest, LoadFromString_LoadFilledManifestFromString_ReturnsTrue)
  285. {
  286. auto writeToJsonResult = m_testManifest.SaveToJsonDocument(m_serializeContext.get(), m_jsonRegistrationContext.get());
  287. ASSERT_TRUE(writeToJsonResult.IsSuccess());
  288. AZStd::string jsonText;
  289. auto writeToStringResult = AZ::JsonSerializationUtils::WriteJsonString(writeToJsonResult.GetValue(), jsonText);
  290. ASSERT_TRUE(writeToStringResult.IsSuccess());
  291. MockSceneManifest loaded;
  292. auto loadFromStringResult = loaded.LoadFromString(jsonText, m_serializeContext.get(), m_jsonRegistrationContext.get());
  293. EXPECT_TRUE(loadFromStringResult.IsSuccess());
  294. EXPECT_FALSE(loaded.IsEmpty());
  295. ASSERT_EQ(loaded.GetEntryCount(), m_testManifest.GetEntryCount());
  296. }
  297. TEST_F(SceneManifestTest, LoadFromString_LoadFromXml_ObjectIdenticalToJsonLoadedObject)
  298. {
  299. // Write out the test Scene Manifest to XML string
  300. char buffer[BUFFER_SIZE];
  301. IO::MemoryStream xmlStream(IO::MemoryStream(buffer, sizeof(buffer), 0));
  302. ASSERT_TRUE(AZ::Utils::SaveObjectToStream<SceneManifest>(xmlStream, ObjectStream::ST_XML, &m_testManifest, m_serializeContext.get()));
  303. xmlStream.Seek(0, IO::GenericStream::ST_SEEK_BEGIN);
  304. AZStd::string xmlString(buffer);
  305. // Deserialize XML
  306. MockSceneManifest xmlSceneManifest;
  307. AZ::Outcome<void, AZStd::string> result = xmlSceneManifest.LoadFromString(xmlString, m_serializeContext.get(), m_jsonRegistrationContext.get(), true);
  308. ASSERT_TRUE(result.IsSuccess());
  309. ASSERT_FALSE(xmlSceneManifest.IsEmpty());
  310. // Write out the test Scene Manifest to JSON string
  311. auto writeToJsonResult = m_testManifest.SaveToJsonDocument(m_serializeContext.get(), m_jsonRegistrationContext.get());
  312. ASSERT_TRUE(writeToJsonResult.IsSuccess());
  313. AZStd::string jsonText;
  314. auto writeToStringResult = AZ::JsonSerializationUtils::WriteJsonString(writeToJsonResult.GetValue(), jsonText);
  315. ASSERT_TRUE(writeToStringResult.IsSuccess());
  316. // Deserialize JSON
  317. MockSceneManifest jsonSceneManifest;
  318. result = jsonSceneManifest.LoadFromString(jsonText, m_serializeContext.get(), m_jsonRegistrationContext.get());
  319. ASSERT_TRUE(result.IsSuccess());
  320. ASSERT_FALSE(jsonSceneManifest.IsEmpty());
  321. // Ensure both deserialized Scene Manifests are identical
  322. ASSERT_EQ(xmlSceneManifest.GetEntryCount(), jsonSceneManifest.GetEntryCount());
  323. }
  324. }
  325. }
  326. }