197 lines
6.7 KiB
Python
197 lines
6.7 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
测试交互式攻击命令
|
||
包括单位攻击单位和单位攻击HQ的测试
|
||
"""
|
||
import sys
|
||
import os
|
||
|
||
# 添加项目路径
|
||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
|
||
|
||
from kards_battle.core.battle_engine import BattleEngine
|
||
from kards_battle.units.unit_loader import load_unit
|
||
from interactive.command_parser import CommandParser
|
||
from interactive.test_scenarios import TestScenarios
|
||
|
||
|
||
def test_attack_unit_to_unit():
|
||
"""测试单位攻击单位"""
|
||
print("=== 测试单位攻击单位 ===")
|
||
|
||
# 创建引擎
|
||
engine = BattleEngine("Germany", "USA", debug_mode=True)
|
||
parser = CommandParser(engine)
|
||
scenarios = TestScenarios()
|
||
|
||
# 加载前线场景
|
||
scenarios.load_scenario('frontline', engine)
|
||
|
||
# 测试攻击支援线上的单位,而不是前线
|
||
# 前线已被德军控制,美军无法部署到前线
|
||
# 所以我们测试德军前线单位攻击美军支援线单位
|
||
|
||
print("初始状态:")
|
||
_print_battlefield_state(engine)
|
||
|
||
# 测试攻击命令:德军掷弹兵(F0)攻击美军海军陆战队(S1)
|
||
print("\n执行攻击: F0 -> S1 (前线攻击敌方支援线)")
|
||
success, message = parser.parse("attack F0 S1")
|
||
|
||
print(f"攻击结果: {success}")
|
||
print(f"消息: {message}")
|
||
|
||
assert success, f"攻击应该成功,但失败了: {message}"
|
||
print("\n攻击后状态:")
|
||
_print_battlefield_state(engine)
|
||
|
||
|
||
def test_attack_unit_to_hq():
|
||
"""测试单位攻击HQ"""
|
||
print("\n=== 测试单位攻击HQ ===")
|
||
|
||
# 创建引擎
|
||
engine = BattleEngine("Germany", "USA", debug_mode=True)
|
||
parser = CommandParser(engine)
|
||
scenarios = TestScenarios()
|
||
|
||
# 加载前线场景
|
||
scenarios.load_scenario('frontline', engine)
|
||
|
||
print("初始状态:")
|
||
_print_battlefield_state(engine)
|
||
print(f"美军HQ初始血量: {engine.battlefield.player2_hq.current_defense}/{engine.battlefield.player2_hq.defense}")
|
||
|
||
# 测试攻击命令:德军掷弹兵(F0)攻击美军HQ(S0)
|
||
print("\n执行攻击: F0 -> S0 (攻击敌方HQ)")
|
||
success, message = parser.parse("attack F0 S0")
|
||
|
||
print(f"攻击结果: {success}")
|
||
print(f"消息: {message}")
|
||
|
||
assert success, f"攻击HQ应该成功,但失败了: {message}"
|
||
print("\n攻击后状态:")
|
||
print(f"美军HQ血量: {engine.battlefield.player2_hq.current_defense}/{engine.battlefield.player2_hq.defense}")
|
||
_print_battlefield_state(engine)
|
||
|
||
|
||
def test_attack_support_to_front():
|
||
"""测试支援线攻击 - 使用能成功的攻击组合"""
|
||
print("\n=== 测试支援线攻击 ===")
|
||
|
||
# 创建引擎并部署火炮单位
|
||
engine = BattleEngine("Germany", "USA", debug_mode=True)
|
||
parser = CommandParser(engine)
|
||
|
||
# 部署德军火炮到支援线
|
||
from kards_battle.units.unit_loader import load_unit
|
||
artillery = load_unit('ger_artillery_88mm')
|
||
engine.deploy_unit_to_support(artillery, 0) # 德军
|
||
|
||
# 部署美军步兵到支援线作为目标
|
||
marine = load_unit('usa_infantry_marine')
|
||
engine.deploy_unit_to_support(marine, 1) # 美军
|
||
|
||
# 确保有足够的Kredits进行攻击
|
||
engine.debug_set_kredits(0, kredits=5)
|
||
|
||
print("初始状态:")
|
||
_print_battlefield_state(engine)
|
||
|
||
# 测试攻击命令:德军火炮(S1)攻击美军海军陆战队(S0)
|
||
# 火炮应该能攻击敌方支援线单位
|
||
print("\n执行攻击: S1 -> S0 (己方支援线火炮攻击敌方支援线)")
|
||
success, message = parser.parse("attack S1 S0")
|
||
|
||
print(f"攻击结果: {success}")
|
||
print(f"消息: {message}")
|
||
|
||
assert success, f"火炮攻击应该成功,但失败了: {message}"
|
||
print("\n攻击后状态:")
|
||
_print_battlefield_state(engine)
|
||
|
||
|
||
def test_attack_simplified_vs_full_syntax():
|
||
"""测试简化格式 vs 完整格式"""
|
||
print("\n=== 测试简化格式 vs 完整格式 ===")
|
||
|
||
# 创建两个相同的引擎进行对比
|
||
engine1 = BattleEngine("Germany", "USA", debug_mode=True)
|
||
engine2 = BattleEngine("Germany", "USA", debug_mode=True)
|
||
parser1 = CommandParser(engine1)
|
||
parser2 = CommandParser(engine2)
|
||
scenarios = TestScenarios()
|
||
|
||
# 加载相同场景
|
||
scenarios.load_scenario('frontline', engine1)
|
||
scenarios.load_scenario('frontline', engine2)
|
||
|
||
# 测试简化格式
|
||
print("测试简化格式: attack F0 S0")
|
||
success1, message1 = parser1.parse("attack F0 S0")
|
||
|
||
# 测试完整格式
|
||
print("测试完整格式: attack FRONT 0 SUPPORT 0")
|
||
success2, message2 = parser2.parse("attack FRONT 0 SUPPORT 0")
|
||
|
||
print(f"简化格式结果: {success1} - {message1}")
|
||
print(f"完整格式结果: {success2} - {message2}")
|
||
|
||
# 验证结果一致
|
||
assert success1 == success2, f"两种格式结果不一致: 简化={success1}, 完整={success2}"
|
||
print("✅ 两种格式结果一致")
|
||
|
||
|
||
def test_attack_error_cases():
|
||
"""测试攻击错误情况"""
|
||
print("\n=== 测试攻击错误情况 ===")
|
||
|
||
engine = BattleEngine("Germany", "USA", debug_mode=True)
|
||
parser = CommandParser(engine)
|
||
scenarios = TestScenarios()
|
||
scenarios.load_scenario('frontline', engine)
|
||
|
||
test_cases = [
|
||
("attack", "参数不足"),
|
||
("attack F0", "参数不足"),
|
||
("attack F0 F0", "攻击自己"),
|
||
("attack F1 S0", "攻击者不存在"),
|
||
("attack S0 S1", "HQ不能主动攻击"),
|
||
("attack F0 S5", "目标位置不存在"),
|
||
("attack X0 S0", "无效位置格式"),
|
||
]
|
||
|
||
all_passed = True
|
||
for command, expected_type in test_cases:
|
||
print(f"\n测试错误情况: {command} ({expected_type})")
|
||
success, message = parser.parse(command)
|
||
print(f"结果: {success} - {message}")
|
||
|
||
assert not success, f"预期失败但成功了: {command} -> {message}"
|
||
print("✅ 正确识别错误")
|
||
|
||
|
||
def _print_battlefield_state(engine):
|
||
"""打印战场状态"""
|
||
print("\n当前战场:")
|
||
|
||
# 美军支援线
|
||
usa_support = engine.battlefield.player2_support.get_all_objectives()
|
||
print("美军支援线:", [f"[{i}]{obj.name if hasattr(obj, 'name') else 'HQ'}"
|
||
for i, obj in enumerate(usa_support) if obj])
|
||
|
||
# 前线
|
||
front = engine.battlefield.front_line.get_all_objectives()
|
||
print("前线:", [f"[{i}]{obj.name}({obj.owner})"
|
||
for i, obj in enumerate(front) if obj])
|
||
|
||
# 德军支援线
|
||
ger_support = engine.battlefield.player1_support.get_all_objectives()
|
||
print("德军支援线:", [f"[{i}]{obj.name if hasattr(obj, 'name') else 'HQ'}"
|
||
for i, obj in enumerate(ger_support) if obj])
|
||
|
||
|
||
if __name__ == "__main__":
|
||
# 运行所有测试
|
||
import pytest
|
||
pytest.main([__file__, "-v"]) |