예제 #1
0
    def hero_attack(self, by):
        if by == "spell":
            if Spell.in_range():
                if Hero.can_cast() == True and self.fattack == True:
                    self.fattack = False  # след боя трябва да стане пак True
                    print(self.msg1)
                    Enemies(take_damege())
                    # Трябва да се добави боя
                elif Hero.can_cast():
                    # Трябва да се добави боя
                else:
                    return self.hero_attack("weapon")  # Май така беше да се испълни функцията

            else:
                print("Nothing in casting range {}".format(self.cast_range))
        if by == "weapon":
            # Трябва да се добави боя
            pass
예제 #2
0
class TestHero(unittest.TestCase):
    def setUp(self):
        self.h = Hero(name="Bron",
                      title="Dragonslayer",
                      health=100,
                      mana=100,
                      mana_regeneration_rate=2)
        self.w = Weapon(name="The Axe of Destiny", damage=20)
        self.s = Spell(name="Fireball", damage=30, mana_cost=50, cast_range=2)

    def test_init(self):
        self.assertEqual(self.h.name, "Bron")
        self.assertEqual(self.h.title, "Dragonslayer")
        self.assertEqual(self.h.health, 100)
        self.assertEqual(self.h.mana, 100)
        self.assertEqual(self.h.mana_regeneration_rate, 2)
        self.assertEqual(self.h.start_mana, 100)
        self.assertEqual(self.h.damage, 0)

    def test_known_as(self):
        result = "Bron the Dragonslayer"
        self.assertEqual(self.h.known_as(), result)

    def test_is_alive(self):
        self.assertTrue(self.h.is_alive() is True)

    def test_take_damage(self):
        damage = self.h.take_damage(40)
        self.assertTrue(self.h.health is 60)

    def test_can_cast(self):
        self.assertTrue(self.h.can_cast() is True)

    def test_take_healing(self):
        self.h.take_damage(100)
        self.new_health = self.h.take_healing(30)
        self.assertTrue(self.h.health is 0)

    def test_take_mana(self):
        self.h.learn(self.s)
        self.h.attack(by="spell")
        self.h.take_mana(10)
        self.assertEqual(self.h.mana, 60)

    def test_attack(self):
        self.h.equip(self.w)
        self.assertEqual(self.h.attack(by="weapon"), 20)
        self.h.learn(self.s)
        self.assertEqual(self.h.attack(by="spell"), 30)

    def test_exception(self):
        self.h.learn(self.s)
        self.assertEqual(self.h.attack(by="spell"), 30)
        with self.assertRaises(NotEnaughMana):
            self.s.mana_cost = 50
            self.h.attack(by="spell")
예제 #3
0
class TestHero(unittest.TestCase):

    def setUp(self):
        self.h = Hero(name="Bron", title="Dragonslayer", health=100, mana=100, mana_regeneration_rate=2)
        self.w = Weapon(name="The Axe of Destiny", damage=20)
        self.s = Spell(name="Fireball", damage=30, mana_cost=50, cast_range=2)

    def test_init(self):
        self.assertEqual(self.h.name, "Bron")
        self.assertEqual(self.h.title, "Dragonslayer")
        self.assertEqual(self.h.health, 100)
        self.assertEqual(self.h.mana, 100)
        self.assertEqual(self.h.mana_regeneration_rate, 2)
        self.assertEqual(self.h.start_mana, 100)
        self.assertEqual(self.h.damage, 0)

    def test_known_as(self):
        result = "Bron the Dragonslayer"
        self.assertEqual(self.h.known_as(), result)

    def test_is_alive(self):
        self.assertTrue(self.h.is_alive() is True)

    def test_take_damage(self):
        damage = self.h.take_damage(40)
        self.assertTrue(self.h.health is 60)

    def test_can_cast(self):
        self.assertTrue(self.h.can_cast() is True)

    def test_take_healing(self):
        self.h.take_damage(100)
        self.new_health = self.h.take_healing(30)
        self.assertTrue(self.h.health is 0)

    def test_take_mana(self):
        self.h.learn(self.s)
        self.h.attack(by="spell")
        self.h.take_mana(10)
        self.assertEqual(self.h.mana, 60)

    def test_attack(self):
        self.h.equip(self.w)
        self.assertEqual(self.h.attack(by="weapon"), 20)
        self.h.learn(self.s)
        self.assertEqual(self.h.attack(by="spell"), 30)

    def test_exception(self):
        self.h.learn(self.s)
        self.assertEqual(self.h.attack(by="spell"), 30)
        with self.assertRaises(NotEnaughMana):
            self.s.mana_cost = 50
            self.h.attack(by="spell")
class Test(unittest.TestCase):
    def setUp(self):
        self.w = Weapon("axe", 20)
        self.spell = Spell("love spell", 70, 2, 4)
        self.h = Hero("Arthur", "great", 100, 100, 100, 2, self.w, self.spell)

    def test_hero_init(self):
        self.assertEqual(self.h.get_name(), "Arthur")
        self.assertEqual(self.h.get_title(), "great")
        self.assertEqual(self.h.get_health(), 100)
        self.assertEqual(self.h.get_start_health(), 100)
        self.assertEqual(self.h.get_mana(), 100)
        self.assertEqual(self.h.get_mana_rate(), 2)
        self.assertEqual(self.h.get_weapon(), "axe")

    def test_hero_init(self):
        self.assertEqual(str(self.h), "Arthur great 100 100 2")

    def test_hero_known_as(self):
        self.assertEqual(self.h.known_as(), "Arthur the great")

    def test_hero_is_alive(self):
        self.assertTrue(self.h.is_alive())

    def test_hero_is_dead(self):
        self.assertFalse(self.h.is_dead())

    def test_hero_can_cast(self):
        self.assertTrue(self.h.can_cast())

    def test_hero_take_damage(self):
        self.assertEqual(self.h.take_damage(70), 30)

    def test_hero_take_healing(self):
        self.h.take_damage(70)
        self.assertEqual(self.h.take_healing(20), 50)

    def test_hero_equip(self):
        self.assertEqual(self.h.equip(self.w), "Equipped with axe, damage: 20")

    def test_hero_attack(self):
        self.assertEqual(self.h.attack("weapon"), 20)
예제 #5
0
class TestsHero(unittest.TestCase):
    def setUp(self):
        self.hero1 = Hero(
            name='Toni',
            title='Pythonslayer',
            health=250,
            mana=1000,
            mana_regeneration_rate=25,
        )

        self.hero2 = Hero(name="Bron",
                          title="Dragonslayer",
                          health=100,
                          mana=100,
                          mana_regeneration_rate=2)

        self.spell = Spell(name="Fireball",
                           damage=30,
                           mana_cost=110,
                           cast_range=2)
        self.weapon = Weapon(name="The Axe of Destiny", damage=20)

    def test_init_working_correctly(self):
        with self.subTest('hero1'):
            self.assertEqual(self.hero1._name, 'Toni')
            self.assertEqual(self.hero1._title, 'Pythonslayer')
            self.assertEqual(self.hero1._health, 250)
            self.assertEqual(self.hero1._max_health, 250)
            self.assertEqual(self.hero1._mana, 1000)
            self.assertEqual(self.hero1._max_mana, 1000)
            self.assertEqual(self.hero1._mana_regeneration_rate, 25)
            self.assertEqual(self.hero1._weapon, None)
            self.assertEqual(self.hero1._spell, None)

    def test_known_as(self):
        with self.subTest('hero1'):
            self.assertEqual(self.hero1.known_as(), 'Toni the Pythonslayer')

        with self.subTest('hero2'):
            self.assertEqual(self.hero2.known_as(), 'Bron the Dragonslayer')

    def test_can_cast(self):
        with self.subTest('spell is None'):
            self.assertFalse(self.hero1.can_cast())

        with self.subTest('when mana is not enough'):
            self.hero2._spell = self.spell

            self.assertFalse(self.hero2.can_cast())

        with self.subTest('when mana is not enough'):
            self.hero1._spell = self.spell

            self.assertTrue(self.hero1.can_cast())

    def test_attack_raises_exceptions_correctly(self):
        with self.subTest('when by == weapon and hero\'s weapon is None'):
            with self.assertRaises(NotEquippedError):
                self.hero1.attack(by='weapon')

        with self.subTest('when by == spell and hero\'s spell is None'):
            with self.assertRaises(NotEquippedError):
                self.hero1.attack(by='spell')

        with self.subTest('when by is not \'weapon\' or \'spell\''):
            with self.assertRaises(TypeError):
                self.hero1.attack(by='foot')

        with self.subTest('when spell costs more then current mana'):
            with self.assertRaises(NotEnoughManaError):
                self.hero1.learn(self.spell)
                for x in range(0, 20):
                    self.hero1.attack(by='spell')

    def test_attack_returns_correct_damage(self):
        with self.subTest('\'by\' == \'spell\''):
            self.hero1._spell = self.spell
            damage = self.hero1.attack(by='spell')

            self.assertEqual(damage, 30)
            self.assertEqual(self.hero1._mana, 890)

        with self.subTest('\'by\' == \'weapon\''):
            self.hero2._weapon = self.weapon
            damage = self.hero2.attack(by='weapon')

            self.assertEqual(damage, 20)

    def test_eq_returns_false_when_hero1_super_different_than_hero2_super(
            self):
        hero3 = Hero(name="Bron",
                     title="Dragonslayer",
                     health=100,
                     mana=100,
                     mana_regeneration_rate=2)

        hero3.learn(self.spell)

        self.assertNotEqual(self.hero2, hero3)

    def test_eq_returns_false_when_hero1_has_different_attr_than_hero2_super(
            self):
        hero3 = Hero(name="Toni",
                     title="Dragonslayer",
                     health=100,
                     mana=100,
                     mana_regeneration_rate=2)

        self.assertNotEqual(self.hero2, hero3)

    def test_eq_returns_true_when_super_and_all_attrs_are_the_same(self):
        hero3 = Hero(name="Bron",
                     title="Dragonslayer",
                     health=100,
                     mana=100,
                     mana_regeneration_rate=2)

        self.assertEqual(self.hero2, hero3)

    def test_to_json(self):
        self.hero1.learn(self.spell)
        expected = {
            'name': 'Toni',
            'title': 'Pythonslayer',
            'mana_regeneration_rate': 25,
            'health': 250,
            'mana': 1000,
            'weapon': None,
            'spell': self.spell.to_json()
        }

        self.assertDictEqual(self.hero1.to_json(), expected)

    def test_from_json(self):
        self.hero1.equip(self.weapon)
        json_dict = {
            'name': 'Toni',
            'title': 'Pythonslayer',
            'mana_regeneration_rate': 25,
            'health': 250,
            'mana': 1000,
            'weapon': self.weapon.to_json(),
            'spell': None
        }

        self.assertEqual(self.hero1, Hero.from_json(json_dict))
class HeroTest(unittest.TestCase):

    def setUp(self):
        self.hunter = Hero("Lagerta", "Arrow", 120, 120, 2)

    def test_create_new_instance(self):
        self.assertTrue(isinstance(self.hunter, Hero))

    def test_valid_members(self):
        self.assertEqual(self.hunter.name, "Lagerta")
        self.assertEqual(self.hunter.title, "Arrow")
        self.assertEqual(self.hunter.health, 120)
        self.assertEqual(self.hunter.mana, 120)
        self.assertEqual(self.hunter.mana_regeneration_rate, 2)

        self.assertEqual(self.hunter.max_health, 120)
        self.assertEqual(self.hunter.max_mana, 120)

    def test_known_as(self):
        self.assertEqual(self.hunter.known_as(), "Lagerta the Arrow")

    def test_get_health(self):
        self.assertEqual(self.hunter.get_health(), 120)

    def test_get_mana(self):
        self.assertEqual(self.hunter.get_mana(), 120)

    def test_is_alive(self):
        self.assertTrue(self.hunter.is_alive())
        self.hunter.health = 0
        self.assertFalse(self.hunter.is_alive())

    def test_can_cast_without_spell(self):
        self.assertFalse(self.hunter.can_cast())

    def test_can_cast_with_more_mana(self):
        self.hunter.spell = Spell("Chilling Poison", 20, 20, 2)
        self.assertTrue(self.hunter.can_cast())

    def test_can_cast_with_less_mana(self):
        self.hunter.spell = Spell("Chilling Poison", 20, 20, 2)
        self.hunter.mana = 0
        self.assertFalse(self.hunter.can_cast())

    def test_take_damage_more_than_health(self):
        self.hunter.take_damage(150)
        self.assertEqual(self.hunter.health, 0)

    def test_take_damage_less_than_health(self):
        self.hunter.take_damage(100)
        self.assertEqual(self.hunter.health, 20)

    def test_take_healing_dead_hero(self):
        self.hunter.health = 0
        self.assertFalse(self.hunter.take_healing(200))

    def test_take_healing_with_more_points_than_max_health(self):
        self.hunter.health = 80
        self.assertTrue(self.hunter.take_healing(200))
        self.assertEqual(self.hunter.health, 120)

    def test_take_healing_with_less_points_than_max_health(self):
        self.hunter.health = 90
        self.assertTrue(self.hunter.take_healing(20))
        self.assertEqual(self.hunter.health, 110)

    def test_take_mana_with_more_points_than_max_mana(self):
        self.hunter.mana = 80
        self.hunter.take_mana(200)
        self.assertEqual(self.hunter.mana, 120)

    def test_take_mana_with_negative_mana(self):
        self.hunter.mana = 50
        self.hunter.take_mana(-60)
        self.assertEqual(self.hunter.mana, 0)

    def test_take_mana_with_less_points_than_max_mana(self):
        self.hunter.mana = 65
        self.hunter.take_mana(20)
        self.assertEqual(self.hunter.mana, 85)

    def test_equip(self):
        knife = Weapon("Knife", 10)
        self.hunter.equip(knife)
        self.assertEqual(self.hunter.weapon, knife)

    def test_learn(self):
        mind_blast = Spell("Mind Blast", 20, 35, 5)
        self.hunter.learn(mind_blast)
        self.assertEqual(self.hunter.spell, mind_blast)

    def test_attack_without_equiped_weapon(self):
        self.assertEqual(self.hunter.attack(by="weapon"), 0)

    def test_attack_with_equiped_weapon(self):
        knife = Weapon("Sword", 30)
        self.hunter.equip(knife)
        self.assertEqual(self.hunter.attack(by="weapon"), 30)

    def test_attack_without_learned_spell(self):
        self.assertEqual(self.hunter.attack(by="spell"), 0)

    def test_attack_with_learned_spell(self):
        fire_blast = Spell("Fire Blast", 60, 40, 2)
        self.hunter.learn(fire_blast)
        self.assertEqual(self.hunter.attack(by="spell"), 60)
예제 #7
0
class TestHero(unittest.TestCase):

    def setUp(self):
        self._hero = Hero(name="Bron", title="Dragonslayer", health=100, mana=100, mana_regeneration_rate=2)

    def test_init(self):
        self.assertTrue(isinstance(self._hero, Hero))

        with self.assertRaises(ValueError):
            Hero(name="Bron", title="Dragonslayer", health=-1, mana=100, mana_regeneration_rate=2)

        with self.assertRaises(ValueError):
            Hero(name="Bron", title="Dragonslayer", health=150, mana=100, mana_regeneration_rate=2)

        with self.assertRaises(ValueError):
            Hero(name="Bron", title="Dragonslayer", health=100, mana=-1, mana_regeneration_rate=2)

        with self.assertRaises(ValueError):
            Hero(name="Bron", title="Dragonslayer", health=100, mana=150, mana_regeneration_rate=2)

        with self.assertRaises(ValueError):
            Hero(name="Bron", title="Dragonslayer", health=100, mana=100, mana_regeneration_rate=-1)

        with self.assertRaises(TypeError):
            Hero(name=0, title="Dragonslayer", health=100, mana=100, mana_regeneration_rate=2)

        with self.assertRaises(TypeError):
            Hero(name="Bron", title=0, health=100, mana=100, mana_regeneration_rate=2)

        with self.assertRaises(TypeError):
            Hero(name="Bron", title="Dragonslayer", health="str", mana=100, mana_regeneration_rate=2)

        with self.assertRaises(TypeError):
            Hero(name="Bron", title="Dragonslayer", health=100, mana="str", mana_regeneration_rate=2)

        with self.assertRaises(TypeError):
            Hero(name="Bron", title="Dragonslayer", health=100, mana=100, mana_regeneration_rate="str")

    def test_known_as(self):
        self.assertEqual(self._hero.known_as(), "Bron the Dragonslayer")

    def test_get_health(self):
        self.assertEqual(self._hero.get_health(), self._hero._health)

    def test_get_mana(self):
        self.assertEqual(self._hero.get_mana(), self._hero._mana)

    def test_is_alive(self):
        self.assertTrue(self._hero.is_alive())

    def test_can_cast(self):
        self.assertTrue(self._hero.can_cast())

    def test_take_damage(self):
        self._hero.take_damage(30)
        self.assertEqual(self._hero._health, 70)

        with self.assertRaises(ValueError):
            self._hero.take_damage(-30)

    def test_take_healing(self):

        damaged_hero = Hero(name="Bron", title="Dragonslayer", health=50, mana=100, mana_regeneration_rate=2)

        self.assertTrue(damaged_hero.take_healing(30))

    def test_take_mana(self):
        down_mana_hero = Hero(name="Bron", title="Dragonslayer", health=100, mana=10, mana_regeneration_rate=2)
        down_mana_hero.take_mana(30)

        self.assertEqual(down_mana_hero._mana, 40)

    def test_equip(self):
        w1 = Weapon(name="The Axe of Destiny", damage=20)
        w2 = Weapon(name="Crescent Scimitar", damage=132)

        self._hero.equip(w2)

        with self.assertRaises(HeroAlreadyHasAWeapon):
            self._hero.equip(w1)

    def test_learn(self):
        s1 = Spell(name="Fireball", damage=30, mana_cost=20, cast_range=2)
        s2 = Spell(name="Earth Pulse", damage=50, mana_cost=20, cast_range=2)

        self._hero.learn(s1)

        self._hero.learn(s2)

        self.assertEqual(self._hero._spell, s2)

    def test_attack(self):
        weapon = Weapon(name="Crescent Scimitar", damage=20)
        self.assertEqual(self._hero.attack(by="weapon"), 0)

        self._hero.equip(weapon)

        self.assertEqual(self._hero.attack(by="weapon"), weapon.damage)
예제 #8
0
class TestHero(unittest.TestCase):
    def setUp(self):
        self.h = Hero(name="Bron",
                      title="Dragonslayer",
                      health=100,
                      mana=100,
                      mana_regeneration_rate=2)

    def test_known_as(self):
        self.assertEqual(self.h.known_as(), "Bron the Dragonslayer")

    def test_take_damage(self):
        self.h.take_damage(20.5)
        self.assertEqual(self.h.health, 79.5)

    def test_take_mana(self):
        self.h.take_mana(20)
        self.assertEqual(self.h.mana, 100)

    def test_can_cast(self):
        s = Spell(name="s", damage=40, mana_cost=120, cast_range=2)
        self.h.learn(s)
        self.assertFalse(self.h.can_cast())
        s1 = Spell(name="s1", damage=40, mana_cost=20, cast_range=2)
        self.h.learn(s1)
        self.assertTrue(self.h.can_cast())

    def test_equip(self):
        self.assertEqual(self.h.weapon, None)
        w = Weapon(name="w", damage=20)
        self.h.equip(w)
        self.assertEqual(self.h.weapon.damage, 20)
        self.assertEqual(self.h.weapon.name, "w")
        w1 = Weapon(name="w1", damage=30)
        self.h.equip(w1)
        self.assertEqual(self.h.weapon.damage, 30)
        self.assertEqual(self.h.weapon.name, "w1")
        w2 = Weapon(name="w2", damage=10)
        self.h.equip(w2)
        self.assertEqual(self.h.weapon.damage, 30)
        self.assertEqual(self.h.weapon.name, "w1")

    def test_learn(self):
        self.assertEqual(self.h.weapon, None)
        s = Spell(name="s", damage=30, mana_cost=50, cast_range=2)
        self.h.learn(s)
        self.assertEqual(self.h.spell.damage, 30)
        self.assertEqual(self.h.spell.name, "s")
        s1 = Spell(name="s1", damage=40, mana_cost=50, cast_range=2)
        self.h.learn(s1)
        self.assertEqual(self.h.spell.damage, 40)
        self.assertEqual(self.h.spell.name, "s1")
        s2 = Spell(name="s1", damage=20, mana_cost=50, cast_range=2)
        self.h.learn(s2)
        self.assertEqual(self.h.spell.damage, 40)
        self.assertEqual(self.h.spell.name, "s1")

    def test_attack(self):
        self.assertEqual(self.h.attack(by="weapon"), 0)
        self.assertEqual(self.h.attack(by="spell"), 0)
        w = Weapon(name="w", damage=20)
        self.h.equip(w)
        self.assertEqual(self.h.attack(by="weapon"), 20)
        s = Spell(name="s", damage=30, mana_cost=10, cast_range=2)
        self.h.learn(s)
        self.assertEqual(self.h.attack(by="spell"), 30)
        self.assertEqual(self.h.mana, 90)
        s1 = Spell(name="s1", damage=30, mana_cost=110, cast_range=2)
        self.h.learn(s1)
        self.assertEqual(self.h.attack(by="spell"), 0)
        self.assertEqual(self.h.mana, 90)
예제 #9
0
class TestHero(unittest.TestCase):
    def setUp(self):
        self.h = Hero(name="Bron",
                      title="Dragonslayer",
                      health=100,
                      mana=100,
                      mana_regeneration_rate=2)
        self.w = Weapon(name="The Axe of Destiny", damage=20)
        self.s = Spell(name="Fireball", damage=30, mana_cost=50, cast_range=2)

    def test_known_as(self):
        self.assertTrue(self.h.known_as(),
                        '{} the {}'.format(self.h.name, self.h.title))

    def test_is_alive(self):
        self.assertTrue(self.h.is_alive())
        self.h.health = 0
        self.assertFalse(self.h.is_alive())

    def test_get_health(self):
        self.assertTrue(self.h.get_health(), self.h.health)

    def test_get_mana(self):
        self.assertTrue(self.h.get_mana(), self.h.mana)

    def test_can_cast(self):
        self.assertFalse(self.h.can_cast())
        self.h.learn(self.s)
        self.assertTrue(self.h.can_cast())
        self.h.mana = 40
        self.assertFalse(self.h.can_cast())

    def test_take_damage(self):
        self.assertEqual(self.h.take_damage(60), 40)
        self.assertEqual(self.h.take_damage(60), 0)

    def test_take_healing(self):
        self.assertTrue(self.h.take_healing(10))
        self.assertEqual(self.h.health, 100)
        self.h.health = 50
        self.assertTrue(self.h.take_healing(10))
        self.assertEqual(self.h.health, 60)
        self.h.health = 0
        self.assertFalse(self.h.take_healing(10))

    def test_take_mana(self):
        self.h.take_mana(10)
        self.assertEqual(self.h.mana, 100)
        self.h.mana = 50
        self.h.take_mana(10)
        self.assertEqual(self.h.mana, 60)
        self.h.take_mana()
        self.assertEqual(self.h.mana, 60 + self.h.mana_regeneration_rate)

    def test_weapon_equip_and_spell_learn(self):
        self.h.learn(self.w)
        self.h.equip(self.s)
        self.assertEqual(self.h.current_spell, 'No spell')
        self.assertEqual(self.h.current_weapon, 'No weapon')

        self.h.learn(self.s)
        self.h.equip(self.w)
        self.assertEqual(self.h.current_spell, self.s)
        self.assertEqual(self.h.current_weapon, self.w)

    def test_attack_function(self):
        self.assertEqual(self.h.attack(by='weapon'), 0)
        self.assertEqual(self.h.attack(by='spell'), 0)

        self.h.learn(self.s)
        self.h.equip(self.w)
        self.assertEqual(self.h.attack(by='weapon'), self.w.damage)
        self.assertEqual(self.h.attack(by='spell'), self.s.damage)

        self.h.mana = 20
        self.assertEqual(self.h.attack(by='spell'), 0)
예제 #10
0
class HeroTest(unittest.TestCase):

    def setUp(self):
        self.hero = Hero(name="Bron",
                         title="Dragonslayer",
                         health=100, mana=100,
                         mana_regeneration_rate=2)
        self.weapon = Weapon(name="The Axe of Destiny", damage=20)
        self.spell = Spell(name="Fireball",
                           damage=30,
                           mana_cost=50,
                           cast_range=2)

    def test_exists_class(self):
        self.assertTrue(isinstance(self.hero, Hero))

    def test_hero_known_as(self):
        self.assertTrue(self.hero.known_as(), "Bron the DragonSlayer")

    def test_hero_is_alive(self):
        self.assertTrue(self.hero.is_alive(), True)

    def test_is_hero_not_alive(self):
        self.hero.reduce_health(100)
        self.assertFalse(self.hero.is_alive())

    def test_hero_can_cast(self):
        self.assertTrue(self.hero.can_cast(), True)

    def test_hero_can_cast_false(self):
        self.hero.reduce_mana(100)
        self.assertFalse(self.hero.can_cast())

    def test_mana_regeneration_rate(self):
        self.assertEqual(self.hero.mana_regeneration_rate(), 2)

    def test_hero_take_damage(self):
        damage_points = 20
        self.hero.take_damage(damage_points)
        self.assertEqual(self.hero.get_health(), 80)

    def test_hero_take_healing(self):
        healing_points = 20
        damage_points = 90
        self.hero.take_damage(damage_points)
        self.hero.take_healing(healing_points)
        self.assertTrue(self.hero.get_health(), 30)

    def test_hero_take_mana(self):
        damage_points = 50
        mana_points = 40
        new_mana_points = 20
        self.hero.take_damage(damage_points)
        self.hero.reduce_mana(mana_points)
        self.assertTrue(self.hero.take_mana(new_mana_points), 80)

    def test_hero_weapon(self):
        weapon_equipment = []
        weapon_equipment.append(self.weapon)
        self.assertEqual(weapon_equipment[0], self.weapon)

    def test_hero_can_equip_with_weapon(self):
        self.hero.equip(self.weapon)
        self.assertEqual(str(self.hero.weapon_equipment[0]),
                         self.weapon.get_name())

    def test_hero_spell(self):
        learned_spell = []
        learned_spell.append(self.spell)
        self.assertEqual(learned_spell[0], self.spell)

    def test_hero_can_learn_new_spell(self):
        self.hero.learn(self.spell)
        self.assertEqual(str(self.hero.learned_spell[0]),
                         self.spell.get_name())

    def test_hero_attack_with_spell(self):
        self.hero.learn(self.spell)
        self.assertEqual(self.hero.attack(by="spell"),
                         self.spell.get_damage())

    def test_hero_attack_with_weapon(self):
        self.hero.equip(self.weapon)
        self.assertEqual(self.hero.attack(by="weapon"),
                         self.weapon.get_damage())
class HeroTests(unittest.TestCase):
    def setUp(self):
        self.hero = Hero("Ahri", "Kingslayer", 100, 100, 2)
        self.enemy = Enemy(100, 100, 20)
        self.dungeon = Dungeon("level1.txt")
        self.weapon = Weapon("The Axe of Destiny", damage=20)
        self.spell = Spell(
            name="Fireball", damage=30, mana_cost=50, cast_range=1)

    def test_known_as(self):
        self.assertEqual(self.hero.known_as(), "Ahri the Kingslayer")

    def test_take_damage(self):
        self.hero.take_damage(150)
        self.assertEqual(self.hero.get_health(), 0)

    def test_take_healing(self):
        self.hero.take_damage(50)
        self.assertTrue(self.hero.take_healing(55))
        self.assertEqual(self.hero.get_health(), 100)

    def test_take_mana_with_potion(self):
        pass

        # Test enemy who can not regenerate mana
    def test_mana_regeneration_while_moving(self):
        pass

    def test_can_cast(self):
        self.hero.learn(self.spell)
        self.assertTrue(self.hero.can_cast())

    def test_can_cast_with_no_spells_learned(self):
        self.assertFalse(self.hero.can_cast())

    def test_attack_not_being_specified(self):
        with self.assertRaises(ValueError):
            self.hero.attack(by="gun")

    def test_attack_without_weapon_or_spell(self):
        self.assertEqual(self.hero.attack(by="weapon"), 0)
        self.assertEqual(self.hero.attack(by="magic"), 0)
        # Test for enemy (base damage= = 20)
        self.assertEqual(self.enemy.attack(by="weapon"), 20)
        self.assertEqual(self.enemy.attack(by="magic"), 20)

    def test_attack(self):
        self.hero.equip(self.weapon)
        self.assertEqual(self.hero.attack(by="weapon"), 20)
        self.hero.learn(self.spell)
        self.assertEqual(self.hero.attack(by="magic"), 30)

    def test_dungeon_map(self):
        self.assertEqual(self.dungeon.map, [['S', '.', '#', '#', '.', '.', '.', '.', '.', 'T'], ['#', 'T', '#', '#', '.', '.', '#', '#', '#', '.'], ['#', '.', '#', '#', '#', 'E', '#', '#', '#', 'E'], ['#', '.', 'E', '.', '.', '.', '#', '#', '#', '.'], ['#', '#', '#', 'T', '#', '#', '#', '#', '#', 'G']])
        # self.dungeon.print_map()

    def test_spawn_hero(self):
        self.dungeon.spawn(self.hero)
        self.dungeon.spawn(self.hero)
        self.dungeon.spawn(self.hero)
        # self.dungeon.print_map()

    def test_get_position(self):
        self.dungeon.spawn(self.hero)
        self.assertEqual(self.dungeon.get_position(), (0, 0))

    def test_move_right(self):
        self.dungeon.spawn(self.hero)
        self.dungeon.move_hero("right")
        # self.dungeon.print_map()
        self.assertFalse(self.dungeon.move_hero("right"))

    def test_move_left(self):
        self.dungeon.spawn(self.hero)
        self.dungeon.move_hero("right")
        self.assertTrue(self.dungeon.move_hero("left"))
        # self.dungeon.print_map()

    def test_move_up(self):
        self.dungeon.spawn(self.hero)
        self.assertFalse(self.dungeon.move_hero("up"))

    def test_move_down(self):
        self.dungeon.spawn(self.hero)
        self.assertFalse(self.dungeon.move_hero("down"))

    def test_moving_around_the_map(self):
        dungeon = Dungeon("level2.txt")
        dungeon.spawn(self.hero)
        dungeon.move_hero("right")
        dungeon.move_hero("down")
        self.assertFalse(dungeon.move_hero("right"))
        dungeon.move_hero("down")
        self.assertFalse(dungeon.move_hero("left"))
        # dungeon.print_map()
        self.assertTrue(dungeon.move_hero("down"))

    def test_the_game(self):
        h = Hero(name="Bron", title="Dragonslayer",
                 health=100, mana=100, mana_regeneration_rate=2)
        w = Weapon(name="The Axe of Destiny", damage=20)
        h.equip(w)
        s = Spell(name="Lightning bolt", damage=30, mana_cost=50, cast_range=2)
        h.learn(s)
        dungeon = Dungeon("level1.txt")
        dungeon.spawn(h)
        dungeon.move_hero("right")
        dungeon.move_hero("down")
        dungeon.try_range_attack()
        dungeon.move_hero("down")
        dungeon.move_hero("down")
        dungeon.try_range_attack()
        # dungeon.move_hero("right")
        # dungeon.move_hero("right")

        dungeon.print_map()