Browse Source

Add basic test case for SdlWindowApi class

Patrick-Christopher Mattulat 1 week ago
parent
commit
24c03034e9

+ 1 - 0
.gitignore

@@ -1,2 +1,3 @@
 .idea
 CMakeUserPresets.json
+pasteBin.txt

+ 66 - 1
CMakeLists.txt

@@ -20,14 +20,21 @@ set(MODULE_NAME_WINDOW ls-atlantis-window)
 set(CMAKE_DEBUG_POSTFIX -d)
 
 include_directories(${CMAKE_CURRENT_LIST_DIR}/include)
+include_directories(${CMAKE_CURRENT_LIST_DIR}/)
 
 ################################
 # Dependencies
 ################################
 
 find_package(GTest REQUIRED)
+find_package(ls-std REQUIRED)
 find_package(SDL3 REQUIRED)
 
+if (WIN32)
+    file(GLOB LS_STD_DLLS_DEBUG "${ls-std_LIB_DIRS_DEBUG}/*.dll")
+    file(GLOB LS_STD_DLLS_RELEASE "${ls-std_LIB_DIRS_RELEASE}/*.dll")
+endif ()
+
 ################################################################
 ################################################################
 # Module: Core
@@ -51,6 +58,8 @@ add_library(${MODULE_NAME_CORE} SHARED ${ATLANTIS_CORE_SOURCES})
 
 target_link_libraries(${MODULE_NAME_CORE} PUBLIC
     ${MODULE_NAME_INTERFACE}
+    $<$<CONFIG:Debug>:ls-std::ls-std-core-d>
+    $<$<CONFIG:Release>:ls-std::ls-std-core>
 )
 
 ################################
@@ -76,7 +85,18 @@ target_link_libraries(${MODULE_NAME_CORE}-tests PRIVATE
 )
 
 include(GoogleTest)
-gtest_discover_tests(${MODULE_NAME_CORE}-tests)
+gtest_discover_tests(${MODULE_NAME_CORE}-tests DISCOVERY_MODE PRE_TEST)
+
+if (WIN32)
+    add_custom_command(TARGET ${MODULE_NAME_CORE}-tests POST_BUILD
+        COMMAND ${CMAKE_COMMAND} -E copy -t $<TARGET_FILE_DIR:${MODULE_NAME_CORE}-tests>
+            $<TARGET_RUNTIME_DLLS:${MODULE_NAME_CORE}-tests>
+        COMMAND ${CMAKE_COMMAND} -E copy -t $<TARGET_FILE_DIR:${MODULE_NAME_CORE}-tests>
+            "$<$<CONFIG:Debug>:${LS_STD_DLLS_DEBUG}>"
+            "$<$<CONFIG:Release>:${LS_STD_DLLS_RELEASE}>"
+        COMMAND_EXPAND_LISTS
+    )
+endif ()
 
 ################################################################
 ################################################################
@@ -130,3 +150,48 @@ target_link_libraries(${MODULE_NAME_WINDOW} PUBLIC
     ${MODULE_NAME_INTERFACE}
     SDL3::SDL3
 )
+
+################################
+# Test Files: Window Module
+################################
+
+set(ATLANTIS_WINDOW_TEST_SOURCES
+        ${CMAKE_CURRENT_SOURCE_DIR}/test/window/mock/SdlApiMock.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/test/window/SdlWindowApiTest.cpp
+)
+
+################################
+# Test Case Creation: Window Module
+################################
+
+add_executable(${MODULE_NAME_WINDOW}-tests ${ATLANTIS_WINDOW_TEST_SOURCES})
+
+target_link_libraries(${MODULE_NAME_WINDOW}-tests PRIVATE
+    ${MODULE_NAME_WINDOW}
+    GTest::gmock_main
+)
+
+gtest_discover_tests(${MODULE_NAME_WINDOW}-tests DISCOVERY_MODE PRE_TEST)
+
+if (WIN32)
+    add_custom_command(TARGET ${MODULE_NAME_WINDOW}-tests POST_BUILD
+        COMMAND ${CMAKE_COMMAND} -E copy -t $<TARGET_FILE_DIR:${MODULE_NAME_WINDOW}-tests>
+            $<TARGET_RUNTIME_DLLS:${MODULE_NAME_WINDOW}-tests>
+        COMMAND ${CMAKE_COMMAND} -E copy -t $<TARGET_FILE_DIR:${MODULE_NAME_WINDOW}-tests>
+            "$<$<CONFIG:Debug>:${LS_STD_DLLS_DEBUG}>"
+            "$<$<CONFIG:Release>:${LS_STD_DLLS_RELEASE}>"
+        COMMAND_EXPAND_LISTS
+    )
+endif ()
+
+################################################################
+################################################################
+# All Tests
+################################################################
+################################################################
+
+add_custom_target(ls-atlantis-tests
+    DEPENDS
+        ${MODULE_NAME_CORE}-tests
+        ${MODULE_NAME_WINDOW}-tests
+)

+ 1 - 0
conanfile.txt

@@ -6,3 +6,4 @@ sdl/3.4.8
 [generators]
 CMakeDeps
 CMakeToolchain
+VirtualRunEnv

+ 1 - 1
include/interface/ISdlApi.hpp

@@ -18,7 +18,7 @@ namespace ls::atlantis::interfaces
       ISdlApi();
       virtual ~ISdlApi();
 
-      virtual int Init(SDL_InitFlags flags) = 0;
+      virtual bool Init(SDL_InitFlags flags) = 0;
       virtual void Quit() = 0;
   };
 }

+ 1 - 1
include/interface/IWindowApi.hpp

@@ -19,7 +19,7 @@ namespace ls::atlantis::interfaces
       IWindowApi();
       virtual ~IWindowApi();
 
-      virtual std::shared_ptr<AStatusCode> init() = 0;
+      virtual ::std::shared_ptr<AStatusCode> init() = 0;
   };
 }
 

+ 1 - 1
include/window/SdlApi.hpp

@@ -18,7 +18,7 @@ namespace ls::atlantis::window
       SdlApi();
       ~SdlApi() override;
 
-      int Init(SDL_InitFlags flags) override;
+      bool Init(SDL_InitFlags flags) override;
       void Quit() override;
   };
 }

+ 5 - 5
include/window/SdlWindowApi.hpp

@@ -19,17 +19,17 @@ namespace ls::atlantis::window
     public:
 
       SdlWindowApi();
-      explicit SdlWindowApi(const std::shared_ptr<ls::atlantis::interfaces::ISdlApi> &_sdlApi);
+      explicit SdlWindowApi(const ::std::shared_ptr<ls::atlantis::interfaces::ISdlApi> &_sdlApi);
       ~SdlWindowApi() override;
 
-      [[nodiscard]] std::shared_ptr<ls::atlantis::interfaces::AStatusCode> init() override;
+      [[nodiscard]] ::std::shared_ptr<ls::atlantis::interfaces::AStatusCode> init() override;
 
     private:
 
-      static std::shared_ptr<ls::atlantis::interfaces::AStatusCode> _createWindow();
-      std::shared_ptr<ls::atlantis::interfaces::AStatusCode> _initApi();
+      static ::std::shared_ptr<ls::atlantis::interfaces::AStatusCode> _createWindow();
+      ::std::shared_ptr<ls::atlantis::interfaces::AStatusCode> _initApi();
 
-      std::shared_ptr<ls::atlantis::interfaces::ISdlApi> sdlApi{};
+      ::std::shared_ptr<ls::atlantis::interfaces::ISdlApi> sdlApi{};
   };
 }
 

+ 1 - 1
source/window/SdlApi.cpp

@@ -11,7 +11,7 @@ SdlApi::SdlApi() = default;
 
 SdlApi::~SdlApi() = default;
 
-int SdlApi::Init(const SDL_InitFlags flags)
+bool SdlApi::Init(const SDL_InitFlags flags)
 {
   return SDL_Init(flags);
 }

+ 4 - 4
source/window/SdlWindowApi.cpp

@@ -6,6 +6,7 @@
 #include <SDL3/SDL.h>
 #include <core/StatusCodeOk.hpp>
 #include <core/StatusCodeWindowApiLoadingFailed.hpp>
+#include <ls-std/core/evaluator/NullPointerArgumentEvaluator.hpp>
 #include <window/SdlApi.hpp>
 #include <window/SdlWindowApi.hpp>
 
@@ -13,19 +14,18 @@ using ls::atlantis::core::StatusCodeOk;
 using ls::atlantis::core::StatusCodeWindowApiLoadingFailed;
 using ls::atlantis::interfaces::AStatusCode;
 using ls::atlantis::interfaces::ISdlApi;
+using ls::std::core::NullPointerArgumentEvaluator;
 using ls::atlantis::window::SdlApi;
 using ls::atlantis::window::SdlWindowApi;
 using ::std::make_shared;
 using ::std::shared_ptr;
 
 SdlWindowApi::SdlWindowApi() : SdlWindowApi(make_shared<SdlApi>())
-{
-  // TODO: null check
-}
+{}
 
 SdlWindowApi::SdlWindowApi(const shared_ptr<ISdlApi> &_sdlApi) : sdlApi(_sdlApi)
 {
-  // TODO: null check
+  NullPointerArgumentEvaluator(_sdlApi).evaluate();
 }
 
 SdlWindowApi::~SdlWindowApi()

+ 55 - 0
test/window/SdlWindowApiTest.cpp

@@ -0,0 +1,55 @@
+/*
+ * author: Patrick-Christopher Mattulat
+ * e-mail: webmaster@lynarstudios.com
+ */
+
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+#include <test/window/mock/SdlApiMock.hpp>
+#include <window/SdlWindowApi.hpp>
+#include <core/StatusCodes.hpp>
+#include <ls-std/core/exception/IllegalArgumentException.hpp>
+
+using ls::atlantis::core::StatusCodes;
+using ls::atlantis::interfaces::ISdlApi;
+using ls::atlantis::window::SdlWindowApi;
+using ls::atlantis::window::test::SdlApiMock;
+using ls::std::core::IllegalArgumentException;
+using ::std::make_shared;
+using ::std::shared_ptr;
+using ::testing::Return;
+using ::testing::Test;
+
+namespace
+{
+  class SdlWindowApiTest : public Test
+  {
+    public:
+
+      SdlWindowApiTest() = default;
+      ~SdlWindowApiTest() override = default;
+
+      shared_ptr<SdlApiMock> sdlApiMock = make_shared<SdlApiMock>();
+  };
+
+  TEST_F(SdlWindowApiTest, constructor_nullPointer)
+  {
+    ASSERT_THROW(SdlWindowApi(nullptr), IllegalArgumentException);
+  }
+
+  TEST_F(SdlWindowApiTest, init)
+  {
+    EXPECT_CALL(*sdlApiMock, Init(SDL_INIT_VIDEO)).WillOnce(Return(1));
+    EXPECT_CALL(*sdlApiMock, Quit());
+
+    ASSERT_EQ(StatusCodes::OK, SdlWindowApi(sdlApiMock).init()->getId());
+  }
+
+  TEST_F(SdlWindowApiTest, init_failed)
+  {
+    EXPECT_CALL(*sdlApiMock, Init(SDL_INIT_VIDEO)).WillOnce(Return(0));
+    EXPECT_CALL(*sdlApiMock, Quit());
+
+    ASSERT_EQ(StatusCodes::WINDOW_API_LOADING_FAILED, SdlWindowApi(sdlApiMock).init()->getId());
+  }
+}

+ 12 - 0
test/window/mock/SdlApiMock.cpp

@@ -0,0 +1,12 @@
+/*
+ * author: Patrick-Christopher Mattulat
+ * e-mail: webmaster@lynarstudios.com
+ */
+
+#include <test/window/mock/SdlApiMock.hpp>
+
+using ls::atlantis::window::test::SdlApiMock;
+
+SdlApiMock::SdlApiMock() = default;
+
+SdlApiMock::~SdlApiMock() = default;

+ 26 - 0
test/window/mock/SdlApiMock.hpp

@@ -0,0 +1,26 @@
+/*
+ * author: Patrick-Christopher Mattulat
+ * e-mail: webmaster@lynarstudios.com
+ */
+
+#ifndef LS_ATLANTIS_ENGINE_SDL_API_MOCK_HPP
+#define LS_ATLANTIS_ENGINE_SDL_API_MOCK_HPP
+
+#include <gmock/gmock.h>
+#include <interface/ISdlApi.hpp>
+
+namespace ls::atlantis::window::test
+{
+  class SdlApiMock : public ls::atlantis::interfaces::ISdlApi
+  {
+    public:
+
+      SdlApiMock();
+      ~SdlApiMock() override;
+
+      MOCK_METHOD(bool, Init, (SDL_InitFlags flags), (override));
+      MOCK_METHOD(void, Quit, (), (override));
+  };
+}
+
+#endif