def test_enemy_with_same_x_as_hero_and_y_in_range_to_attack_choose_normal_attack_reduces_hero_health( self): # test without spell and weapon h = Hero(name="Bron", title="Dragonslayer", health=100, mana=100, mana_regeneration_rate=2) enemy = Enemy(health=100, mana=40, damage=60) enemy.x = 3 enemy.y = 2 fight = Fight(enemy) h.x = 3 h.y = 3 fight.enemy_move(h) self.assertEqual(h.health, 40)
def test_enemy_move_with_same_x_level_as_hero_and_y_in_range_to_attack_with_spell_should_reduce_hero_health( self): h = Hero(name="Bron", title="Dragonslayer", health=100, mana=100, mana_regeneration_rate=2) s = Spell('fireball', damage=45, mana_cost=15, cast_range=3) enemy = Enemy(health=100, mana=40, damage=20) enemy.x = 3 enemy.y = 2 enemy.learn(s) fight = Fight(enemy) h.x = 3 h.y = 3 fight.enemy_move(h) self.assertEqual(h.health, 55)
def test_enemy_move_with_same_x_level_as_hero_and_y_in_range_to_attack_with_weapon_should_reduce_hero_health( self): h = Hero(name="Bron", title="Dragonslayer", health=100, mana=100, mana_regeneration_rate=2) weapon = Weapon(name='Pruchka', damage=40) enemy = Enemy(health=100, mana=40, damage=20) enemy.x = 3 enemy.y = 2 enemy.equip(weapon) fight = Fight(enemy) h.x = 3 h.y = 3 fight.enemy_move(h) self.assertEqual(h.health, 60)
def test_enemy_with_same_x_as_hero_and_y_in_range_to_attack_choose_normal_attack_reduces_hero_health_3( self): # test with weapon only and enemy dmg > weapon dmg h = Hero(name="Bron", title="Dragonslayer", health=100, mana=100, mana_regeneration_rate=2) enemy = Enemy(health=100, mana=40, damage=60) enemy.x = 3 enemy.y = 2 weapon = Weapon(name='Pruchka', damage=50) enemy.equip(weapon) fight = Fight(enemy) h.x = 3 h.y = 3 fight.enemy_move(h) self.assertEqual(h.health, 40)
def test_enemy_with_same_x_as_hero_and_y_in_range_to_attack_choose_normal_attack_reduces_hero_health_2( self): # test with spell only and enemy dmg > spell dmg h = Hero(name="Bron", title="Dragonslayer", health=100, mana=100, mana_regeneration_rate=2) enemy = Enemy(health=100, mana=40, damage=60) enemy.x = 3 enemy.y = 2 s = Spell('fireball', damage=45, mana_cost=15, cast_range=3) enemy.learn(s) fight = Fight(enemy) h.x = 3 h.y = 3 fight.enemy_move(h) self.assertEqual(h.health, 40)
def test_enemy_move_with_same_x_as_hero_and_y_in_range_to_attack_choose_spell_not_weapon_reduces_hero_health( self): h = Hero(name="Bron", title="Dragonslayer", health=100, mana=100, mana_regeneration_rate=2) s = Spell('fireball', damage=55, mana_cost=15, cast_range=3) enemy = Enemy(health=100, mana=40, damage=20) weapon = Weapon(name='Pruchka', damage=50) enemy.x = 3 enemy.y = 2 enemy.learn(s) enemy.equip(weapon) fight = Fight(enemy) h.x = 3 h.y = 3 fight.enemy_move(h) self.assertEqual(h.health, 45)
def test_enemy_with_bigger_basic_dmg_and_not_enough_range_should_change_y_to_hero_2( self): # hero is on the same x as enemy but on higher y level h = Hero(name="Bron", title="Dragonslayer", health=100, mana=100, mana_regeneration_rate=2) enemy = Enemy(health=100, mana=40, damage=20) enemy.x = 3 enemy.y = 5 weapon = Weapon(name='Pruchka', damage=0) s = Spell('fireball', damage=0, mana_cost=15, cast_range=1) enemy.learn(s) enemy.equip(weapon) fight = Fight(enemy) h.x = 3 h.y = 3 fight.enemy_move(h) self.assertEqual(enemy.y, 4)
def test_enemy_with_bigger_weapon_dmg_and_not_enough_range_should_change_x_to_hero( self): # hero is on the right side of enemy and in the same y level h = Hero(name="Bron", title="Dragonslayer", health=100, mana=100, mana_regeneration_rate=2) enemy = Enemy(health=100, mana=40, damage=20) enemy.x = 1 enemy.y = 3 weapon = Weapon(name='Pruchka', damage=50) s = Spell('fireball', damage=45, mana_cost=15, cast_range=1) enemy.learn(s) enemy.equip(weapon) fight = Fight(enemy) h.x = 3 h.y = 3 fight.enemy_move(h) self.assertEqual(enemy.x, 2)
def test_enemy_with_same_y_as_hero_and_x_in_range_to_attack_choose_normal_attack_reduces_hero_health_5( self): # test with weapon and spell and enemy dmg > spell dmg > weapon dmg h = Hero(name="Bron", title="Dragonslayer", health=100, mana=100, mana_regeneration_rate=2) enemy = Enemy(health=100, mana=40, damage=60) enemy.x = 2 enemy.y = 3 weapon = Weapon(name='Pruchka', damage=50) s = Spell('fireball', damage=45, mana_cost=15, cast_range=3) enemy.learn(s) enemy.equip(weapon) fight = Fight(enemy) h.x = 3 h.y = 3 fight.enemy_move(h) self.assertEqual(h.health, 40)
class FightTests(unittest.TestCase): def setUp(self): self.spell = Spell(name="Fireball", damage=5, mana_cost=20, cast_range=1) self.weapon = Weapon(name="The Axe of Destiny", damage=10) self.hero = Hero(name="Bron", title="Dragonslayer", health=100, mana=100, mana_regeneration_rate=2) self.map = [['.', '.', '#', '#', '.', 'S', '.', '.', '.', 'T'], ['#', 'T', '#', '#', '.', '.', '#', '#', '#', '.'], ['#', '.', '#', '#', '#', 'E', '#', '#', '#', 'E'], ['#', '.', 'E', '.', '.', '.', '#', '#', '#', '.'], ['#', '#', '#', 'T', '#', 'T', '#', '#', '#', 'G']] self.enemies = { "2,5": { "damage": 10, "health": 40, "mana": 20, "weapon": None, "spell": self.spell.to_json() }, "2,9": { "damage": 10, "health": 40, "mana": 20, "weapon": self.weapon.to_json(), "spell": None }, "3,2": { "damage": 10, "health": 40, "mana": 20, "weapon": None, "spell": None } } self.treasures = { "1,1": { "class": "Potion", "type": "mana", "amount": 50 }, "0,9": { "class": "Potion", "type": "health", "amount": 50 }, "4,3": { "class": "Weapon", "name": "The Axe of Destiny", "damage": 10 }, "4,5": { 'class': "Spell", 'name': 'Fireball', 'damage': 5, 'mana_cost': 20, 'cast_range': 1 } } self.json_data = { "map": self.map, "enemies": self.enemies, "treasures": self.treasures } self.dungeon = Dungeon(self.json_data) self.dungeon.spawn(self.hero) self.fight = Fight(dungeon=self.dungeon, enemy_pos=(2, 5)) def test_init_initializing_correctly(self): self.assertEqual(self.fight.dungeon, self.dungeon) self.assertEqual(self.fight.enemy, Enemy.from_json(self.enemies['2,5'])) self.assertEqual(self.fight.enemy_pos, (2, 5)) def test_init_raises_Assertion_error_when_there_is_no_enemy_on_the_given_pos( self): with self.assertRaises(AssertionError): Fight(dungeon=self.dungeon, enemy_pos=(0, 1)) def test__range_between(self): self.assertEqual(self.fight._range_between(), 2) def test__direction_to_enemy_without_arguments(self): with self.subTest('Hero is up from enemy'): self.assertEqual(self.fight._direction_to_enemy(), (1, 0)) with self.subTest('Hero is down from enemy'): self.fight.dungeon._hero_pos = (3, 5) self.assertEqual(self.fight._direction_to_enemy(), (-1, 0)) def test__direction_to_enemy_with_argument(self): self.fight.enemy_pos = (3, 2) with self.subTest('Hero is left from enemy'): self.fight.dungeon._hero_pos = (3, 1) self.assertEqual(self.fight._direction_to_enemy(False), (0, 1)) with self.subTest('Hero is right from enemy'): self.fight.dungeon._hero_pos = (3, 5) self.assertEqual(self.fight._direction_to_enemy(False), (0, -3)) def test_hero_move_moves_hero_on_the_map_towards_enemy(self): self.fight.hero_move() self.assertEqual(self.fight.dungeon._map[1][5], self.hero) def test_enemy_move_moves_enemy_on_the_map_towards_hero(self): self.fight.enemy_move() self.assertEqual(self.fight.dungeon._map[1][5], self.fight.enemy) self.assertEqual(self.fight.enemy_pos, (1, 5)) def test_player_makes_move_one_of_the_players_move_when_hero_has_to_move( self): self.fight.player_makes_move(self.dungeon._hero) self.assertEqual(self.fight.dungeon._map[1][5], self.hero) def test_player_makes_move_one_of_the_players_move_when_enemy_has_to_move( self): self.fight.player_makes_move(self.fight.enemy) self.assertEqual(self.fight.dungeon._map[1][5], self.fight.enemy) def test_player_makes_move_hero_attacks(self): self.fight.dungeon._hero.learn(self.spell) self.fight.enemy_move() self.fight.player_makes_move(self.fight.dungeon._hero) self.assertEqual(self.fight.enemy.get_health(), 35) def test_player_makes_move_enemy_attacks(self): self.fight.hero_move() self.fight.player_makes_move(self.fight.enemy) self.assertEqual(self.fight.dungeon._hero.get_health(), 85) def test_fight(self): spell = Spell(name="Fireball", damage=20, mana_cost=4, cast_range=1) self.fight.dungeon._hero.learn(spell) print() self.fight.dungeon.print_map() self.fight.fight() self.assertEqual(self.fight.dungeon._hero.get_health(), 85) self.assertEqual(self.fight.dungeon._hero_pos, (1, 5)) self.assertFalse(self.fight.enemy.is_alive()) def test_fight_hero_is_dead(self): self.hero._health = 10 with self.assertRaises(HeroIsDeadError): self.fight.fight()