Please take a look at the code below. We've got a class FightService, which implements a logic of a fight between two heroes. After the fight one of the hero may lose some health points.
Please implement a test for FightService::fight() method.
Feel free to refactor any code if you think it's needed.
<?php
use PHPUnit\Framework\TestCase;
interface HeroInterface
{
public function getAttack(): int;
public function getDefence(): int;
public function getHealthPoints(): int;
public function setHealthPoints(int $healthPoints);
}
class DamageCalculator
{
const DAMAGE_RAND_FACTOR = 0.2;
public static function calculateDamage(HeroInterface $attacker, HeroInterface $defender): int
{
$damage = 0;
if ($attacker->getAttack() > $defender->getDefence()) {
$baseDamage = $attacker->getAttack() - $defender->getDefence();
$factor = $baseDamage * self::DAMAGE_RAND_FACTOR;
$minDamage = $baseDamage - $factor;
$maxDamage = $baseDamage + $factor;
$damage = mt_rand($minDamage, $maxDamage);
}
return $damage;
}
}
class FightService
{
public function fight(HeroInterface $attacker, HeroInterface $defender)
{
$damage = DamageCalculator::calculateDamage($attacker, $defender);
$defender->setHealthPoints($defender->getHealthPoints() - $damage);
}
}
class FightServiceTest extends TestCase {
public function testFight()
{
// implement the test
}
}
0 Answer(s)