CatapultTest.cpp 4.2 KB

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