SpawnableTests.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513
  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 <AzCore/Casting/numeric_cast.h>
  9. #include <AzCore/UnitTest/TestTypes.h>
  10. #include <AzFramework/Spawnable/Spawnable.h>
  11. #include <AzTest/AzTest.h>
  12. namespace UnitTest
  13. {
  14. class SpawnableTest : public LeakDetectionFixture
  15. {
  16. public:
  17. static constexpr size_t DefaultEntityAliasTestCount = 8;
  18. void SetUp() override
  19. {
  20. LeakDetectionFixture::SetUp();
  21. m_spawnable = aznew AzFramework::Spawnable();
  22. }
  23. void TearDown() override
  24. {
  25. delete m_spawnable;
  26. m_spawnable = nullptr;
  27. LeakDetectionFixture::TearDown();
  28. }
  29. void InsertEntities(size_t count)
  30. {
  31. AzFramework::Spawnable::EntityList& entities = m_spawnable->GetEntities();
  32. entities.reserve(entities.size() + count);
  33. for (size_t i = 0; i < count; ++i)
  34. {
  35. entities.emplace_back(AZStd::make_unique<AZ::Entity>());
  36. }
  37. }
  38. template<size_t Count>
  39. void InsertEntityAliases(
  40. const AZStd::array<uint32_t, Count>& sourceIds,
  41. const AZStd::array<uint32_t, Count>& targetIds,
  42. const AZStd::array<AzFramework::Spawnable::EntityAliasType, Count>& aliasTypes,
  43. bool queueLoad = false)
  44. {
  45. AzFramework::Spawnable::EntityAliasVisitor visitor = m_spawnable->TryGetAliases();
  46. for (uint32_t i = 0; i < Count; ++i)
  47. {
  48. AZ::Data::Asset<AzFramework::Spawnable> spawnable(
  49. AZ::Data::AssetId(AZ::Uuid("{4CBEC17A-52D6-42D5-9037-F4C05B9CE1D9}"), i), azrtti_typeid<AzFramework::Spawnable>());
  50. visitor.AddAlias(spawnable, AZ::Crc32(i), sourceIds[i], targetIds[i], aliasTypes[i], queueLoad);
  51. }
  52. }
  53. template<size_t Count>
  54. void InsertEntityAliases(bool queueLoad)
  55. {
  56. using namespace AzFramework;
  57. AZStd::array<uint32_t, Count> ids;
  58. for (uint32_t i=0; i<aznumeric_cast<uint32_t>(Count); ++i)
  59. {
  60. ids[i] = i;
  61. }
  62. AZStd::array<AzFramework::Spawnable::EntityAliasType, Count> aliasTypes;
  63. for (uint32_t i = 0; i < aznumeric_cast<uint32_t>(Count); ++i)
  64. {
  65. aliasTypes[i] = Spawnable::EntityAliasType::Replace;
  66. }
  67. InsertEntityAliases<Count>(ids, ids, aliasTypes, queueLoad);
  68. }
  69. template<size_t Count>
  70. void InsertEntityAliases()
  71. {
  72. InsertEntityAliases<Count>(false);
  73. }
  74. protected:
  75. AzFramework::Spawnable* m_spawnable;
  76. };
  77. //
  78. // TryGetAliasesConst
  79. //
  80. TEST_F(SpawnableTest, TryGetAliasesConst_GetVisitor_VisitorDataIsAvailable)
  81. {
  82. AzFramework::Spawnable::EntityAliasConstVisitor visitor = m_spawnable->TryGetAliasesConst();
  83. EXPECT_TRUE(visitor.IsValid());
  84. }
  85. TEST_F(SpawnableTest, TryGetAliasesConst_VisitorThatIsNotReadShared_VisitorDataIsNotAvailable)
  86. {
  87. AzFramework::Spawnable::EntityAliasVisitor readWriteVisitor = m_spawnable->TryGetAliases();
  88. ASSERT_TRUE(readWriteVisitor.IsValid());
  89. AzFramework::Spawnable::EntityAliasConstVisitor visitor = m_spawnable->TryGetAliasesConst();
  90. EXPECT_FALSE(visitor.IsValid());
  91. }
  92. TEST_F(SpawnableTest, TryGetAliasesConst_VisitorThatIsAlreadyReadShared_VisitorDataIsAvailable)
  93. {
  94. AzFramework::Spawnable::EntityAliasConstVisitor readVisitor = m_spawnable->TryGetAliasesConst();
  95. ASSERT_TRUE(readVisitor.IsValid());
  96. AzFramework::Spawnable::EntityAliasConstVisitor visitor = m_spawnable->TryGetAliasesConst();
  97. EXPECT_TRUE(visitor.IsValid());
  98. }
  99. //
  100. // TryGetAliases
  101. //
  102. TEST_F(SpawnableTest, TryGetAliases_GetVisitor_VisitorDataIsAvailable)
  103. {
  104. AzFramework::Spawnable::EntityAliasVisitor visitor = m_spawnable->TryGetAliases();
  105. EXPECT_TRUE(visitor.IsValid());
  106. }
  107. TEST_F(SpawnableTest, TryGetAliasesConst_VisitorThatIsAlreadyShared_VisitorDataNotIsAvailable)
  108. {
  109. AzFramework::Spawnable::EntityAliasConstVisitor readVisitor = m_spawnable->TryGetAliasesConst();
  110. ASSERT_TRUE(readVisitor.IsValid());
  111. AzFramework::Spawnable::EntityAliasVisitor visitor = m_spawnable->TryGetAliases();
  112. EXPECT_FALSE(visitor.IsValid());
  113. }
  114. //
  115. // EntityAliasVisitor
  116. //
  117. //
  118. // HasAliases
  119. //
  120. TEST_F(SpawnableTest, EntityAliasVisitor_HasAliases_EmptyAliasList_ReturnsFalse)
  121. {
  122. AzFramework::Spawnable::EntityAliasVisitor visitor = m_spawnable->TryGetAliases();
  123. ASSERT_TRUE(visitor.IsValid());
  124. EXPECT_FALSE(visitor.HasAliases());
  125. }
  126. TEST_F(SpawnableTest, EntityAliasVisitor_HasAliases_FilledInAliasList_ReturnsTrue)
  127. {
  128. InsertEntities(8);
  129. InsertEntityAliases<8>();
  130. AzFramework::Spawnable::EntityAliasVisitor visitor = m_spawnable->TryGetAliases();
  131. ASSERT_TRUE(visitor.IsValid());
  132. EXPECT_TRUE(visitor.HasAliases());
  133. }
  134. //
  135. // Optimize
  136. //
  137. TEST_F(SpawnableTest, EntityAliasVisitor_Optimize_SortEntityAliases_AliasesAreSortedBySourceAndTargetId)
  138. {
  139. InsertEntities(DefaultEntityAliasTestCount);
  140. InsertEntityAliases<DefaultEntityAliasTestCount>();
  141. AzFramework::Spawnable::EntityAliasVisitor visitor = m_spawnable->TryGetAliases();
  142. ASSERT_TRUE(visitor.IsValid());
  143. // Optimize doesn't need to be explicitly called because the setup of the aliases will cause the alias list to be sorted and optimized.
  144. uint32_t sourceIndex = 0;
  145. uint32_t targetIndex = 0;
  146. for (const AzFramework::Spawnable::EntityAlias& alias : visitor)
  147. {
  148. if (alias.m_sourceIndex != sourceIndex)
  149. {
  150. ASSERT_LE(sourceIndex, alias.m_sourceIndex);
  151. }
  152. else
  153. {
  154. ASSERT_LE(targetIndex, alias.m_targetIndex);
  155. }
  156. sourceIndex = alias.m_sourceIndex;
  157. targetIndex = alias.m_targetIndex;
  158. }
  159. }
  160. TEST_F(
  161. SpawnableTest, EntityAliasVisitor_Optimize_RemoveUnused_OnlySecondToLastAliasRemains)
  162. {
  163. using namespace AzFramework;
  164. InsertEntities(8);
  165. InsertEntityAliases<8>(
  166. { 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 2, 3, 4, 5, 6, 7 },
  167. { Spawnable::EntityAliasType::Replace, Spawnable::EntityAliasType::Original, Spawnable::EntityAliasType::Disable,
  168. Spawnable::EntityAliasType::Replace, Spawnable::EntityAliasType::Original, Spawnable::EntityAliasType::Disable,
  169. Spawnable::EntityAliasType::Replace, Spawnable::EntityAliasType::Original });
  170. AzFramework::Spawnable::EntityAliasVisitor visitor = m_spawnable->TryGetAliases();
  171. ASSERT_TRUE(visitor.IsValid());
  172. EXPECT_EQ(1, AZStd::distance(visitor.begin(), visitor.end()));
  173. EXPECT_EQ(Spawnable::EntityAliasType::Replace, visitor.begin()->m_aliasType);
  174. EXPECT_EQ(6, visitor.begin()->m_targetIndex);
  175. }
  176. TEST_F(SpawnableTest, EntityAliasVisitor_Optimize_AddAdditional_ThreeAdditionalAliasesAreAdded)
  177. {
  178. using namespace AzFramework;
  179. InsertEntities(8);
  180. InsertEntityAliases<8>(
  181. { 0, 0, 0, 0, 1, 2, 2, 2 }, { 0, 1, 2, 3, 4, 5, 6, 7 },
  182. { Spawnable::EntityAliasType::Additional, Spawnable::EntityAliasType::Additional, Spawnable::EntityAliasType::Additional,
  183. Spawnable::EntityAliasType::Additional, Spawnable::EntityAliasType::Additional, Spawnable::EntityAliasType::Additional,
  184. Spawnable::EntityAliasType::Additional, Spawnable::EntityAliasType::Additional });
  185. AzFramework::Spawnable::EntityAliasVisitor visitor = m_spawnable->TryGetAliases();
  186. ASSERT_TRUE(visitor.IsValid());
  187. EXPECT_EQ(11, AZStd::distance(visitor.begin(), visitor.end()));
  188. EXPECT_EQ(Spawnable::EntityAliasType::Original, visitor.begin()->m_aliasType);
  189. EXPECT_EQ(Spawnable::EntityAliasType::Original, visitor.begin()[5].m_aliasType);
  190. EXPECT_EQ(Spawnable::EntityAliasType::Original, visitor.begin()[7].m_aliasType);
  191. }
  192. TEST_F(SpawnableTest, EntityAliasVisitor_Optimize_OriginalsOnly_AliasListIsEmpty)
  193. {
  194. using namespace AzFramework;
  195. InsertEntities(8);
  196. InsertEntityAliases<8>(
  197. { 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 2, 3, 4, 5, 6, 7 },
  198. { Spawnable::EntityAliasType::Original, Spawnable::EntityAliasType::Original, Spawnable::EntityAliasType::Original,
  199. Spawnable::EntityAliasType::Original, Spawnable::EntityAliasType::Original, Spawnable::EntityAliasType::Original,
  200. Spawnable::EntityAliasType::Original, Spawnable::EntityAliasType::Original });
  201. AzFramework::Spawnable::EntityAliasVisitor visitor = m_spawnable->TryGetAliases();
  202. ASSERT_TRUE(visitor.IsValid());
  203. EXPECT_EQ(0, AZStd::distance(visitor.begin(), visitor.end()));
  204. }
  205. TEST_F(SpawnableTest, EntityAliasVisitor_Optimize_MixedOriginals_AllOriginalsRemoved)
  206. {
  207. using namespace AzFramework;
  208. InsertEntities(8);
  209. InsertEntityAliases<8>(
  210. { 0, 0, 0, 1, 1, 2, 2, 2 }, { 0, 1, 2, 3, 4, 5, 6, 7 },
  211. { Spawnable::EntityAliasType::Original, Spawnable::EntityAliasType::Original, Spawnable::EntityAliasType::Original,
  212. Spawnable::EntityAliasType::Original, Spawnable::EntityAliasType::Disable, Spawnable::EntityAliasType::Original,
  213. Spawnable::EntityAliasType::Replace, Spawnable::EntityAliasType::Original });
  214. AzFramework::Spawnable::EntityAliasVisitor visitor = m_spawnable->TryGetAliases();
  215. ASSERT_TRUE(visitor.IsValid());
  216. EXPECT_EQ(2, AZStd::distance(visitor.begin(), visitor.end()));
  217. EXPECT_EQ(Spawnable::EntityAliasType::Disable, visitor.begin()->m_aliasType);
  218. EXPECT_EQ(Spawnable::EntityAliasType::Replace, visitor.begin()[1].m_aliasType);
  219. }
  220. TEST_F(SpawnableTest, EntityAliasVisitor_Optimize_MergeAfterOriginal_NoAdditionalOriginalIsInserted)
  221. {
  222. using namespace AzFramework;
  223. InsertEntities(8);
  224. InsertEntityAliases<8>(
  225. { 0, 0, 1, 1, 2, 2, 2, 2 }, { 0, 1, 2, 3, 4, 5, 6, 7 },
  226. { Spawnable::EntityAliasType::Original, Spawnable::EntityAliasType::Merge, Spawnable::EntityAliasType::Replace,
  227. Spawnable::EntityAliasType::Merge, Spawnable::EntityAliasType::Original, Spawnable::EntityAliasType::Original,
  228. Spawnable::EntityAliasType::Original, Spawnable::EntityAliasType::Original });
  229. AzFramework::Spawnable::EntityAliasVisitor visitor = m_spawnable->TryGetAliases();
  230. ASSERT_TRUE(visitor.IsValid());
  231. EXPECT_EQ(4, AZStd::distance(visitor.begin(), visitor.end()));
  232. EXPECT_EQ(Spawnable::EntityAliasType::Original, visitor.begin()->m_aliasType);
  233. EXPECT_EQ(Spawnable::EntityAliasType::Merge, visitor.begin()[1].m_aliasType);
  234. EXPECT_EQ(Spawnable::EntityAliasType::Replace, visitor.begin()[2].m_aliasType);
  235. EXPECT_EQ(Spawnable::EntityAliasType::Merge, visitor.begin()[3].m_aliasType);
  236. }
  237. //
  238. // UpdateAliasType
  239. //
  240. TEST_F(SpawnableTest, EntityAliasVisitor_UpdateAliasType_AllToOriginal_NoAliasesAfterOptimization)
  241. {
  242. using namespace AzFramework;
  243. InsertEntities(8);
  244. InsertEntityAliases<8>(
  245. { 0, 1, 2, 3, 4, 5, 6, 7 }, { 0, 1, 2, 3, 4, 5, 6, 7 },
  246. { Spawnable::EntityAliasType::Replace, Spawnable::EntityAliasType::Replace, Spawnable::EntityAliasType::Replace,
  247. Spawnable::EntityAliasType::Replace, Spawnable::EntityAliasType::Replace, Spawnable::EntityAliasType::Replace,
  248. Spawnable::EntityAliasType::Replace, Spawnable::EntityAliasType::Replace });
  249. AzFramework::Spawnable::EntityAliasVisitor visitor = m_spawnable->TryGetAliases();
  250. ASSERT_TRUE(visitor.IsValid());
  251. for (uint32_t i = 0; i < 8; ++i)
  252. {
  253. visitor.UpdateAliasType(i, Spawnable::EntityAliasType::Original);
  254. }
  255. for (const Spawnable::EntityAlias& alias : visitor)
  256. {
  257. EXPECT_EQ(Spawnable::EntityAliasType::Original, alias.m_aliasType);
  258. }
  259. visitor.Optimize();
  260. EXPECT_EQ(0, AZStd::distance(visitor.begin(), visitor.end()));
  261. }
  262. //
  263. // UpdateAliases
  264. //
  265. TEST_F(SpawnableTest, EntityAliasVisitor_UpdateAliases_AllToOriginal_NoAliasesAfterOptimization)
  266. {
  267. using namespace AzFramework;
  268. InsertEntities(8);
  269. InsertEntityAliases<8>(
  270. { 0, 1, 2, 3, 4, 5, 6, 7 }, { 0, 1, 2, 3, 4, 5, 6, 7 },
  271. { Spawnable::EntityAliasType::Replace, Spawnable::EntityAliasType::Replace, Spawnable::EntityAliasType::Replace,
  272. Spawnable::EntityAliasType::Replace, Spawnable::EntityAliasType::Replace, Spawnable::EntityAliasType::Replace,
  273. Spawnable::EntityAliasType::Replace, Spawnable::EntityAliasType::Replace });
  274. AzFramework::Spawnable::EntityAliasVisitor visitor = m_spawnable->TryGetAliases();
  275. ASSERT_TRUE(visitor.IsValid());
  276. auto callback =
  277. [](Spawnable::EntityAliasType& aliasType, bool& /*queueLoad*/, const AZ::Data::Asset<Spawnable>& /*aliasedSpawnable*/,
  278. const AZ::Crc32 /*tag*/, const uint32_t /*sourceIndex*/, const uint32_t /*targetIndex*/)
  279. {
  280. aliasType = Spawnable::EntityAliasType::Original;
  281. };
  282. visitor.UpdateAliases(AZStd::move(callback));
  283. for (const Spawnable::EntityAlias& alias : visitor)
  284. {
  285. EXPECT_EQ(Spawnable::EntityAliasType::Original, alias.m_aliasType);
  286. }
  287. visitor.Optimize();
  288. EXPECT_EQ(0, AZStd::distance(visitor.begin(), visitor.end()));
  289. }
  290. TEST_F(SpawnableTest, EntityAliasVisitor_UpdateAliases_FilterByTag_OnlyOneAliasUpdated)
  291. {
  292. using namespace AzFramework;
  293. InsertEntities(8);
  294. InsertEntityAliases<8>(
  295. { 0, 1, 2, 3, 4, 5, 6, 7 }, { 0, 1, 2, 3, 4, 5, 6, 7 },
  296. { Spawnable::EntityAliasType::Replace, Spawnable::EntityAliasType::Replace, Spawnable::EntityAliasType::Replace,
  297. Spawnable::EntityAliasType::Replace, Spawnable::EntityAliasType::Replace, Spawnable::EntityAliasType::Replace,
  298. Spawnable::EntityAliasType::Replace, Spawnable::EntityAliasType::Replace });
  299. AzFramework::Spawnable::EntityAliasVisitor visitor = m_spawnable->TryGetAliases();
  300. ASSERT_TRUE(visitor.IsValid());
  301. bool correctTag = false;
  302. size_t numberOfUpdates = 0;
  303. auto callback = [&correctTag, &numberOfUpdates](Spawnable::EntityAliasType& aliasType, bool& /*queueLoad*/,
  304. const AZ::Data::Asset<Spawnable>& /*aliasedSpawnable*/, const AZ::Crc32 tag, const uint32_t /*sourceIndex*/,
  305. const uint32_t /*targetIndex*/)
  306. {
  307. correctTag = (tag == AZ::Crc32(3));
  308. numberOfUpdates++;
  309. aliasType = Spawnable::EntityAliasType::Original;
  310. };
  311. visitor.UpdateAliases(AZ::Crc32(3), AZStd::move(callback));
  312. EXPECT_EQ(Spawnable::EntityAliasType::Original, visitor.begin()[3].m_aliasType);
  313. }
  314. //
  315. // AreAllSpawnablesReady
  316. //
  317. TEST_F(SpawnableTest, EntityAliasVisitor_AreAllSpawnablesReady_CheckFakeLoadedAssets_ReturnsTrue)
  318. {
  319. using namespace AzFramework;
  320. InsertEntities(DefaultEntityAliasTestCount);
  321. InsertEntityAliases<DefaultEntityAliasTestCount>();
  322. AzFramework::Spawnable::EntityAliasVisitor visitor = m_spawnable->TryGetAliases();
  323. ASSERT_TRUE(visitor.IsValid());
  324. EXPECT_TRUE(visitor.AreAllSpawnablesReady());
  325. }
  326. TEST_F(SpawnableTest, EntityAliasVisitor_AreAllSpawnablesReady_CheckFakeNotLoadedAssets_ReturnsFalse)
  327. {
  328. using namespace AzFramework;
  329. InsertEntities(8);
  330. InsertEntityAliases<8>(true);
  331. AzFramework::Spawnable::EntityAliasVisitor visitor = m_spawnable->TryGetAliases();
  332. ASSERT_TRUE(visitor.IsValid());
  333. EXPECT_FALSE(visitor.AreAllSpawnablesReady());
  334. }
  335. //
  336. // ListTargetSpawnables
  337. //
  338. TEST_F(SpawnableTest, EntityAliasVisitor_ListTargetSpawnables_ListAllTargetAssets_AllTargetsListed)
  339. {
  340. using namespace AzFramework;
  341. InsertEntities(DefaultEntityAliasTestCount);
  342. InsertEntityAliases<DefaultEntityAliasTestCount>();
  343. AzFramework::Spawnable::EntityAliasVisitor visitor = m_spawnable->TryGetAliases();
  344. ASSERT_TRUE(visitor.IsValid());
  345. size_t count = 0;
  346. bool correctAssets = true;
  347. auto callback = [&count, &correctAssets](const AZ::Data::Asset<Spawnable>& targetSpawnable)
  348. {
  349. correctAssets = correctAssets && (targetSpawnable.GetId().m_subId == count);
  350. count++;
  351. };
  352. visitor.ListTargetSpawnables(callback);
  353. EXPECT_EQ(8, count);
  354. EXPECT_TRUE(correctAssets);
  355. }
  356. TEST_F(SpawnableTest, EntityAliasVisitor_ListTargetSpawnables_ListTaggedTargetAssets_OneAssetListed)
  357. {
  358. using namespace AzFramework;
  359. InsertEntities(DefaultEntityAliasTestCount);
  360. InsertEntityAliases<DefaultEntityAliasTestCount>();
  361. AzFramework::Spawnable::EntityAliasVisitor visitor = m_spawnable->TryGetAliases();
  362. ASSERT_TRUE(visitor.IsValid());
  363. size_t count = 0;
  364. bool correctAsset = false;
  365. auto callback = [&count, &correctAsset](const AZ::Data::Asset<Spawnable>& targetSpawnable)
  366. {
  367. correctAsset = (targetSpawnable.GetId().m_subId == 3);
  368. count++;
  369. };
  370. visitor.ListTargetSpawnables(AZ::Crc32(3), callback);
  371. EXPECT_EQ(1, count);
  372. EXPECT_TRUE(correctAsset);
  373. }
  374. //
  375. // ListSpawnablesRequiringLoad
  376. //
  377. TEST_F(SpawnableTest, EntityAliasVisitor_ListSpawnablesRequiringLoad_AllSetToLoaded_AllTargetsListed)
  378. {
  379. using namespace AzFramework;
  380. InsertEntities(DefaultEntityAliasTestCount);
  381. InsertEntityAliases<DefaultEntityAliasTestCount>(true);
  382. AzFramework::Spawnable::EntityAliasVisitor visitor = m_spawnable->TryGetAliases();
  383. ASSERT_TRUE(visitor.IsValid());
  384. size_t count = 0;
  385. bool correctAssets = true;
  386. auto callback = [&count, &correctAssets](const AZ::Data::Asset<Spawnable>& targetSpawnable)
  387. {
  388. correctAssets = correctAssets && (targetSpawnable.GetId().m_subId == count);
  389. count++;
  390. };
  391. visitor.ListSpawnablesRequiringLoad(callback);
  392. EXPECT_EQ(8, count);
  393. EXPECT_TRUE(correctAssets);
  394. }
  395. TEST_F(SpawnableTest, EntityAliasVisitor_ListSpawnablesRequiringLoad_AllSetToNotLoaded_NoTargetsListed)
  396. {
  397. using namespace AzFramework;
  398. InsertEntities(DefaultEntityAliasTestCount);
  399. InsertEntityAliases<DefaultEntityAliasTestCount>(false);
  400. AzFramework::Spawnable::EntityAliasVisitor visitor = m_spawnable->TryGetAliases();
  401. ASSERT_TRUE(visitor.IsValid());
  402. size_t count = 0;
  403. auto callback = [&count](const AZ::Data::Asset<Spawnable>& /*targetSpawnable*/)
  404. {
  405. count++;
  406. };
  407. visitor.ListSpawnablesRequiringLoad(callback);
  408. EXPECT_EQ(0, count);
  409. }
  410. } // namespace UnitTest