More tests

This commit is contained in:
Yohann D'ANELLO 2021-01-08 01:56:54 +01:00
parent 1a78ad584c
commit 6c6a44fb18
Signed by: ynerant
GPG Key ID: 3A75C55819C8CF85
4 changed files with 119 additions and 29 deletions

View File

@ -54,17 +54,7 @@ class Item(Entity):
""" """
Indicates what should be done when the item is unequipped. Indicates what should be done when the item is unequipped.
""" """
if isinstance(self, Chestplate): self.held_by.remove_from_inventory(self)
self.held_by.equipped_armor = None
elif isinstance(self, Helmet):
self.held_by.equipped_helmet = None
elif isinstance(self, Weapon):
if self.held_by.equipped_main == self:
self.held_by.equipped_main = None
else:
self.held_by.equipped_secondary = None
else:
self.held_by.equipped_secondary = None
self.held_by.add_to_inventory(self) self.held_by.add_to_inventory(self)
def hold(self, holder: InventoryHolder) -> None: def hold(self, holder: InventoryHolder) -> None:
@ -211,7 +201,6 @@ class Explosion(Item):
""" """
The player can't hold any explosion. The player can't hold any explosion.
""" """
pass
class Weapon(Item): class Weapon(Item):
@ -304,7 +293,6 @@ class Helmet(Armor):
*args, **kwargs) *args, **kwargs)
def equip(self) -> None: def equip(self) -> None:
super().equip()
if self.held_by.equipped_helmet: if self.held_by.equipped_helmet:
self.held_by.equipped_helmet.unequip() self.held_by.equipped_helmet.unequip()
self.held_by.remove_from_inventory(self) self.held_by.remove_from_inventory(self)
@ -322,7 +310,6 @@ class Chestplate(Armor):
*args, **kwargs) *args, **kwargs)
def equip(self) -> None: def equip(self) -> None:
super().equip()
if self.held_by.equipped_armor: if self.held_by.equipped_armor:
self.held_by.equipped_armor.unequip() self.held_by.equipped_armor.unequip()
self.held_by.remove_from_inventory(self) self.held_by.remove_from_inventory(self)
@ -414,7 +401,14 @@ class Ring(Item):
def save_state(self) -> dict: def save_state(self) -> dict:
d = super().save_state() d = super().save_state()
d["maxhealth"] = self.maxhealth
d["strength"] = self.strength
d["intelligence"] = self.intelligence
d["charisma"] = self.charisma
d["dexterity"] = self.dexterity
d["constitution"] = self.constitution d["constitution"] = self.constitution
d["critical"] = self.critical
d["experience"] = self.experience
return d return d

View File

@ -42,18 +42,14 @@ class Player(InventoryHolder, FightingEntity):
self.inventory = self.translate_inventory(inventory or []) self.inventory = self.translate_inventory(inventory or [])
self.paths = dict() self.paths = dict()
self.hazel = hazel self.hazel = hazel
if isinstance(equipped_main, dict): self.equipped_main = self.dict_to_item(equipped_main) \
equipped_main = self.dict_to_item(equipped_main) if isinstance(equipped_main, dict) else equipped_main
if isinstance(equipped_armor, dict): self.equipped_armor = self.dict_to_item(equipped_armor) \
equipped_armor = self.dict_to_item(equipped_armor) if isinstance(equipped_armor, dict) else equipped_armor
if isinstance(equipped_secondary, dict): self.equipped_secondary = self.dict_to_item(equipped_secondary) \
equipped_secondary = self.dict_to_item(equipped_secondary) if isinstance(equipped_secondary, dict) else equipped_secondary
if isinstance(equipped_helmet, dict): self.equipped_helmet = self.dict_to_item(equipped_helmet) \
equipped_helmet = self.dict_to_item(equipped_helmet) if isinstance(equipped_helmet, dict) else equipped_helmet
self.equipped_main = equipped_main
self.equipped_armor = equipped_armor
self.equipped_secondary = equipped_secondary
self.equipped_helmet = equipped_helmet
def move(self, y: int, x: int) -> None: def move(self, y: int, x: int) -> None:
""" """

View File

@ -108,7 +108,7 @@ class Game:
self.handle_key_pressed_store(key) self.handle_key_pressed_store(key)
self.display_actions(DisplayActions.REFRESH) self.display_actions(DisplayActions.REFRESH)
def handle_key_pressed_play(self, key: KeyValues) -> None: def handle_key_pressed_play(self, key: KeyValues) -> None: # noqa: C901
""" """
In play mode, arrows or zqsd move the main character. In play mode, arrows or zqsd move the main character.
""" """
@ -128,7 +128,10 @@ class Game:
self.state = GameMode.INVENTORY self.state = GameMode.INVENTORY
self.display_actions(DisplayActions.UPDATE) self.display_actions(DisplayActions.UPDATE)
elif key == KeyValues.USE and self.player.equipped_main: elif key == KeyValues.USE and self.player.equipped_main:
self.player.equipped_main.use() if self.player.equipped_main:
self.player.equipped_main.use()
if self.player.equipped_secondary:
self.player.equipped_secondary.use()
elif key == KeyValues.SPACE: elif key == KeyValues.SPACE:
self.state = GameMode.MAINMENU self.state = GameMode.MAINMENU
elif key == KeyValues.CHAT: elif key == KeyValues.CHAT:

View File

@ -2,13 +2,16 @@
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
import os import os
import random
import unittest import unittest
from ..bootstrap import Bootstrap from ..bootstrap import Bootstrap
from ..display.display import Display from ..display.display import Display
from ..display.display_manager import DisplayManager from ..display.display_manager import DisplayManager
from ..entities.friendly import Merchant, Sunflower from ..entities.friendly import Merchant, Sunflower
from ..entities.items import Bomb, Heart, Sword, Explosion from ..entities.items import Bomb, Heart, Sword, Explosion, Shield, Helmet, \
Chestplate, RingCritical
from ..entities.monsters import GiantSeaEagle
from ..entities.player import Player from ..entities.player import Player
from ..enums import DisplayActions from ..enums import DisplayActions
from ..game import Game, KeyValues, GameMode from ..game import Game, KeyValues, GameMode
@ -609,3 +612,97 @@ class TestGame(unittest.TestCase):
# Exit the menu # Exit the menu
self.game.handle_key_pressed(KeyValues.SPACE) self.game.handle_key_pressed(KeyValues.SPACE)
self.assertEqual(self.game.state, GameMode.PLAY) self.assertEqual(self.game.state, GameMode.PLAY)
def test_equipment(self) -> None:
"""
Ensure that equipment is working.
"""
self.game.state = GameMode.INVENTORY
# sword goes into the main equipment slot
sword = Sword()
sword.hold(self.game.player)
self.game.handle_key_pressed(KeyValues.EQUIP)
self.assertEqual(self.game.player.equipped_main, sword)
self.assertFalse(self.game.player.inventory)
# shield goes into the secondary equipment slot
shield = Shield()
shield.hold(self.game.player)
self.game.handle_key_pressed(KeyValues.EQUIP)
self.assertEqual(self.game.player.equipped_secondary, shield)
self.assertFalse(self.game.player.inventory)
# helmet goes into the helmet slot
helmet = Helmet()
helmet.hold(self.game.player)
self.game.handle_key_pressed(KeyValues.EQUIP)
self.assertEqual(self.game.player.equipped_helmet, helmet)
self.assertFalse(self.game.player.inventory)
# helmet goes into the armor slot
chestplate = Chestplate()
chestplate.hold(self.game.player)
self.game.handle_key_pressed(KeyValues.EQUIP)
self.assertEqual(self.game.player.equipped_armor, chestplate)
self.assertFalse(self.game.player.inventory)
# Use bomb
bomb = Bomb()
bomb.hold(self.game.player)
self.game.handle_key_pressed(KeyValues.EQUIP)
self.assertEqual(self.game.player.equipped_secondary, bomb)
self.assertIn(shield, self.game.player.inventory)
self.game.state = GameMode.PLAY
self.game.handle_key_pressed(KeyValues.USE)
self.assertIsNone(self.game.player.equipped_secondary)
self.game.state = GameMode.INVENTORY
self.game.handle_key_pressed(KeyValues.EQUIP)
self.assertEqual(self.game.player.equipped_secondary, shield)
self.assertFalse(self.game.player.inventory)
# Reequip, which is useless but covers code
sword.equip()
shield.equip()
helmet.equip()
chestplate.equip()
self.game.save_state()
# Unequip all
sword.unequip()
shield.unequip()
helmet.unequip()
chestplate.unequip()
self.assertIsNone(self.game.player.equipped_main)
self.assertIsNone(self.game.player.equipped_secondary)
self.assertIsNone(self.game.player.equipped_helmet)
self.assertIsNone(self.game.player.equipped_armor)
self.assertIn(sword, self.game.player.inventory)
self.assertIn(shield, self.game.player.inventory)
self.assertIn(helmet, self.game.player.inventory)
self.assertIn(chestplate, self.game.player.inventory)
# Test rings
self.game.player.inventory.clear()
ring = RingCritical()
ring.hold(self.game.player)
old_critical = self.game.player.critical
self.game.handle_key_pressed(KeyValues.EQUIP)
self.assertEqual(self.game.player.critical,
old_critical + ring.critical)
self.game.save_state()
ring.unequip()
def test_critical_hit(self) -> None:
"""
Ensure that critical hits are working.
"""
random.seed(2) # Next random.randint(1, 100) will output 8
self.game.player.critical = 10
sea_eagle = GiantSeaEagle()
self.game.map.add_entity(sea_eagle)
sea_eagle.move(2, 6)
old_health = sea_eagle.health
self.game.player.hit(sea_eagle)
self.assertEqual(sea_eagle.health,
old_health - self.game.player.strength * 4)