charasheet/src/character/tests/test_character.py

87 lines
2.5 KiB
Python
Raw Normal View History

2022-10-30 09:30:54 +01:00
import pytest
from hypothesis import given
from hypothesis.strategies import integers
from character.models.character import Character
from character.tests.utils import ability_values, levels, modifier_test
@pytest.mark.parametrize(
"value,expected",
[
(1, -4),
(2, -4),
(3, -4),
(4, -3),
(5, -3),
(6, -2),
(7, -2),
(8, -1),
(9, -1),
(10, 0),
(11, 0),
(12, 1),
(13, 1),
(14, 2),
(15, 2),
(16, 3),
(17, 3),
(18, 4),
(19, 4),
(20, 5),
(21, 5),
],
)
@pytest.mark.parametrize(
"ability",
["strength", "dexterity", "constitution", "intelligence", "wisdom", "charisma"],
)
def test_modifier_values(value, expected, ability):
character = Character()
value_attribute = f"value_{ability}"
setattr(character, value_attribute, value)
modifier_attribute = f"modifier_{ability}"
assert getattr(character, modifier_attribute) == expected
@given(ability_values())
def test_initiative(dex):
assert Character(value_dexterity=dex).initiative == dex
@given(level=levels(), strength=ability_values())
def test_attack_melee(level, strength):
character = Character(level=level, value_strength=strength)
assert character.attack_melee == level + modifier_test(strength)
@given(level=levels(), dexterity=ability_values())
def test_attack_range(level, dexterity):
character = Character(level=level, value_dexterity=dexterity)
assert character.attack_range == level + modifier_test(dexterity)
@given(armor=integers(), shield=integers(), dexterity=ability_values(), misc=integers())
def test_defense(armor, shield, dexterity, misc):
char = Character(
armor=armor, shield=shield, value_dexterity=dexterity, defense_misc=misc
)
assert char.defense == 10 + armor + shield + modifier_test(dexterity) + misc
@given(level=levels(), intelligence=ability_values())
def test_mana_max(level, intelligence):
char = Character(level=level, value_intelligence=intelligence)
assert char.mana_max == 2 * level + modifier_test(intelligence)
@given(
level=levels(), intelligence=ability_values(), mana_consumed=integers(min_value=0)
)
def test_mana_remaining(level, intelligence, mana_consumed):
char = Character(
level=level, value_intelligence=intelligence, mana_consumed=mana_consumed
)
mana_max = 2 * level + modifier_test(intelligence)
assert char.mana_remaining == mana_max - mana_consumed