kards-env/tests/test_card_params.py

338 lines
12 KiB
Python
Raw Permalink Normal View History

2025-09-05 17:05:43 +08:00
"""
卡牌参数系统测试
"""
import pytest
from kards_battle.cards.card_params import (
ParameterDefinition, ParameterType, TargetType, ZoneType, FilterType,
CardParameterValidator, CardParameterHelper
)
from kards_battle.cards.card_loader import CardLoader
from kards_battle.core.enums import Nation
class TestParameterDefinition:
"""参数定义测试"""
def test_slot_parameter_creation(self):
"""测试槽位参数定义"""
param_data = {
"name": "position",
"type": "slot",
"range": [0, 4],
"required": False,
"description": "Deploy position"
}
param_def = ParameterDefinition.from_dict(param_data)
assert param_def.name == "position"
assert param_def.param_type == ParameterType.SLOT
assert param_def.slot_range == [0, 4]
assert not param_def.required
assert param_def.description == "Deploy position"
def test_target_parameter_creation(self):
"""测试目标参数定义"""
param_data = {
"name": "target_hq",
"type": "target",
"target_type": "hq",
"filter": "any",
"required": True,
"description": "Select HQ to target"
}
param_def = ParameterDefinition.from_dict(param_data)
assert param_def.name == "target_hq"
assert param_def.param_type == ParameterType.TARGET
assert param_def.target_type == TargetType.HQ
assert param_def.target_filter == FilterType.ANY
assert param_def.required
def test_unit_target_parameter_creation(self):
"""测试单位目标参数定义"""
param_data = {
"name": "target_unit",
"type": "target",
"target_type": "unit",
"valid_zones": ["O", "F"],
"filter": "friendly",
"unit_type_filter": ["fighter", "bomber"],
"nation_filter": ["uk"],
"required": True,
"description": "Select British aircraft"
}
param_def = ParameterDefinition.from_dict(param_data)
assert param_def.target_type == TargetType.UNIT
assert param_def.valid_zones == [ZoneType.OWN, ZoneType.FRONT]
assert param_def.target_filter == FilterType.FRIENDLY
assert param_def.unit_type_filter == ["fighter", "bomber"]
assert param_def.nation_filter == ["uk"]
def test_multi_target_parameter_creation(self):
"""测试多目标参数定义"""
param_data = {
"name": "targets",
"type": "multi_target",
"target_type": "unit",
"valid_zones": ["E", "F"],
"filter": "enemy",
"min_count": 1,
"max_count": 3,
"required": True,
"description": "Select up to 3 enemy units"
}
param_def = ParameterDefinition.from_dict(param_data)
assert param_def.param_type == ParameterType.MULTI_TARGET
assert param_def.min_count == 1
assert param_def.max_count == 3
class TestParameterValidator:
"""参数验证器测试"""
def test_validate_slot_parameter(self):
"""测试槽位参数验证"""
param_def = ParameterDefinition(
name="position",
param_type=ParameterType.SLOT,
slot_range=[0, 4]
)
# 有效槽位
assert CardParameterValidator.validate_slot_parameter(param_def, 0)
assert CardParameterValidator.validate_slot_parameter(param_def, 2)
assert CardParameterValidator.validate_slot_parameter(param_def, 4)
# 无效槽位
assert not CardParameterValidator.validate_slot_parameter(param_def, -1)
assert not CardParameterValidator.validate_slot_parameter(param_def, 5)
assert not CardParameterValidator.validate_slot_parameter(param_def, "invalid")
def test_validate_hq_target_parameter(self):
"""测试HQ目标参数验证"""
param_def = ParameterDefinition(
name="target_hq",
param_type=ParameterType.TARGET,
target_type=TargetType.HQ
)
# 有效HQ目标
valid_hq = {"player": 0}
assert CardParameterValidator.validate_target_parameter(param_def, valid_hq)
valid_hq2 = {"player": 1}
assert CardParameterValidator.validate_target_parameter(param_def, valid_hq2)
# 无效HQ目标
invalid_hq1 = {"player": 2} # 无效玩家ID
assert not CardParameterValidator.validate_target_parameter(param_def, invalid_hq1)
invalid_hq2 = {} # 缺少player字段
assert not CardParameterValidator.validate_target_parameter(param_def, invalid_hq2)
invalid_hq3 = {"player": "invalid"} # 非整数
assert not CardParameterValidator.validate_target_parameter(param_def, invalid_hq3)
def test_validate_unit_target_parameter(self):
"""测试单位目标参数验证"""
param_def = ParameterDefinition(
name="target_unit",
param_type=ParameterType.TARGET,
target_type=TargetType.UNIT,
valid_zones=[ZoneType.OWN, ZoneType.FRONT]
)
# 有效单位目标
valid_unit = {"zone": "O", "slot": 2}
assert CardParameterValidator.validate_target_parameter(param_def, valid_unit)
valid_unit2 = {"zone": "F", "slot": 0}
assert CardParameterValidator.validate_target_parameter(param_def, valid_unit2)
# 无效单位目标
invalid_unit1 = {"zone": "E", "slot": 2} # 不在valid_zones中
assert not CardParameterValidator.validate_target_parameter(param_def, invalid_unit1)
invalid_unit2 = {"zone": "O", "slot": 5} # 槽位超出范围
assert not CardParameterValidator.validate_target_parameter(param_def, invalid_unit2)
invalid_unit3 = {"zone": "O"} # 缺少slot
assert not CardParameterValidator.validate_target_parameter(param_def, invalid_unit3)
def test_validate_multi_target_parameter(self):
"""测试多目标参数验证"""
param_def = ParameterDefinition(
name="targets",
param_type=ParameterType.MULTI_TARGET,
target_type=TargetType.UNIT,
valid_zones=[ZoneType.ENEMY],
min_count=1,
max_count=3
)
# 有效多目标
valid_targets = [
{"zone": "E", "slot": 0},
{"zone": "E", "slot": 2}
]
assert CardParameterValidator.validate_multi_target_parameter(param_def, valid_targets)
# 数量不足
too_few = []
assert not CardParameterValidator.validate_multi_target_parameter(param_def, too_few)
# 数量过多
too_many = [
{"zone": "E", "slot": 0},
{"zone": "E", "slot": 1},
{"zone": "E", "slot": 2},
{"zone": "E", "slot": 3}
]
assert not CardParameterValidator.validate_multi_target_parameter(param_def, too_many)
def test_validate_card_parameters(self):
"""测试卡牌参数集合验证"""
definitions = [
ParameterDefinition(
name="target",
param_type=ParameterType.TARGET,
target_type=TargetType.HQ,
required=True
),
ParameterDefinition(
name="value",
param_type=ParameterType.VALUE,
min_value=1,
max_value=10,
required=False
)
]
# 有效参数
valid_params = {
"target": {"player": 0},
"value": 5
}
errors = CardParameterValidator.validate_card_parameters(definitions, valid_params)
assert len(errors) == 0
# 缺少必需参数
missing_required = {"value": 5}
errors = CardParameterValidator.validate_card_parameters(definitions, missing_required)
assert "target" in errors
# 未知参数
unknown_param = {
"target": {"player": 0},
"unknown": "value"
}
errors = CardParameterValidator.validate_card_parameters(definitions, unknown_param)
assert "unknown" in errors
class TestCardParameterHelper:
"""卡牌参数辅助类测试"""
def test_format_parameter_value(self):
"""测试参数值格式化"""
# 槽位参数
slot_def = ParameterDefinition(name="pos", param_type=ParameterType.SLOT)
assert CardParameterHelper.format_parameter_value(slot_def, 2) == "slot 2"
# HQ目标参数
hq_def = ParameterDefinition(name="hq", param_type=ParameterType.TARGET, target_type=TargetType.HQ)
assert CardParameterHelper.format_parameter_value(hq_def, {"player": 0}) == "HQ0"
# 单位目标参数
unit_def = ParameterDefinition(name="unit", param_type=ParameterType.TARGET, target_type=TargetType.UNIT)
assert CardParameterHelper.format_parameter_value(unit_def, {"zone": "O", "slot": 2}) == "O2"
# 多目标参数
multi_def = ParameterDefinition(name="units", param_type=ParameterType.MULTI_TARGET, target_type=TargetType.UNIT)
multi_value = [{"zone": "E", "slot": 1}, {"zone": "E", "slot": 3}]
assert CardParameterHelper.format_parameter_value(multi_def, multi_value) == "E1, E3"
class TestCardLoaderWithParams:
"""卡牌加载器参数支持测试"""
def test_load_parameterized_card(self):
"""测试加载带参数的卡牌"""
loader = CardLoader()
# 创建测试卡牌数据
card_data = {
"id": "test_parameterized_card",
"name": "Test Parameterized Card",
"type": "unit",
"cost": 3,
"nation": "germany",
"rarity": 2,
"unit_definition_id": "test_unit",
"params": [
{
"name": "position",
"type": "slot",
"range": [0, 4],
"required": False,
"description": "Deploy position"
}
]
}
card = loader._create_unit_card(card_data)
assert card.has_parameters()
assert len(card.parameters) == 1
param = card.parameters[0]
assert param.name == "position"
assert param.param_type == ParameterType.SLOT
assert not param.required
def test_card_parameter_validation(self):
"""测试卡牌参数验证"""
loader = CardLoader()
card_data = {
"id": "test_card",
"name": "Test Card",
"type": "unit",
"cost": 2,
"nation": "germany",
"rarity": 1,
"unit_definition_id": "test_unit",
"params": [
{
"name": "target",
"type": "target",
"target_type": "hq",
"filter": "enemy",
"required": True,
"description": "Select enemy HQ"
}
]
}
card = loader._create_unit_card(card_data)
# 测试有效参数
valid_params = {"target": {"player": 1}}
errors = card.validate_parameters(valid_params)
assert len(errors) == 0
# 测试无效参数
invalid_params = {"target": {"player": 2}}
errors = card.validate_parameters(invalid_params)
assert len(errors) > 0
# 测试缺少必需参数
missing_params = {}
errors = card.validate_parameters(missing_params)
assert len(errors) > 0