"""
Test the EvAdventure equipment handler.
"""
from unittest.mock import MagicMock, patch
from parameterized import parameterized
from evennia.utils.test_resources import BaseEvenniaTest
from ..enums import Ability, WieldLocation
from ..equipment import EquipmentError
from .mixins import EvAdventureMixin
[docs]class TestEquipment(EvAdventureMixin, BaseEvenniaTest):
[docs] def test_count_slots(self):
self.assertEqual(self.character.equipment.count_slots(), 0)
[docs] def test_max_slots(self):
self.assertEqual(self.character.equipment.max_slots, 11)
setattr(self.character, Ability.CON.value, 3)
self.assertEqual(self.character.equipment.max_slots, 13)
[docs] def test_add__remove(self):
self.character.equipment.add(self.helmet)
self.assertEqual(self.character.equipment.slots[WieldLocation.BACKPACK], [self.helmet])
self.character.equipment.remove(self.helmet)
self.assertEqual(self.character.equipment.slots[WieldLocation.BACKPACK], [])
[docs] def test_move__get_current_slot(self):
self.character.equipment.add(self.helmet)
self.assertEqual(
self.character.equipment.get_current_slot(self.helmet), WieldLocation.BACKPACK
)
self.character.equipment.move(self.helmet)
self.assertEqual(self.character.equipment.get_current_slot(self.helmet), WieldLocation.HEAD)
[docs] def test_get_wearable_or_wieldable_objects_from_backpack(self):
self.character.equipment.add(self.helmet)
self.character.equipment.add(self.weapon)
self.assertEqual(
self.character.equipment.get_wieldable_objects_from_backpack(), [self.weapon]
)
self.assertEqual(
self.character.equipment.get_wearable_objects_from_backpack(), [self.helmet]
)
self.assertEqual(
self.character.equipment.all(),
[
(None, WieldLocation.WEAPON_HAND),
(None, WieldLocation.SHIELD_HAND),
(None, WieldLocation.TWO_HANDS),
(None, WieldLocation.BODY),
(None, WieldLocation.HEAD),
(self.helmet, WieldLocation.BACKPACK),
(self.weapon, WieldLocation.BACKPACK),
],
)
def _get_empty_slots(self):
return {
WieldLocation.BACKPACK: [],
WieldLocation.WEAPON_HAND: None,
WieldLocation.SHIELD_HAND: None,
WieldLocation.TWO_HANDS: None,
WieldLocation.BODY: None,
WieldLocation.HEAD: None,
}
[docs] def test_equipmenthandler_max_slots(self):
self.assertEqual(self.character.equipment.max_slots, 11)
@parameterized.expand(
[
# size, pass_validation?
(1, True),
(2, True),
(11, True),
(12, False),
(20, False),
(25, False),
]
)
def test_validate_slot_usage(self, size, is_ok):
obj = MagicMock()
obj.size = size
with patch("evennia.contrib.tutorials.evadventure.equipment.inherits_from") as mock_inherit:
mock_inherit.return_value = True
if is_ok:
self.assertTrue(self.character.equipment.validate_slot_usage(obj))
else:
with self.assertRaises(EquipmentError):
self.character.equipment.validate_slot_usage(obj)
@parameterized.expand(
[
# item, where
("helmet", WieldLocation.HEAD),
("shield", WieldLocation.SHIELD_HAND),
("armor", WieldLocation.BODY),
("weapon", WieldLocation.WEAPON_HAND),
("big_weapon", WieldLocation.TWO_HANDS),
("item", WieldLocation.BACKPACK),
]
)
def test_move(self, itemname, where):
self.assertEqual(self.character.equipment.slots, self._get_empty_slots())
obj = getattr(self, itemname)
self.character.equipment.move(obj)
# check that item ended up in the right place
if where is WieldLocation.BACKPACK:
self.assertTrue(obj in self.character.equipment.slots[where])
else:
self.assertEqual(self.character.equipment.slots[where], obj)
[docs] def test_add(self):
self.character.equipment.add(self.weapon)
self.assertEqual(self.character.equipment.slots[WieldLocation.WEAPON_HAND], None)
self.assertTrue(self.weapon in self.character.equipment.slots[WieldLocation.BACKPACK])
[docs] def test_two_handed_exclusive(self):
"""Two-handed weapons can't be used together with weapon+shield"""
self.character.equipment.move(self.big_weapon)
self.assertEqual(self.character.equipment.slots[WieldLocation.TWO_HANDS], self.big_weapon)
# equipping sword or shield removes two-hander
self.character.equipment.move(self.shield)
self.assertEqual(self.character.equipment.slots[WieldLocation.SHIELD_HAND], self.shield)
self.assertEqual(self.character.equipment.slots[WieldLocation.TWO_HANDS], None)
self.character.equipment.move(self.weapon)
self.assertEqual(self.character.equipment.slots[WieldLocation.WEAPON_HAND], self.weapon)
# the two-hander removes the two weapons
self.character.equipment.move(self.big_weapon)
self.assertEqual(self.character.equipment.slots[WieldLocation.TWO_HANDS], self.big_weapon)
self.assertEqual(self.character.equipment.slots[WieldLocation.SHIELD_HAND], None)
self.assertEqual(self.character.equipment.slots[WieldLocation.WEAPON_HAND], None)
[docs] def test_remove__with_obj(self):
self.character.equipment.move(self.shield)
self.character.equipment.move(self.item)
self.character.equipment.add(self.weapon)
self.assertEqual(self.character.equipment.slots[WieldLocation.SHIELD_HAND], self.shield)
self.assertEqual(
self.character.equipment.slots[WieldLocation.BACKPACK], [self.item, self.weapon]
)
self.assertEqual(self.character.equipment.remove(self.shield), [self.shield])
self.assertEqual(self.character.equipment.remove(self.item), [self.item])
self.assertEqual(self.character.equipment.slots[WieldLocation.SHIELD_HAND], None)
self.assertEqual(self.character.equipment.slots[WieldLocation.BACKPACK], [self.weapon])
[docs] def test_remove__with_slot(self):
self.character.equipment.move(self.shield)
self.character.equipment.move(self.item)
self.character.equipment.add(self.helmet)
self.assertEqual(self.character.equipment.slots[WieldLocation.SHIELD_HAND], self.shield)
self.assertEqual(
self.character.equipment.slots[WieldLocation.BACKPACK], [self.item, self.helmet]
)
self.assertEqual(self.character.equipment.remove(WieldLocation.SHIELD_HAND), [self.shield])
self.assertEqual(
self.character.equipment.remove(WieldLocation.BACKPACK), [self.item, self.helmet]
)
self.assertEqual(self.character.equipment.slots[WieldLocation.SHIELD_HAND], None)
self.assertEqual(self.character.equipment.slots[WieldLocation.BACKPACK], [])
[docs] def test_properties(self):
self.character.equipment.move(self.armor)
self.assertEqual(self.character.equipment.armor, 1)
self.character.equipment.move(self.shield)
self.assertEqual(self.character.equipment.armor, 2)
self.character.equipment.move(self.helmet)
self.assertEqual(self.character.equipment.armor, 3)
self.character.equipment.move(self.weapon)
self.assertEqual(self.character.equipment.weapon, self.weapon)
self.character.equipment.move(self.big_weapon)
self.assertEqual(self.character.equipment.weapon, self.big_weapon)