TickBusTest.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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/Component/TickBus.h>
  9. #include <AzCore/Math/Random.h>
  10. #include <AzCore/std/sort.h>
  11. #include <AzCore/UnitTest/TestTypes.h>
  12. using namespace AZ;
  13. // TickBus handler with customizable tick-order.
  14. // When ticked it pushes its tick-order into a list.
  15. struct OrderedTicker : public TickBus::Handler
  16. {
  17. int m_order = TICK_DEFAULT; ///< Relative order on TickBus
  18. AZStd::vector<int>* m_targetList = nullptr; ///< OnTick, push order into this list
  19. ///////////////////////////////////////////////////////////////////////////
  20. // TickBus
  21. int GetTickOrder() override { return m_order; }
  22. void OnTick(float /*deltaTime*/, ScriptTimePoint /*time*/) override
  23. {
  24. if (m_targetList)
  25. {
  26. m_targetList->push_back(m_order);
  27. }
  28. }
  29. ///////////////////////////////////////////////////////////////////////////
  30. };
  31. class OrderedTickBus : public UnitTest::LeakDetectionFixture
  32. {};
  33. TEST_F(OrderedTickBus, OnTick_HandlersFireInSortedOrder)
  34. {
  35. // arbitrary unsorted order for each handler
  36. AZStd::vector<int> unsortedHandlerOrder = { 7, 5, 6, 3, 2, 9, 1, 0, 4, 8 };
  37. // handlers will add their order to this list in OnTick()
  38. AZStd::vector<int> actualTickOrder;
  39. // create OrderedTickers
  40. AZStd::list<OrderedTicker> tickers;
  41. for (int order : unsortedHandlerOrder)
  42. {
  43. OrderedTicker& ticker = tickers.emplace_back();
  44. ticker.m_order = order;
  45. ticker.m_targetList = &actualTickOrder;
  46. ticker.TickBus::Handler::BusConnect();
  47. }
  48. // Tick!
  49. TickBus::Broadcast(&TickBus::Events::OnTick, 0.f, ScriptTimePoint{});
  50. // this is the order they should have fired in
  51. AZStd::vector<int> sortedOrder = unsortedHandlerOrder;
  52. AZStd::sort(sortedOrder.begin(), sortedOrder.end());
  53. // check the order they actually fired in
  54. EXPECT_EQ(actualTickOrder, sortedOrder);
  55. }