166 lines
5.9 KiB
Python
166 lines
5.9 KiB
Python
"""
|
|
测试宗门等级系统
|
|
"""
|
|
import pytest
|
|
from src.classes.cultivation import CultivationProgress, Realm
|
|
from src.classes.sect_ranks import (
|
|
SectRank,
|
|
get_rank_from_realm,
|
|
get_rank_display_name,
|
|
should_auto_promote,
|
|
)
|
|
from src.classes.sect import sects_by_name
|
|
from src.classes.world import World
|
|
from src.classes.map import Map
|
|
from src.classes.calendar import MonthStamp
|
|
from src.sim.new_avatar import make_avatars
|
|
|
|
|
|
def test_rank_from_realm():
|
|
"""测试境界到宗门职位的映射"""
|
|
assert get_rank_from_realm(Realm.Qi_Refinement) == SectRank.OuterDisciple
|
|
assert get_rank_from_realm(Realm.Foundation_Establishment) == SectRank.InnerDisciple
|
|
assert get_rank_from_realm(Realm.Core_Formation) == SectRank.Elder
|
|
assert get_rank_from_realm(Realm.Nascent_Soul) == SectRank.Patriarch
|
|
|
|
|
|
def test_rank_display_name():
|
|
"""测试职位显示名称"""
|
|
assert get_rank_display_name(SectRank.Patriarch) == "掌门"
|
|
assert get_rank_display_name(SectRank.Elder) == "长老"
|
|
assert get_rank_display_name(SectRank.InnerDisciple) == "内门弟子"
|
|
assert get_rank_display_name(SectRank.OuterDisciple) == "外门弟子"
|
|
|
|
|
|
def test_rank_comparison():
|
|
"""测试职位比较"""
|
|
assert SectRank.Patriarch > SectRank.Elder
|
|
assert SectRank.Elder > SectRank.InnerDisciple
|
|
assert SectRank.InnerDisciple > SectRank.OuterDisciple
|
|
assert SectRank.OuterDisciple < SectRank.Patriarch
|
|
|
|
|
|
def test_auto_promote():
|
|
"""测试自动晋升逻辑"""
|
|
assert should_auto_promote(Realm.Qi_Refinement, Realm.Foundation_Establishment) == True
|
|
assert should_auto_promote(Realm.Foundation_Establishment, Realm.Core_Formation) == True
|
|
assert should_auto_promote(Realm.Core_Formation, Realm.Nascent_Soul) == True
|
|
assert should_auto_promote(Realm.Qi_Refinement, Realm.Qi_Refinement) == False
|
|
|
|
|
|
def test_avatar_sect_rank_assignment():
|
|
"""测试avatar创建时宗门职位分配"""
|
|
from src.run.load_map import load_cultivation_world_map
|
|
game_map = load_cultivation_world_map()
|
|
world = World(
|
|
map=game_map,
|
|
month_stamp=MonthStamp(100 * 12),
|
|
)
|
|
|
|
# 创建多个avatar
|
|
avatars_dict = make_avatars(world, count=20, current_month_stamp=MonthStamp(100 * 12))
|
|
avatars = list(avatars_dict.values())
|
|
|
|
# 检查所有有宗门的avatar都有职位
|
|
for avatar in avatars:
|
|
if avatar.sect is not None:
|
|
assert avatar.sect_rank is not None, f"{avatar.name} 有宗门但没有职位"
|
|
# 职位应该匹配境界
|
|
expected_rank = get_rank_from_realm(avatar.cultivation_progress.realm)
|
|
# 如果不是预期职位,只可能是元婴修士被降为长老(因为掌门唯一性)
|
|
if avatar.sect_rank != expected_rank:
|
|
assert avatar.cultivation_progress.realm == Realm.Nascent_Soul
|
|
assert avatar.sect_rank == SectRank.Elder
|
|
else:
|
|
assert avatar.sect_rank is None, f"{avatar.name} 散修不应该有职位"
|
|
|
|
|
|
def test_patriarch_uniqueness():
|
|
"""测试每个宗门只有一个掌门"""
|
|
from src.run.load_map import load_cultivation_world_map
|
|
game_map = load_cultivation_world_map()
|
|
world = World(
|
|
map=game_map,
|
|
month_stamp=MonthStamp(100 * 12),
|
|
)
|
|
|
|
# 创建足够多的avatar
|
|
avatars_dict = make_avatars(world, count=50, current_month_stamp=MonthStamp(100 * 12))
|
|
avatars = list(avatars_dict.values())
|
|
|
|
# 统计每个宗门的掌门数量
|
|
sect_patriarchs = {}
|
|
for avatar in avatars:
|
|
if avatar.sect is not None and avatar.sect_rank == SectRank.Patriarch:
|
|
sect_id = avatar.sect.id
|
|
if sect_id not in sect_patriarchs:
|
|
sect_patriarchs[sect_id] = []
|
|
sect_patriarchs[sect_id].append(avatar.name)
|
|
|
|
# 确保每个宗门最多只有一个掌门
|
|
for sect_id, patriarchs in sect_patriarchs.items():
|
|
assert len(patriarchs) <= 1, f"宗门 {sect_id} 有多个掌门: {patriarchs}"
|
|
|
|
|
|
def test_sect_str_display():
|
|
"""测试宗门信息显示"""
|
|
from src.run.load_map import load_cultivation_world_map
|
|
game_map = load_cultivation_world_map()
|
|
world = World(
|
|
map=game_map,
|
|
month_stamp=MonthStamp(100 * 12),
|
|
)
|
|
|
|
avatars_dict = make_avatars(world, count=20, current_month_stamp=MonthStamp(100 * 12))
|
|
avatars = list(avatars_dict.values())
|
|
|
|
for avatar in avatars:
|
|
sect_str = avatar.get_sect_str()
|
|
if avatar.sect is None:
|
|
assert sect_str == "散修"
|
|
else:
|
|
# 应该包含宗门名
|
|
assert avatar.sect.name in sect_str
|
|
# 应该包含职位名
|
|
if avatar.sect_rank is not None:
|
|
rank_name = get_rank_display_name(avatar.sect_rank, avatar.sect)
|
|
assert rank_name in sect_str
|
|
|
|
|
|
def test_cultivation_breakthrough_promotion():
|
|
"""测试突破境界后自动晋升"""
|
|
from src.run.load_map import load_cultivation_world_map
|
|
game_map = load_cultivation_world_map()
|
|
world = World(
|
|
map=game_map,
|
|
month_stamp=MonthStamp(100 * 12),
|
|
)
|
|
|
|
avatars_dict = make_avatars(world, count=10, current_month_stamp=MonthStamp(100 * 12))
|
|
avatars = list(avatars_dict.values())
|
|
|
|
# 找一个练气期的宗门弟子
|
|
target_avatar = None
|
|
for avatar in avatars:
|
|
if avatar.sect is not None and avatar.cultivation_progress.realm == Realm.Qi_Refinement:
|
|
target_avatar = avatar
|
|
break
|
|
|
|
if target_avatar is not None:
|
|
# 记录原职位
|
|
old_rank = target_avatar.sect_rank
|
|
assert old_rank == SectRank.OuterDisciple
|
|
|
|
# 突破到筑基
|
|
target_avatar.cultivation_progress.level = 31 # 筑基初期
|
|
target_avatar.update_cultivation(31)
|
|
|
|
# 检查职位是否晋升
|
|
assert target_avatar.sect_rank == SectRank.InnerDisciple
|
|
assert target_avatar.sect_rank > old_rank
|
|
|
|
|
|
if __name__ == "__main__":
|
|
pytest.main([__file__, "-v"])
|
|
|