Files
tft/backend/tests/test_parse.py
team3 c450841822 Mechanisches Boardstärke-Modell: Statsheet aus cdragon-Exaktdaten, sqrt(eHP×DPS), Tier-Anker, Tau-Fit
A/B auf 38 Holdout-Matches: mechanical 0.724 vs legacy 0.695. Promotion durchgeführt.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 08:52:56 +02:00

78 lines
2.7 KiB
Python

from tft.staticdata.parse import parse, resolve_spell
RAW = {
"sets": {
"17": {
"name": "Set17",
"champions": [
{
"apiName": "TFT17_Mage",
"name": "Mage",
"cost": 2,
"traits": ["Caster"],
"role": "Caster",
"stats": {"hp": 600, "armor": 25, "magicResist": 25, "damage": 40,
"attackSpeed": 0.7, "mana": 60, "initialMana": 10},
"squareIcon": "ASSETS/x.TFT_Set17.tex",
"ability": {
"name": "Blast",
"desc": "Deal <magicDamage>@ModifiedDamage@ (%i:scaleAP%)</magicDamage> magic damage.",
"variables": [{"name": "Damage", "value": [0, 200, 300, 450, 700, 0, 0]}],
},
},
],
"traits": [
{
"apiName": "TFT17_Caster",
"name": "Caster",
"icon": "ASSETS/t.tex",
"effects": [
{"minUnits": 2, "maxUnits": 3, "style": 1,
"variables": {"BonusAP": 20.0}},
],
},
],
},
},
"items": [
{
"apiName": "TFT_Item_TestSword",
"name": "Test Sword",
"composition": ["TFT_Item_A", "TFT_Item_B"],
"effects": {"AD": 0.35, "CritChance": 35.0},
"icon": "ASSETS/i.tex",
},
],
}
def test_parse_keeps_effects_and_variables():
parsed = parse(RAW, set_override=17)
assert parsed["items"]["TFT_Item_TestSword"]["effects"] == {"AD": 0.35, "CritChance": 35.0}
bp = parsed["traits"]["TFT17_Caster"]["breakpoints"][0]
assert bp["variables"] == {"BonusAP": 20.0}
def test_parse_resolves_spell_damage():
unit = parse(RAW, set_override=17)["units"]["TFT17_Mage"]
assert unit["spell_damage"] == [0, 200, 300, 450, 700, 0, 0]
assert unit["spell_damage_type"] == "magic"
assert unit["spell_scaling"] == "ap"
def test_resolve_spell_adaptive_and_fallback():
adaptive = {
"desc": "Deal <magicDamage>@TotalDamage@</magicDamage> damage. %i:scaleAP% %i:scaleAD%",
"variables": [
{"name": "ADDamage", "value": [0, 100, 150, 225, 0, 0, 0]},
{"name": "APDamage", "value": [0, 50, 75, 110, 0, 0, 0]},
],
}
r = resolve_spell(adaptive)
assert r["spell_damage"][1] == 150 # 100 + 50
assert r["spell_scaling"] == "both"
utility = {"desc": "Grant a shield.", "variables": [
{"name": "Shield", "value": [0, 300, 400, 500, 0, 0, 0]}]}
assert resolve_spell(utility)["spell_damage"] is None