Added 3 PickupSpawnSystem tests.
This commit is contained in:
@@ -0,0 +1,205 @@
|
|||||||
|
#include <boost/test/unit_test.hpp>
|
||||||
|
using boost::unit_test_framework::test_suite;
|
||||||
|
using boost::unit_test_framework::test_case;
|
||||||
|
|
||||||
|
#include "PickupSpawnTest.h"
|
||||||
|
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_SUITE(PickupSpawnTestSuite)
|
||||||
|
|
||||||
|
//dont use the same name as the classname in test cases...
|
||||||
|
BOOST_AUTO_TEST_CASE(PickupSpawnTest_HealthPickupRespawns_PlayerHealthPickupEventTriggers)
|
||||||
|
{
|
||||||
|
PickupSpawnTest game(1);
|
||||||
|
bool success = game.Game_Loop_OneHundredTimes();
|
||||||
|
BOOST_TEST(success);
|
||||||
|
}
|
||||||
|
BOOST_AUTO_TEST_CASE(PickupSpawnTest_APlayerAtMaxHealth_CantTakeHealthPickup)
|
||||||
|
{
|
||||||
|
PickupSpawnTest game(2);
|
||||||
|
bool success = game.Game_Loop_OneHundredTimes();
|
||||||
|
BOOST_TEST(success);
|
||||||
|
}
|
||||||
|
BOOST_AUTO_TEST_CASE(PickupSpawnTest_APickupCanRespawnSlowly)
|
||||||
|
{
|
||||||
|
PickupSpawnTest game(3);
|
||||||
|
bool success = game.Game_Loop_OneHundredTimes();
|
||||||
|
BOOST_TEST(success);
|
||||||
|
}
|
||||||
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
||||||
|
PickupSpawnTest::PickupSpawnTest(int runTestNumber)
|
||||||
|
{
|
||||||
|
ResourceManager::RegisterType<ConfigFile>("ConfigFile");
|
||||||
|
ResourceManager::RegisterType<EntityFile>("EntityFile");
|
||||||
|
|
||||||
|
m_Config = ResourceManager::Load<ConfigFile>("Config.ini");
|
||||||
|
LOG_LEVEL = static_cast<_LOG_LEVEL>(m_Config->Get<int>("Debug.LogLevel", 1));
|
||||||
|
|
||||||
|
m_EventBroker = new EventBroker();
|
||||||
|
m_World = new World();
|
||||||
|
|
||||||
|
// Create system pipeline
|
||||||
|
m_SystemPipeline = new SystemPipeline(m_World, m_EventBroker);
|
||||||
|
m_SystemPipeline->AddSystem<HealthSystem>(0);
|
||||||
|
m_SystemPipeline->AddSystem<PickupSpawnSystem>(1);
|
||||||
|
|
||||||
|
//must register components (Components.xsd), else you cant create entities. Easiest done by loading a test xsd file
|
||||||
|
auto file = ResourceManager::Load<EntityFile>("Schema/Entities/HealthPickup.xml");
|
||||||
|
EntityFilePreprocessor fpp(file);
|
||||||
|
fpp.RegisterComponents(m_World);
|
||||||
|
EntityFileParser fp(file);
|
||||||
|
//connect the healthpickup to the world
|
||||||
|
m_HealthPickupID = fp.MergeEntities(m_World);
|
||||||
|
|
||||||
|
//create a player
|
||||||
|
m_PlayerID = m_World->CreateEntity();
|
||||||
|
auto& player = m_World->AttachComponent(m_PlayerID, "Player");
|
||||||
|
|
||||||
|
m_RunTestNumber = runTestNumber;
|
||||||
|
|
||||||
|
//further testsetups
|
||||||
|
TestSetup(m_RunTestNumber);
|
||||||
|
|
||||||
|
//init glfw so dt works
|
||||||
|
glfwInit();
|
||||||
|
|
||||||
|
//listen to the 2 events that are related to PickupSpawn
|
||||||
|
EVENT_SUBSCRIBE_MEMBER(m_HP, &PickupSpawnTest::OnHealthPickup);
|
||||||
|
EVENT_SUBSCRIBE_MEMBER(m_PS, &PickupSpawnTest::OnPickupSpawned);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PickupSpawnTest::OnHealthPickup(Events::PlayerHealthPickup& e) {
|
||||||
|
//very that the event has the correct healthgain number and playerid
|
||||||
|
if (m_RunTestNumber == 1) {
|
||||||
|
if (e.HealthAmount == 22.0 && e.Player.ID == m_PlayerID) {
|
||||||
|
testStage1Success = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (m_RunTestNumber == 2) {
|
||||||
|
testStage1Success = false;
|
||||||
|
}
|
||||||
|
if (m_RunTestNumber == 3) {
|
||||||
|
if (e.HealthAmount == 50.0 && e.Player.ID == m_PlayerID) {
|
||||||
|
testStage1Success = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
bool PickupSpawnTest::OnPickupSpawned(Events::PickupSpawned& e) {
|
||||||
|
//verify that the newly spawned pickup has the same variable values as the original one
|
||||||
|
if (m_RunTestNumber == 1) {
|
||||||
|
if ((double)e.Pickup["HealthPickup"]["HealthGain"] == 22.0 && (double)e.Pickup["HealthPickup"]["RespawnTimer"] == 2.0) {
|
||||||
|
testStage2Success = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (m_RunTestNumber == 2) {
|
||||||
|
testStage2Success = false;
|
||||||
|
}
|
||||||
|
if (m_RunTestNumber == 3) {
|
||||||
|
testStage2Success = false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PickupSpawnTest::TestSetup(int testNumber)
|
||||||
|
{
|
||||||
|
//cant use switch here, since each case might initialize different variables
|
||||||
|
if (m_RunTestNumber == 1) {
|
||||||
|
//PickupSpawnTest_HealthPickupRespawns_PlayerHealthPickupEventTriggers
|
||||||
|
auto& healthPickupEW = EntityWrapper(m_World, m_HealthPickupID);
|
||||||
|
healthPickupEW["HealthPickup"]["RespawnTimer"] = 2.0;
|
||||||
|
healthPickupEW["HealthPickup"]["HealthGain"] = 22.0;
|
||||||
|
|
||||||
|
//create a player
|
||||||
|
auto& health = m_World->AttachComponent(m_PlayerID, "Health");
|
||||||
|
health["Health"] = 20.0;
|
||||||
|
health["MaxHealth"] = 100.0;
|
||||||
|
|
||||||
|
Events::TriggerTouch eTriggerTouch;
|
||||||
|
DoTouchEvent(m_PlayerID, m_HealthPickupID);
|
||||||
|
}
|
||||||
|
if (m_RunTestNumber == 2) {
|
||||||
|
//PickupSpawnTest_APlayerAtMaxHealth_CantTakeHealthPickup
|
||||||
|
auto& healthPickupEW = EntityWrapper(m_World, m_HealthPickupID);
|
||||||
|
healthPickupEW["HealthPickup"]["RespawnTimer"] = 1.0;
|
||||||
|
healthPickupEW["HealthPickup"]["HealthGain"] = 50.0;
|
||||||
|
|
||||||
|
//create a player at max health
|
||||||
|
auto& health = m_World->AttachComponent(m_PlayerID, "Health");
|
||||||
|
health["Health"] = 100.0;
|
||||||
|
health["MaxHealth"] = 100.0;
|
||||||
|
|
||||||
|
Events::TriggerTouch eTriggerTouch;
|
||||||
|
DoTouchEvent(m_PlayerID, m_HealthPickupID);
|
||||||
|
}
|
||||||
|
if (m_RunTestNumber == 3) {
|
||||||
|
//PickupSpawnTest_APickupCanRespawnSlowly
|
||||||
|
auto& healthPickupEW = EntityWrapper(m_World, m_HealthPickupID);
|
||||||
|
healthPickupEW["HealthPickup"]["RespawnTimer"] = 100.0;
|
||||||
|
healthPickupEW["HealthPickup"]["HealthGain"] = 50.0;
|
||||||
|
|
||||||
|
//create a player
|
||||||
|
auto& health = m_World->AttachComponent(m_PlayerID, "Health");
|
||||||
|
health["Health"] = 1.0;
|
||||||
|
health["MaxHealth"] = 100.0;
|
||||||
|
|
||||||
|
Events::TriggerTouch eTriggerTouch;
|
||||||
|
DoTouchEvent(m_PlayerID, m_HealthPickupID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//generic stuff
|
||||||
|
void PickupSpawnTest::Tick()
|
||||||
|
{
|
||||||
|
glfwPollEvents();
|
||||||
|
|
||||||
|
//just set dt to 1.0 since we want fast testing
|
||||||
|
double dt = 1.0;
|
||||||
|
|
||||||
|
// Iterate through systems and update world!
|
||||||
|
m_SystemPipeline->Update(dt);
|
||||||
|
|
||||||
|
m_EventBroker->Swap();
|
||||||
|
m_EventBroker->Clear();
|
||||||
|
|
||||||
|
//verify that healthgain event has been published and pickup has respawned
|
||||||
|
if (m_RunTestNumber == 1 && testStage1Success && testStage2Success) {
|
||||||
|
m_TestSucceeded = true;
|
||||||
|
}
|
||||||
|
//verify that no healthgain event has been published and that no pickup has respawned
|
||||||
|
if (m_NumLoops > 90 && m_RunTestNumber == 2 && !testStage1Success && !testStage2Success) {
|
||||||
|
m_TestSucceeded = true;
|
||||||
|
}
|
||||||
|
//3: verify that the pickup hasnt spawned
|
||||||
|
if (m_NumLoops > 90 && m_RunTestNumber == 3 && testStage1Success && !testStage2Success) {
|
||||||
|
m_TestSucceeded = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool PickupSpawnTest::Game_Loop_OneHundredTimes() {
|
||||||
|
//100 loops will be more than enough to do the test
|
||||||
|
int loops = 100;
|
||||||
|
bool success = false;
|
||||||
|
while (loops > 0) {
|
||||||
|
Tick();
|
||||||
|
m_NumLoops++;
|
||||||
|
if (m_TestSucceeded) {
|
||||||
|
success = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
loops--;
|
||||||
|
}
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
PickupSpawnTest::~PickupSpawnTest()
|
||||||
|
{
|
||||||
|
delete m_SystemPipeline;
|
||||||
|
delete m_World;
|
||||||
|
//delete m_EventBroker;
|
||||||
|
}
|
||||||
|
void PickupSpawnTest::DoTouchEvent(EntityID whoDidSomething, EntityID onWhatObject) {
|
||||||
|
Events::TriggerTouch touchEvent;
|
||||||
|
touchEvent.Entity = EntityWrapper(m_World, whoDidSomething);
|
||||||
|
touchEvent.Trigger = EntityWrapper(m_World, onWhatObject);
|
||||||
|
m_EventBroker->Publish(touchEvent);
|
||||||
|
}
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
#ifndef PickupSpawnTest_h__
|
||||||
|
#define PickupSpawnTest_h__
|
||||||
|
|
||||||
|
#include "Core/ResourceManager.h"
|
||||||
|
#include "Core/ConfigFile.h"
|
||||||
|
#include "Core/EventBroker.h"
|
||||||
|
#include "Core/World.h"
|
||||||
|
#include "Input/InputProxy.h"
|
||||||
|
#include "Input/KeyboardInputHandler.h"
|
||||||
|
#include "Input/MouseInputHandler.h"
|
||||||
|
#include "Core/EKeyDown.h"
|
||||||
|
#include "Core/EntityFile.h"
|
||||||
|
#include "Core/SystemPipeline.h"
|
||||||
|
|
||||||
|
#include "Core/EntityFilePreprocessor.h"
|
||||||
|
#include "Core/EntityFileParser.h"
|
||||||
|
#include "Core/EntityFileWriter.h"
|
||||||
|
|
||||||
|
#include "Engine/Collision/ETrigger.h"
|
||||||
|
|
||||||
|
//#include "Core/System.h"
|
||||||
|
//#include "Core/Transform.h"
|
||||||
|
//#include "Core/ResourceManager.h"
|
||||||
|
//#include "Core/EntityFileParser.h"
|
||||||
|
//#include "Core/EPickupSpawned.h"
|
||||||
|
//#include "Core/EPlayerHealthPickup.h"
|
||||||
|
#include "Engine/Collision/ETrigger.h"
|
||||||
|
//#include "Common.h"
|
||||||
|
//#include <tuple>
|
||||||
|
#include "Collision/TriggerSystem.h"
|
||||||
|
#include "Collision/CollisionSystem.h"
|
||||||
|
#include "Core/EntityFileWriter.h"
|
||||||
|
#include "Game/Systems/HealthSystem.h"
|
||||||
|
#include "Game/Systems/PickupSpawnSystem.h"
|
||||||
|
|
||||||
|
#include "Core/ResourceManager.h"
|
||||||
|
|
||||||
|
class PickupSpawnTest
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PickupSpawnTest(int runTestNumber);
|
||||||
|
~PickupSpawnTest();
|
||||||
|
|
||||||
|
void Tick();
|
||||||
|
bool m_TestSucceeded = false;
|
||||||
|
int m_NumLoops = 0;
|
||||||
|
|
||||||
|
bool Game_Loop_OneHundredTimes();
|
||||||
|
|
||||||
|
void TestSetup(int testNumber);
|
||||||
|
void DoTouchEvent(EntityID whoDidSomething, EntityID onWhatObject);
|
||||||
|
|
||||||
|
private:
|
||||||
|
double m_LastTime;
|
||||||
|
ConfigFile* m_Config = nullptr;
|
||||||
|
EventBroker* m_EventBroker;
|
||||||
|
World* m_World;
|
||||||
|
SystemPipeline* m_SystemPipeline;
|
||||||
|
EntityID m_PlayerID, m_HealthPickupID;
|
||||||
|
int m_RunTestNumber;
|
||||||
|
|
||||||
|
EventRelay<PickupSpawnSystem, Events::PlayerHealthPickup> m_HP;
|
||||||
|
bool OnHealthPickup(Events::PlayerHealthPickup& e);
|
||||||
|
EventRelay<PickupSpawnSystem, Events::PickupSpawned> m_PS;
|
||||||
|
bool OnPickupSpawned(Events::PickupSpawned& e);
|
||||||
|
|
||||||
|
bool testStage1Success = false;
|
||||||
|
bool testStage2Success = false;
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
Reference in New Issue
Block a user