stamina_system_test.cpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. #include "core/component.h"
  2. #include "core/entity.h"
  3. #include "core/world.h"
  4. #include "systems/stamina_system.h"
  5. #include "units/spawn_type.h"
  6. #include <gtest/gtest.h>
  7. using namespace Engine::Core;
  8. using namespace Game::Systems;
  9. class StaminaSystemTest : public ::testing::Test {
  10. protected:
  11. void SetUp() override { world = std::make_unique<World>(); }
  12. void TearDown() override { world.reset(); }
  13. std::unique_ptr<World> world;
  14. StaminaSystem stamina_system;
  15. };
  16. TEST_F(StaminaSystemTest, StaminaDepletesWhileRunning) {
  17. auto *unit = world->create_entity();
  18. unit->add_component<TransformComponent>(0.0F, 0.0F, 0.0F);
  19. auto *unit_comp = unit->add_component<UnitComponent>(100, 100, 1.0F, 12.0F);
  20. unit_comp->owner_id = 1;
  21. unit_comp->spawn_type = Game::Units::SpawnType::Archer;
  22. auto *movement = unit->add_component<MovementComponent>();
  23. movement->vx = 1.0F;
  24. movement->vz = 1.0F;
  25. auto *stamina = unit->add_component<StaminaComponent>();
  26. stamina->stamina = 100.0F;
  27. stamina->max_stamina = 100.0F;
  28. stamina->depletion_rate = 20.0F;
  29. stamina->run_requested = true;
  30. stamina_system.update(world.get(), 1.0F);
  31. EXPECT_TRUE(stamina->is_running);
  32. EXPECT_FLOAT_EQ(stamina->stamina, 80.0F);
  33. }
  34. TEST_F(StaminaSystemTest, StaminaRegeneratesWhenNotRunning) {
  35. auto *unit = world->create_entity();
  36. unit->add_component<TransformComponent>(0.0F, 0.0F, 0.0F);
  37. auto *unit_comp = unit->add_component<UnitComponent>(100, 100, 1.0F, 12.0F);
  38. unit_comp->owner_id = 1;
  39. unit_comp->spawn_type = Game::Units::SpawnType::Archer;
  40. auto *movement = unit->add_component<MovementComponent>();
  41. movement->vx = 0.0F;
  42. movement->vz = 0.0F;
  43. auto *stamina = unit->add_component<StaminaComponent>();
  44. stamina->stamina = 50.0F;
  45. stamina->max_stamina = 100.0F;
  46. stamina->regen_rate = 10.0F;
  47. stamina->run_requested = false;
  48. stamina_system.update(world.get(), 1.0F);
  49. EXPECT_FALSE(stamina->is_running);
  50. EXPECT_FLOAT_EQ(stamina->stamina, 60.0F);
  51. }
  52. TEST_F(StaminaSystemTest, StaminaDoesNotExceedMax) {
  53. auto *unit = world->create_entity();
  54. unit->add_component<TransformComponent>(0.0F, 0.0F, 0.0F);
  55. auto *unit_comp = unit->add_component<UnitComponent>(100, 100, 1.0F, 12.0F);
  56. unit_comp->owner_id = 1;
  57. unit_comp->spawn_type = Game::Units::SpawnType::Archer;
  58. auto *movement = unit->add_component<MovementComponent>();
  59. movement->vx = 0.0F;
  60. movement->vz = 0.0F;
  61. auto *stamina = unit->add_component<StaminaComponent>();
  62. stamina->stamina = 95.0F;
  63. stamina->max_stamina = 100.0F;
  64. stamina->regen_rate = 20.0F;
  65. stamina->run_requested = false;
  66. stamina_system.update(world.get(), 1.0F);
  67. EXPECT_FLOAT_EQ(stamina->stamina, 100.0F);
  68. }
  69. TEST_F(StaminaSystemTest, RunningStopsWhenStaminaDepleted) {
  70. auto *unit = world->create_entity();
  71. unit->add_component<TransformComponent>(0.0F, 0.0F, 0.0F);
  72. auto *unit_comp = unit->add_component<UnitComponent>(100, 100, 1.0F, 12.0F);
  73. unit_comp->owner_id = 1;
  74. unit_comp->spawn_type = Game::Units::SpawnType::Archer;
  75. auto *movement = unit->add_component<MovementComponent>();
  76. movement->vx = 1.0F;
  77. movement->vz = 1.0F;
  78. auto *stamina = unit->add_component<StaminaComponent>();
  79. stamina->stamina = 5.0F;
  80. stamina->max_stamina = 100.0F;
  81. stamina->depletion_rate = 20.0F;
  82. stamina->run_requested = true;
  83. stamina->is_running = true;
  84. stamina_system.update(world.get(), 1.0F);
  85. EXPECT_FALSE(stamina->is_running);
  86. EXPECT_FLOAT_EQ(stamina->stamina, 0.0F);
  87. }
  88. TEST_F(StaminaSystemTest, CatapultsCannotRun) {
  89. auto *unit = world->create_entity();
  90. unit->add_component<TransformComponent>(0.0F, 0.0F, 0.0F);
  91. auto *unit_comp = unit->add_component<UnitComponent>(100, 100, 1.0F, 12.0F);
  92. unit_comp->owner_id = 1;
  93. unit_comp->spawn_type = Game::Units::SpawnType::Catapult;
  94. auto *movement = unit->add_component<MovementComponent>();
  95. movement->vx = 1.0F;
  96. movement->vz = 1.0F;
  97. auto *stamina = unit->add_component<StaminaComponent>();
  98. stamina->stamina = 100.0F;
  99. stamina->max_stamina = 100.0F;
  100. stamina->run_requested = true;
  101. stamina_system.update(world.get(), 1.0F);
  102. EXPECT_FALSE(stamina->is_running);
  103. EXPECT_FALSE(stamina->run_requested);
  104. }
  105. TEST_F(StaminaSystemTest, BallistasCannotRun) {
  106. auto *unit = world->create_entity();
  107. unit->add_component<TransformComponent>(0.0F, 0.0F, 0.0F);
  108. auto *unit_comp = unit->add_component<UnitComponent>(100, 100, 1.0F, 12.0F);
  109. unit_comp->owner_id = 1;
  110. unit_comp->spawn_type = Game::Units::SpawnType::Ballista;
  111. auto *movement = unit->add_component<MovementComponent>();
  112. movement->vx = 1.0F;
  113. movement->vz = 1.0F;
  114. auto *stamina = unit->add_component<StaminaComponent>();
  115. stamina->stamina = 100.0F;
  116. stamina->max_stamina = 100.0F;
  117. stamina->run_requested = true;
  118. stamina_system.update(world.get(), 1.0F);
  119. EXPECT_FALSE(stamina->is_running);
  120. EXPECT_FALSE(stamina->run_requested);
  121. }
  122. TEST_F(StaminaSystemTest, InfantryCanRun) {
  123. auto *unit = world->create_entity();
  124. unit->add_component<TransformComponent>(0.0F, 0.0F, 0.0F);
  125. auto *unit_comp = unit->add_component<UnitComponent>(100, 100, 1.0F, 12.0F);
  126. unit_comp->owner_id = 1;
  127. unit_comp->spawn_type = Game::Units::SpawnType::Knight;
  128. auto *movement = unit->add_component<MovementComponent>();
  129. movement->vx = 1.0F;
  130. movement->vz = 1.0F;
  131. auto *stamina = unit->add_component<StaminaComponent>();
  132. stamina->stamina = 100.0F;
  133. stamina->max_stamina = 100.0F;
  134. stamina->run_requested = true;
  135. stamina_system.update(world.get(), 1.0F);
  136. EXPECT_TRUE(stamina->is_running);
  137. }
  138. TEST_F(StaminaSystemTest, CavalryCanRun) {
  139. auto *unit = world->create_entity();
  140. unit->add_component<TransformComponent>(0.0F, 0.0F, 0.0F);
  141. auto *unit_comp = unit->add_component<UnitComponent>(100, 100, 1.0F, 12.0F);
  142. unit_comp->owner_id = 1;
  143. unit_comp->spawn_type = Game::Units::SpawnType::MountedKnight;
  144. auto *movement = unit->add_component<MovementComponent>();
  145. movement->vx = 1.0F;
  146. movement->vz = 1.0F;
  147. auto *stamina = unit->add_component<StaminaComponent>();
  148. stamina->stamina = 100.0F;
  149. stamina->max_stamina = 100.0F;
  150. stamina->run_requested = true;
  151. stamina_system.update(world.get(), 1.0F);
  152. EXPECT_TRUE(stamina->is_running);
  153. }
  154. TEST_F(StaminaSystemTest, NoRunningWhenStationary) {
  155. auto *unit = world->create_entity();
  156. unit->add_component<TransformComponent>(0.0F, 0.0F, 0.0F);
  157. auto *unit_comp = unit->add_component<UnitComponent>(100, 100, 1.0F, 12.0F);
  158. unit_comp->owner_id = 1;
  159. unit_comp->spawn_type = Game::Units::SpawnType::Archer;
  160. auto *movement = unit->add_component<MovementComponent>();
  161. movement->vx = 0.0F;
  162. movement->vz = 0.0F;
  163. auto *stamina = unit->add_component<StaminaComponent>();
  164. stamina->stamina = 100.0F;
  165. stamina->max_stamina = 100.0F;
  166. stamina->run_requested = true;
  167. stamina_system.update(world.get(), 1.0F);
  168. EXPECT_FALSE(stamina->is_running);
  169. EXPECT_FLOAT_EQ(stamina->stamina, 100.0F);
  170. }