56 lines
1.9 KiB
Python
56 lines
1.9 KiB
Python
|
||
import pytest
|
||
import copy
|
||
from src.classes.weapon import Weapon, WeaponType
|
||
from src.classes.equipment_grade import EquipmentGrade
|
||
from src.classes.sect import Sect, SectHeadQuarter
|
||
from src.classes.alignment import Alignment
|
||
from pathlib import Path
|
||
|
||
def test_weapon_deepcopy_does_not_copy_sect():
|
||
# 1. 创建模拟的 Sect
|
||
hq = SectHeadQuarter("HQ", "Desc", Path("img.png"))
|
||
sect = Sect(
|
||
id=1, name="TestSect", desc="Desc", member_act_style="Style",
|
||
alignment=Alignment.Righteous, headquarter=hq, technique_names=[]
|
||
)
|
||
|
||
# 向 Sect 中添加一些可能导致问题的成员(虽然这里只是简单测试引用)
|
||
# 在真实场景中,Sect.members 可能包含复杂的 Avatar 对象
|
||
sect.members["dummy"] = "DummyAvatar"
|
||
|
||
# 2. 创建 Weapon 并关联 Sect
|
||
weapon = Weapon(
|
||
id=101, name="TestWeapon", weapon_type=WeaponType.SWORD,
|
||
grade=EquipmentGrade.COMMON, sect_id=1, desc="Desc", sect=sect
|
||
)
|
||
|
||
# 3. 深拷贝 Weapon
|
||
weapon_copy = copy.deepcopy(weapon)
|
||
|
||
# 4. 验证 Weapon 被复制了
|
||
assert weapon_copy is not weapon
|
||
assert weapon_copy.id == weapon.id
|
||
|
||
# 5. 关键验证:Sect 应该是同一个对象(浅拷贝)
|
||
assert weapon_copy.sect is sect
|
||
assert weapon_copy.sect is weapon.sect
|
||
|
||
# 验证 Sect 的成员没有被复制
|
||
assert weapon_copy.sect.members is sect.members
|
||
|
||
def test_weapon_special_data_is_copied():
|
||
# 验证 special_data 是否被正确深拷贝
|
||
weapon = Weapon(
|
||
id=101, name="TestWeapon", weapon_type=WeaponType.SWORD,
|
||
grade=EquipmentGrade.COMMON, sect_id=None, desc="Desc"
|
||
)
|
||
weapon.special_data = {"souls": 10, "nested": {"a": 1}}
|
||
|
||
weapon_copy = copy.deepcopy(weapon)
|
||
|
||
assert weapon_copy.special_data == weapon.special_data
|
||
assert weapon_copy.special_data is not weapon.special_data
|
||
assert weapon_copy.special_data["nested"] is not weapon.special_data["nested"]
|
||
|