CHealthTest.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  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_UnitHealthInfo.h"
  12. #include "../../lib/CStack.h"
  13. using namespace testing;
  14. static const int32_t UNIT_HEALTH = 123;
  15. static const int32_t UNIT_AMOUNT = 300;
  16. class HealthTest : public ::testing::Test
  17. {
  18. public:
  19. UnitHealthInfoMock mock;
  20. HealthTest() : health(&mock)
  21. {}
  22. void setDefaultExpectations()
  23. {
  24. EXPECT_CALL(mock, unitMaxHealth()).WillRepeatedly(Return(UNIT_HEALTH));
  25. EXPECT_CALL(mock, unitBaseAmount()).WillRepeatedly(Return(UNIT_AMOUNT));
  26. }
  27. CHealth health;
  28. };
  29. static void checkTotal(const CHealth & health, const UnitHealthInfoMock & mock)
  30. {
  31. EXPECT_EQ(health.total(), mock.unitMaxHealth() * mock.unitBaseAmount());
  32. }
  33. static void checkEmptyHealth(const CHealth & health, const UnitHealthInfoMock & mock)
  34. {
  35. checkTotal(health, mock);
  36. EXPECT_EQ(health.getCount(), 0);
  37. EXPECT_EQ(health.getFirstHPleft(), 0);
  38. EXPECT_EQ(health.getResurrected(), 0);
  39. EXPECT_EQ(health.available(), 0);
  40. }
  41. static void checkFullHealth(const CHealth & health, const UnitHealthInfoMock & mock)
  42. {
  43. checkTotal(health, mock);
  44. EXPECT_EQ(health.getCount(), mock.unitBaseAmount());
  45. EXPECT_EQ(health.getFirstHPleft(), mock.unitMaxHealth());
  46. EXPECT_EQ(health.getResurrected(), 0);
  47. EXPECT_EQ(health.available(), mock.unitMaxHealth() * mock.unitBaseAmount());
  48. }
  49. static void checkDamage(CHealth & health, const int32_t initialDamage, const int32_t expectedDamage)
  50. {
  51. int32_t damage = initialDamage;
  52. health.damage(damage);
  53. EXPECT_EQ(damage, expectedDamage);
  54. }
  55. static void checkNormalDamage(CHealth & health, const int32_t initialDamage)
  56. {
  57. checkDamage(health, initialDamage, initialDamage);
  58. }
  59. static void checkNoDamage(CHealth & health, const int32_t initialDamage)
  60. {
  61. checkDamage(health, initialDamage, 0);
  62. }
  63. static void checkHeal(CHealth & health, EHealLevel level, EHealPower power, const int32_t initialHeal, const int32_t expectedHeal)
  64. {
  65. int32_t heal = initialHeal;
  66. health.heal(heal, level, power);
  67. EXPECT_EQ(heal, expectedHeal);
  68. }
  69. TEST_F(HealthTest, empty)
  70. {
  71. setDefaultExpectations();
  72. checkEmptyHealth(health, mock);
  73. health.init();
  74. checkFullHealth(health, mock);
  75. health.reset();
  76. checkEmptyHealth(health, mock);
  77. }
  78. TEST_F(HealthTest, damage)
  79. {
  80. setDefaultExpectations();
  81. health.init();
  82. checkNormalDamage(health, 0);
  83. checkFullHealth(health, mock);
  84. checkNormalDamage(health, mock.unitMaxHealth() - 1);
  85. EXPECT_EQ(health.getCount(), UNIT_AMOUNT);
  86. EXPECT_EQ(health.getFirstHPleft(), 1);
  87. EXPECT_EQ(health.getResurrected(), 0);
  88. checkNormalDamage(health, 1);
  89. EXPECT_EQ(health.getCount(), UNIT_AMOUNT - 1);
  90. EXPECT_EQ(health.getFirstHPleft(), UNIT_HEALTH);
  91. EXPECT_EQ(health.getResurrected(), 0);
  92. checkNormalDamage(health, UNIT_HEALTH * (UNIT_AMOUNT - 1));
  93. checkEmptyHealth(health, mock);
  94. checkNoDamage(health, 1337);
  95. checkEmptyHealth(health, mock);
  96. }
  97. TEST_F(HealthTest, heal)
  98. {
  99. setDefaultExpectations();
  100. health.init();
  101. checkNormalDamage(health, 99);
  102. EXPECT_EQ(health.getCount(), UNIT_AMOUNT);
  103. EXPECT_EQ(health.getFirstHPleft(), UNIT_HEALTH-99);
  104. EXPECT_EQ(health.getResurrected(), 0);
  105. checkHeal(health, EHealLevel::HEAL, EHealPower::PERMANENT, 9, 9);
  106. EXPECT_EQ(health.getCount(), UNIT_AMOUNT);
  107. EXPECT_EQ(health.getFirstHPleft(), UNIT_HEALTH-90);
  108. EXPECT_EQ(health.getResurrected(), 0);
  109. checkHeal(health, EHealLevel::RESURRECT, EHealPower::ONE_BATTLE, 40, 40);
  110. EXPECT_EQ(health.getCount(), UNIT_AMOUNT);
  111. EXPECT_EQ(health.getFirstHPleft(), UNIT_HEALTH-50);
  112. EXPECT_EQ(health.getResurrected(), 0);
  113. checkHeal(health, EHealLevel::OVERHEAL, EHealPower::PERMANENT, 50, 50);
  114. checkFullHealth(health, mock);
  115. }
  116. TEST_F(HealthTest, resurrectOneBattle)
  117. {
  118. setDefaultExpectations();
  119. health.init();
  120. checkNormalDamage(health, UNIT_HEALTH);
  121. EXPECT_EQ(health.getCount(), UNIT_AMOUNT - 1);
  122. EXPECT_EQ(health.getFirstHPleft(), UNIT_HEALTH);
  123. EXPECT_EQ(health.getResurrected(), 0);
  124. checkHeal(health, EHealLevel::RESURRECT, EHealPower::ONE_BATTLE, UNIT_HEALTH, UNIT_HEALTH);
  125. EXPECT_EQ(health.getCount(), UNIT_AMOUNT);
  126. EXPECT_EQ(health.getFirstHPleft(), UNIT_HEALTH);
  127. EXPECT_EQ(health.getResurrected(), 1);
  128. checkNormalDamage(health, UNIT_HEALTH);
  129. EXPECT_EQ(health.getCount(), UNIT_AMOUNT - 1);
  130. EXPECT_EQ(health.getFirstHPleft(), UNIT_HEALTH);
  131. EXPECT_EQ(health.getResurrected(), 0);
  132. health.init();
  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.takeResurrected();
  138. EXPECT_EQ(health.getCount(), UNIT_AMOUNT - 1);
  139. EXPECT_EQ(health.getFirstHPleft(), UNIT_HEALTH);
  140. EXPECT_EQ(health.getResurrected(), 0);
  141. health.init();
  142. checkNormalDamage(health, UNIT_HEALTH * UNIT_AMOUNT);
  143. checkEmptyHealth(health, mock);
  144. checkHeal(health, EHealLevel::RESURRECT, EHealPower::ONE_BATTLE, UNIT_HEALTH * UNIT_AMOUNT, UNIT_HEALTH * UNIT_AMOUNT);
  145. EXPECT_EQ(health.getCount(), UNIT_AMOUNT);
  146. EXPECT_EQ(health.getFirstHPleft(), UNIT_HEALTH);
  147. EXPECT_EQ(health.getResurrected(), UNIT_AMOUNT);
  148. health.takeResurrected();
  149. checkEmptyHealth(health, mock);
  150. }
  151. TEST_F(HealthTest, resurrectPermanent)
  152. {
  153. setDefaultExpectations();
  154. health.init();
  155. checkNormalDamage(health, UNIT_HEALTH);
  156. EXPECT_EQ(health.getCount(), UNIT_AMOUNT - 1);
  157. EXPECT_EQ(health.getFirstHPleft(), UNIT_HEALTH);
  158. EXPECT_EQ(health.getResurrected(), 0);
  159. checkHeal(health, EHealLevel::RESURRECT, EHealPower::PERMANENT, UNIT_HEALTH, UNIT_HEALTH);
  160. EXPECT_EQ(health.getCount(), UNIT_AMOUNT);
  161. EXPECT_EQ(health.getFirstHPleft(), UNIT_HEALTH);
  162. EXPECT_EQ(health.getResurrected(), 0);
  163. checkNormalDamage(health, UNIT_HEALTH);
  164. EXPECT_EQ(health.getCount(), UNIT_AMOUNT - 1);
  165. EXPECT_EQ(health.getFirstHPleft(), UNIT_HEALTH);
  166. EXPECT_EQ(health.getResurrected(), 0);
  167. health.init();
  168. checkNormalDamage(health, UNIT_HEALTH * UNIT_AMOUNT);
  169. checkEmptyHealth(health, mock);
  170. checkHeal(health, EHealLevel::RESURRECT, EHealPower::PERMANENT, UNIT_HEALTH * UNIT_AMOUNT, UNIT_HEALTH * UNIT_AMOUNT);
  171. checkFullHealth(health, mock);
  172. health.takeResurrected();
  173. checkFullHealth(health, mock);
  174. }
  175. TEST_F(HealthTest, singleUnitStack)
  176. {
  177. //related to issue 2612
  178. //one Titan
  179. EXPECT_CALL(mock, unitMaxHealth()).WillRepeatedly(Return(300));
  180. EXPECT_CALL(mock, unitBaseAmount()).WillRepeatedly(Return(1));
  181. health.init();
  182. checkDamage(health, 1000, 300);
  183. checkEmptyHealth(health, mock);
  184. checkHeal(health, EHealLevel::RESURRECT, EHealPower::PERMANENT, 300, 300);
  185. checkFullHealth(health, mock);
  186. }