Files
cultivation-world-simulator/tests/test_death_region_release.py
bridge 4f377551e8 feat(avatar): implement region ownership management in AvatarManager and Avatar classes
- Added `owned_regions` attribute to the Avatar class to track regions owned by avatars.
- Introduced `occupy_region` and `release_region` methods for managing region ownership and ensuring proper relationship handling.
- Updated AvatarManager to clear relationships when an avatar is released, ensuring no lingering references.
- Refactored region ownership logic in the Occupy action and Simulator to utilize the new methods for better clarity and maintainability.
- Enhanced game loading process to establish ownership relationships correctly during game state restoration.
2026-02-02 21:34:02 +08:00

108 lines
3.4 KiB
Python

import pytest
from src.classes.death_reason import DeathReason, DeathType
from src.classes.death import handle_death
from src.classes.region import CultivateRegion, EssenceType
def test_death_releases_region(base_world, dummy_avatar):
"""测试死亡时释放占领的洞府"""
# 1. 创建一个修炼区域
region = CultivateRegion(
id=1001,
name="Test Cave",
desc="A test cave",
essence_type=EssenceType.GOLD,
essence_density=10
)
# 将区域添加到地图
base_world.map.regions[region.id] = region
# 2. 让角色占领该区域
dummy_avatar.occupy_region(region)
# 验证占领成功
assert region.host_avatar == dummy_avatar
assert region in dummy_avatar.owned_regions
# 3. 角色死亡
reason = DeathReason(DeathType.OLD_AGE)
handle_death(base_world, dummy_avatar, reason)
# 4. 验证洞府已被释放
assert region.host_avatar is None
assert len(dummy_avatar.owned_regions) == 0
assert dummy_avatar.is_dead is True
def test_occupy_region_logic(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
# 创建第二个角色
other_avatar = Avatar(
world=base_world,
name="Other",
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
)
region = CultivateRegion(
id=1002,
name="Test Cave 2",
desc="Another test cave",
essence_type=EssenceType.WOOD,
essence_density=10
)
# 1. dummy_avatar 占领
dummy_avatar.occupy_region(region)
assert region.host_avatar == dummy_avatar
assert region in dummy_avatar.owned_regions
# 2. other_avatar 抢夺
other_avatar.occupy_region(region)
# 验证所有权转移
assert region.host_avatar == other_avatar
assert region in other_avatar.owned_regions
# 验证旧主已释放
assert region not in dummy_avatar.owned_regions
def test_remove_avatar_releases_region(base_world, dummy_avatar):
"""测试彻底删除角色时释放占领的洞府"""
# 1. 创建一个修炼区域
region = CultivateRegion(
id=1003,
name="Test Cave 3",
desc="Yet another test cave",
essence_type=EssenceType.WATER,
essence_density=10
)
base_world.map.regions[region.id] = region
# 2. 注册并占领
base_world.avatar_manager.register_avatar(dummy_avatar)
dummy_avatar.occupy_region(region)
assert region.host_avatar == dummy_avatar
# 3. 彻底删除角色
base_world.avatar_manager.remove_avatar(dummy_avatar.id)
# 4. 验证洞府已被释放
assert region.host_avatar is None
# 注意:此时 dummy_avatar 对象可能还在内存中,但已经从管理器移除
# 它的 owned_regions 应该被清空了
assert len(dummy_avatar.owned_regions) == 0