Files
cultivation-world-simulator/tests/test_sect_ranks.py
2025-12-18 22:08:06 +08:00

145 lines
5.3 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 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(base_world):
"""测试avatar创建时宗门职位分配"""
# 使用 base_world fixture不需要 load_cultivation_world_map
# 创建多个avatar
avatars_dict = make_avatars(base_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(base_world):
"""测试每个宗门只有一个掌门"""
# 创建足够多的avatar
avatars_dict = make_avatars(base_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(base_world):
"""测试宗门信息显示"""
avatars_dict = make_avatars(base_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(base_world):
"""测试突破境界后自动晋升"""
avatars_dict = make_avatars(base_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"])