CatapultTest.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /*
  2. * CatapultTest.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 "EffectFixture.h"
  12. #include <vstd/RNG.h>
  13. #include "../../../lib/mapObjects/CGTownInstance.h"
  14. #include "../../../lib/json/JsonNode.h"
  15. namespace test
  16. {
  17. using namespace ::spells;
  18. using namespace ::spells::effects;
  19. using namespace ::testing;
  20. class CatapultTest : public Test, public EffectFixture
  21. {
  22. public:
  23. CatapultTest()
  24. :EffectFixture("core:catapult")
  25. {
  26. }
  27. protected:
  28. void SetUp() override
  29. {
  30. EffectFixture::setUp();
  31. setupEffect(JsonNode());
  32. }
  33. };
  34. TEST_F(CatapultTest, NotApplicableWithoutTown)
  35. {
  36. EXPECT_CALL(*battleFake, getDefendedTown()).WillRepeatedly(Return(nullptr));
  37. EXPECT_CALL(mechanicsMock, adaptProblem(_, _)).WillOnce(Return(false));
  38. EXPECT_CALL(mechanicsMock, isSmart()).WillRepeatedly(Return(true));
  39. EXPECT_CALL(*battleFake, getWallState(_)).Times(0);
  40. EXPECT_FALSE(subject->applicable(problemMock, &mechanicsMock));
  41. }
  42. TEST_F(CatapultTest, DISABLED_NotApplicableInVillage)
  43. {
  44. auto fakeTown = std::make_shared<CGTownInstance>(nullptr);
  45. EXPECT_CALL(*battleFake, getDefendedTown()).WillRepeatedly(Return(fakeTown.get()));
  46. EXPECT_CALL(mechanicsMock, adaptProblem(_, _)).WillOnce(Return(false));
  47. EXPECT_CALL(mechanicsMock, isSmart()).WillRepeatedly(Return(true));
  48. EXPECT_CALL(*battleFake, getWallState(_)).Times(0);
  49. EXPECT_FALSE(subject->applicable(problemMock, &mechanicsMock));
  50. }
  51. TEST_F(CatapultTest, DISABLED_NotApplicableForDefenderIfSmart)
  52. {
  53. auto fakeTown = std::make_shared<CGTownInstance>(nullptr);
  54. fakeTown->addBuilding(BuildingID::FORT);
  55. mechanicsMock.casterSide = BattleSide::DEFENDER;
  56. EXPECT_CALL(*battleFake, getDefendedTown()).WillRepeatedly(Return(fakeTown.get()));
  57. EXPECT_CALL(mechanicsMock, adaptProblem(_, _)).WillOnce(Return(false));
  58. EXPECT_CALL(mechanicsMock, isSmart()).WillRepeatedly(Return(true));
  59. EXPECT_CALL(*battleFake, getWallState(_)).WillRepeatedly(Return(EWallState::INTACT));
  60. EXPECT_FALSE(subject->applicable(problemMock, &mechanicsMock));
  61. }
  62. TEST_F(CatapultTest, DISABLED_ApplicableInTown)
  63. {
  64. auto fakeTown = std::make_shared<CGTownInstance>(nullptr);
  65. fakeTown->addBuilding(BuildingID::FORT);
  66. EXPECT_CALL(*battleFake, getDefendedTown()).WillRepeatedly(Return(fakeTown.get()));
  67. EXPECT_CALL(mechanicsMock, adaptProblem(_, _)).Times(0);
  68. EXPECT_CALL(mechanicsMock, isSmart()).WillRepeatedly(Return(true));
  69. EXPECT_CALL(*battleFake, getWallState(_)).WillRepeatedly(Return(EWallState::INTACT));
  70. EXPECT_TRUE(subject->applicable(problemMock, &mechanicsMock));
  71. }
  72. class CatapultApplyTest : public Test, public EffectFixture
  73. {
  74. public:
  75. CatapultApplyTest()
  76. : EffectFixture("core:catapult")
  77. {
  78. }
  79. void setDefaultExpectations()
  80. {
  81. EXPECT_CALL(*battleFake, getDefendedTown()).WillRepeatedly(Return(fakeTown.get()));
  82. EXPECT_CALL(mechanicsMock, isSmart()).WillRepeatedly(Return(true));
  83. setupDefaultRNG();
  84. }
  85. protected:
  86. void SetUp() override
  87. {
  88. EffectFixture::setUp();
  89. fakeTown = std::make_shared<CGTownInstance>(nullptr);
  90. fakeTown->addBuilding(BuildingID::FORT);
  91. }
  92. private:
  93. std::shared_ptr<CGTownInstance> fakeTown;
  94. };
  95. TEST_F(CatapultApplyTest, DISABLED_DamageToIntactPart)
  96. {
  97. {
  98. JsonNode config;
  99. config["targetsToAttack"].Integer() = 1;
  100. config["chanceToNormalHit"].Integer() = 100;
  101. EffectFixture::setupEffect(config);
  102. }
  103. setDefaultExpectations();
  104. const EWallPart targetPart = EWallPart::BELOW_GATE;
  105. auto & actualCaster = unitsFake.add(BattleSide::ATTACKER);
  106. mechanicsMock.caster = &actualCaster;
  107. EXPECT_CALL(actualCaster, getCasterUnitId()).WillRepeatedly(Return(-1));
  108. EXPECT_CALL(mechanicsMock, isMassive()).WillRepeatedly(Return(true));
  109. EXPECT_CALL(*battleFake, getWallState(_)).WillRepeatedly(Return(EWallState::DESTROYED));
  110. EXPECT_CALL(*battleFake, getWallState(Eq(targetPart))).WillRepeatedly(Return(EWallState::INTACT));
  111. EXPECT_CALL(*battleFake, setWallState(Eq(targetPart), Eq(EWallState::DAMAGED))).Times(1);
  112. EXPECT_CALL(serverMock, apply(Matcher<CatapultAttack &>(_))).Times(1);
  113. EffectTarget target;
  114. target.emplace_back();
  115. subject->apply(&serverMock, &mechanicsMock, target);
  116. }
  117. }