From 78cc589fc9e17ab1487643fa4e7ded33e4ae1622 Mon Sep 17 00:00:00 2001 From: Vraiment Date: Sat, 15 Jul 2017 18:39:48 -0700 Subject: [PATCH] Added PollEvent(T eventHandler) --- SDL2pp/EventPolling.hh | 12 ++++++ tests/test_eventpolling.cc | 77 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) diff --git a/SDL2pp/EventPolling.hh b/SDL2pp/EventPolling.hh index cf2ecf2..4bb77bf 100644 --- a/SDL2pp/EventPolling.hh +++ b/SDL2pp/EventPolling.hh @@ -26,6 +26,18 @@ namespace SDL2pp { bool PollEvent(); + + template + bool PollEvent(T& eventHandler) { + SDL_Event event; + if (!SDL_PollEvent(&event)) { + return false; + } + + eventHandler(event); + + return true; + } } #endif diff --git a/tests/test_eventpolling.cc b/tests/test_eventpolling.cc index 20e4d16..3e9a692 100644 --- a/tests/test_eventpolling.cc +++ b/tests/test_eventpolling.cc @@ -5,7 +5,10 @@ #include "testing.h" +#include + using namespace SDL2pp; +using namespace std; inline SDL_Event PushUserEvent(Sint32 userCode = 0, void *data1 = nullptr, void *data2 = nullptr) { SDL_Event event; @@ -21,6 +24,22 @@ inline SDL_Event PushUserEvent(Sint32 userCode = 0, void *data1 = nullptr, void return event; } +namespace StaticEventHandler { + vector events; + + inline void EventHandler(const SDL_Event& event) { + events.push_back(event); + } +} + +struct CallableEventHandler { + vector events; + + void operator()(const SDL_Event& event) { + events.push_back(event); + } +}; + BEGIN_TEST(int, char*[]) // With no callback and no polled event { @@ -34,4 +53,62 @@ BEGIN_TEST(int, char*[]) EXPECT_TRUE(PollEvent() == true); EXPECT_TRUE(PollEvent() == false); } + + + // With function as an event handler + { + StaticEventHandler::events.clear(); + + const SDL_Event expected = PushUserEvent(15); + + EXPECT_TRUE(PollEvent(StaticEventHandler::EventHandler) == true); + EXPECT_TRUE(StaticEventHandler::events.size() == 1); + + const SDL_Event result = StaticEventHandler::events[0]; + EXPECT_TRUE(result.type == expected.type); + EXPECT_TRUE(result.user.code == expected.user.code); + + // Verify no further events + EXPECT_TRUE(PollEvent(StaticEventHandler::EventHandler) == false); + EXPECT_TRUE(StaticEventHandler::events.size() == 1); + } + + // With lambda as an event handler + { + vector events; + auto eventHandler = [&events](const SDL_Event& event) { + events.push_back(event); + }; + + const SDL_Event expectedEvent = PushUserEvent(22); + + EXPECT_TRUE(PollEvent(eventHandler) == true); + EXPECT_TRUE(events.size() == 1); + + const SDL_Event result = events[0]; + EXPECT_TRUE(result.type == expectedEvent.type); + EXPECT_TRUE(result.user.code == expectedEvent.user.code); + + // Verify no further events + EXPECT_TRUE(PollEvent(eventHandler) == false); + EXPECT_TRUE(events.size() == 1); + } + + // With callable object + { + CallableEventHandler eventHandler; + + const SDL_Event expectedEvent = PushUserEvent(45); + + EXPECT_TRUE(PollEvent(eventHandler) == true); + EXPECT_TRUE(eventHandler.events.size() == 1); + + const SDL_Event result = eventHandler.events[0]; + EXPECT_TRUE(result.type == expectedEvent.type); + EXPECT_TRUE(result.user.code == expectedEvent.user.code); + + // Verify no further events + EXPECT_TRUE(PollEvent(eventHandler) == false); + EXPECT_TRUE(eventHandler.events.size() == 1); + } END_TEST()