From 5daaba6e646564af1424aa275a2036a2b0f93c1a Mon Sep 17 00:00:00 2001 From: MrSimbax Date: Sat, 11 Sep 2021 12:44:26 +0200 Subject: [PATCH] Fixes after merge Fix mistakes after previous merge and make it compile. Rewrite the function interpolating between time stamps as it was written after the original pull request was created. Add unit tests for it. I couldn't help myself and also changed some enums to enum classes and did some renames. --- src/app/app.cpp | 49 ++++-------- src/app/app.h | 2 +- src/app/main.cpp | 4 +- src/app/signal_handlers.cpp | 8 +- src/common/system/system.cpp | 51 ++++++------ src/common/system/system.h | 44 +++++------ src/common/system/system_linux.cpp | 33 +++----- src/common/system/system_linux.h | 4 - src/common/system/system_windows.cpp | 24 +++--- src/graphics/engine/engine.cpp | 2 +- test/unit/CMakeLists.txt | 15 +--- test/unit/app/app_test.cpp | 13 +--- test/unit/common/system/system_linux_test.cpp | 77 ------------------- test/unit/common/system/system_test.cpp | 46 ++++++++++- .../common/system/system_windows_test.cpp | 69 ----------------- 15 files changed, 146 insertions(+), 295 deletions(-) delete mode 100644 test/unit/common/system/system_linux_test.cpp delete mode 100644 test/unit/common/system/system_windows_test.cpp diff --git a/src/app/app.cpp b/src/app/app.cpp index 74cc7e6b..c2264cf8 100644 --- a/src/app/app.cpp +++ b/src/app/app.cpp @@ -137,13 +137,6 @@ CApplication::CApplication(CSystemUtils* systemUtils) m_absTime = 0.0f; m_relTime = 0.0f; - m_baseTimeStamp = m_systemUtils->CreateTimeStamp(); - m_curTimeStamp = m_systemUtils->CreateTimeStamp(); - m_lastTimeStamp = m_systemUtils->CreateTimeStamp(); - - m_manualFrameLast = m_systemUtils->CreateTimeStamp(); - m_manualFrameTime = m_systemUtils->CreateTimeStamp(); - m_joystickEnabled = false; @@ -161,13 +154,6 @@ CApplication::CApplication(CSystemUtils* systemUtils) CApplication::~CApplication() { - m_systemUtils->DestroyTimeStamp(m_baseTimeStamp); - m_systemUtils->DestroyTimeStamp(m_curTimeStamp); - m_systemUtils->DestroyTimeStamp(m_lastTimeStamp); - - m_systemUtils->DestroyTimeStamp(m_manualFrameLast); - m_systemUtils->DestroyTimeStamp(m_manualFrameTime); - m_joystickEnabled = false; m_controller.reset(); @@ -674,7 +660,7 @@ bool CApplication::Create() { GetLogger()->Error("Unknown graphics device: %s\n", graphics.c_str()); GetLogger()->Info("Changing to default device\n"); - m_systemUtils->SystemDialog(SDT_ERROR, "Graphics initialization error", "You have selected invalid graphics device with -graphics switch. Game will use default OpenGL device instead."); + m_systemUtils->SystemDialog(SystemDialogType::ERROR, "Graphics initialization error", "You have selected invalid graphics device with -graphics switch. Game will use default OpenGL device instead."); m_device = Gfx::CreateDevice(m_deviceConfig, "opengl"); } } @@ -1057,9 +1043,9 @@ int CApplication::Run() MoveMouse(Math::Point(0.5f, 0.5f)); // center mouse on start - SystemTimeStamp *previousTimeStamp = m_systemUtils->CreateTimeStamp(); - SystemTimeStamp *currentTimeStamp = m_systemUtils->CreateTimeStamp(); - SystemTimeStamp *interpolatedTimeStamp = m_systemUtils->CreateTimeStamp(); + SystemTimeStamp previousTimeStamp{}; + SystemTimeStamp currentTimeStamp{}; + SystemTimeStamp interpolatedTimeStamp{}; while (true) { @@ -1163,11 +1149,11 @@ int CApplication::Run() // If game speed is increased then we do extra ticks per loop iteration to improve physics accuracy. int numTickSlices = static_cast(GetSimulationSpeed()); if(numTickSlices < 1) numTickSlices = 1; - m_systemUtils->CopyTimeStamp(previousTimeStamp, m_curTimeStamp); - m_systemUtils->GetCurrentTimeStamp(currentTimeStamp); + previousTimeStamp = m_curTimeStamp; + currentTimeStamp = m_systemUtils->GetCurrentTimeStamp(); for(int tickSlice = 0; tickSlice < numTickSlices; tickSlice++) { - m_systemUtils->InterpolateTimeStamp(interpolatedTimeStamp, previousTimeStamp, currentTimeStamp, (tickSlice+1)/static_cast(numTickSlices)); + interpolatedTimeStamp = m_systemUtils->TimeStampLerp(previousTimeStamp, currentTimeStamp, (tickSlice+1)/static_cast(numTickSlices)); Event event = CreateUpdateEvent(interpolatedTimeStamp); if (event.type != EVENT_NULL && m_controller != nullptr) { @@ -1198,9 +1184,6 @@ int CApplication::Run() } end: - m_systemUtils->DestroyTimeStamp(previousTimeStamp); - m_systemUtils->DestroyTimeStamp(currentTimeStamp); - m_systemUtils->DestroyTimeStamp(interpolatedTimeStamp); return m_exitCode; } @@ -1539,17 +1522,15 @@ void CApplication::StartLoadingMusic() std::thread{[this]() { GetLogger()->Debug("Cache sounds...\n"); - SystemTimeStamp* musicLoadStart = m_systemUtils->CreateTimeStamp(); - m_systemUtils->GetCurrentTimeStamp(musicLoadStart); + SystemTimeStamp musicLoadStart{m_systemUtils->GetCurrentTimeStamp()}; m_sound->Reset(); m_sound->CacheAll(); - SystemTimeStamp* musicLoadEnd = m_systemUtils->CreateTimeStamp(); - m_systemUtils->GetCurrentTimeStamp(musicLoadEnd); - float musicLoadTime = m_systemUtils->TimeStampDiff(musicLoadStart, musicLoadEnd, STU_MSEC); + SystemTimeStamp musicLoadEnd{m_systemUtils->GetCurrentTimeStamp()}; + float musicLoadTime = m_systemUtils->TimeStampDiff(musicLoadStart, musicLoadEnd, SystemTimeUnit::MILLISECONDS); GetLogger()->Debug("Sound loading took %.2f ms\n", musicLoadTime); - }).detach(); + }}.detach(); } bool CApplication::GetSimulationSuspended() const @@ -1561,20 +1542,20 @@ void CApplication::SetSimulationSpeed(float speed) { m_simulationSpeed = speed; - m_systemUtils->CopyTimeStamp(m_baseTimeStamp, m_curTimeStamp); + m_baseTimeStamp = m_curTimeStamp; m_realAbsTimeBase = m_realAbsTime; m_absTimeBase = m_exactAbsTime; GetLogger()->Info("Simulation speed = %.2f\n", speed); } -Event CApplication::CreateUpdateEvent(SystemTimeStamp *newTimeStamp) +Event CApplication::CreateUpdateEvent(SystemTimeStamp newTimeStamp) { if (m_simulationSuspended) return Event(EVENT_NULL); - m_systemUtils->CopyTimeStamp(m_lastTimeStamp, m_curTimeStamp); - m_systemUtils->CopyTimeStamp(m_curTimeStamp, newTimeStamp); + m_lastTimeStamp = m_curTimeStamp; + m_curTimeStamp = newTimeStamp; long long absDiff = m_systemUtils->TimeStampExactDiff(m_baseTimeStamp, m_curTimeStamp); long long newRealAbsTime = m_realAbsTimeBase + absDiff; diff --git a/src/app/app.h b/src/app/app.h index 02e12124..60d11c42 100644 --- a/src/app/app.h +++ b/src/app/app.h @@ -297,7 +297,7 @@ protected: //! If applicable, creates a virtual event to match the changed state as of new event Event CreateVirtualEvent(const Event& sourceEvent); //! Prepares a simulation update event - TEST_VIRTUAL Event CreateUpdateEvent(SystemTimeStamp *newTimeStamp); + TEST_VIRTUAL Event CreateUpdateEvent(SystemTimeStamp newTimeStamp); //! Logs debug data for event void LogEvent(const Event& event); diff --git a/src/app/main.cpp b/src/app/main.cpp index 1cb8171a..002bd4f8 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -177,7 +177,7 @@ int main(int argc, char *argv[]) ParseArgsStatus status = app.ParseArguments(argc, argv); if (status == PARSE_ARGS_FAIL) { - systemUtils->SystemDialog(SDT_ERROR, "COLOBOT - Fatal Error", "Invalid commandline arguments!\n"); + systemUtils->SystemDialog(SystemDialogType::ERROR, "COLOBOT - Fatal Error", "Invalid commandline arguments!\n"); return app.GetExitCode(); } else if (status == PARSE_ARGS_HELP) @@ -190,7 +190,7 @@ int main(int argc, char *argv[]) code = app.GetExitCode(); if (code != 0 && !app.GetErrorMessage().empty()) { - systemUtils->SystemDialog(SDT_ERROR, "COLOBOT - Fatal Error", app.GetErrorMessage()); + systemUtils->SystemDialog(SystemDialogType::ERROR, "COLOBOT - Fatal Error", app.GetErrorMessage()); } logger.Info("Didn't run main loop. Exiting with code %d\n", code); return code; diff --git a/src/app/signal_handlers.cpp b/src/app/signal_handlers.cpp index 1558f4be..99c04d5d 100644 --- a/src/app/signal_handlers.cpp +++ b/src/app/signal_handlers.cpp @@ -162,7 +162,7 @@ void CSignalHandlers::ReportError(const std::string& errorMessage) std::cerr << std::endl << msg.str() << std::endl; - m_systemUtils->SystemDialog(SDT_ERROR, "Unhandled exception occurred!", msg.str()); + m_systemUtils->SystemDialog(SystemDialogType::ERROR, "Unhandled exception occurred!", msg.str()); if (canSave && !triedSaving) { @@ -172,13 +172,13 @@ void CSignalHandlers::ReportError(const std::string& errorMessage) msg << std::endl; msg << "Do you want to try saving now?"; - SystemDialogResult result = m_systemUtils->SystemDialog(SDT_YES_NO, "Try to save?", msg.str()); - if (result == SDR_YES) + SystemDialogResult result = m_systemUtils->SystemDialog(SystemDialogType::YES_NO, "Try to save?", msg.str()); + if (result == SystemDialogResult::YES) { triedSaving = true; CResourceManager::CreateNewDirectory("crashsave"); robotMain->IOWriteScene("crashsave/data.sav", "crashsave/cbot.run", "crashsave/screen.png", "Backup at the moment of a crash", true); - m_systemUtils->SystemDialog(SDT_INFO, "Try to save?", "Saving finished.\nPlease restart the game now"); + m_systemUtils->SystemDialog(SystemDialogType::INFO, "Try to save?", "Saving finished.\nPlease restart the game now"); } } diff --git a/src/common/system/system.cpp b/src/common/system/system.cpp index 46fa81e2..d007fcb1 100644 --- a/src/common/system/system.cpp +++ b/src/common/system/system.cpp @@ -61,17 +61,17 @@ SystemDialogResult CSystemUtils::ConsoleSystemDialog(SystemDialogType type, cons { switch (type) { - case SDT_INFO: + case SystemDialogType::INFO: std::cout << "INFO: "; break; - case SDT_WARNING: + case SystemDialogType::WARNING: std::cout << "WARNING:"; break; - case SDT_ERROR: + case SystemDialogType::ERROR: std::cout << "ERROR: "; break; - case SDT_YES_NO: - case SDT_OK_CANCEL: + case SystemDialogType::YES_NO: + case SystemDialogType::OK_CANCEL: std::cout << "QUESTION: "; break; } @@ -80,24 +80,24 @@ SystemDialogResult CSystemUtils::ConsoleSystemDialog(SystemDialogType type, cons std::string line; - SystemDialogResult result = SDR_OK; + auto result = SystemDialogResult::OK; bool done = false; while (!done) { switch (type) { - case SDT_INFO: - case SDT_WARNING: - case SDT_ERROR: + case SystemDialogType::INFO: + case SystemDialogType::WARNING: + case SystemDialogType::ERROR: std::cout << "Press ENTER to continue"; break; - case SDT_YES_NO: + case SystemDialogType::YES_NO: std::cout << "Type 'Y' for Yes or 'N' for No"; break; - case SDT_OK_CANCEL: + case SystemDialogType::OK_CANCEL: std::cout << "Type 'O' for OK or 'C' for Cancel"; break; } @@ -106,35 +106,35 @@ SystemDialogResult CSystemUtils::ConsoleSystemDialog(SystemDialogType type, cons switch (type) { - case SDT_INFO: - case SDT_WARNING: - case SDT_ERROR: + case SystemDialogType::INFO: + case SystemDialogType::WARNING: + case SystemDialogType::ERROR: done = true; break; - case SDT_YES_NO: + case SystemDialogType::YES_NO: if (line == "Y" || line == "y") { - result = SDR_YES; + result = SystemDialogResult::YES; done = true; } else if (line == "N" || line == "n") { - result = SDR_NO; + result = SystemDialogResult::NO; done = true; } break; - case SDT_OK_CANCEL: + case SystemDialogType::OK_CANCEL: if (line == "O" || line == "o") { done = true; - result = SDR_OK; + result = SystemDialogResult::OK; } else if (line == "C" || line == "c") { done = true; - result = SDR_CANCEL; + result = SystemDialogResult::CANCEL; } break; } @@ -148,6 +148,11 @@ SystemTimeStamp CSystemUtils::GetCurrentTimeStamp() return std::chrono::high_resolution_clock::now(); } +SystemTimeStamp CSystemUtils::TimeStampLerp(SystemTimeStamp a, SystemTimeStamp b, float t) +{ + return a + std::chrono::duration_cast((b - a) * t); +} + long long CSystemUtils::TimeStampExactDiff(SystemTimeStamp before, SystemTimeStamp after) { return std::chrono::duration_cast(after - before).count(); @@ -158,11 +163,11 @@ float CSystemUtils::TimeStampDiff(SystemTimeStamp before, SystemTimeStamp after, long long exact = TimeStampExactDiff(before, after); float result = 0.0f; - if (unit == STU_SEC) + if (unit == SystemTimeUnit::SECONDS) result = exact * 1e-9; - else if (unit == STU_MSEC) + else if (unit == SystemTimeUnit::MILLISECONDS) result = exact * 1e-6; - else if (unit == STU_USEC) + else if (unit == SystemTimeUnit::MICROSECONDS) result = exact * 1e-3; else assert(false); diff --git a/src/common/system/system.h b/src/common/system/system.h index 2f7fd146..1d0b31eb 100644 --- a/src/common/system/system.h +++ b/src/common/system/system.h @@ -35,18 +35,18 @@ * \enum SystemDialogType * \brief Type of system dialog */ -enum SystemDialogType +enum class SystemDialogType { //! Information message - SDT_INFO, + INFO, //! Warning message - SDT_WARNING, + WARNING, //! Error message - SDT_ERROR, + ERROR, //! Yes/No question - SDT_YES_NO, + YES_NO, //! Ok/Cancel question - SDT_OK_CANCEL + OK_CANCEL }; /** @@ -55,26 +55,23 @@ enum SystemDialogType * * Means which button was pressed. */ -enum SystemDialogResult +enum class SystemDialogResult { - SDR_OK, - SDR_CANCEL, - SDR_YES, - SDR_NO + OK, + CANCEL, + YES, + NO }; /** * \enum SystemTimeUnit * \brief Time unit */ -enum SystemTimeUnit +enum class SystemTimeUnit { - //! seconds - STU_SEC, - //! milliseconds - STU_MSEC, - //! microseconds - STU_USEC + SECONDS, + MILLISECONDS, + MICROSECONDS }; using SystemTimeStamp = std::chrono::time_point; @@ -103,20 +100,23 @@ public: //! Displays a fallback system dialog using console TEST_VIRTUAL SystemDialogResult ConsoleSystemDialog(SystemDialogType type, const std::string& title, const std::string& message); - //! Interpolates between two timestamps. If i=0 then dst=a. If i=1 then dst=b. If i=0.5 then dst is halfway between. - virtual void InterpolateTimeStamp(SystemTimeStamp *dst, SystemTimeStamp *a, SystemTimeStamp *b, float i) = 0; - //! Returns a time stamp associated with current time TEST_VIRTUAL SystemTimeStamp GetCurrentTimeStamp(); + //! Linearly interpolates between two timestamps. + SystemTimeStamp TimeStampLerp(SystemTimeStamp a, SystemTimeStamp b, float t); + //! Returns a difference between two timestamps in given time unit /** The difference is \a after - \a before. */ - float TimeStampDiff(SystemTimeStamp before, SystemTimeStamp after, SystemTimeUnit unit = STU_SEC); + float TimeStampDiff(SystemTimeStamp before, SystemTimeStamp after, SystemTimeUnit unit = SystemTimeUnit::SECONDS); //! Returns the exact (in nanosecond units) difference between two timestamps /** The difference is \a after - \a before. */ long long TimeStampExactDiff(SystemTimeStamp before, SystemTimeStamp after); + //! Returns the path where the executable binary is located (ends with the path separator) + virtual std::string GetBasePath(); + //! Returns the data path (containing textures, levels, helpfiles, etc) virtual std::string GetDataPath(); diff --git a/src/common/system/system_linux.cpp b/src/common/system/system_linux.cpp index 9f738aa9..056e34ad 100644 --- a/src/common/system/system_linux.cpp +++ b/src/common/system/system_linux.cpp @@ -46,20 +46,20 @@ SystemDialogResult CSystemUtilsLinux::SystemDialog(SystemDialogType type, const std::string options = ""; switch (type) { - case SDT_INFO: + case SystemDialogType::INFO: default: options = "--info"; break; - case SDT_WARNING: + case SystemDialogType::WARNING: options = "--warning"; break; - case SDT_ERROR: + case SystemDialogType::ERROR: options = "--error"; break; - case SDT_YES_NO: + case SystemDialogType::YES_NO: options = "--question --ok-label=\"Yes\" --cancel-label=\"No\""; break; - case SDT_OK_CANCEL: + case SystemDialogType::OK_CANCEL: options = "--question --ok-label=\"OK\" --cancel-label=\"Cancel\""; break; } @@ -67,14 +67,14 @@ SystemDialogResult CSystemUtilsLinux::SystemDialog(SystemDialogType type, const std::string command = "zenity " + options + " --text=\"" + message + "\" --title=\"" + title + "\""; int code = system(command.c_str()); - SystemDialogResult result = SDR_OK; + SystemDialogResult result = SystemDialogResult::OK; switch (type) { - case SDT_YES_NO: - result = code ? SDR_NO : SDR_YES; + case SystemDialogType::YES_NO: + result = code ? SystemDialogResult::NO : SystemDialogResult::YES; break; - case SDT_OK_CANCEL: - result = code ? SDR_CANCEL : SDR_OK; + case SystemDialogType::OK_CANCEL: + result = code ? SystemDialogResult::CANCEL : SystemDialogResult::OK; break; default: break; @@ -83,19 +83,6 @@ SystemDialogResult CSystemUtilsLinux::SystemDialog(SystemDialogType type, const return result; } -void CSystemUtilsLinux::InterpolateTimeStamp(SystemTimeStamp *dst, SystemTimeStamp *a, SystemTimeStamp *b, float i) -{ - long long delta = TimeStampExactDiff(a, b); - delta *= i; // truncates - dst->clockTime.tv_sec = a->clockTime.tv_sec + delta / 1000000000; - dst->clockTime.tv_nsec = a->clockTime.tv_nsec + delta % 1000000000; - if(dst->clockTime.tv_nsec >= 1000000000) - { - dst->clockTime.tv_nsec -= 1000000000; - dst->clockTime.tv_sec++; - } -} - void CSystemUtilsLinux::GetCurrentTimeStamp(SystemTimeStamp *stamp) { clock_gettime(CLOCK_MONOTONIC_RAW, &stamp->clockTime); diff --git a/src/common/system/system_linux.h b/src/common/system/system_linux.h index 93a0c8ba..8a1e60ec 100644 --- a/src/common/system/system_linux.h +++ b/src/common/system/system_linux.h @@ -24,8 +24,6 @@ #include "common/system/system.h" -#include - //@colobot-lint-exclude UndefinedFunctionRule class CSystemUtilsLinux : public CSystemUtils @@ -35,8 +33,6 @@ public: SystemDialogResult SystemDialog(SystemDialogType type, const std::string& title, const std::string& message) override; - void InterpolateTimeStamp(SystemTimeStamp *dst, SystemTimeStamp *a, SystemTimeStamp *b, float i) override; - std::string GetSaveDir() override; std::string GetEnvVar(const std::string& name) override; diff --git a/src/common/system/system_windows.cpp b/src/common/system/system_windows.cpp index 1d3c9b1e..3f2bb171 100644 --- a/src/common/system/system_windows.cpp +++ b/src/common/system/system_windows.cpp @@ -37,20 +37,24 @@ SystemDialogResult CSystemUtilsWindows::SystemDialog(SystemDialogType type, cons switch (type) { - case SDT_INFO: + case SystemDialogType::INFO: default: windowsType = MB_ICONINFORMATION|MB_OK; break; - case SDT_WARNING: + case SystemDialogType::WARNING: windowsType = MB_ICONWARNING|MB_OK; break; - case SDT_ERROR: +// windows.h defines ERROR which collides with the enum name +#pragma push_macro("ERROR") +#undef ERROR + case SystemDialogType::ERROR: +#pragma pop_macro("ERROR") windowsType = MB_ICONERROR|MB_OK; break; - case SDT_YES_NO: + case SystemDialogType::YES_NO: windowsType = MB_ICONQUESTION|MB_YESNO; break; - case SDT_OK_CANCEL: + case SystemDialogType::OK_CANCEL: windowsType = MB_ICONWARNING|MB_OKCANCEL; break; } @@ -58,18 +62,18 @@ SystemDialogResult CSystemUtilsWindows::SystemDialog(SystemDialogType type, cons switch (MessageBoxW(nullptr, windowsMessage.c_str(), windowsTitle.c_str(), windowsType)) { case IDOK: - return SDR_OK; + return SystemDialogResult::OK; case IDCANCEL: - return SDR_CANCEL; + return SystemDialogResult::CANCEL; case IDYES: - return SDR_YES; + return SystemDialogResult::YES; case IDNO: - return SDR_NO; + return SystemDialogResult::NO; default: break; } - return SDR_OK; + return SystemDialogResult::OK; } //! Converts a wide Unicode string to an UTF8 string diff --git a/src/graphics/engine/engine.cpp b/src/graphics/engine/engine.cpp index 19df60f8..72cc69b4 100644 --- a/src/graphics/engine/engine.cpp +++ b/src/graphics/engine/engine.cpp @@ -3168,7 +3168,7 @@ void CEngine::Render() m_fpsCounter++; m_currentFrameTime = m_systemUtils->GetCurrentTimeStamp(); - float diff = m_systemUtils->TimeStampDiff(m_lastFrameTime, m_currentFrameTime, STU_SEC); + float diff = m_systemUtils->TimeStampDiff(m_lastFrameTime, m_currentFrameTime, SystemTimeUnit::SECONDS); if (diff > 1.0f) { m_lastFrameTime = m_currentFrameTime; diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt index f0eaecd9..bcf187d0 100644 --- a/test/unit/CMakeLists.txt +++ b/test/unit/CMakeLists.txt @@ -1,10 +1,3 @@ -# Platform-dependent tests -if(PLATFORM_WINDOWS) - set(PLATFORM_TESTS common/system/system_windows_test.cpp) -elseif(PLATFORM_LINUX) - set(PLATFORM_TESTS common/system/system_linux_test.cpp) -endif() - set(TEST_FILES common/colobot.ini ) @@ -21,6 +14,7 @@ add_executable(colobot_ut CBot/CBotToken_test.cpp CBot/CBot_test.cpp common/config_file_test.cpp + common/system/system_test.cpp graphics/engine/lightman_test.cpp math/func_test.cpp math/geometry_test.cpp @@ -28,13 +22,6 @@ add_executable(colobot_ut math/vector_test.cpp ) -# Platform-dependent tests -if(PLATFORM_WINDOWS) - target_sources(colobot_ut PRIVATE common/system/system_windows_test.cpp) -elseif(PLATFORM_LINUX) - target_sources(colobot_ut PRIVATE common/system/system_linux_test.cpp) -endif() - target_include_directories(colobot_ut PRIVATE common math diff --git a/test/unit/app/app_test.cpp b/test/unit/app/app_test.cpp index 3b9443db..22fc3eb4 100644 --- a/test/unit/app/app_test.cpp +++ b/test/unit/app/app_test.cpp @@ -47,7 +47,7 @@ public: SDL_Quit(); } - Event CreateUpdateEvent(SystemTimeStamp *timestamp) override + Event CreateUpdateEvent(SystemTimeStamp timestamp) override { return CApplication::CreateUpdateEvent(timestamp); } @@ -117,8 +117,7 @@ void CApplicationUT::TestCreateUpdateEvent(long long relTimeExact, long long abs float relTime, float absTime, long long relTimeReal, long long absTimeReal) { - SystemTimeStamp *now = CreateTimeStamp(); - GetCurrentTimeStamp(now); + SystemTimeStamp now = GetCurrentTimeStamp(); Event event = m_app->CreateUpdateEvent(now); EXPECT_EQ(EVENT_FRAME, event.type); EXPECT_FLOAT_EQ(relTime, event.rTime); @@ -135,9 +134,7 @@ TEST_F(CApplicationUT, UpdateEventTimeCalculation_SimulationSuspended) { m_app->SuspendSimulation(); - SystemTimeStamp *now = CreateTimeStamp(); - GetCurrentTimeStamp(now); - Event event = m_app->CreateUpdateEvent(now); + Event event = m_app->CreateUpdateEvent(GetCurrentTimeStamp()); EXPECT_EQ(EVENT_NULL, event.type); } @@ -190,9 +187,7 @@ TEST_F(CApplicationUT, UpdateEventTimeCalculation_NegativeTimeOperation) NextInstant(-1111); - SystemTimeStamp *now = CreateTimeStamp(); - GetCurrentTimeStamp(now); - Event event = m_app->CreateUpdateEvent(now); + Event event = m_app->CreateUpdateEvent(GetCurrentTimeStamp()); EXPECT_EQ(EVENT_NULL, event.type); } diff --git a/test/unit/common/system/system_linux_test.cpp b/test/unit/common/system/system_linux_test.cpp deleted file mode 100644 index 6a503c18..00000000 --- a/test/unit/common/system/system_linux_test.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/* - * This file is part of the Colobot: Gold Edition source code - * Copyright (C) 2001-2020, Daniel Roux, EPSITEC SA & TerranovaTeam - * http://epsitec.ch; http://colobot.info; http://github.com/colobot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see http://gnu.org/licenses - */ - -#include "common/system/system.h" -#include "common/system/system_linux.h" - -#include - -class CSystemUtilsLinuxUT : public testing::Test -{ -protected: - static const long long SEC = 1000000000; - - CSystemUtilsLinux m_systemUtils; -}; - - -TEST_F(CSystemUtilsLinuxUT, TimeStampDiff) -{ - SystemTimeStamp before, after; - - before.clockTime.tv_sec = 1; - before.clockTime.tv_nsec = 100; - - after.clockTime.tv_sec = 1; - after.clockTime.tv_nsec = 900; - - long long tDiff = m_systemUtils.TimeStampExactDiff(&before, &after); - EXPECT_EQ( 800, tDiff); - - tDiff = m_systemUtils.TimeStampExactDiff(&after, &before); - EXPECT_EQ(-800, tDiff); - - // ------- - - before.clockTime.tv_sec = 2; - before.clockTime.tv_nsec = 200; - - after.clockTime.tv_sec = 3; - after.clockTime.tv_nsec = 500; - - tDiff = m_systemUtils.TimeStampExactDiff(&before, &after); - EXPECT_EQ( SEC + 300, tDiff); - - tDiff = m_systemUtils.TimeStampExactDiff(&after, &before); - EXPECT_EQ(-SEC - 300, tDiff); - - // ------- - - before.clockTime.tv_sec = 3; - before.clockTime.tv_nsec = 200; - - after.clockTime.tv_sec = 4; - after.clockTime.tv_nsec = 100; - - tDiff = m_systemUtils.TimeStampExactDiff(&before, &after); - EXPECT_EQ( SEC - 100, tDiff); - - tDiff = m_systemUtils.TimeStampExactDiff(&after, &before); - EXPECT_EQ(-SEC + 100, tDiff); -} diff --git a/test/unit/common/system/system_test.cpp b/test/unit/common/system/system_test.cpp index 60447dd7..f78a4f98 100644 --- a/test/unit/common/system/system_test.cpp +++ b/test/unit/common/system/system_test.cpp @@ -21,11 +21,13 @@ #include -struct SystemTest : ::testing::Test { +struct SystemTest : ::testing::Test +{ CSystemUtilsOther system; }; -TEST_F(SystemTest, TimeStampExactDiff) { +TEST_F(SystemTest, TimeStampExactDiff) +{ auto epoch = SystemTimeStamp{}; EXPECT_EQ(system.TimeStampExactDiff(epoch, epoch), 0); @@ -35,3 +37,43 @@ TEST_F(SystemTest, TimeStampExactDiff) { EXPECT_EQ(system.TimeStampExactDiff(before, after), std::chrono::nanoseconds{duration}.count()); EXPECT_EQ(system.TimeStampExactDiff(after, before), -std::chrono::nanoseconds{duration}.count()); } + +constexpr auto TIMESTAMP_START = SystemTimeStamp{std::chrono::nanoseconds{300}}; +constexpr auto TIMESTAMP_MID = SystemTimeStamp{std::chrono::nanoseconds{600}}; +constexpr auto TIMESTAMP_END = SystemTimeStamp{std::chrono::nanoseconds{900}}; + +constexpr auto LERP_PARAM_ZERO = 0.0f; +constexpr auto LERP_PARAM_HALF = 0.5f; +constexpr auto LERP_PARAM_ONE = 1.0f; + +TEST_F(SystemTest, TimeStampLerpReturnsStartWhenLerpParameterIsZero) +{ + EXPECT_EQ(TIMESTAMP_START, system.TimeStampLerp(TIMESTAMP_START, TIMESTAMP_END, LERP_PARAM_ZERO)); +} + +TEST_F(SystemTest, TimeStampLerpReturnsEndWhenLerpParameterIsOne) +{ + EXPECT_EQ(TIMESTAMP_END, system.TimeStampLerp(TIMESTAMP_START, TIMESTAMP_END, LERP_PARAM_ONE)); +} + +TEST_F(SystemTest, TimeStampLerpReturnsValueBetweenStartAndEndWhenLerpParameterIsBetweenZeroAndOne) +{ + EXPECT_EQ(TIMESTAMP_MID, system.TimeStampLerp(TIMESTAMP_START, TIMESTAMP_END, LERP_PARAM_HALF)); +} + +TEST_F(SystemTest, TimeStampLerpIsMonotonic) +{ + constexpr auto deltaLerpParam = 0.1f; + auto earlierTimeStamp = system.TimeStampLerp(TIMESTAMP_START, TIMESTAMP_END, LERP_PARAM_HALF - deltaLerpParam); + auto laterTimeStamp = system.TimeStampLerp(TIMESTAMP_START, TIMESTAMP_END, LERP_PARAM_HALF + deltaLerpParam); + EXPECT_TRUE(earlierTimeStamp < laterTimeStamp); +} + +TEST_F(SystemTest, TimeStampLerpIsConsistent) +{ + auto timeStamp = TIMESTAMP_START; + EXPECT_EQ(timeStamp, system.TimeStampLerp(timeStamp, timeStamp, LERP_PARAM_ZERO)); + EXPECT_EQ(timeStamp, system.TimeStampLerp(timeStamp, timeStamp, LERP_PARAM_HALF)); + EXPECT_EQ(timeStamp, system.TimeStampLerp(timeStamp, timeStamp, LERP_PARAM_ONE)); +} + diff --git a/test/unit/common/system/system_windows_test.cpp b/test/unit/common/system/system_windows_test.cpp deleted file mode 100644 index eb959ff0..00000000 --- a/test/unit/common/system/system_windows_test.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/* - * This file is part of the Colobot: Gold Edition source code - * Copyright (C) 2001-2020, Daniel Roux, EPSITEC SA & TerranovaTeam - * http://epsitec.ch; http://colobot.info; http://github.com/colobot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see http://gnu.org/licenses - */ - -#include "common/system/system.h" -#include "common/system/system_windows.h" - -#include - -class CSystemUtilsWindowsWrapper : public CSystemUtilsWindows -{ -public: - void SetFrequency(long long frequency) - { - m_counterFrequency = frequency; - } -}; - -class CSystemUtilsWindowsUT : public testing::Test -{ -protected: - static const long long SEC = 1000000000; - - CSystemUtilsWindowsWrapper m_systemUtils; -}; - -TEST_F(CSystemUtilsWindowsUT, TimeStampDiff) -{ - m_systemUtils.SetFrequency(SEC); - - SystemTimeStamp before, after; - - before.counterValue = 100; - after.counterValue = 200; - - long long tDiff = m_systemUtils.TimeStampExactDiff(&before, &after); - EXPECT_EQ( 100, tDiff); - - tDiff = m_systemUtils.TimeStampExactDiff(&after, &before); - EXPECT_EQ(-100, tDiff); - - // ------- - - m_systemUtils.SetFrequency(SEC/3); - - before.counterValue = 200; - after.counterValue = 400; - - tDiff = m_systemUtils.TimeStampExactDiff(&before, &after); - EXPECT_EQ( 200*3, tDiff); - - tDiff = m_systemUtils.TimeStampExactDiff(&after, &before); - EXPECT_EQ(-200*3, tDiff); -}