class Test_Weapon(unittest.TestCase):

    def setUp(self):
        self.w = Weapon(name="The Axe of Destiny", damage=20)

    def test_init(self):
        self.assertEqual(self.w.get_name(), "The Axe of Destiny")
        self.assertEqual(self.w.get_damage(), 20)

    def test_save(self):
        self.assertEqual(self.w.prepare_json(), {
            "name": "The Axe of Destiny",
            "damage": 20
        })
class Hero(Creature):
    def __init__(self, **kwargs):
        self.name = kwargs['name']
        self.title = kwargs['title']
        self.health = kwargs['health']
        self.mana = kwargs['mana']
        self.mana_regeneration_rate = kwargs['mana_regeneration_rate']

        self.starting_health = kwargs['health']
        self.starting_mana = kwargs['mana']

        self.current_spell = None
        self.current_weapon = Weapon(name="Hands", damage=20)

    def known_as(self):
        return "{} known as the {}".format(self.name, self.title)

    def take_healing(self, healing_points):
        self.health = min(self.starting_health, self.health + healing_points)

    def take_mana(self, *args):
        if len(args) == 0:
            mana_value = self.mana + self.mana_regeneration_rate
            self.mana = min(self.starting_mana, mana_value)
        else:
            mana_value = self.mana + args[0]
            self.mana = min(self.starting_mana, mana_value)

    def attack(self, **kwargs):
        if kwargs['by'] == "weapon":
            if self.current_weapon is None:
                return 0
            else:
                return self.current_weapon.get_damage()

        if kwargs['by'] == "magic":
            if self.current_spell is None:
                return 0
            else:
                return self.current_spell.get_damage()