CHealthTest.cpp 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. /*
  2. * CHealthTest.cpp, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "StdInc.h"
  11. #include "mock/mock_battle_Unit.h"
  12. #include "mock/mock_BonusBearer.h"
  13. #include "../../lib/battle/CUnitState.h"
  14. using namespace testing;
  15. using namespace battle;
  16. static const int32_t UNIT_HEALTH = 123;
  17. static const int32_t UNIT_AMOUNT = 300;
  18. class HealthTest : public Test
  19. {
  20. public:
  21. UnitMock mock;
  22. BonusBearerMock bonusMock;
  23. HealthTest() : health(&mock)
  24. {}
  25. void setDefaultExpectations()
  26. {
  27. EXPECT_CALL(mock, getAllBonuses(_, _)).WillRepeatedly(Invoke(&bonusMock, &BonusBearerMock::getAllBonuses));
  28. EXPECT_CALL(mock, getTreeVersion()).WillRepeatedly(Return(1));
  29. bonusMock.addNewBonus(std::make_shared<Bonus>(BonusDuration::PERMANENT, BonusType::STACK_HEALTH, BonusSource::CREATURE_ABILITY, UNIT_HEALTH, BonusSourceID()));
  30. EXPECT_CALL(mock, unitBaseAmount()).WillRepeatedly(Return(UNIT_AMOUNT));
  31. }
  32. CHealth health;
  33. };
  34. static void checkTotal(const CHealth & health, const UnitMock & mock)
  35. {
  36. EXPECT_EQ(health.total(), mock.getMaxHealth() * mock.unitBaseAmount());
  37. }
  38. static void checkEmptyHealth(const CHealth & health, const UnitMock & mock)
  39. {
  40. checkTotal(health, mock);
  41. EXPECT_EQ(health.getCount(), 0);
  42. EXPECT_EQ(health.getFirstHPleft(), 0);
  43. EXPECT_EQ(health.getResurrected(), 0);
  44. EXPECT_EQ(health.available(), 0);
  45. }
  46. static void checkFullHealth(const CHealth & health, const UnitMock & mock)
  47. {
  48. checkTotal(health, mock);
  49. EXPECT_EQ(health.getCount(), mock.unitBaseAmount());
  50. EXPECT_EQ(health.getFirstHPleft(), mock.getMaxHealth());
  51. EXPECT_EQ(health.getResurrected(), 0);
  52. EXPECT_EQ(health.available(), mock.getMaxHealth() * mock.unitBaseAmount());
  53. }
  54. static void checkDamage(CHealth & health, const int64_t initialDamage, const int64_t expectedDamage)
  55. {
  56. int64_t damage = initialDamage;
  57. health.damage(damage);
  58. EXPECT_EQ(damage, expectedDamage);
  59. }
  60. static void checkNormalDamage(CHealth & health, const int64_t initialDamage)
  61. {
  62. checkDamage(health, initialDamage, initialDamage);
  63. }
  64. static void checkNoDamage(CHealth & health, const int64_t initialDamage)
  65. {
  66. checkDamage(health, initialDamage, 0);
  67. }
  68. static void checkHeal(CHealth & health, EHealLevel level, EHealPower power, const int64_t initialHeal, const int64_t expectedHeal)
  69. {
  70. int64_t heal = initialHeal;
  71. health.heal(heal, level, power);
  72. EXPECT_EQ(heal, expectedHeal);
  73. }
  74. TEST_F(HealthTest, empty)
  75. {
  76. setDefaultExpectations();
  77. checkEmptyHealth(health, mock);
  78. health.init();
  79. checkFullHealth(health, mock);
  80. health.reset();
  81. checkEmptyHealth(health, mock);
  82. }
  83. TEST_F(HealthTest, damage)
  84. {
  85. setDefaultExpectations();
  86. health.init();
  87. checkNormalDamage(health, 0);
  88. checkFullHealth(health, mock);
  89. checkNormalDamage(health, mock.getMaxHealth() - 1);
  90. EXPECT_EQ(health.getCount(), UNIT_AMOUNT);
  91. EXPECT_EQ(health.getFirstHPleft(), 1);
  92. EXPECT_EQ(health.getResurrected(), 0);
  93. checkNormalDamage(health, 1);
  94. EXPECT_EQ(health.getCount(), UNIT_AMOUNT - 1);
  95. EXPECT_EQ(health.getFirstHPleft(), UNIT_HEALTH);
  96. EXPECT_EQ(health.getResurrected(), 0);
  97. checkNormalDamage(health, UNIT_HEALTH * (UNIT_AMOUNT - 1));
  98. checkEmptyHealth(health, mock);
  99. checkNoDamage(health, 1337);
  100. checkEmptyHealth(health, mock);
  101. }
  102. TEST_F(HealthTest, heal)
  103. {
  104. setDefaultExpectations();
  105. health.init();
  106. checkNormalDamage(health, 99);
  107. EXPECT_EQ(health.getCount(), UNIT_AMOUNT);
  108. EXPECT_EQ(health.getFirstHPleft(), UNIT_HEALTH-99);
  109. EXPECT_EQ(health.getResurrected(), 0);
  110. checkHeal(health, EHealLevel::HEAL, EHealPower::PERMANENT, 9, 9);
  111. EXPECT_EQ(health.getCount(), UNIT_AMOUNT);
  112. EXPECT_EQ(health.getFirstHPleft(), UNIT_HEALTH-90);
  113. EXPECT_EQ(health.getResurrected(), 0);
  114. checkHeal(health, EHealLevel::RESURRECT, EHealPower::ONE_BATTLE, 40, 40);
  115. EXPECT_EQ(health.getCount(), UNIT_AMOUNT);
  116. EXPECT_EQ(health.getFirstHPleft(), UNIT_HEALTH-50);
  117. EXPECT_EQ(health.getResurrected(), 0);
  118. checkHeal(health, EHealLevel::OVERHEAL, EHealPower::PERMANENT, 50, 50);
  119. checkFullHealth(health, mock);
  120. }
  121. TEST_F(HealthTest, resurrectOneBattle)
  122. {
  123. setDefaultExpectations();
  124. health.init();
  125. checkNormalDamage(health, UNIT_HEALTH);
  126. EXPECT_EQ(health.getCount(), UNIT_AMOUNT - 1);
  127. EXPECT_EQ(health.getFirstHPleft(), UNIT_HEALTH);
  128. EXPECT_EQ(health.getResurrected(), 0);
  129. checkHeal(health, EHealLevel::RESURRECT, EHealPower::ONE_BATTLE, UNIT_HEALTH, UNIT_HEALTH);
  130. EXPECT_EQ(health.getCount(), UNIT_AMOUNT);
  131. EXPECT_EQ(health.getFirstHPleft(), UNIT_HEALTH);
  132. EXPECT_EQ(health.getResurrected(), 1);
  133. checkNormalDamage(health, UNIT_HEALTH);
  134. EXPECT_EQ(health.getCount(), UNIT_AMOUNT - 1);
  135. EXPECT_EQ(health.getFirstHPleft(), UNIT_HEALTH);
  136. EXPECT_EQ(health.getResurrected(), 0);
  137. health.init();
  138. checkNormalDamage(health, UNIT_HEALTH);
  139. EXPECT_EQ(health.getCount(), UNIT_AMOUNT - 1);
  140. EXPECT_EQ(health.getFirstHPleft(), UNIT_HEALTH);
  141. EXPECT_EQ(health.getResurrected(), 0);
  142. health.takeResurrected();
  143. EXPECT_EQ(health.getCount(), UNIT_AMOUNT - 1);
  144. EXPECT_EQ(health.getFirstHPleft(), UNIT_HEALTH);
  145. EXPECT_EQ(health.getResurrected(), 0);
  146. health.init();
  147. checkNormalDamage(health, UNIT_HEALTH * UNIT_AMOUNT);
  148. checkEmptyHealth(health, mock);
  149. checkHeal(health, EHealLevel::RESURRECT, EHealPower::ONE_BATTLE, UNIT_HEALTH * UNIT_AMOUNT, UNIT_HEALTH * UNIT_AMOUNT);
  150. EXPECT_EQ(health.getCount(), UNIT_AMOUNT);
  151. EXPECT_EQ(health.getFirstHPleft(), UNIT_HEALTH);
  152. EXPECT_EQ(health.getResurrected(), UNIT_AMOUNT);
  153. health.takeResurrected();
  154. checkEmptyHealth(health, mock);
  155. }
  156. TEST_F(HealthTest, resurrectPermanent)
  157. {
  158. setDefaultExpectations();
  159. health.init();
  160. checkNormalDamage(health, UNIT_HEALTH);
  161. EXPECT_EQ(health.getCount(), UNIT_AMOUNT - 1);
  162. EXPECT_EQ(health.getFirstHPleft(), UNIT_HEALTH);
  163. EXPECT_EQ(health.getResurrected(), 0);
  164. checkHeal(health, EHealLevel::RESURRECT, EHealPower::PERMANENT, UNIT_HEALTH, UNIT_HEALTH);
  165. EXPECT_EQ(health.getCount(), UNIT_AMOUNT);
  166. EXPECT_EQ(health.getFirstHPleft(), UNIT_HEALTH);
  167. EXPECT_EQ(health.getResurrected(), 0);
  168. checkNormalDamage(health, UNIT_HEALTH);
  169. EXPECT_EQ(health.getCount(), UNIT_AMOUNT - 1);
  170. EXPECT_EQ(health.getFirstHPleft(), UNIT_HEALTH);
  171. EXPECT_EQ(health.getResurrected(), 0);
  172. health.init();
  173. checkNormalDamage(health, UNIT_HEALTH * UNIT_AMOUNT);
  174. checkEmptyHealth(health, mock);
  175. checkHeal(health, EHealLevel::RESURRECT, EHealPower::PERMANENT, UNIT_HEALTH * UNIT_AMOUNT, UNIT_HEALTH * UNIT_AMOUNT);
  176. checkFullHealth(health, mock);
  177. health.takeResurrected();
  178. checkFullHealth(health, mock);
  179. }
  180. TEST_F(HealthTest, singleUnitStack)
  181. {
  182. //related to issue 2612
  183. //one Titan
  184. EXPECT_CALL(mock, getAllBonuses(_, _)).WillRepeatedly(Invoke(&bonusMock, &BonusBearerMock::getAllBonuses));
  185. EXPECT_CALL(mock, getTreeVersion()).WillRepeatedly(Return(1));
  186. bonusMock.addNewBonus(std::make_shared<Bonus>(BonusDuration::PERMANENT, BonusType::STACK_HEALTH, BonusSource::CREATURE_ABILITY, 300, BonusSourceID()));
  187. EXPECT_CALL(mock, unitBaseAmount()).WillRepeatedly(Return(1));
  188. health.init();
  189. checkDamage(health, 1000, 300);
  190. checkEmptyHealth(health, mock);
  191. checkHeal(health, EHealLevel::RESURRECT, EHealPower::PERMANENT, 300, 300);
  192. checkFullHealth(health, mock);
  193. }