mirror of
https://github.com/Crocmagnon/charasheet.git
synced 2024-11-05 06:13:55 +01:00
Add some tests
This commit is contained in:
parent
24eefc7467
commit
e3522a9d61
6 changed files with 159 additions and 1 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -34,3 +34,5 @@ src/public/static/
|
||||||
import_files/
|
import_files/
|
||||||
test_reports/
|
test_reports/
|
||||||
dashboard_templates/backup_*.zip
|
dashboard_templates/backup_*.zip
|
||||||
|
|
||||||
|
.hypothesis
|
||||||
|
|
35
poetry.lock
generated
35
poetry.lock
generated
|
@ -313,6 +313,35 @@ category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.7"
|
python-versions = ">=3.7"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hypothesis"
|
||||||
|
version = "6.56.4"
|
||||||
|
description = "A library for property-based testing"
|
||||||
|
category = "dev"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
attrs = ">=19.2.0"
|
||||||
|
exceptiongroup = {version = ">=1.0.0", markers = "python_version < \"3.11\""}
|
||||||
|
sortedcontainers = ">=2.1.0,<3.0.0"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
all = ["backports.zoneinfo (>=0.2.1)", "black (>=19.10b0)", "click (>=7.0)", "django (>=3.2)", "dpcontracts (>=0.4)", "importlib-metadata (>=3.6)", "lark-parser (>=0.6.5)", "libcst (>=0.3.16)", "numpy (>=1.9.0)", "pandas (>=1.0)", "pytest (>=4.6)", "python-dateutil (>=1.4)", "pytz (>=2014.1)", "redis (>=3.0.0)", "rich (>=9.0.0)", "tzdata (>=2022.5)"]
|
||||||
|
cli = ["black (>=19.10b0)", "click (>=7.0)", "rich (>=9.0.0)"]
|
||||||
|
codemods = ["libcst (>=0.3.16)"]
|
||||||
|
dateutil = ["python-dateutil (>=1.4)"]
|
||||||
|
django = ["django (>=3.2)"]
|
||||||
|
dpcontracts = ["dpcontracts (>=0.4)"]
|
||||||
|
ghostwriter = ["black (>=19.10b0)"]
|
||||||
|
lark = ["lark-parser (>=0.6.5)"]
|
||||||
|
numpy = ["numpy (>=1.9.0)"]
|
||||||
|
pandas = ["pandas (>=1.0)"]
|
||||||
|
pytest = ["pytest (>=4.6)"]
|
||||||
|
pytz = ["pytz (>=2014.1)"]
|
||||||
|
redis = ["redis (>=3.0.0)"]
|
||||||
|
zoneinfo = ["backports.zoneinfo (>=0.2.1)", "tzdata (>=2022.5)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "identify"
|
name = "identify"
|
||||||
version = "2.5.8"
|
version = "2.5.8"
|
||||||
|
@ -865,7 +894,7 @@ h11 = ">=0.9.0,<1"
|
||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "1.1"
|
lock-version = "1.1"
|
||||||
python-versions = ">=3.10.0, <4"
|
python-versions = ">=3.10.0, <4"
|
||||||
content-hash = "d566d58d59e11f9bc96abc0c53cc8b00b8b5d6b1c886b82570cc0fb1cdc158fd"
|
content-hash = "0dc2fab20f892efa2b0acbddd23ae1378d5c5ae24ece6357f11858c625cced68"
|
||||||
|
|
||||||
[metadata.files]
|
[metadata.files]
|
||||||
ansicon = [
|
ansicon = [
|
||||||
|
@ -1187,6 +1216,10 @@ h11 = [
|
||||||
{file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"},
|
{file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"},
|
||||||
{file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"},
|
{file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"},
|
||||||
]
|
]
|
||||||
|
hypothesis = [
|
||||||
|
{file = "hypothesis-6.56.4-py3-none-any.whl", hash = "sha256:67950103ee930c66673494b3671474a083ea71f1ebe8f0ff849ba8ad5317772d"},
|
||||||
|
{file = "hypothesis-6.56.4.tar.gz", hash = "sha256:313bc1c0f377ec6c98815d3237a69add7558eadee4effe4ed613d0ba36513a52"},
|
||||||
|
]
|
||||||
identify = [
|
identify = [
|
||||||
{file = "identify-2.5.8-py2.py3-none-any.whl", hash = "sha256:48b7925fe122720088aeb7a6c34f17b27e706b72c61070f27fe3789094233440"},
|
{file = "identify-2.5.8-py2.py3-none-any.whl", hash = "sha256:48b7925fe122720088aeb7a6c34f17b27e706b72c61070f27fe3789094233440"},
|
||||||
{file = "identify-2.5.8.tar.gz", hash = "sha256:7a214a10313b9489a0d61467db2856ae8d0b8306fc923e03a9effa53d8aedc58"},
|
{file = "identify-2.5.8.tar.gz", hash = "sha256:7a214a10313b9489a0d61467db2856ae8d0b8306fc923e03a9effa53d8aedc58"},
|
||||||
|
|
|
@ -32,6 +32,7 @@ freezegun = ">=1.1.0"
|
||||||
bpython = ">=0.22.1"
|
bpython = ">=0.22.1"
|
||||||
poetry-deps-scanner = ">=2.0.0"
|
poetry-deps-scanner = ">=2.0.0"
|
||||||
invoke = ">=1.7.3"
|
invoke = ">=1.7.3"
|
||||||
|
hypothesis = ">=6.56.4"
|
||||||
|
|
||||||
[build-system]
|
[build-system]
|
||||||
requires = ["poetry-core>=1.0.0"]
|
requires = ["poetry-core>=1.0.0"]
|
||||||
|
|
|
@ -155,6 +155,7 @@ class Character(models.Model):
|
||||||
Profile.MagicalStrength.INTELLIGENCE: self.modifier_intelligence,
|
Profile.MagicalStrength.INTELLIGENCE: self.modifier_intelligence,
|
||||||
Profile.MagicalStrength.WISDOM: self.modifier_wisdom,
|
Profile.MagicalStrength.WISDOM: self.modifier_wisdom,
|
||||||
Profile.MagicalStrength.CHARISMA: self.modifier_charisma,
|
Profile.MagicalStrength.CHARISMA: self.modifier_charisma,
|
||||||
|
Profile.MagicalStrength.NONE: 0,
|
||||||
}
|
}
|
||||||
|
|
||||||
return self.level + modifier_map.get(
|
return self.level + modifier_map.get(
|
||||||
|
|
86
src/character/tests/test_character.py
Normal file
86
src/character/tests/test_character.py
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
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
|
35
src/character/tests/utils.py
Normal file
35
src/character/tests/utils.py
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
from functools import partial
|
||||||
|
|
||||||
|
from hypothesis.strategies import integers
|
||||||
|
|
||||||
|
VALUE_TO_MODIFIER = {
|
||||||
|
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,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def modifier_test(value: int) -> int:
|
||||||
|
return VALUE_TO_MODIFIER[value]
|
||||||
|
|
||||||
|
|
||||||
|
ability_values = partial(integers, min_value=1, max_value=21)
|
||||||
|
levels = partial(integers, min_value=1)
|
Loading…
Reference in a new issue