#!/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()