summaryrefslogtreecommitdiffstats
path: root/test/unit/app/app_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/unit/app/app_test.cpp')
-rw-r--r--test/unit/app/app_test.cpp320
1 files changed, 320 insertions, 0 deletions
diff --git a/test/unit/app/app_test.cpp b/test/unit/app/app_test.cpp
new file mode 100644
index 0000000..8c1e899
--- /dev/null
+++ b/test/unit/app/app_test.cpp
@@ -0,0 +1,320 @@
+#include "app/app.h"
+
+#if defined(PLATFORM_WINDOWS)
+ #include "app/system_windows.h"
+#elif defined(PLATFORM_LINUX)
+ #include "app/system_linux.h"
+#else
+ #include "app/system_other.h"
+#endif
+
+#include "app/system_mock.h"
+
+#include "common/logger.h"
+
+#include <gtest/gtest.h>
+
+using testing::_;
+using testing::InSequence;
+using testing::Return;
+
+struct FakeSystemTimeStamp : public SystemTimeStamp
+{
+ FakeSystemTimeStamp(int uid) : uid(uid), time(0) {}
+
+ int uid;
+ long long time;
+};
+
+
+class CApplicationWrapper : public CApplication
+{
+public:
+ virtual Event CreateUpdateEvent() override
+ {
+ return CApplication::CreateUpdateEvent();
+ }
+};
+
+class ApplicationUT : public testing::Test
+{
+protected:
+ ApplicationUT();
+
+ virtual void SetUp() override;
+ virtual void TearDown() override;
+
+ void NextInstant(long long diff);
+
+ SystemTimeStamp* CreateTimeStamp();
+ void DestroyTimeStamp(SystemTimeStamp *stamp);
+ void CopyTimeStamp(SystemTimeStamp *dst, SystemTimeStamp *src);
+ void GetCurrentTimeStamp(SystemTimeStamp *stamp);
+ long long TimeStampExactDiff(SystemTimeStamp *before, SystemTimeStamp *after);
+
+ void TestCreateUpdateEvent(long long relTimeExact, long long absTimeExact,
+ float relTime, float absTime,
+ long long relTimeReal, long long absTimeReal);
+
+protected:
+ CLogger logger;
+ CApplicationWrapper* app;
+ CSystemUtilsMock* systemUtils;
+
+private:
+ int m_stampUid;
+ long long m_currentTime;
+};
+
+ApplicationUT::ApplicationUT()
+ : m_stampUid(0)
+ , m_currentTime(0)
+{}
+
+void ApplicationUT::SetUp()
+{
+ systemUtils = new CSystemUtilsMock();
+
+ ON_CALL(*systemUtils, CreateTimeStamp()).WillByDefault(Invoke(this, &ApplicationUT::CreateTimeStamp));
+ ON_CALL(*systemUtils, DestroyTimeStamp(_)).WillByDefault(Invoke(this, &ApplicationUT::DestroyTimeStamp));
+ ON_CALL(*systemUtils, CopyTimeStamp(_, _)).WillByDefault(Invoke(this, &ApplicationUT::CopyTimeStamp));
+ ON_CALL(*systemUtils, GetCurrentTimeStamp(_)).WillByDefault(Invoke(this, &ApplicationUT::GetCurrentTimeStamp));
+ ON_CALL(*systemUtils, TimeStampExactDiff(_, _)).WillByDefault(Invoke(this, &ApplicationUT::TimeStampExactDiff));
+
+ EXPECT_CALL(*systemUtils, CreateTimeStamp()).Times(3 + PCNT_MAX*2);
+ app = new CApplicationWrapper();
+}
+
+void ApplicationUT::TearDown()
+{
+ EXPECT_CALL(*systemUtils, DestroyTimeStamp(_)).Times(3 + PCNT_MAX*2);
+ delete app;
+ app = nullptr;
+
+ delete systemUtils;
+ systemUtils = nullptr;
+}
+
+SystemTimeStamp* ApplicationUT::CreateTimeStamp()
+{
+ return new FakeSystemTimeStamp(++m_stampUid);
+}
+
+void ApplicationUT::DestroyTimeStamp(SystemTimeStamp *stamp)
+{
+ delete static_cast<FakeSystemTimeStamp*>(stamp);
+}
+
+void ApplicationUT::CopyTimeStamp(SystemTimeStamp *dst, SystemTimeStamp *src)
+{
+ *static_cast<FakeSystemTimeStamp*>(dst) = *static_cast<FakeSystemTimeStamp*>(src);
+}
+
+void ApplicationUT::GetCurrentTimeStamp(SystemTimeStamp *stamp)
+{
+ static_cast<FakeSystemTimeStamp*>(stamp)->time = m_currentTime;
+}
+
+long long ApplicationUT::TimeStampExactDiff(SystemTimeStamp *before, SystemTimeStamp *after)
+{
+ return static_cast<FakeSystemTimeStamp*>(after)->time - static_cast<FakeSystemTimeStamp*>(before)->time;
+}
+
+void ApplicationUT::NextInstant(long long diff)
+{
+ m_currentTime += diff;
+}
+
+void ApplicationUT::TestCreateUpdateEvent(long long relTimeExact, long long absTimeExact,
+ float relTime, float absTime,
+ long long relTimeReal, long long absTimeReal)
+{
+ {
+ InSequence seq;
+ EXPECT_CALL(*systemUtils, CopyTimeStamp(_, _));
+ EXPECT_CALL(*systemUtils, GetCurrentTimeStamp(_));
+ EXPECT_CALL(*systemUtils, TimeStampExactDiff(_, _)).Times(2);
+ }
+
+ Event event = app->CreateUpdateEvent();
+ EXPECT_EQ(EVENT_FRAME, event.type);
+ EXPECT_FLOAT_EQ(relTime, event.rTime);
+ EXPECT_FLOAT_EQ(relTime, app->GetRelTime());
+ EXPECT_FLOAT_EQ(absTime, app->GetAbsTime());
+ EXPECT_EQ(relTimeExact, app->GetExactRelTime());
+ EXPECT_EQ(absTimeExact, app->GetExactAbsTime());
+ EXPECT_EQ(relTimeReal, app->GetRealRelTime());
+ EXPECT_EQ(absTimeReal, app->GetRealAbsTime());
+}
+
+
+TEST_F(ApplicationUT, UpdateEventTimeCalculation_SimulationSuspended)
+{
+ app->SuspendSimulation();
+ Event event = app->CreateUpdateEvent();
+ EXPECT_EQ(EVENT_NULL, event.type);
+}
+
+TEST_F(ApplicationUT, UpdateEventTimeCalculation_NormalOperation)
+{
+ // 1st update
+
+ long long relTimeExact = 1111;
+ long long absTimeExact = relTimeExact;
+ float relTime = relTimeExact / 1e9f;
+ float absTime = absTimeExact / 1e9f;
+ long long relTimeReal = relTimeExact;
+ long long absTimeReal = absTimeExact;
+
+ NextInstant(relTimeReal);
+
+ TestCreateUpdateEvent(relTimeExact, absTimeExact, relTime, absTime, relTimeReal, absTimeReal);
+
+ // 2nd update
+
+ relTimeExact = 2222;
+ absTimeExact += relTimeExact;
+ relTime = relTimeExact / 1e9f;
+ absTime = absTimeExact / 1e9f;
+ relTimeReal = relTimeExact;
+ absTimeReal = absTimeExact;
+
+ NextInstant(relTimeReal);
+
+ TestCreateUpdateEvent(relTimeExact, absTimeExact, relTime, absTime, relTimeReal, absTimeReal);
+}
+
+TEST_F(ApplicationUT, UpdateEventTimeCalculation_NegativeTimeOperation)
+{
+ // 1st update
+
+ long long relTimeExact = 2222;
+ long long absTimeExact = relTimeExact;
+ float relTime = relTimeExact / 1e9f;
+ float absTime = absTimeExact / 1e9f;
+ long long relTimeReal = relTimeExact;
+ long long absTimeReal = absTimeExact;
+
+ NextInstant(relTimeReal);
+
+ TestCreateUpdateEvent(relTimeExact, absTimeExact, relTime, absTime, relTimeReal, absTimeReal);
+
+ // 2nd update
+
+ NextInstant(-1111);
+
+ {
+ InSequence seq;
+ EXPECT_CALL(*systemUtils, CopyTimeStamp(_, _));
+ EXPECT_CALL(*systemUtils, GetCurrentTimeStamp(_));
+ EXPECT_CALL(*systemUtils, TimeStampExactDiff(_, _)).Times(2);
+ }
+ Event event = app->CreateUpdateEvent();
+ EXPECT_EQ(EVENT_NULL, event.type);
+}
+
+TEST_F(ApplicationUT, UpdateEventTimeCalculation_ChangingSimulationSpeed)
+{
+ EXPECT_CALL(*systemUtils, GetCurrentTimeStamp(_));
+ app->SetSimulationSpeed(2.0f);
+
+ // 1st update -- speed 2x
+
+ long long relTimeReal = 100;
+ long long absTimeReal = relTimeReal;
+ long long relTimeExact = relTimeReal*2;
+ long long absTimeExact = absTimeReal*2;
+ float relTime = relTimeExact / 1e9f;
+ float absTime = absTimeExact / 1e9f;
+
+ NextInstant(relTimeReal);
+
+ TestCreateUpdateEvent(relTimeExact, absTimeExact, relTime, absTime, relTimeReal, absTimeReal);
+
+ // 2nd update -- speed 2x
+
+ relTimeReal = 200;
+ absTimeReal += relTimeReal;
+ relTimeExact = relTimeReal*2;
+ absTimeExact += relTimeReal*2;
+ relTime = relTimeExact / 1e9f;
+ absTime = absTimeExact / 1e9f;
+
+ NextInstant(relTimeReal);
+
+ TestCreateUpdateEvent(relTimeExact, absTimeExact, relTime, absTime, relTimeReal, absTimeReal);
+
+ // 3rd update -- speed 4x
+ EXPECT_CALL(*systemUtils, GetCurrentTimeStamp(_));
+ app->SetSimulationSpeed(4.0f);
+
+ relTimeReal = 300;
+ absTimeReal += relTimeReal;
+ relTimeExact = relTimeReal*4;
+ absTimeExact += relTimeReal*4;
+ relTime = relTimeExact / 1e9f;
+ absTime = absTimeExact / 1e9f;
+
+ NextInstant(relTimeReal);
+
+ TestCreateUpdateEvent(relTimeExact, absTimeExact, relTime, absTime, relTimeReal, absTimeReal);
+
+ // 4th update -- speed 1x
+ EXPECT_CALL(*systemUtils, GetCurrentTimeStamp(_));
+ app->SetSimulationSpeed(1.0f);
+
+ relTimeReal = 400;
+ absTimeReal += relTimeReal;
+ relTimeExact = relTimeReal;
+ absTimeExact += relTimeReal;
+ relTime = relTimeExact / 1e9f;
+ absTime = absTimeExact / 1e9f;
+
+ NextInstant(relTimeReal);
+
+ TestCreateUpdateEvent(relTimeExact, absTimeExact, relTime, absTime, relTimeReal, absTimeReal);
+}
+
+TEST_F(ApplicationUT, UpdateEventTimeCalculation_SuspendingAndResumingSimulation)
+{
+ // 1st update -- simulation enabled
+
+ long long relTimeReal = 1000;
+ long long absTimeReal = relTimeReal;
+ long long relTimeExact = relTimeReal;
+ long long absTimeExact = absTimeReal;
+ float relTime = relTimeExact / 1e9f;
+ float absTime = absTimeExact / 1e9f;
+
+ NextInstant(relTimeReal);
+
+ TestCreateUpdateEvent(relTimeExact, absTimeExact, relTime, absTime, relTimeReal, absTimeReal);
+
+ // 2nd update -- simulation suspended
+
+ app->SuspendSimulation();
+
+ long long suspensionTime = 5000;
+
+ NextInstant(suspensionTime);
+
+ // 3rd update -- simulation resumed
+
+ {
+ InSequence seq;
+ EXPECT_CALL(*systemUtils, GetCurrentTimeStamp(_));
+ EXPECT_CALL(*systemUtils, CopyTimeStamp(_, _));
+ }
+ app->ResumeSimulation();
+
+ relTimeReal = 200;
+ absTimeReal += relTimeReal;
+ relTimeExact = relTimeReal;
+ absTimeExact += relTimeReal;
+ relTime = relTimeExact / 1e9f;
+ absTime = absTimeExact / 1e9f;
+
+ NextInstant(relTimeReal);
+
+ TestCreateUpdateEvent(relTimeExact, absTimeExact, relTime, absTime, relTimeReal, absTimeReal);
+}