diff --git a/tests/test_known_regions.py b/tests/test_known_regions.py new file mode 100644 index 0000000..5fb8417 --- /dev/null +++ b/tests/test_known_regions.py @@ -0,0 +1,211 @@ +""" +测试 Avatar._init_known_regions 的行为。 + +验证: +1. 无宗门的 avatar:known_regions 只包含当前位置的区域(如果有) +2. 有宗门的 avatar:known_regions 包含宗门驻地 +""" +import pytest +from unittest.mock import MagicMock + +from src.classes.map import Map +from src.classes.tile import TileType +from src.classes.world import World +from src.classes.calendar import Month, Year, create_month_stamp +from src.classes.avatar import Avatar, Gender +from src.classes.age import Age +from src.classes.cultivation import Realm +from src.classes.root import Root +from src.classes.alignment import Alignment +from src.classes.sect import sects_by_id +from src.classes.sect_region import SectRegion +from src.classes.region import NormalRegion +from src.utils.id_generator import get_avatar_id + + +@pytest.fixture +def world_with_sect_region(): + """创建一个带有宗门驻地的世界""" + width, height = 10, 10 + game_map = Map(width=width, height=height) + + # 创建 tiles + for x in range(width): + for y in range(height): + game_map.create_tile(x, y, TileType.PLAIN) + + # 获取一个真实的宗门(明心剑宗,id=1) + sect = sects_by_id.get(1) + assert sect is not None, "宗门 ID=1 应该存在" + + # 创建对应的 SectRegion + sect_region = SectRegion( + id=401, + name="连霞山", + desc="测试宗门驻地", + cors=[(5, 5)], + sect_name=sect.name, + sect_id=sect.id + ) + + # 注册到 map + game_map.regions[sect_region.id] = sect_region + game_map.sect_regions[sect_region.id] = sect_region + + # 将区域绑定到 tile + tile = game_map.get_tile(5, 5) + tile.region = sect_region + + world = World(map=game_map, month_stamp=create_month_stamp(Year(1), Month.JANUARY)) + return world, sect, sect_region + + +@pytest.fixture +def world_with_normal_region(): + """创建一个带有普通区域的世界""" + width, height = 10, 10 + game_map = Map(width=width, height=height) + + for x in range(width): + for y in range(height): + game_map.create_tile(x, y, TileType.PLAIN) + + # 创建普通区域 + normal_region = NormalRegion( + id=101, + name="测试区域", + desc="一片普通的区域", + cors=[(0, 0)] + ) + + game_map.regions[normal_region.id] = normal_region + + # 绑定到 tile + tile = game_map.get_tile(0, 0) + tile.region = normal_region + + world = World(map=game_map, month_stamp=create_month_stamp(Year(1), Month.JANUARY)) + return world, normal_region + + +class TestInitKnownRegions: + """测试 Avatar._init_known_regions""" + + def test_avatar_without_sect_knows_current_region(self, world_with_normal_region): + """无宗门的 avatar 应该知道当前位置的区域""" + world, normal_region = world_with_normal_region + + avatar = Avatar( + world=world, + name="散修测试", + 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.GOLD, + alignment=Alignment.RIGHTEOUS, + sect=None # 散修 + ) + + # 设置 tile(模拟正常初始化流程) + avatar.tile = world.map.get_tile(0, 0) + avatar._init_known_regions() + + assert normal_region.id in avatar.known_regions, ( + f"散修应该知道当前位置的区域,但 known_regions={avatar.known_regions}" + ) + + def test_avatar_with_sect_knows_headquarters(self, world_with_sect_region): + """有宗门的 avatar 应该知道宗门驻地位置""" + world, sect, sect_region = world_with_sect_region + + avatar = Avatar( + world=world, + name="宗门弟子测试", + 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.GOLD, + alignment=Alignment.RIGHTEOUS, + sect=sect # 有宗门 + ) + + # _init_known_regions 在 __post_init__ 中自动调用 + assert sect_region.id in avatar.known_regions, ( + f"宗门弟子应该知道宗门驻地位置,但 known_regions={avatar.known_regions}" + ) + + def test_avatar_without_sect_does_not_know_sect_region(self, world_with_sect_region): + """无宗门的 avatar 不应该自动知道宗门驻地""" + world, sect, sect_region = world_with_sect_region + + avatar = Avatar( + world=world, + name="散修测试", + 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.GOLD, + alignment=Alignment.RIGHTEOUS, + sect=None # 散修 + ) + + # 散修不应该知道宗门驻地(除非在那个位置) + assert sect_region.id not in avatar.known_regions, ( + f"散修不应该自动知道宗门驻地,但 known_regions={avatar.known_regions}" + ) + + def test_avatar_knows_only_their_sect_headquarters(self, world_with_sect_region): + """avatar 只应该知道自己宗门的驻地,不知道其他宗门""" + world, sect, sect_region = world_with_sect_region + + # 添加另一个宗门的驻地 + other_sect = sects_by_id.get(2) # 百兽宗 + assert other_sect is not None + + other_sect_region = SectRegion( + id=402, + name="玄灵洞", + desc="另一个宗门驻地", + cors=[(7, 7)], + sect_name=other_sect.name, + sect_id=other_sect.id + ) + world.map.regions[other_sect_region.id] = other_sect_region + world.map.sect_regions[other_sect_region.id] = other_sect_region + + # 创建明心剑宗弟子 + avatar = Avatar( + world=world, + name="明心剑宗弟子", + 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.GOLD, + alignment=Alignment.RIGHTEOUS, + sect=sect # 明心剑宗 + ) + + # 应该知道自己宗门的驻地 + assert sect_region.id in avatar.known_regions, ( + "应该知道自己宗门的驻地" + ) + # 不应该知道其他宗门的驻地 + assert other_sect_region.id not in avatar.known_regions, ( + "不应该知道其他宗门的驻地" + ) + + +if __name__ == "__main__": + pytest.main([__file__, "-v"])