#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 {
}
}
+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()
+ );
+}
+
}
}
}
--- /dev/null
+#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