/* * Copyright (c) Contributors to the Open 3D Engine Project. * For complete copyright and license terms please see the LICENSE at the root of this distribution. * * SPDX-License-Identifier: Apache-2.0 OR MIT * */ #include #include #include #include #include #include #include #include namespace UnitTest { class ScheduledEventTests : public LeakDetectionFixture { public: void SetUp() override { AZ::NameDictionary::Create(); m_loggerComponent = AZStd::make_unique(); m_timeSystem = AZStd::make_unique(); m_eventSchedulerComponent = AZStd::make_unique(); m_testEvent = AZStd::make_unique([this] { TestBasicEvent(); }, AZ::Name("UnitTestEvent fire once event")); m_testRequeue = AZStd::make_unique([this] { TestAutoRequeuedEvent(); }, AZ::Name("UnitTestEvent auto Requeue")); } void TearDown() override { m_testEvent.reset(); m_testRequeue.reset(); m_eventSchedulerComponent.reset(); m_timeSystem.reset(); m_loggerComponent.reset(); AZ::NameDictionary::Destroy(); } void TestBasicEvent() { ++m_basicEventTriggerCount; } void TestAutoRequeuedEvent() { ++m_requeuedEventTriggerCount; } uint32_t m_basicEventTriggerCount = 0; uint32_t m_requeuedEventTriggerCount = 0; AZStd::unique_ptr m_testEvent; AZStd::unique_ptr m_testRequeue; AZStd::unique_ptr m_loggerComponent; AZStd::unique_ptr m_timeSystem; AZStd::unique_ptr m_eventSchedulerComponent; }; TEST_F(ScheduledEventTests, TestFireOnce) { m_testEvent->Enqueue(AZ::TimeMs(100)); constexpr AZ::TimeMs TotalIterationTimeMs = AZ::TimeMs{ 1050 }; const AZ::TimeMs startTimeMs = AZ::GetElapsedTimeMs(); for (;;) { AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(1)); m_eventSchedulerComponent->OnTick(0.0f, AZ::ScriptTimePoint()); if (AZ::GetElapsedTimeMs() - startTimeMs > TotalIterationTimeMs) { break; } } EXPECT_EQ(m_basicEventTriggerCount, 1); } TEST_F(ScheduledEventTests, TestRequeue) { m_testRequeue->Enqueue(AZ::TimeMs(200), true); constexpr AZ::TimeMs TotalIterationTimeMs = AZ::TimeMs{ 1050 }; const AZ::TimeMs startTimeMs = AZ::GetElapsedTimeMs(); for (;;) { AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(1)); m_eventSchedulerComponent->OnTick(0.0f, AZ::ScriptTimePoint()); if (AZ::GetElapsedTimeMs() - startTimeMs > TotalIterationTimeMs) { break; } } // Use EXPECT_GT in case the OS oversleeps long enough to cause unexpected extra timer pops EXPECT_GT(m_requeuedEventTriggerCount, 1); } }