]> git.localhorst.tv Git - blobs.git/commitdiff
test basic interaction
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Mon, 18 Dec 2017 16:23:51 +0000 (17:23 +0100)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Mon, 18 Dec 2017 16:23:51 +0000 (17:23 +0100)
src/app/MasterState.hpp
tst/app/MasterTest.cpp
tst/app/MasterTest.hpp
tst/event.hpp [new file with mode: 0644]

index cb952157fb23c31dcb719d6a12482481036e291a..77d00cf54822aee0ed004af3b2ca8b0f103c38b7 100644 (file)
@@ -41,6 +41,9 @@ public:
        graphics::Camera &GetCamera() noexcept { return cam; }
        const graphics::Camera &GetCamera() const noexcept { return cam; }
 
+       ui::BodyPanel &GetBodyPanel() noexcept { return bp; }
+       const ui::BodyPanel &GetBodyPanel() const noexcept { return bp; }
+
        ui::CreaturePanel &GetCreaturePanel() noexcept { return cp; }
        const ui::CreaturePanel &GetCreaturePanel() const noexcept { return cp; }
 
index c9ab2d90d672ea60febbe8b3e2775a31c93f8db6..1624efa0cf6099960272fb295bb2692b89d561e7 100644 (file)
@@ -1,14 +1,21 @@
 #include "MasterTest.hpp"
 
+#include "../event.hpp"
+
 #include "app/Application.hpp"
 #include "app/Assets.hpp"
 #include "app/init.hpp"
 #include "app/MasterState.hpp"
 #include "creature/Creature.hpp"
+#include "world/Planet.hpp"
 #include "world/Simulation.hpp"
 
 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(blobs::app::test::MasterTest, "headed");
 
+using blobs::test::FakeKeyPress;
+using blobs::test::FakeMouseClick;
+using blobs::test::FakeQuit;
+
 
 namespace blobs {
 namespace app {
@@ -47,6 +54,101 @@ void MasterTest::testOneSecond() {
        }
 }
 
+void MasterTest::testBasicInteraction() {
+       Init init(false, 1);
+       Assets assets;
+
+       world::Simulation sim(assets);
+       assets.LoadUniverse("universe", sim);
+
+       auto blob = new creature::Creature(sim);
+       blob->Name(assets.name.Sequential());
+       Spawn(*blob, sim.PlanetByName("Planet"));
+       // decrease chances of ur-blob dying without splitting
+       blob->GetProperties().Fertility() = 1.0;
+       blob->BuildVAO();
+
+       app::MasterState state(assets, sim);
+       state.Show(*blob);
+
+       app::Application app(init.window, init.viewport);
+       app.PushState(&state);
+
+       // skip first 200ms to let camera settle
+       for (int t = 0; t < 200; t += 17) {
+               app.Loop(17);
+       }
+
+       CPPUNIT_ASSERT_MESSAGE(
+               "creature panel not shown",
+               state.GetCreaturePanel().Shown()
+       );
+       CPPUNIT_ASSERT_EQUAL_MESSAGE(
+               "creature panel showing wrong creature",
+               const_cast<const creature::Creature *>(blob), &state.GetCreaturePanel().GetCreature()
+       );
+       CPPUNIT_ASSERT_MESSAGE(
+               "records panel not shown",
+               state.GetRecordsPanel().Shown()
+       );
+       CPPUNIT_ASSERT_MESSAGE(
+               "body panel shown",
+               !state.GetBodyPanel().Shown()
+       );
+
+       // hide records panel
+       FakeKeyPress(SDLK_F1);
+       app.Loop(17);
+       CPPUNIT_ASSERT_MESSAGE(
+               "records panel shown",
+               !state.GetRecordsPanel().Shown()
+       );
+
+       // show records panel
+       FakeKeyPress(SDLK_F1);
+       app.Loop(17);
+       CPPUNIT_ASSERT_MESSAGE(
+               "records panel not shown",
+               state.GetRecordsPanel().Shown()
+       );
+
+       // click on blob
+       FakeMouseClick(SDL_BUTTON_LEFT, init.viewport.Width() / 2, init.viewport.Height() / 2);
+       app.Loop(17);
+       CPPUNIT_ASSERT_MESSAGE(
+               "creature panel not shown",
+               state.GetCreaturePanel().Shown()
+       );
+       CPPUNIT_ASSERT_MESSAGE(
+               "body panel shown",
+               !state.GetBodyPanel().Shown()
+       );
+
+       // click on planet
+       FakeMouseClick(SDL_BUTTON_LEFT, init.viewport.Width() / 3, init.viewport.Height() / 2);
+       app.Loop(17);
+       CPPUNIT_ASSERT_MESSAGE(
+               "creature panel shown",
+               !state.GetCreaturePanel().Shown()
+       );
+       CPPUNIT_ASSERT_MESSAGE(
+               "body panel not shown",
+               state.GetBodyPanel().Shown()
+       );
+       CPPUNIT_ASSERT_EQUAL_MESSAGE(
+               "body panel showing wrong body",
+               static_cast<const world::Body *>(&sim.PlanetByName("Planet")), &state.GetBodyPanel().GetBody()
+       );
+
+       // close window
+       FakeQuit();
+       app.Loop(17);
+       CPPUNIT_ASSERT_MESSAGE(
+               "app didn't exit after quit event",
+               !app.HasState()
+       );
+}
+
 }
 }
 }
index 14df37d583b8732a3a2e6ab4dc1e5b3935b129ff..ecccafe61672d13c96294faf689cfbfdf7e5f3d0 100644 (file)
@@ -14,6 +14,7 @@ class MasterTest
 CPPUNIT_TEST_SUITE(MasterTest);
 
 CPPUNIT_TEST(testOneSecond);
+CPPUNIT_TEST(testBasicInteraction);
 
 CPPUNIT_TEST_SUITE_END();
 
@@ -22,6 +23,7 @@ public:
        void tearDown();
 
        void testOneSecond();
+       void testBasicInteraction();
 
 };
 
diff --git a/tst/event.hpp b/tst/event.hpp
new file mode 100644 (file)
index 0000000..315d0d4
--- /dev/null
@@ -0,0 +1,77 @@
+#ifndef BLOBS_TEST_EVENT_HPP_
+#define BLOBS_TEST_EVENT_HPP_
+
+#include <SDL.h>
+
+
+namespace blobs {
+namespace test {
+
+inline void FakeKeyDown(int sym) {
+       SDL_Event e;
+       e.type = SDL_KEYDOWN;
+       e.key.keysym.sym = sym;
+       SDL_PushEvent(&e);
+}
+
+inline void FakeKeyUp(int sym) {
+       SDL_Event e;
+       e.type = SDL_KEYUP;
+       e.key.keysym.sym = sym;
+       SDL_PushEvent(&e);
+}
+
+inline void FakeKeyPress(int sym) {
+       FakeKeyDown(sym);
+       FakeKeyUp(sym);
+}
+
+inline void FakeMouseDown(int button = SDL_BUTTON_LEFT, int x = 0, int y = 0) {
+       SDL_Event e;
+       e.type = SDL_MOUSEBUTTONDOWN;
+       e.button.button = button;
+       e.button.x = x;
+       e.button.y = y;
+       SDL_PushEvent(&e);
+}
+
+inline void FakeMouseUp(int button = SDL_BUTTON_LEFT, int x = 0, int y = 0) {
+       SDL_Event e;
+       e.type = SDL_MOUSEBUTTONUP;
+       e.button.button = button;
+       e.button.x = x;
+       e.button.y = y;
+       SDL_PushEvent(&e);
+}
+
+inline void FakeMouseClick(int button = SDL_BUTTON_LEFT, int x = 0, int y = 0) {
+       FakeMouseDown(button, x, y);
+       FakeMouseUp(button, x, y);
+}
+
+inline void FakeMouseMotion(int xrel = 0, int yrel = 0) {
+       SDL_Event e;
+       e.type = SDL_MOUSEMOTION;
+       e.motion.xrel = xrel;
+       e.motion.yrel = yrel;
+       SDL_PushEvent(&e);
+}
+
+inline void FakeMouseWheel(int y = 0, int x = 0) {
+       SDL_Event e;
+       e.type = SDL_MOUSEWHEEL;
+       e.wheel.x = x;
+       e.wheel.y = y;
+       SDL_PushEvent(&e);
+}
+
+inline void FakeQuit() {
+       SDL_Event e;
+       e.type = SDL_QUIT;
+       SDL_PushEvent(&e);
+}
+
+}
+}
+
+#endif