From e7bced112cf36007da8f418ba3313d2dd4b3e045 Mon Sep 17 00:00:00 2001 From: AlexVinS Date: Sun, 9 Jun 2019 22:46:29 +0300 Subject: [PATCH] Fixed https://bugs.vcmi.eu/view.php?id=3059 --- lib/spells/effects/Heal.cpp | 2 +- test/spells/effects/HealTest.cpp | 82 ++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 1 deletion(-) diff --git a/lib/spells/effects/Heal.cpp b/lib/spells/effects/Heal.cpp index 20db55515..cf8b3a63a 100644 --- a/lib/spells/effects/Heal.cpp +++ b/lib/spells/effects/Heal.cpp @@ -68,7 +68,7 @@ bool Heal::isValidTarget(const Mechanics * m, const battle::Unit * unit) const if(minFullUnits > 0) { - auto hpGained = m->getEffectValue(); + auto hpGained = std::min(m->getEffectValue(), insuries); if(hpGained < minFullUnits * unit->MaxHealth()) return false; } diff --git a/test/spells/effects/HealTest.cpp b/test/spells/effects/HealTest.cpp index 9e03f4681..7604470d1 100644 --- a/test/spells/effects/HealTest.cpp +++ b/test/spells/effects/HealTest.cpp @@ -73,6 +73,88 @@ TEST_F(HealTest, ApplicableToWoundedUnit) EXPECT_TRUE(subject->applicable(problemMock, &mechanicsMock, target)); } +TEST_F(HealTest, ApplicableIfActuallyResurrects) +{ + { + JsonNode config(JsonNode::JsonType::DATA_STRUCT); + config["healLevel"].String() = "resurrect"; + config["minFullUnits"].Integer() = 5; + EffectFixture::setupEffect(config); + } + + auto & unit = unitsFake.add(BattleSide::ATTACKER); + unit.makeAlive(); + EXPECT_CALL(unit, isValidTarget(Eq(true))).WillOnce(Return(true)); + EXPECT_CALL(unit, getTotalHealth()).WillOnce(Return(20000)); + EXPECT_CALL(unit, getAvailableHealth()).WillOnce(Return(100)); + + EXPECT_CALL(mechanicsMock, getEffectValue()).Times(AtLeast(1)).WillRepeatedly(Return(1000)); + EXPECT_CALL(mechanicsMock, isSmart()).WillOnce(Return(false)); + EXPECT_CALL(mechanicsMock, ownerMatches(Eq(&unit))).WillOnce(Return(true)); + + unit.addNewBonus(std::make_shared(Bonus::PERMANENT, Bonus::STACK_HEALTH, Bonus::CREATURE_ABILITY, 200, 0)); + unitsFake.setDefaultBonusExpectations(); + + EffectTarget target; + target.emplace_back(&unit, BattleHex()); + + EXPECT_TRUE(subject->applicable(problemMock, &mechanicsMock, target)); +} + +TEST_F(HealTest, NotApplicableIfNotEnoughCasualties) +{ + { + JsonNode config(JsonNode::JsonType::DATA_STRUCT); + config["healLevel"].String() = "resurrect"; + config["minFullUnits"].Integer() = 1; + EffectFixture::setupEffect(config); + } + + auto & unit = unitsFake.add(BattleSide::ATTACKER); + EXPECT_CALL(unit, isValidTarget(Eq(true))).WillOnce(Return(true)); + EXPECT_CALL(unit, getTotalHealth()).WillOnce(Return(200)); + EXPECT_CALL(unit, getAvailableHealth()).WillOnce(Return(100)); + + EXPECT_CALL(mechanicsMock, getEffectValue()).Times(AtLeast(1)).WillRepeatedly(Return(999)); + EXPECT_CALL(mechanicsMock, isSmart()).WillRepeatedly(Return(false)); + EXPECT_CALL(mechanicsMock, ownerMatches(Eq(&unit))).WillRepeatedly(Return(true)); + + unit.addNewBonus(std::make_shared(Bonus::PERMANENT, Bonus::STACK_HEALTH, Bonus::CREATURE_ABILITY, 200, 0)); + unitsFake.setDefaultBonusExpectations(); + + EffectTarget target; + target.emplace_back(&unit, BattleHex()); + + EXPECT_FALSE(subject->applicable(problemMock, &mechanicsMock, target)); +} + +TEST_F(HealTest, NotApplicableIfResurrectsLessThanRequired) +{ + { + JsonNode config(JsonNode::JsonType::DATA_STRUCT); + config["healLevel"].String() = "resurrect"; + config["minFullUnits"].Integer() = 5; + EffectFixture::setupEffect(config); + } + + auto & unit = unitsFake.add(BattleSide::ATTACKER); + EXPECT_CALL(unit, isValidTarget(Eq(true))).WillOnce(Return(true)); + EXPECT_CALL(unit, getTotalHealth()).WillOnce(Return(20000)); + EXPECT_CALL(unit, getAvailableHealth()).WillOnce(Return(100)); + + EXPECT_CALL(mechanicsMock, getEffectValue()).Times(AtLeast(1)).WillRepeatedly(Return(999)); + EXPECT_CALL(mechanicsMock, isSmart()).WillRepeatedly(Return(false)); + EXPECT_CALL(mechanicsMock, ownerMatches(Eq(&unit))).WillRepeatedly(Return(true)); + + unit.addNewBonus(std::make_shared(Bonus::PERMANENT, Bonus::STACK_HEALTH, Bonus::CREATURE_ABILITY, 200, 0)); + unitsFake.setDefaultBonusExpectations(); + + EffectTarget target; + target.emplace_back(&unit, BattleHex()); + + EXPECT_FALSE(subject->applicable(problemMock, &mechanicsMock, target)); +} + TEST_F(HealTest, ApplicableToDeadUnit) { {