2
0

CUnitStateTest.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. /*
  2. * CUnitStateTest.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_BonusBearer.h"
  12. #include "mock/mock_UnitInfo.h"
  13. #include "mock/mock_UnitEnvironment.h"
  14. #include "../../lib/battle/CUnitState.h"
  15. #include "../../lib/CCreatureHandler.h"
  16. static const int32_t DEFAULT_HP = 123;
  17. static const int32_t DEFAULT_AMOUNT = 100;
  18. static const int32_t DEFAULT_SPEED = 10;
  19. static const BattleHex DEFAULT_POSITION = BattleHex(5, 5);
  20. static const int DEFAULT_ATTACK = 58;
  21. static const int DEFAULT_DEFENCE = 63;
  22. class UnitStateTest : public testing::Test
  23. {
  24. public:
  25. UnitInfoMock infoMock;
  26. UnitEnvironmentMock envMock;
  27. BonusBearerMock bonusMock;
  28. const CCreature * pikeman;
  29. battle::CUnitStateDetached subject;
  30. bool hasAmmoCart;
  31. UnitStateTest()
  32. :infoMock(),
  33. envMock(),
  34. bonusMock(),
  35. subject(&infoMock, &bonusMock),
  36. hasAmmoCart(false)
  37. {
  38. pikeman = CreatureID(0).toCreature();
  39. }
  40. void setDefaultExpectations()
  41. {
  42. using namespace testing;
  43. bonusMock.addNewBonus(std::make_shared<Bonus>(Bonus::PERMANENT, Bonus::STACKS_SPEED, Bonus::CREATURE_ABILITY, DEFAULT_SPEED, 0));
  44. bonusMock.addNewBonus(std::make_shared<Bonus>(Bonus::PERMANENT, Bonus::PRIMARY_SKILL, Bonus::CREATURE_ABILITY, DEFAULT_ATTACK, 0, PrimarySkill::ATTACK));
  45. bonusMock.addNewBonus(std::make_shared<Bonus>(Bonus::PERMANENT, Bonus::PRIMARY_SKILL, Bonus::CREATURE_ABILITY, DEFAULT_DEFENCE, 0, PrimarySkill::DEFENSE));
  46. bonusMock.addNewBonus(std::make_shared<Bonus>(Bonus::PERMANENT, Bonus::STACK_HEALTH, Bonus::CREATURE_ABILITY, DEFAULT_HP, 0));
  47. EXPECT_CALL(infoMock, unitBaseAmount()).WillRepeatedly(Return(DEFAULT_AMOUNT));
  48. EXPECT_CALL(infoMock, unitType()).WillRepeatedly(Return(pikeman));
  49. EXPECT_CALL(envMock, unitHasAmmoCart(_)).WillRepeatedly(Return(hasAmmoCart));
  50. }
  51. void makeShooter(int32_t ammo)
  52. {
  53. bonusMock.addNewBonus(std::make_shared<Bonus>(Bonus::PERMANENT, Bonus::SHOOTER, Bonus::CREATURE_ABILITY, 1, 0));
  54. bonusMock.addNewBonus(std::make_shared<Bonus>(Bonus::PERMANENT, Bonus::SHOTS, Bonus::CREATURE_ABILITY, ammo, 0));
  55. }
  56. void initUnit()
  57. {
  58. subject.localInit(&envMock);
  59. subject.position = DEFAULT_POSITION;
  60. }
  61. };
  62. TEST_F(UnitStateTest, initialRegular)
  63. {
  64. setDefaultExpectations();
  65. initUnit();
  66. EXPECT_TRUE(subject.alive());
  67. EXPECT_TRUE(subject.ableToRetaliate());
  68. EXPECT_FALSE(subject.isGhost());
  69. EXPECT_FALSE(subject.isDead());
  70. EXPECT_FALSE(subject.isTurret());
  71. EXPECT_TRUE(subject.isValidTarget(true));
  72. EXPECT_TRUE(subject.isValidTarget(false));
  73. EXPECT_FALSE(subject.isClone());
  74. EXPECT_FALSE(subject.hasClone());
  75. EXPECT_FALSE(subject.canCast());
  76. EXPECT_FALSE(subject.isCaster());
  77. EXPECT_FALSE(subject.canShoot());
  78. EXPECT_FALSE(subject.isShooter());
  79. EXPECT_EQ(subject.getCount(), DEFAULT_AMOUNT);
  80. EXPECT_EQ(subject.getFirstHPleft(), DEFAULT_HP);
  81. EXPECT_EQ(subject.getKilled(), 0);
  82. EXPECT_EQ(subject.getAvailableHealth(), DEFAULT_HP * DEFAULT_AMOUNT);
  83. EXPECT_EQ(subject.getTotalHealth(), subject.getAvailableHealth());
  84. EXPECT_EQ(subject.getPosition(), DEFAULT_POSITION);
  85. EXPECT_EQ(subject.getInitiative(), DEFAULT_SPEED);
  86. EXPECT_EQ(subject.getInitiative(123456), DEFAULT_SPEED);
  87. EXPECT_TRUE(subject.canMove());
  88. EXPECT_TRUE(subject.canMove(123456));
  89. EXPECT_FALSE(subject.defended());
  90. EXPECT_FALSE(subject.defended(123456));
  91. EXPECT_FALSE(subject.moved());
  92. EXPECT_FALSE(subject.moved(123456));
  93. EXPECT_TRUE(subject.willMove());
  94. EXPECT_TRUE(subject.willMove(123456));
  95. EXPECT_FALSE(subject.waited());
  96. EXPECT_FALSE(subject.waited(123456));
  97. EXPECT_EQ(subject.getTotalAttacks(true), 1);
  98. EXPECT_EQ(subject.getTotalAttacks(false), 1);
  99. }
  100. TEST_F(UnitStateTest, canShoot)
  101. {
  102. setDefaultExpectations();
  103. makeShooter(1);
  104. initUnit();
  105. EXPECT_FALSE(subject.canCast());
  106. EXPECT_FALSE(subject.isCaster());
  107. EXPECT_TRUE(subject.canShoot());
  108. EXPECT_TRUE(subject.isShooter());
  109. subject.afterAttack(true, false);
  110. EXPECT_FALSE(subject.canShoot());
  111. EXPECT_TRUE(subject.isShooter());
  112. }
  113. TEST_F(UnitStateTest, canShootWithAmmoCart)
  114. {
  115. hasAmmoCart = true;
  116. setDefaultExpectations();
  117. makeShooter(1);
  118. initUnit();
  119. EXPECT_FALSE(subject.canCast());
  120. EXPECT_FALSE(subject.isCaster());
  121. EXPECT_TRUE(subject.canShoot());
  122. EXPECT_TRUE(subject.isShooter());
  123. subject.afterAttack(true, false);
  124. EXPECT_TRUE(subject.canShoot());
  125. EXPECT_TRUE(subject.isShooter());
  126. }
  127. TEST_F(UnitStateTest, getAttack)
  128. {
  129. setDefaultExpectations();
  130. EXPECT_EQ(subject.getAttack(false), DEFAULT_ATTACK);
  131. EXPECT_EQ(subject.getAttack(true), DEFAULT_ATTACK);
  132. }
  133. TEST_F(UnitStateTest, getDefence)
  134. {
  135. setDefaultExpectations();
  136. EXPECT_EQ(subject.getDefence(false), DEFAULT_DEFENCE);
  137. EXPECT_EQ(subject.getDefence(true), DEFAULT_DEFENCE);
  138. }
  139. TEST_F(UnitStateTest, attackWithFrenzy)
  140. {
  141. setDefaultExpectations();
  142. bonusMock.addNewBonus(std::make_shared<Bonus>(Bonus::PERMANENT, Bonus::IN_FRENZY, Bonus::SPELL_EFFECT, 50, 0));
  143. int expectedAttack = static_cast<int>(DEFAULT_ATTACK + 0.5 * DEFAULT_DEFENCE);
  144. EXPECT_EQ(subject.getAttack(false), expectedAttack);
  145. EXPECT_EQ(subject.getAttack(true), expectedAttack);
  146. }
  147. TEST_F(UnitStateTest, defenceWithFrenzy)
  148. {
  149. setDefaultExpectations();
  150. bonusMock.addNewBonus(std::make_shared<Bonus>(Bonus::PERMANENT, Bonus::IN_FRENZY, Bonus::SPELL_EFFECT, 50, 0));
  151. int expectedDefence = 0;
  152. EXPECT_EQ(subject.getDefence(false), expectedDefence);
  153. EXPECT_EQ(subject.getDefence(true), expectedDefence);
  154. }
  155. TEST_F(UnitStateTest, additionalAttack)
  156. {
  157. setDefaultExpectations();
  158. {
  159. auto bonus = std::make_shared<Bonus>(Bonus::PERMANENT, Bonus::ADDITIONAL_ATTACK, Bonus::SPELL_EFFECT, 41, 0);
  160. bonusMock.addNewBonus(bonus);
  161. }
  162. EXPECT_EQ(subject.getTotalAttacks(false), 42);
  163. EXPECT_EQ(subject.getTotalAttacks(true), 42);
  164. }
  165. TEST_F(UnitStateTest, additionalMeleeAttack)
  166. {
  167. setDefaultExpectations();
  168. {
  169. auto bonus = std::make_shared<Bonus>(Bonus::PERMANENT, Bonus::ADDITIONAL_ATTACK, Bonus::SPELL_EFFECT, 41, 0);
  170. bonus->effectRange = Bonus::ONLY_MELEE_FIGHT;
  171. bonusMock.addNewBonus(bonus);
  172. }
  173. EXPECT_EQ(subject.getTotalAttacks(false), 42);
  174. EXPECT_EQ(subject.getTotalAttacks(true), 1);
  175. }
  176. TEST_F(UnitStateTest, additionalRangedAttack)
  177. {
  178. setDefaultExpectations();
  179. {
  180. auto bonus = std::make_shared<Bonus>(Bonus::PERMANENT, Bonus::ADDITIONAL_ATTACK, Bonus::SPELL_EFFECT, 41, 0);
  181. bonus->effectRange = Bonus::ONLY_DISTANCE_FIGHT;
  182. bonusMock.addNewBonus(bonus);
  183. }
  184. EXPECT_EQ(subject.getTotalAttacks(false), 1);
  185. EXPECT_EQ(subject.getTotalAttacks(true), 42);
  186. }