Resolve unit tests

This commit is contained in:
Griatch 2022-09-17 23:37:08 +02:00
parent a4eff902cc
commit 705d47fe47
14 changed files with 291 additions and 350 deletions

View file

@ -43,4 +43,4 @@ class TestCharacters(BaseEvenniaTest):
# can't get more coins than we have
result = self.character.at_pay(100)
self.assertEqual(result, 40)
self.assertEqual(self.characer.coins, 0)
self.assertEqual(self.character.coins, 0)

View file

@ -0,0 +1,64 @@
"""
Test chargen.
"""
from unittest.mock import MagicMock, patch
from evennia import create_object
from evennia.utils.test_resources import BaseEvenniaTest
from parameterized import parameterized
from .. import chargen, enums, objects
class EvAdventureCharacterGenerationTest(BaseEvenniaTest):
"""
Test the Character generator in the rule engine.
"""
@patch("evennia.contrib.tutorials.evadventure.rules.randint")
def setUp(self, mock_randint):
super().setUp()
mock_randint.return_value = 10
self.chargen = chargen.TemporaryCharacterSheet()
def test_base_chargen(self):
self.assertEqual(self.chargen.strength, 10) # not realistic, due to mock
self.assertEqual(self.chargen.armor, "gambeson")
self.assertEqual(self.chargen.shield, "shield")
self.assertEqual(
self.chargen.backpack, ["ration", "ration", "waterskin", "waterskin", "drill", "twine"]
)
def test_build_desc(self):
self.assertEqual(
self.chargen.desc,
"You are scrawny with a broken face, pockmarked skin, greased hair, hoarse speech, and "
"stained clothing. You were a Herbalist, but you were exiled and ended up a knave. You "
"are honest but also irascible. You tend towards neutrality.",
)
@patch("evennia.contrib.tutorials.evadventure.chargen.spawn")
def test_apply(self, mock_spawn):
gambeson = create_object(objects.EvAdventureArmor, key="gambeson")
mock_spawn.return_value = gambeson
character = self.chargen.apply()
self.assertIn("Herbalist", character.db.desc)
self.assertEqual(
character.equipment.all(),
[
(None, enums.WieldLocation.WEAPON_HAND),
(None, enums.WieldLocation.SHIELD_HAND),
(None, enums.WieldLocation.TWO_HANDS),
(gambeson, enums.WieldLocation.BODY),
(None, enums.WieldLocation.HEAD),
],
)
gambeson.delete()
character.delete()

View file

@ -4,7 +4,10 @@ Test the EvAdventure equipment handler.
"""
from unittest.mock import MagicMock, patch
from evennia.utils.test_resources import BaseEvenniaTest
from parameterized import parameterized
from ..enums import Ability, WieldLocation
from ..equipment import EquipmentError
@ -20,13 +23,6 @@ class TestEquipment(EvAdventureMixin, BaseEvenniaTest):
setattr(self.character, Ability.CON.value, 3)
self.assertEqual(self.character.equipment.max_slots, 13)
def test_validate_slot_usage(self):
helmet = self.helmet
self.assertTrue(self.character.equipment.validate_slot_usage(helmet))
helmet.size = 20 # a very large helmet
with self.assertRaises(EquipmentError):
self.assertFalse(self.character.equipment.validate_slot_usage(helmet))
def test_add__remove(self):
self.character.equipment.add(self.helmet)
self.assertEqual(self.character.equipment.slots[WieldLocation.BACKPACK], [self.helmet])
@ -53,6 +49,141 @@ class TestEquipment(EvAdventureMixin, BaseEvenniaTest):
)
self.assertEqual(
self.character.equipment.get_all(),
[(self.helmet, WieldLocation.BACKPACK), (self.weapon, WieldLocation.BACKPACK)],
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,
}
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)
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])
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)
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])
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], [])
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)

View file

@ -151,24 +151,20 @@ class EvAdventureRollEngineTest(BaseEvenniaTest):
mock_randint.return_value = 10
self.assertEqual(
self.roll_engine.roll_random_table(
"1d20", random_tables.character_generation["physique"]
),
self.roll_engine.roll_random_table("1d20", random_tables.chargen_tables["physique"]),
"scrawny",
)
self.assertEqual(
self.roll_engine.roll_random_table("1d20", random_tables.character_generation["vice"]),
self.roll_engine.roll_random_table("1d20", random_tables.chargen_tables["vice"]),
"irascible",
)
self.assertEqual(
self.roll_engine.roll_random_table(
"1d20", random_tables.character_generation["alignment"]
),
self.roll_engine.roll_random_table("1d20", random_tables.chargen_tables["alignment"]),
"neutrality",
)
self.assertEqual(
self.roll_engine.roll_random_table(
"1d20", random_tables.character_generation["helmets and shields"]
"1d20", random_tables.chargen_tables["helmets and shields"]
),
"no helmet or shield",
)
@ -176,14 +172,14 @@ class EvAdventureRollEngineTest(BaseEvenniaTest):
mock_randint.return_value = 25
self.assertEqual(
self.roll_engine.roll_random_table(
"1d20", random_tables.character_generation["helmets and shields"]
"1d20", random_tables.chargen_tables["helmets and shields"]
),
"helmet and shield",
)
mock_randint.return_value = -10
self.assertEqual(
self.roll_engine.roll_random_table(
"1d20", random_tables.character_generation["helmets and shields"]
"1d20", random_tables.chargen_tables["helmets and shields"]
),
"no helmet or shield",
)
@ -202,17 +198,15 @@ class EvAdventureRollEngineTest(BaseEvenniaTest):
@patch("evennia.contrib.tutorials.evadventure.rules.randint")
def test_heal_from_rest(self, mock_randint):
character = MagicMock()
character.heal = MagicMock()
character.hp_max = 8
character.hp = 1
character.constitution = 1
mock_randint.return_value = 5
self.roll_engine.heal_from_rest(character)
self.assertEqual(character.hp, 7) # hp + 1d8 + consititution bonus
mock_randint.assert_called_with(1, 8) # 1d8
self.roll_engine.heal_from_rest(character)
self.assertEqual(character.hp, 8) # can't have more than max hp
character.heal.assert_called_with(6) # roll + constitution bonus
@patch("evennia.contrib.tutorials.evadventure.rules.randint")
def test_roll_death(self, mock_randint):
@ -229,233 +223,3 @@ class EvAdventureRollEngineTest(BaseEvenniaTest):
mock_randint.return_value = 3
self.roll_engine.roll_death(character)
self.assertEqual(character.strength, 10)
class EvAdventureCharacterGenerationTest(BaseEvenniaTest):
"""
Test the Character generator in the rule engine.
"""
@patch("evennia.contrib.tutorials.evadventure.rules.randint")
def setUp(self, mock_randint):
super().setUp()
mock_randint.return_value = 10
self.chargen = rules.EvAdventureCharacterGeneration()
def test_base_chargen(self):
self.assertEqual(self.chargen.strength, 2)
self.assertEqual(self.chargen.physique, "scrawny")
self.assertEqual(self.chargen.skin, "pockmarked")
self.assertEqual(self.chargen.hair, "greased")
self.assertEqual(self.chargen.clothing, "stained")
self.assertEqual(self.chargen.misfortune, "exiled")
self.assertEqual(self.chargen.armor, "gambeson")
self.assertEqual(self.chargen.shield, "shield")
self.assertEqual(
self.chargen.backpack, ["ration", "ration", "waterskin", "waterskin", "drill", "twine"]
)
def test_build_desc(self):
self.assertEqual(
self.chargen.build_desc(),
"Herbalist. Wears stained clothes, and has hoarse speech. Has a scrawny physique, "
"a broken face, pockmarked skin and greased hair. Is honest, but irascible. "
"Has been exiled in the past. Favors neutrality.",
)
@parameterized.expand(
[
# source, target, value, new_source_val, new_target_val
(enums.Ability.CON, enums.Ability.STR, 1, 1, 3),
(enums.Ability.INT, enums.Ability.DEX, 1, 1, 3),
(enums.Ability.CHA, enums.Ability.CON, 1, 1, 3),
(enums.Ability.STR, enums.Ability.WIS, 1, 1, 3),
(enums.Ability.WIS, enums.Ability.CHA, 1, 1, 3),
(enums.Ability.DEX, enums.Ability.DEX, 1, 2, 2),
]
)
def test_adjust_attribute(self, source, target, value, new_source_val, new_target_val):
self.chargen.adjust_attribute(source, target, value)
self.assertEqual(getattr(self.chargen, source.value), new_source_val, f"{source}->{target}")
self.assertEqual(getattr(self.chargen, target.value), new_target_val, f"{source}->{target}")
def test_adjust_consecutive(self):
# gradually shift all to STR (starts at 2)
self.chargen.adjust_attribute(enums.Ability.CON, enums.Ability.STR, 1)
self.chargen.adjust_attribute(enums.Ability.CHA, enums.Ability.STR, 1)
self.chargen.adjust_attribute(enums.Ability.DEX, enums.Ability.STR, 1)
self.chargen.adjust_attribute(enums.Ability.WIS, enums.Ability.STR, 1)
self.assertEqual(self.chargen.constitution, 1)
self.assertEqual(self.chargen.strength, 6)
# max is 6
with self.assertRaises(ValueError):
self.chargen.adjust_attribute(enums.Ability.INT, enums.Ability.STR, 1)
# minimum is 1
with self.assertRaises(ValueError):
self.chargen.adjust_attribute(enums.Ability.DEX, enums.Ability.WIS, 1)
# move all from str to wis
self.chargen.adjust_attribute(enums.Ability.STR, enums.Ability.WIS, 5)
self.assertEqual(self.chargen.strength, 1)
self.assertEqual(self.chargen.wisdom, 6)
def test_apply(self):
character = MagicMock()
self.chargen.apply(character)
self.assertTrue(character.db.desc.startswith("Herbalist"))
self.assertEqual(character.armor, "gambeson")
character.equipment.add.assert_called()
class EvAdventureEquipmentTest(EvAdventureMixin, BaseEvenniaTest):
"""
Test the equipment mechanism.
"""
def _get_empty_slots(self):
return {
enums.WieldLocation.BACKPACK: [],
enums.WieldLocation.WEAPON_HAND: None,
enums.WieldLocation.SHIELD_HAND: None,
enums.WieldLocation.TWO_HANDS: None,
enums.WieldLocation.BODY: None,
enums.WieldLocation.HEAD: None,
}
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
if is_ok:
self.assertTrue(self.character.equipment.validate_slot_usage(obj))
else:
with self.assertRaises(equipment.EquipmentError):
self.character.equipment.validate_slot_usage(obj)
@parameterized.expand(
[
# item, where
("helmet", enums.WieldLocation.HEAD),
("shield", enums.WieldLocation.SHIELD_HAND),
("armor", enums.WieldLocation.BODY),
("weapon", enums.WieldLocation.WEAPON_HAND),
("big_weapon", enums.WieldLocation.TWO_HANDS),
("item", enums.WieldLocation.BACKPACK),
]
)
def test_use(self, itemname, where):
self.assertEqual(self.character.equipment.slots, self._get_empty_slots())
obj = getattr(self, itemname)
self.character.equipment.use(obj)
# check that item ended up in the right place
if where is enums.WieldLocation.BACKPACK:
self.assertTrue(obj in self.character.equipment.slots[where])
else:
self.assertEqual(self.character.equipment.slots[where], obj)
def test_add(self):
self.character.equipment.add(self.weapon)
self.assertEqual(self.character.equipment.slots[enums.WieldLocation.WEAPON_HAND], None)
self.assertTrue(self.weapon in self.character.equipment.slots[enums.WieldLocation.BACKPACK])
def test_two_handed_exclusive(self):
"""Two-handed weapons can't be used together with weapon+shield"""
self.character.equipment.use(self.big_weapon)
self.assertEqual(
self.character.equipment.slots[enums.WieldLocation.TWO_HANDS], self.big_weapon
)
# equipping sword or shield removes two-hander
self.character.equipment.use(self.shield)
self.assertEqual(
self.character.equipment.slots[enums.WieldLocation.SHIELD_HAND], self.shield
)
self.assertEqual(self.character.equipment.slots[enums.WieldLocation.TWO_HANDS], None)
self.character.equipment.use(self.weapon)
self.assertEqual(
self.character.equipment.slots[enums.WieldLocation.WEAPON_HAND], self.weapon
)
# the two-hander removes the two weapons
self.character.equipment.use(self.big_weapon)
self.assertEqual(
self.character.equipment.slots[enums.WieldLocation.TWO_HANDS], self.big_weapon
)
self.assertEqual(self.character.equipment.slots[enums.WieldLocation.SHIELD_HAND], None)
self.assertEqual(self.character.equipment.slots[enums.WieldLocation.WEAPON_HAND], None)
def test_remove__with_obj(self):
self.character.equipment.use(self.shield)
self.character.equipment.use(self.item)
self.character.equipment.add(self.weapon)
self.assertEqual(
self.character.equipment.slots[enums.WieldLocation.SHIELD_HAND], self.shield
)
self.assertEqual(
self.character.equipment.slots[enums.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[enums.WieldLocation.SHIELD_HAND], None)
self.assertEqual(
self.character.equipment.slots[enums.WieldLocation.BACKPACK], [self.weapon]
)
def test_remove__with_slot(self):
self.character.equipment.use(self.shield)
self.character.equipment.use(self.item)
self.character.equipment.add(self.helmet)
self.assertEqual(
self.character.equipment.slots[enums.WieldLocation.SHIELD_HAND], self.shield
)
self.assertEqual(
self.character.equipment.slots[enums.WieldLocation.BACKPACK], [self.item, self.helmet]
)
self.assertEqual(
self.character.equipment.remove(enums.WieldLocation.SHIELD_HAND), [self.shield]
)
self.assertEqual(
self.character.equipment.remove(enums.WieldLocation.BACKPACK), [self.item, self.helmet]
)
self.assertEqual(self.character.equipment.slots[enums.WieldLocation.SHIELD_HAND], None)
self.assertEqual(self.character.equipment.slots[enums.WieldLocation.BACKPACK], [])
def test_properties(self):
self.character.equipment.use(self.armor)
self.assertEqual(self.character.equipment.armor, 1)
self.character.equipment.use(self.shield)
self.assertEqual(self.character.equipment.armor, 2)
self.character.equipment.use(self.helmet)
self.assertEqual(self.character.equipment.armor, 3)
self.character.equipment.use(self.weapon)
self.assertEqual(self.character.equipment.weapon, self.weapon)
self.character.equipment.use(self.big_weapon)
self.assertEqual(self.character.equipment.weapon, self.big_weapon)