253 lines
10 KiB
Python
253 lines
10 KiB
Python
|
|
#!/usr/bin/env python3
|
|||
|
|
"""
|
|||
|
|
回合流逝和资源系统测试 - 使用pytest
|
|||
|
|
测试Kredits Slot增长、Kredits补满、上限限制等
|
|||
|
|
"""
|
|||
|
|
import pytest
|
|||
|
|
import sys
|
|||
|
|
import os
|
|||
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
|
|||
|
|
|
|||
|
|
from kards_battle.core.battle_engine import BattleEngine
|
|||
|
|
|
|||
|
|
|
|||
|
|
class TestTurnProgression:
|
|||
|
|
"""测试回合流逝系统"""
|
|||
|
|
|
|||
|
|
def setup_method(self):
|
|||
|
|
"""每个测试前的设置"""
|
|||
|
|
self.engine = BattleEngine("Germany", "USA", debug_mode=True)
|
|||
|
|
|
|||
|
|
def test_kredits_slot_increases_with_turns(self):
|
|||
|
|
"""测试:随回合Slots增加,Kredits补满"""
|
|||
|
|
# 验证初始状态
|
|||
|
|
assert self.engine.get_kredits_slot(0) == 1 # 德军初始slot
|
|||
|
|
assert self.engine.get_kredits_slot(1) == 0 # 美军初始slot
|
|||
|
|
assert self.engine.get_kredits(0) == 1 # 德军初始kredits
|
|||
|
|
assert self.engine.get_kredits(1) == 0 # 美军初始kredits
|
|||
|
|
|
|||
|
|
# 进行几轮完整回合
|
|||
|
|
for turn in range(2, 6): # 测试回合2-5
|
|||
|
|
# 德军回合结束,切换到美军
|
|||
|
|
result1 = self.engine.end_turn()
|
|||
|
|
assert result1['new_active_player'] == 1
|
|||
|
|
assert result1['turn_phase'] == 1
|
|||
|
|
assert not result1['is_new_round']
|
|||
|
|
|
|||
|
|
# 美军获得资源
|
|||
|
|
assert self.engine.get_kredits_slot(1) == turn - 1
|
|||
|
|
assert self.engine.get_kredits(1) == turn - 1
|
|||
|
|
|
|||
|
|
# 美军回合结束,切换到德军(新回合开始)
|
|||
|
|
result2 = self.engine.end_turn()
|
|||
|
|
assert result2['new_active_player'] == 0
|
|||
|
|
assert result2['turn_phase'] == 0
|
|||
|
|
assert result2['is_new_round']
|
|||
|
|
assert result2['turn_number'] == turn
|
|||
|
|
|
|||
|
|
# 德军获得新回合资源
|
|||
|
|
assert self.engine.get_kredits_slot(0) == turn
|
|||
|
|
assert self.engine.get_kredits(0) == turn
|
|||
|
|
|
|||
|
|
def test_kredits_slot_caps_at_12(self):
|
|||
|
|
"""测试:Kredits Slot达到12时不应再自动增加"""
|
|||
|
|
# 快速推进到slot接近12的回合
|
|||
|
|
self.engine.debug_set_kredits(0, kredits_slot=11)
|
|||
|
|
self.engine.debug_set_kredits(1, kredits_slot=11)
|
|||
|
|
|
|||
|
|
# 进行几轮回合,验证不超过12
|
|||
|
|
for _ in range(5):
|
|||
|
|
self.engine.end_turn() # 德→美
|
|||
|
|
|
|||
|
|
# 美军slot不应超过12
|
|||
|
|
assert self.engine.get_kredits_slot(1) <= 12
|
|||
|
|
|
|||
|
|
self.engine.end_turn() # 美→德(新回合)
|
|||
|
|
|
|||
|
|
# 德军slot不应超过12
|
|||
|
|
assert self.engine.get_kredits_slot(0) <= 12
|
|||
|
|
|
|||
|
|
# 最终验证都是12
|
|||
|
|
assert self.engine.get_kredits_slot(0) == 12
|
|||
|
|
assert self.engine.get_kredits_slot(1) == 12
|
|||
|
|
|
|||
|
|
def test_kredits_caps_at_24_absolute_max(self):
|
|||
|
|
"""测试:Kredits超过24时自动设为24(绝对上限)"""
|
|||
|
|
# 尝试设置超过绝对上限的Kredits
|
|||
|
|
result1 = self.engine.debug_set_kredits(0, kredits=30)
|
|||
|
|
assert result1['success']
|
|||
|
|
assert result1['changes']['kredits'] == 24 # 应该被限制为24
|
|||
|
|
assert self.engine.get_kredits(0) == 24
|
|||
|
|
|
|||
|
|
# 尝试设置超过绝对上限的Slot
|
|||
|
|
result2 = self.engine.debug_set_kredits(1, kredits_slot=30)
|
|||
|
|
assert result2['success']
|
|||
|
|
assert result2['changes']['kredits_slot'] == 24 # 应该被限制为24
|
|||
|
|
assert self.engine.get_kredits_slot(1) == 24
|
|||
|
|
|
|||
|
|
def test_kredits_reset_to_slot_each_turn(self):
|
|||
|
|
"""测试:每回合Kredits重置为Slot数值"""
|
|||
|
|
# 设置slot和消耗一些kredits
|
|||
|
|
self.engine.debug_set_kredits(0, kredits_slot=5, kredits=2) # slot=5, 当前=2
|
|||
|
|
|
|||
|
|
initial_slot = self.engine.get_kredits_slot(0)
|
|||
|
|
initial_kredits = self.engine.get_kredits(0)
|
|||
|
|
|
|||
|
|
assert initial_slot == 5
|
|||
|
|
assert initial_kredits == 2
|
|||
|
|
|
|||
|
|
# 切换回合应该重置Kredits为Slot值
|
|||
|
|
self.engine.end_turn() # 德→美
|
|||
|
|
self.engine.end_turn() # 美→德(新回合,重置Kredits)
|
|||
|
|
|
|||
|
|
# 德军Kredits应该重置为slot+1(因为新回合slot会增长)
|
|||
|
|
final_slot = self.engine.get_kredits_slot(0)
|
|||
|
|
final_kredits = self.engine.get_kredits(0)
|
|||
|
|
|
|||
|
|
assert final_slot == initial_slot + 1 # slot增长了1
|
|||
|
|
assert final_kredits == final_slot # kredits重置为新的slot值
|
|||
|
|
|
|||
|
|
def test_turn_phases_alternate_correctly(self):
|
|||
|
|
"""测试:回合阶段正确轮换"""
|
|||
|
|
# 验证初始状态:回合1,阶段0(德军)
|
|||
|
|
assert self.engine.current_turn == 1
|
|||
|
|
assert self.engine.turn_phase == 0
|
|||
|
|
assert self.engine.active_player == 0
|
|||
|
|
|
|||
|
|
# 第一次切换:回合1,阶段1(美军)
|
|||
|
|
result1 = self.engine.end_turn()
|
|||
|
|
assert result1['turn_number'] == 1
|
|||
|
|
assert result1['turn_phase'] == 1
|
|||
|
|
assert result1['new_active_player'] == 1
|
|||
|
|
assert not result1['is_new_round']
|
|||
|
|
|
|||
|
|
# 第二次切换:回合2,阶段0(德军,新回合)
|
|||
|
|
result2 = self.engine.end_turn()
|
|||
|
|
assert result2['turn_number'] == 2
|
|||
|
|
assert result2['turn_phase'] == 0
|
|||
|
|
assert result2['new_active_player'] == 0
|
|||
|
|
assert result2['is_new_round']
|
|||
|
|
|
|||
|
|
# 第三次切换:回合2,阶段1(美军)
|
|||
|
|
result3 = self.engine.end_turn()
|
|||
|
|
assert result3['turn_number'] == 2
|
|||
|
|
assert result3['turn_phase'] == 1
|
|||
|
|
assert result3['new_active_player'] == 1
|
|||
|
|
assert not result3['is_new_round']
|
|||
|
|
|
|||
|
|
def test_both_players_get_resources_in_their_phase(self):
|
|||
|
|
"""测试:双方在各自阶段都能获得正确资源"""
|
|||
|
|
# 进行完整的几轮游戏
|
|||
|
|
turn_data = []
|
|||
|
|
|
|||
|
|
for i in range(8): # 8次切换 = 4个完整回合
|
|||
|
|
turn_info = {
|
|||
|
|
'step': i + 1,
|
|||
|
|
'turn': self.engine.current_turn,
|
|||
|
|
'phase': self.engine.turn_phase,
|
|||
|
|
'active': self.engine.active_player,
|
|||
|
|
'ger_slot': self.engine.get_kredits_slot(0),
|
|||
|
|
'ger_kredits': self.engine.get_kredits(0),
|
|||
|
|
'usa_slot': self.engine.get_kredits_slot(1),
|
|||
|
|
'usa_kredits': self.engine.get_kredits(1)
|
|||
|
|
}
|
|||
|
|
turn_data.append(turn_info)
|
|||
|
|
|
|||
|
|
self.engine.end_turn()
|
|||
|
|
|
|||
|
|
# 验证资源增长模式
|
|||
|
|
# 德军应该在每个新回合开始时增长slot
|
|||
|
|
# 美军应该在每次轮到自己时增长slot
|
|||
|
|
|
|||
|
|
# 检查德军资源增长(在phase=0时)
|
|||
|
|
ger_turns = [t for t in turn_data if t['active'] == 0]
|
|||
|
|
for i, turn in enumerate(ger_turns):
|
|||
|
|
expected_slot = i + 1 # 德军slot应该等于轮数
|
|||
|
|
assert turn['ger_slot'] == expected_slot, f"德军第{i+1}轮slot应为{expected_slot},实际为{turn['ger_slot']}"
|
|||
|
|
assert turn['ger_kredits'] == expected_slot, f"德军第{i+1}轮kredits应为{expected_slot},实际为{turn['ger_kredits']}"
|
|||
|
|
|
|||
|
|
# 检查美军资源增长(在phase=1时)
|
|||
|
|
usa_turns = [t for t in turn_data if t['active'] == 1]
|
|||
|
|
for i, turn in enumerate(usa_turns):
|
|||
|
|
expected_slot = i + 1 # 美军slot应该等于轮数
|
|||
|
|
assert turn['usa_slot'] == expected_slot, f"美军第{i+1}轮slot应为{expected_slot},实际为{turn['usa_slot']}"
|
|||
|
|
assert turn['usa_kredits'] == expected_slot, f"美军第{i+1}轮kredits应为{expected_slot},实际为{turn['usa_kredits']}"
|
|||
|
|
|
|||
|
|
def test_spend_kredits_correctly(self):
|
|||
|
|
"""测试:正确扣除Kredits"""
|
|||
|
|
self.engine.debug_set_kredits(0, kredits=10)
|
|||
|
|
|
|||
|
|
# 扣除3点
|
|||
|
|
result = self.engine.spend_kredits(0, 3)
|
|||
|
|
assert result is True
|
|||
|
|
assert self.engine.get_kredits(0) == 7
|
|||
|
|
|
|||
|
|
# 扣除超过现有的点数
|
|||
|
|
result = self.engine.spend_kredits(0, 10)
|
|||
|
|
assert result is False
|
|||
|
|
assert self.engine.get_kredits(0) == 7 # 不应该变化
|
|||
|
|
|
|||
|
|
# 扣除0点
|
|||
|
|
result = self.engine.spend_kredits(0, 0)
|
|||
|
|
assert result is True
|
|||
|
|
assert self.engine.get_kredits(0) == 7 # 不应该变化
|
|||
|
|
|
|||
|
|
# 扣除负数
|
|||
|
|
result = self.engine.spend_kredits(0, -1)
|
|||
|
|
assert result is True
|
|||
|
|
assert self.engine.get_kredits(0) == 7 # 不应该变化
|
|||
|
|
|
|||
|
|
|
|||
|
|
class TestResourceLimits:
|
|||
|
|
"""测试资源限制"""
|
|||
|
|
|
|||
|
|
def setup_method(self):
|
|||
|
|
"""每个测试前的设置"""
|
|||
|
|
self.engine = BattleEngine("Germany", "USA", debug_mode=True)
|
|||
|
|
|
|||
|
|
def test_natural_slot_growth_stops_at_12(self):
|
|||
|
|
"""测试:自然增长的slot在12处停止"""
|
|||
|
|
# 设置slot接近上限
|
|||
|
|
self.engine.debug_set_kredits(0, kredits_slot=10)
|
|||
|
|
self.engine.debug_set_kredits(1, kredits_slot=10)
|
|||
|
|
|
|||
|
|
# 进行多轮游戏
|
|||
|
|
for _ in range(10): # 进行10轮完整回合
|
|||
|
|
self.engine.end_turn() # 德→美
|
|||
|
|
self.engine.end_turn() # 美→德
|
|||
|
|
|
|||
|
|
# 验证slot都停在12
|
|||
|
|
assert self.engine.get_kredits_slot(0) == 12
|
|||
|
|
assert self.engine.get_kredits_slot(1) == 12
|
|||
|
|
|
|||
|
|
# 再进行几轮,确认不会超过12
|
|||
|
|
for _ in range(5):
|
|||
|
|
self.engine.end_turn()
|
|||
|
|
self.engine.end_turn()
|
|||
|
|
|
|||
|
|
assert self.engine.get_kredits_slot(0) == 12
|
|||
|
|
assert self.engine.get_kredits_slot(1) == 12
|
|||
|
|
|
|||
|
|
def test_debug_set_respects_absolute_limits(self):
|
|||
|
|
"""测试:DEBUG设置尊重绝对限制"""
|
|||
|
|
# 测试正常范围内的设置
|
|||
|
|
result = self.engine.debug_set_kredits(0, kredits=15, kredits_slot=15)
|
|||
|
|
assert result['success']
|
|||
|
|
assert result['changes']['kredits'] == 15
|
|||
|
|
assert result['changes']['kredits_slot'] == 15
|
|||
|
|
|
|||
|
|
# 测试超出绝对上限的设置
|
|||
|
|
result = self.engine.debug_set_kredits(0, kredits=50, kredits_slot=50)
|
|||
|
|
assert result['success']
|
|||
|
|
assert result['changes']['kredits'] == 24 # 被限制为24
|
|||
|
|
assert result['changes']['kredits_slot'] == 24 # 被限制为24
|
|||
|
|
|
|||
|
|
# 测试负数设置
|
|||
|
|
result = self.engine.debug_set_kredits(0, kredits=-5, kredits_slot=-5)
|
|||
|
|
assert result['success']
|
|||
|
|
assert result['changes']['kredits'] == 0 # 被限制为0
|
|||
|
|
assert result['changes']['kredits_slot'] == 0 # 被限制为0
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
pytest.main([__file__, "-v"])
|