Files
cultivation-world-simulator/tests/test_death.py
4thfever 7630174820 Feat/relation (#139)
* update relation

* feat: add relation_type to avatar info structure and update related components

- Added `relation_type` to the avatar structured info in `info_presenter.py`.
- Updated `AvatarDetail.vue` to utilize the new `relation_type` for displaying avatar relationships.
- Modified `RelationRow.vue` to accept `type` as a prop for enhanced relationship representation.
- Updated `core.ts` to include `relation_type` in the `RelationInfo` interface.

Closes #
2026-02-05 22:14:44 +08:00

140 lines
4.9 KiB
Python
Raw 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.
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.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()