TimedTest.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /*
  2. * TimedTest.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. namespace test
  14. {
  15. using namespace ::spells;
  16. using namespace ::spells::effects;
  17. using namespace ::testing;
  18. class TimedTest : public Test, public EffectFixture
  19. {
  20. public:
  21. TimedTest()
  22. : EffectFixture("core:timed")
  23. {
  24. }
  25. protected:
  26. void SetUp() override
  27. {
  28. EffectFixture::setUp();
  29. }
  30. };
  31. class TimedApplyTest : public TestWithParam<::testing::tuple<bool, bool>>, public EffectFixture
  32. {
  33. public:
  34. bool cumulative = false;
  35. bool firstCast = false;
  36. const int32_t spellIndex = 456;
  37. const int32_t duration = 57;
  38. TimedApplyTest()
  39. : EffectFixture("core:timed")
  40. {
  41. }
  42. void setDefaultExpectaions()
  43. {
  44. unitsFake.setDefaultBonusExpectations();
  45. EXPECT_CALL(mechanicsMock, getSpellIndex()).WillRepeatedly(Return(spellIndex));
  46. EXPECT_CALL(mechanicsMock, getEffectDuration()).WillRepeatedly(Return(duration));
  47. EXPECT_CALL(serverMock, describeChanges()).WillRepeatedly(Return(false));
  48. }
  49. protected:
  50. void SetUp() override
  51. {
  52. EffectFixture::setUp();
  53. cumulative = get<0>(GetParam());
  54. firstCast = get<1>(GetParam());
  55. }
  56. };
  57. TEST_P(TimedApplyTest, ChangesBonuses)
  58. {
  59. Bonus testBonus1(Bonus::PERMANENT, Bonus::PRIMARY_SKILL, Bonus::OTHER, 3, 0, PrimarySkill::KNOWLEDGE);
  60. Bonus testBonus2(Bonus::N_TURNS, Bonus::PRIMARY_SKILL, Bonus::OTHER, 3, 0, PrimarySkill::KNOWLEDGE);
  61. testBonus2.turnsRemain = 4;
  62. JsonNode options(JsonNode::JsonType::DATA_STRUCT);
  63. options["cumulative"].Bool() = cumulative;
  64. options["bonus"]["test1"] = testBonus1.toJsonNode();
  65. options["bonus"]["test2"] = testBonus2.toJsonNode();
  66. options.setMeta(CModHandler::scopeBuiltin());
  67. setupEffect(options);
  68. const uint32_t unitId = 42;
  69. auto & targetUnit = unitsFake.add(BattleSide::ATTACKER);
  70. targetUnit.makeAlive();
  71. EXPECT_CALL(targetUnit, unitId()).WillRepeatedly(Return(unitId));
  72. EXPECT_CALL(targetUnit, creatureLevel()).WillRepeatedly(Return(1));
  73. EffectTarget target;
  74. target.emplace_back(&targetUnit, BattleHex());
  75. std::vector<Bonus> actualBonus;
  76. std::vector<Bonus> expectedBonus;
  77. testBonus1.turnsRemain = duration;
  78. expectedBonus.push_back(testBonus1);
  79. expectedBonus.push_back(testBonus2);
  80. for(auto & bonus : expectedBonus)
  81. {
  82. bonus.source = Bonus::SPELL_EFFECT;
  83. bonus.sid = spellIndex;
  84. }
  85. if(cumulative)
  86. {
  87. EXPECT_CALL(*battleFake, addUnitBonus(Eq(unitId),_)).WillOnce(SaveArg<1>(&actualBonus));
  88. }
  89. else
  90. {
  91. EXPECT_CALL(*battleFake, updateUnitBonus(Eq(unitId),_)).WillOnce(SaveArg<1>(&actualBonus));
  92. }
  93. setDefaultExpectaions();
  94. EXPECT_CALL(serverMock, apply(Matcher<SetStackEffect *>(_))).Times(1);
  95. subject->apply(&serverMock, &mechanicsMock, target);
  96. EXPECT_THAT(actualBonus, UnorderedElementsAreArray(expectedBonus));
  97. }
  98. INSTANTIATE_TEST_CASE_P
  99. (
  100. ByConfig,
  101. TimedApplyTest,
  102. Combine
  103. (
  104. Values(false, true),
  105. Values(false, true)
  106. )
  107. );
  108. }