140 lines
4.9 KiB
Python
140 lines
4.9 KiB
Python
import pytest
|
||
from unittest.mock import MagicMock
|
||
|
||
from src.classes.death_reason import DeathReason, DeathType
|
||
from src.classes.death import handle_death
|
||
from src.classes.relation import Relation, get_relations_strs
|
||
from src.classes.event import Event
|
||
|
||
def test_death_reason_str():
|
||
"""测试死因的字符串格式化"""
|
||
# 战死
|
||
reason_battle = DeathReason(DeathType.BATTLE, killer_name="张三")
|
||
assert str(reason_battle) == "被张三杀害"
|
||
|
||
# 战死(未知凶手)
|
||
reason_battle_unknown = DeathReason(DeathType.BATTLE)
|
||
assert str(reason_battle_unknown) == "被未知角色杀害"
|
||
|
||
# 重伤
|
||
reason_injury = DeathReason(DeathType.SERIOUS_INJURY)
|
||
assert str(reason_injury) == "重伤不治身亡"
|
||
|
||
# 老死
|
||
reason_old = DeathReason(DeathType.OLD_AGE)
|
||
assert str(reason_old) == "寿元耗尽而亡"
|
||
|
||
def test_handle_death(base_world, dummy_avatar):
|
||
"""测试死亡处理函数(集成测试:包含归档和缓冲)"""
|
||
reason = DeathReason(DeathType.BATTLE, killer_name="李四")
|
||
|
||
# 确保角色在管理器中
|
||
base_world.avatar_manager.register_avatar(dummy_avatar)
|
||
assert dummy_avatar.id in base_world.avatar_manager.avatars
|
||
|
||
# 执行死亡处理
|
||
handle_death(base_world, dummy_avatar, reason)
|
||
|
||
# 1. 验证对象状态
|
||
assert dummy_avatar.is_dead is True
|
||
assert dummy_avatar.death_info is not None
|
||
assert dummy_avatar.death_info["reason"] == "被李四杀害"
|
||
assert dummy_avatar.death_info["time"] == int(base_world.month_stamp)
|
||
|
||
# 2. 验证管理器状态(已归档)
|
||
assert dummy_avatar.id not in base_world.avatar_manager.avatars
|
||
assert dummy_avatar.id in base_world.avatar_manager.dead_avatars
|
||
|
||
# 3. 验证缓冲区(用于前端推送)
|
||
newly_dead = base_world.avatar_manager.pop_newly_dead()
|
||
assert str(dummy_avatar.id) in newly_dead
|
||
|
||
# 4. 验证缓冲区清空
|
||
assert len(base_world.avatar_manager.pop_newly_dead()) == 0
|
||
|
||
def test_relation_display_with_death(base_world, dummy_avatar):
|
||
"""测试关系列表中的死亡显示"""
|
||
# 创建另一个角色作为朋友
|
||
from src.classes.avatar import Avatar, Gender
|
||
from src.classes.age import Age
|
||
from src.classes.cultivation import Realm
|
||
from src.utils.id_generator import get_avatar_id
|
||
from src.classes.root import Root
|
||
from src.classes.alignment import Alignment
|
||
from src.classes.calendar import create_month_stamp, Year, Month
|
||
|
||
friend = Avatar(
|
||
world=base_world,
|
||
name="Friend",
|
||
id=get_avatar_id(),
|
||
birth_month_stamp=create_month_stamp(Year(2000), Month.JANUARY),
|
||
age=Age(20, Realm.Qi_Refinement),
|
||
gender=Gender.MALE,
|
||
pos_x=0, pos_y=0,
|
||
root=Root.WOOD,
|
||
alignment=Alignment.RIGHTEOUS
|
||
)
|
||
# 注册朋友
|
||
base_world.avatar_manager.register_avatar(friend)
|
||
|
||
# 建立关系
|
||
dummy_avatar.set_relation(friend, Relation.FRIEND)
|
||
|
||
# 初始状态:显示正常名字
|
||
strs_before = get_relations_strs(dummy_avatar)
|
||
assert "朋友:Friend" in strs_before
|
||
|
||
# 朋友死亡(重伤)
|
||
reason = DeathReason(DeathType.SERIOUS_INJURY)
|
||
handle_death(base_world, friend, reason)
|
||
|
||
# 死亡后:显示带死因的名字
|
||
strs_after = get_relations_strs(dummy_avatar)
|
||
assert "朋友:Friend(已故:重伤不治身亡)" in strs_after
|
||
|
||
|
||
def test_avatar_manager_archive_death(base_world, dummy_avatar):
|
||
"""测试 AvatarManager 的死亡归档逻辑"""
|
||
manager = base_world.avatar_manager
|
||
manager.register_avatar(dummy_avatar)
|
||
|
||
# 确保初始在活人表
|
||
assert dummy_avatar.id in manager.avatars
|
||
assert dummy_avatar.id not in manager.dead_avatars
|
||
|
||
# 执行归档
|
||
manager.handle_death(dummy_avatar.id)
|
||
|
||
# 验证位置转移
|
||
assert dummy_avatar.id not in manager.avatars
|
||
assert dummy_avatar.id in manager.dead_avatars
|
||
|
||
# 验证 get_avatar 依然能查到
|
||
assert manager.get_avatar(dummy_avatar.id) == dummy_avatar
|
||
|
||
# 验证 buffer
|
||
assert str(dummy_avatar.id) in manager.pop_newly_dead()
|
||
|
||
@pytest.mark.asyncio
|
||
async def test_simulator_resolve_death(base_world, dummy_avatar):
|
||
"""测试模拟器的死亡结算阶段"""
|
||
from src.sim.simulator import Simulator
|
||
sim = Simulator(base_world)
|
||
base_world.avatar_manager.register_avatar(dummy_avatar)
|
||
|
||
# Case 1: 重伤死亡
|
||
dummy_avatar.hp.cur = -10
|
||
|
||
# 执行死亡结算
|
||
events = sim._phase_resolve_death()
|
||
|
||
# 验证
|
||
assert dummy_avatar.is_dead is True
|
||
assert dummy_avatar.death_info["reason"] == "重伤不治身亡"
|
||
assert len(events) > 0
|
||
assert "重伤不治身亡" in str(events[0])
|
||
|
||
# 验证已被自动归档(因为 handle_death 现在会调用 manager.handle_death)
|
||
assert dummy_avatar.id in base_world.avatar_manager.dead_avatars
|
||
assert str(dummy_avatar.id) in base_world.avatar_manager.pop_newly_dead()
|