瀏覽代碼

Add SDL window creation error hint

Patrick-Christopher Mattulat 1 周之前
父節點
當前提交
d032c7f486

+ 1 - 0
include/interface/AStatusCode.hpp

@@ -20,6 +20,7 @@ namespace ls::atlantis::interfaces
       virtual ~AStatusCode();
 
       virtual void addHint(const ::std::string &_hint);
+      [[nodiscard]] ::std::vector<::std::string> getHints() const;
       [[nodiscard]] virtual uint16_t getId() const;
       [[nodiscard]] virtual ::std::string getText() const;
 

+ 1 - 0
include/interface/ISdlApi.hpp

@@ -20,6 +20,7 @@ namespace ls::atlantis::interfaces
 
       virtual SDL_Window *CreateWindow(const char *_title, int _width, int _height, SDL_WindowFlags _flags) = 0;
       virtual void DestroyWindow(SDL_Window *_window) = 0;
+      virtual const char *GetError() = 0;
       virtual bool Init(SDL_InitFlags flags) = 0;
       virtual void Quit() = 0;
   };

+ 1 - 0
include/window/SdlApi.hpp

@@ -20,6 +20,7 @@ namespace ls::atlantis::window
 
       SDL_Window *CreateWindow(const char *_title, int _width, int _height, SDL_WindowFlags _flags) override;
       void DestroyWindow(SDL_Window *_window) override;
+      const char *GetError() override;
       bool Init(SDL_InitFlags flags) override;
       void Quit() override;
   };

+ 6 - 0
source/interface/AStatusCode.cpp

@@ -10,6 +10,7 @@ using ls::atlantis::interfaces::AStatusCode;
 using ls::std::core::EmptyStringArgumentEvaluator;
 using ::std::move;
 using ::std::string;
+using ::std::vector;
 
 AStatusCode::AStatusCode(const uint16_t &_statusId, string _statusText) : statusId(_statusId), statusText(::move(_statusText))
 {}
@@ -22,6 +23,11 @@ void AStatusCode::addHint(const string &_hint)
   this->statusHints.push_back(_hint);
 }
 
+vector<string> AStatusCode::getHints() const
+{
+  return this->statusHints;
+}
+
 uint16_t AStatusCode::getId() const
 {
   return this->statusId;

+ 5 - 0
source/window/SdlApi.cpp

@@ -21,6 +21,11 @@ void SdlApi::DestroyWindow(SDL_Window *_window)
   SDL_DestroyWindow(_window);
 }
 
+const char *SdlApi::GetError()
+{
+  return SDL_GetError();
+}
+
 bool SdlApi::Init(const SDL_InitFlags flags)
 {
   return SDL_Init(flags);

+ 4 - 2
source/window/SdlWindowApi.cpp

@@ -51,14 +51,16 @@ shared_ptr<AStatusCode> SdlWindowApi::init()
 
 shared_ptr<AStatusCode> SdlWindowApi::_createWindow()
 {
+  shared_ptr<AStatusCode> statusCode = make_shared<StatusCodeOk>();
   window.reset(sdlApi->CreateWindow("", 0, 0, SDL_WINDOW_FULLSCREEN));
 
   if (window == nullptr)
   {
-    return make_shared<StatusCodeWindowCreationFailed>();
+    statusCode = make_shared<StatusCodeWindowCreationFailed>();
+    statusCode->addHint(sdlApi->GetError());
   }
 
-  return make_shared<StatusCodeOk>();
+  return statusCode;
 }
 
 shared_ptr<AStatusCode> SdlWindowApi::_initApi() const

+ 12 - 1
test/window/SdlWindowApiTest.cpp

@@ -9,14 +9,18 @@
 #include <window/SdlWindowApi.hpp>
 #include <core/StatusCodes.hpp>
 #include <ls-std/core/exception/IllegalArgumentException.hpp>
+#include <interface/AStatusCode.hpp>
+#include <string>
 
 using ls::atlantis::core::StatusCodes;
+using ls::atlantis::interfaces::AStatusCode;
 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 ::std::string;
 using ::testing::Return;
 using ::testing::StrEq;
 using ::testing::Test;
@@ -61,10 +65,17 @@ namespace
 
   TEST_F(SdlWindowApiTest, init_windowCreationFailed)
   {
+    const string hint = "Upsi Dupsi";
+
     EXPECT_CALL(*sdlApiMock, Init(SDL_INIT_VIDEO)).WillOnce(Return(1));
     EXPECT_CALL(*sdlApiMock, CreateWindow(StrEq(""), 0, 0, SDL_WINDOW_FULLSCREEN)).WillOnce(Return(nullptr));
+    EXPECT_CALL(*sdlApiMock, GetError()).WillOnce(Return(hint.c_str()));
     EXPECT_CALL(*sdlApiMock, Quit());
 
-    ASSERT_EQ(StatusCodes::WINDOW_CREATION_FAILED, SdlWindowApi(sdlApiMock).init()->getId());
+    const shared_ptr<AStatusCode> statusCode = SdlWindowApi(sdlApiMock).init();
+
+    ASSERT_EQ(StatusCodes::WINDOW_CREATION_FAILED, statusCode->getId());
+    ASSERT_EQ(1, statusCode->getHints().size());
+    ASSERT_STREQ(hint.c_str(), statusCode->getHints()[0].c_str());
   }
 }

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

@@ -20,6 +20,7 @@ namespace ls::atlantis::window::test
 
       MOCK_METHOD(SDL_Window *, CreateWindow, (const char *, int, int, SDL_WindowFlags), (override));
       MOCK_METHOD(void, DestroyWindow, (SDL_Window *), (override));
+      MOCK_METHOD(const char*, GetError, (), (override));
       MOCK_METHOD(bool, Init, (SDL_InitFlags flags), (override));
       MOCK_METHOD(void, Quit, (), (override));
   };