kards-env/tests/unit/test_battle_engine.py.needs...

261 lines
9.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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.core.enums import LineType
from kards_battle.examples.sample_units import create_german_infantry, create_american_gi, create_german_88mm_gun
def test_kredits_slot_system():
"""测试Kredits Slot系统"""
print("\n💰 Kredits Slot系统测试")
print("-" * 40)
engine = BattleEngine("Germany", "USA", debug_mode=True)
# 初始状态检查
print(f"初始状态:")
print(f" 德军 Slot: {engine.get_kredits_slot(0)}, Kredits: {engine.get_kredits(0)}")
print(f" 美军 Slot: {engine.get_kredits_slot(1)}, Kredits: {engine.get_kredits(1)}")
# 模拟多回合,检查槽数增长
results = []
for turn in range(1, 25): # 测试到第25回合确保能达到12
result = engine.end_turn()
player = result["new_active_player"]
slot = result["kredits_slot"]
kredits = result["kredits"]
# 只打印关键回合
if turn <= 5 or slot >= 10 or turn == 24:
print(f"回合{turn+1}: {player} - Slot: {slot}, Kredits: {kredits}")
results.append((turn+1, player, slot, kredits))
# 验证规则
print("\n验证规则:")
slot_12_reached = any(slot >= 12 for _, _, slot, _ in results)
kredits_equal_slot = all(slot == kredits for _, _, slot, kredits in results)
print(f"✅ Slot达到12: {'' if slot_12_reached else ''}")
print(f"✅ Kredits等于Slot: {'' if kredits_equal_slot else ''}")
assert slot_12_reached, "Kredits Slot should reach 12"
assert kredits_equal_slot, "Kredits should always equal Kredits Slot"
def test_direct_unit_deployment():
"""测试直接单位部署功能"""
print("\n🚀 直接单位部署测试")
print("-" * 40)
engine = BattleEngine("Germany", "USA", debug_mode=True)
# 创建单位
german_inf = create_german_infantry()
american_gi = create_american_gi()
german_inf.stats.operation_cost = 1
american_gi.stats.operation_cost = 1
# 部署德军单位
deploy_result1 = engine.deploy_unit_to_support(german_inf, 0)
print(f"德军步兵部署: {deploy_result1['success']}")
# 部署美军单位
deploy_result2 = engine.deploy_unit_to_support(american_gi, 1)
print(f"美军GI部署: {deploy_result2['success']}")
print(f"\n战场状态:")
print(engine.battlefield)
success = deploy_result1["success"] and deploy_result2["success"]
print(f"✅ 部署测试: {'通过' if success else '失败'}")
assert success, "Unit deployment should succeed"
def test_movement_and_attack():
"""测试移动和攻击功能"""
print("\n⚔️ 移动和攻击测试")
print("-" * 40)
# Setup units for testing
engine = BattleEngine("Germany", "USA", debug_mode=True)
german_inf = create_german_infantry()
american_gi = create_american_gi()
german_inf.stats.operation_cost = 1
american_gi.stats.operation_cost = 1
# Deploy units
deploy_result1 = engine.deploy_unit_to_support(german_inf, 0)
deploy_result2 = engine.deploy_unit_to_support(american_gi, 1)
success = deploy_result1["success"] and deploy_result2["success"]
if not success:
print("❌ 部署失败,无法测试移动攻击")
assert False, "Unit deployment failed"
# 等待一回合让单位可以行动
engine.end_turn()
engine.end_turn()
# 给足够的Kredits
engine.debug_set_kredits(0, kredits=10)
engine.debug_set_kredits(1, kredits=10)
# 德军移动到前线
print(f"\n德军Kredits: {engine.get_kredits(0)}")
move_result = engine.move_unit(german_inf.id, (LineType.FRONT, 0), 0)
print(f"德军步兵移动到前线: {move_result['success']}")
print(f"德军剩余Kredits: {engine.get_kredits(0)}")
if move_result["success"]:
print(f"前线控制权: {move_result['front_line_controller']}")
print(f"战场状态:")
print(engine.battlefield)
# 切换到美军回合
engine.end_turn()
# 美军攻击德军
print(f"\n美军Kredits: {engine.get_kredits(1)}")
attack_result = engine.attack_target(american_gi.id, german_inf.id, 1)
print(f"美军攻击德军: {attack_result['success']}")
if attack_result["success"]:
print(f"造成伤害: {attack_result.get('damage_dealt', 0)}")
print(f"反击伤害: {attack_result.get('counter_damage', 0)}")
print(f"摧毁单位: {len(attack_result.get('units_destroyed', []))}")
print(f"美军剩余Kredits: {engine.get_kredits(1)}")
movement_success = move_result.get("success", False)
attack_success = attack_result.get("success", False)
print(f"✅ 移动测试: {'通过' if movement_success else '失败'}")
print(f"✅ 攻击测试: {'通过' if attack_success else '失败'}")
assert movement_success, "Unit movement should succeed"
assert attack_success, "Unit attack should succeed"
def test_debug_functions():
"""测试DEBUG功能"""
print("\n🔧 DEBUG功能测试")
print("-" * 40)
engine = BattleEngine("Germany", "USA", debug_mode=True)
# 测试设置Kredits
debug_result1 = engine.debug_set_kredits(0, kredits=15, kredits_slot=8)
print(f"设置德军Kredits/Slot: {debug_result1['success']}")
print(f" 德军 Kredits: {engine.get_kredits(0)}, Slot: {engine.get_kredits_slot(0)}")
# 测试设置HQ防御
debug_result2 = engine.debug_set_hq_defense(1, 10)
print(f"设置美军HQ防御: {debug_result2['success']}")
print(f" 美军HQ防御: {engine.battlefield.player2_hq.current_defense}")
# 创建单位测试属性设置
german_inf = create_german_infantry()
engine.deploy_unit_to_support(german_inf, 0)
debug_result3 = engine.debug_set_unit_stats(german_inf.id, attack=10, defense=15)
print(f"设置单位属性: {debug_result3['success']}")
print(f" 单位攻击力: {german_inf.stats.attack}, 防御力: {german_inf.stats.current_defense}")
# 测试非DEBUG模式
engine_no_debug = BattleEngine("A", "B", debug_mode=False)
debug_result4 = engine_no_debug.debug_set_kredits(0, kredits=20)
print(f"非DEBUG模式限制: {not debug_result4['success']}")
all_success = all([
debug_result1["success"],
debug_result2["success"],
debug_result3["success"],
not debug_result4["success"] # 这个应该失败
])
print(f"✅ DEBUG功能测试: {'通过' if all_success else '失败'}")
assert all_success, "All debug functions should work correctly"
def test_artillery_no_counter():
"""测试火炮不受反击"""
print("\n🎯 火炮不受反击测试")
print("-" * 40)
engine = BattleEngine("Germany", "USA", debug_mode=True)
# 部署单位
artillery = create_german_88mm_gun()
american_gi = create_american_gi()
artillery.stats.operation_cost = 1
american_gi.stats.operation_cost = 1
engine.deploy_unit_to_support(artillery, 0)
engine.deploy_unit_to_support(american_gi, 1)
# 给足够Kredits
engine.debug_set_kredits(0, kredits=10)
# 火炮攻击GI
attack_result = engine.attack_target(artillery.id, american_gi.id, 0)
success = attack_result.get("success", False)
no_counter = attack_result.get("counter_damage", -1) == 0
print(f"火炮攻击成功: {'' if success else ''}")
print(f"火炮不受反击: {'' if no_counter else ''}")
print(f"造成伤害: {attack_result.get('damage_dealt', 0)}")
result = success and no_counter
print(f"✅ 火炮测试: {'通过' if result else '失败'}")
assert result, "Artillery should not receive counter damage"
def run_all_tests():
"""运行所有测试"""
print("🧪 新战斗引擎系统全面测试")
print("=" * 50)
tests = [
("Kredits Slot系统", test_kredits_slot_system),
("直接部署功能", lambda: test_direct_unit_deployment()[0]),
("移动和攻击", test_movement_and_attack),
("DEBUG功能", test_debug_functions),
("火炮不受反击", test_artillery_no_counter),
]
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()