CHealthTest.cpp 6.9 KB

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