From 12ee436f4dbc8d5cb3c28793a18eb4f2e9addf28 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Tue, 10 Nov 2020 22:44:53 +0100 Subject: [PATCH] Fix broken game test --- dungeonbattle/entities/monsters.py | 2 +- dungeonbattle/interfaces.py | 10 +++++++++- dungeonbattle/tests/entities_test.py | 8 +++++++- dungeonbattle/tests/game_test.py | 6 ++++++ 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/dungeonbattle/entities/monsters.py b/dungeonbattle/entities/monsters.py index 7c19c62..f7dd413 100644 --- a/dungeonbattle/entities/monsters.py +++ b/dungeonbattle/entities/monsters.py @@ -10,7 +10,7 @@ class Monster(FightingEntity): And if a player is close to the monster, the monster run on the player. """ # TODO If a player is close, move to the player - while True: + for _ in range(100): if choice([self.move_up, self.move_down, self.move_left, self.move_right])(): break diff --git a/dungeonbattle/interfaces.py b/dungeonbattle/interfaces.py index 65e381d..04ed8d1 100644 --- a/dungeonbattle/interfaces.py +++ b/dungeonbattle/interfaces.py @@ -33,6 +33,12 @@ class Map: self.entities.append(entity) entity.map = self + def remove_entity(self, entity: "Entity") -> None: + """ + Unregister an entity from the map. + """ + self.entities.remove(entity) + def is_free(self, y: int, x: int) -> bool: """ Indicates that the case at the coordinates (y, x) is empty. @@ -138,9 +144,10 @@ class Entity: self.move(y, x) return free - def move(self, y: int, x: int) -> None: + def move(self, y: int, x: int) -> bool: self.y = y self.x = x + return True def move_up(self, force: bool = False) -> bool: return self.move(self.y - 1, self.x) if force else \ @@ -192,3 +199,4 @@ class FightingEntity(Entity): def die(self) -> None: self.dead = True + self.map.remove_entity(self) diff --git a/dungeonbattle/tests/entities_test.py b/dungeonbattle/tests/entities_test.py index 1d3a04b..adca2ec 100644 --- a/dungeonbattle/tests/entities_test.py +++ b/dungeonbattle/tests/entities_test.py @@ -28,7 +28,7 @@ class TestEntities(unittest.TestCase): Test some random stuff with fighting entities. """ entity = Hedgehog() - self.assertIsNone(entity.act(self.map)) + self.map.add_entity(entity) self.assertEqual(entity.maxhealth, 10) self.assertEqual(entity.maxhealth, entity.health) self.assertEqual(entity.strength, 3) @@ -41,6 +41,12 @@ class TestEntities(unittest.TestCase): self.assertIsNone(entity.hit(entity)) self.assertTrue(entity.dead) + entity = Hedgehog() + self.map.add_entity(entity) + entity.move(2, 6) + self.map.tick() + self.assertFalse(entity.y == 2 and entity.x == 6) + def test_items(self) -> None: """ Test some random stuff with items. diff --git a/dungeonbattle/tests/game_test.py b/dungeonbattle/tests/game_test.py index 2498b48..c83e851 100644 --- a/dungeonbattle/tests/game_test.py +++ b/dungeonbattle/tests/game_test.py @@ -4,6 +4,7 @@ import unittest from dungeonbattle.bootstrap import Bootstrap from dungeonbattle.display.display import Display from dungeonbattle.display.display_manager import DisplayManager +from dungeonbattle.entities.player import Player from dungeonbattle.game import Game, KeyValues, GameMode from dungeonbattle.menus import MainMenuValues @@ -90,6 +91,11 @@ class TestGame(unittest.TestCase): self.game.handle_key_pressed(KeyValues.ENTER) self.assertEqual(self.game.state, GameMode.PLAY) + # Kill entities + for entity in self.game.map.entities.copy(): + if not isinstance(entity, Player): + self.game.map.remove_entity(entity) + y, x = self.game.player.y, self.game.player.x self.game.handle_key_pressed(KeyValues.DOWN) new_y, new_x = self.game.player.y, self.game.player.x