165 lines
5.4 KiB
Python
165 lines
5.4 KiB
Python
|
|
#!/usr/bin/env python3
|
|||
|
|
"""
|
|||
|
|
测试支援线指定位置部署功能
|
|||
|
|
"""
|
|||
|
|
import sys
|
|||
|
|
import os
|
|||
|
|
# 添加项目根目录到Python路径
|
|||
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..'))
|
|||
|
|
|
|||
|
|
from kards_battle.core.battle_engine import BattleEngine
|
|||
|
|
from kards_battle.examples.sample_units import create_german_infantry, create_american_gi, create_german_panzer_iv
|
|||
|
|
|
|||
|
|
|
|||
|
|
def test_position_deployment():
|
|||
|
|
"""测试指定位置部署"""
|
|||
|
|
print("\n🎯 支援线指定位置部署测试")
|
|||
|
|
print("-" * 40)
|
|||
|
|
|
|||
|
|
engine = BattleEngine("Germany", "USA", debug_mode=True)
|
|||
|
|
|
|||
|
|
# 创建多个单位
|
|||
|
|
unit1 = create_german_infantry()
|
|||
|
|
unit1.name = "Infantry 1"
|
|||
|
|
|
|||
|
|
unit2 = create_german_panzer_iv()
|
|||
|
|
unit2.name = "Panzer 2"
|
|||
|
|
|
|||
|
|
unit3 = create_german_infantry()
|
|||
|
|
unit3.name = "Infantry 3"
|
|||
|
|
|
|||
|
|
print("初始战场:")
|
|||
|
|
print(engine.battlefield)
|
|||
|
|
|
|||
|
|
# 测试1: 默认位置部署(末尾)
|
|||
|
|
result1 = engine.deploy_unit_to_support(unit1, 0)
|
|||
|
|
print(f"\n部署Infantry 1到默认位置: {result1['success']}")
|
|||
|
|
if result1['success']:
|
|||
|
|
print(f" 实际位置: {result1['position']}")
|
|||
|
|
|
|||
|
|
print("部署后战场:")
|
|||
|
|
print(engine.battlefield)
|
|||
|
|
|
|||
|
|
# 测试2: 指定位置1部署
|
|||
|
|
result2 = engine.deploy_unit_to_support(unit2, 0, position=1)
|
|||
|
|
print(f"\n部署Panzer 2到位置1: {result2['success']}")
|
|||
|
|
if result2['success']:
|
|||
|
|
print(f" 实际位置: {result2['position']}")
|
|||
|
|
|
|||
|
|
print("部署后战场:")
|
|||
|
|
print(engine.battlefield)
|
|||
|
|
|
|||
|
|
# 测试3: 指定位置0部署(最前面)
|
|||
|
|
result3 = engine.deploy_unit_to_support(unit3, 0, position=0)
|
|||
|
|
print(f"\n部署Infantry 3到位置0: {result3['success']}")
|
|||
|
|
if result3['success']:
|
|||
|
|
print(f" 实际位置: {result3['position']}")
|
|||
|
|
|
|||
|
|
print("最终战场:")
|
|||
|
|
print(engine.battlefield)
|
|||
|
|
|
|||
|
|
# 验证单位顺序是否正确
|
|||
|
|
support_line = engine.battlefield.get_player_support_line(engine.player_names[0])
|
|||
|
|
objectives = support_line.get_all_objectives()
|
|||
|
|
|
|||
|
|
print(f"\n单位顺序验证:")
|
|||
|
|
for i, obj in enumerate(objectives):
|
|||
|
|
if hasattr(obj, 'name'):
|
|||
|
|
print(f" 位置{i}: {obj.name}")
|
|||
|
|
else:
|
|||
|
|
print(f" 位置{i}: HQ")
|
|||
|
|
|
|||
|
|
# 期望顺序: Infantry 3(位置0), HQ(被挤到位置1), Panzer 2(位置2), Infantry 1(被挤到位置3)
|
|||
|
|
expected_order = ["Infantry 3", "HQ", "Panzer 2", "Infantry 1"]
|
|||
|
|
actual_order = []
|
|||
|
|
for obj in objectives:
|
|||
|
|
if hasattr(obj, 'name'):
|
|||
|
|
actual_order.append(obj.name)
|
|||
|
|
else:
|
|||
|
|
actual_order.append("HQ")
|
|||
|
|
|
|||
|
|
order_correct = actual_order == expected_order
|
|||
|
|
print(f"✅ 单位顺序正确: {'是' if order_correct else '否'}")
|
|||
|
|
print(f"期望: {expected_order}")
|
|||
|
|
print(f"实际: {actual_order}")
|
|||
|
|
|
|||
|
|
assert all([result1['success'], result2['success'], result3['success'], order_correct]), "Position deployment should work correctly"
|
|||
|
|
|
|||
|
|
|
|||
|
|
def test_edge_cases():
|
|||
|
|
"""测试边界情况"""
|
|||
|
|
print("\n🔍 边界情况测试")
|
|||
|
|
print("-" * 40)
|
|||
|
|
|
|||
|
|
engine = BattleEngine("Germany", "USA", debug_mode=True)
|
|||
|
|
|
|||
|
|
unit1 = create_german_infantry()
|
|||
|
|
unit1.name = "Test Unit"
|
|||
|
|
|
|||
|
|
# 测试1: 负数位置
|
|||
|
|
result1 = engine.deploy_unit_to_support(unit1, 0, position=-1)
|
|||
|
|
print(f"部署到负数位置: {'失败' if not result1['success'] else '成功'}")
|
|||
|
|
print(f" 错误信息: {result1.get('reason', 'None')}")
|
|||
|
|
|
|||
|
|
# 测试2: 超大位置(应该部署到末尾)
|
|||
|
|
result2 = engine.deploy_unit_to_support(unit1, 0, position=999)
|
|||
|
|
print(f"部署到超大位置: {result2['success']}")
|
|||
|
|
if result2['success']:
|
|||
|
|
print(f" 实际位置: {result2['position']}")
|
|||
|
|
|
|||
|
|
# 测试3: 支援线满了的情况
|
|||
|
|
# 先填满支援线
|
|||
|
|
for i in range(4): # 支援线最多5个目标,已有HQ,再加4个单位就满了
|
|||
|
|
unit = create_german_infantry()
|
|||
|
|
unit.name = f"Filler {i}"
|
|||
|
|
engine.deploy_unit_to_support(unit, 0)
|
|||
|
|
|
|||
|
|
print(f"\n支援线满后状态:")
|
|||
|
|
print(engine.battlefield)
|
|||
|
|
|
|||
|
|
# 尝试再部署一个单位
|
|||
|
|
extra_unit = create_german_infantry()
|
|||
|
|
extra_unit.name = "Extra Unit"
|
|||
|
|
result3 = engine.deploy_unit_to_support(extra_unit, 0, position=2)
|
|||
|
|
print(f"支援线满时部署: {'失败' if not result3['success'] else '成功'}")
|
|||
|
|
print(f" 错误信息: {result3.get('reason', 'None')}")
|
|||
|
|
|
|||
|
|
assert not result1['success'], "Negative position deployment should fail"
|
|||
|
|
assert result2['success'], "Large position deployment should succeed"
|
|||
|
|
assert not result3['success'], "Full support line deployment should fail"
|
|||
|
|
|
|||
|
|
|
|||
|
|
def run_all_tests():
|
|||
|
|
"""运行所有测试"""
|
|||
|
|
print("🧪 支援线位置部署测试套件")
|
|||
|
|
print("=" * 50)
|
|||
|
|
|
|||
|
|
tests = [
|
|||
|
|
("指定位置部署", test_position_deployment),
|
|||
|
|
("边界情况", test_edge_cases),
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
results = {}
|
|||
|
|
for name, test_func in tests:
|
|||
|
|
try:
|
|||
|
|
results[name] = test_func()
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"❌ {name} 测试异常: {e}")
|
|||
|
|
results[name] = False
|
|||
|
|
|
|||
|
|
print("\n📊 测试结果汇总")
|
|||
|
|
print("=" * 50)
|
|||
|
|
|
|||
|
|
all_passed = True
|
|||
|
|
for name, passed in results.items():
|
|||
|
|
status = "✅ 通过" if passed else "❌ 失败"
|
|||
|
|
print(f"{name}: {status}")
|
|||
|
|
if not passed:
|
|||
|
|
all_passed = False
|
|||
|
|
|
|||
|
|
print(f"\n总体结果: {'🎉 全部通过!' if all_passed else '❌ 有测试失败'}")
|
|||
|
|
return all_passed
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
run_all_tests()
|