338 lines
12 KiB
Python
338 lines
12 KiB
Python
|
|
"""
|
||
|
|
卡牌参数系统测试
|
||
|
|
"""
|
||
|
|
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
|