§
    ži»jE  ã            
       óz  — d Z ddlZddlmc mZ ddlZddlZddl	Z	ddl
Z
e	j                             de
j                             e
j                             e
j                             e¦  «        d¦  «        ¦  «        ¦  «         ddlmZmZmZmZmZmZmZ ej        d„ ¦   «         Zd„ Zd„ Zd„ Zd	„ Zd
„ Zd„ Z d„ Z!dS )zÑ
Unit tests for FreeExile Seasonal League & Realm Partitioning System.
Verifies PoE2-style fresh start resets, realm isolation, remove-only stash tabs,
hardcore permadeath migration, and lifecycle management.
é    Nz../../server)Ú
LeagueTypeÚLeagueStatusÚLeagueÚSeasonCharacterÚStashTabÚSeasonStashItemÚSeasonLeagueManagerc            
      óJ  — t          ¦   «         } |                      ddt          j        t          j        ddddœ¬¦  «         |                      dd	t          j        t          j        dd
di¬¦  «         |                      ddt          j        t          j        dddi¬¦  «         | S )NÚseason_01_minh_nguyetu#   MÃ¹a 1: Minh Nguyá»‡t Tráº£m ThiÃªnzv1.0.0Úenabledz1.2)Úblood_meridianÚdrop_rate_mult)Ú	league_idÚdisplay_nameÚleague_typeÚstatusÚversion_requirementÚmechanic_flagsÚseason_01_hardcoreu(   MÃ¹a 1: Tá»­ Sinh LuÃ¢n Há»“i (Hardcore)Úpermadeath_migrationÚstandardÚseason_01_ssfu#   MÃ¹a 1: Ä�á»™c HÃ nh Tu ChÃ¢n (SSF)Útrade_disabledÚtrue)r	   Úcreate_leaguer   Ú	CHALLENGEr   ÚACTIVEÚHARDCOREÚSOLO_SELF_FOUND)Úmanagers    ú=C:\Projects\FreeExile\tests\unit\test_season_league_system.pyÚleague_managerr"      sÉ   € å!Ñ#Ô#€Gà×ÒØ)Ø:ÝÔ(ÝÔ"Ø$Ø*3ÀuÐMÐMð ñ ô ð ð ×ÒØ&Ø?ÝÔ'ÝÔ"Ø$Ø.°
Ð;ð ñ ô ð ð ×ÒØ!Ø:ÝÔ.ÝÔ"Ø$Ø(¨&Ð1ð ñ ô ð ð €Nó    c                 óÂ  — |                       d¦  «        }d}||u}|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|j	        }t          j        }||k    }|sòt          j        d|fd	||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d
t          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nd
t          j        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}x}}|j        }t          j        }||k    }|sòt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}x}}dS )uD   Standard (ThÃ¡i HÆ° Giá»›i) must always exist and never be archived.r   N©úis not©z%(py0)s is not %(py3)s©Úpy0Úpy3úassert %(py5)sÚpy5©ú==)zQ%(py2)s
{%(py2)s = %(py0)s.league_type
} == %(py6)s
{%(py6)s = %(py4)s.STANDARD
}r   )r)   Úpy2Úpy4Úpy6zassert %(py8)sÚpy8)zJ%(py2)s
{%(py2)s = %(py0)s.status
} == %(py6)s
{%(py6)s = %(py4)s.ACTIVE
}r   )Ú
get_leagueÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationr   r   ÚSTANDARDr   r   r   )
r"   r   Ú@py_assert2Ú@py_assert1Ú@py_format4Ú@py_format6Ú@py_assert5Ú@py_assert3Ú@py_format7Ú@py_format9s
             r!   Ú*test_standard_realm_initialized_by_defaultrE   :   s  € à×(Ò(¨Ñ4Ô4€HØÐˆ8˜4ÐÐÐÐÕÔÐÐÐÐˆ8˜4ÐÑÔÐÕÔÑÔÐÐÕÔˆ8ÑÔÐÕÔˆ8ÑÔÐÐÕÔ˜4ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÔÐ6¥:Ô#6Ð6ÐÐ#6Ò6Ð6Ð6Ð6Õ6Ô6Ð6Ð6Ð6Ð6ÐÐ#6Ð6Ñ6Ô6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6ˆ8Ñ6Ô6Ð6Õ6Ô6ˆ8Ñ6Ô6Ð6Ð6Õ6Ô6ÐÑ6Ô6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6¥:Ñ6Ô6Ð6Õ6Ô6¥:Ñ6Ô6Ð6Ð6Õ6Ô6Ð#6Ñ6Ô6Ð6Ð6Ñ6Ð6Ð6Ð6Ð6Ð6Ñ6Ð6Õ6Õ6Ô6Ð6Ñ6Ô6Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6Ð6ØŒ?Ð1�lÔ1Ð1ˆ?Ð1Ò1Ð1Ð1Ð1Õ1Ô1Ð1Ð1Ð1Ð1ˆ?Ð1Ð1Ñ1Ô1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1ˆ8Ñ1Ô1Ð1Õ1Ô1ˆ8Ñ1Ô1Ð1Ð1Õ1Ô1ˆ?Ñ1Ô1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1�lÑ1Ô1Ð1Õ1Ô1�lÑ1Ô1Ð1Ð1Õ1Ô1Ð1Ñ1Ô1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1r#   c                 ó”  — |                       dddd¬¦  «        }|j        }d}||u}|sªt          j        d|fd||f¦  «        d	t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}|j
        }d}||k    }|sªt          j        d|fd||f¦  «        d	t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}|j        }d}||k    }|sªt          j        d|fd||f¦  «        d	t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}|j        }t          |¦  «        }d}||k    }	|	�st          j        d|	fd||f¦  «        dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndd	t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }
dd|
iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}	}|j        }d}||u }|sªt          j        d|fd||f¦  «        d	t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}dS )zPCreating a character in a new season starts fresh at level 1 with 0 progression.Úacc_001ÚKiemMaDocHanhÚ	ThienNhanr   ©Ú
account_idÚcharacter_nameÚmartial_classr   Nr%   )z8%(py2)s
{%(py2)s = %(py0)s.character_id
} is not %(py5)sÚchar©r)   r/   r,   úassert %(py7)sÚpy7é   r-   )z-%(py2)s
{%(py2)s = %(py0)s.level
} == %(py5)s©z1%(py2)s
{%(py2)s = %(py0)s.league_id
} == %(py5)sr   )zO%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.inventory
})
} == %(py8)sÚlen)r)   Úpy1r*   r,   r2   zassert %(py10)sÚpy10T©Úis©z0%(py2)s
{%(py2)s = %(py0)s.is_alive
} is %(py5)s)Úcreate_characterÚcharacter_idr4   r5   r6   r7   r8   r9   r:   r;   Úlevelr   Ú	inventoryrT   Úis_alive)r"   rN   r>   Ú@py_assert4rB   r@   Ú@py_format8r=   Ú@py_assert7Ú@py_assert6rD   Ú@py_format11s               r!   Ú&test_seasonal_fresh_character_creationrd   B   sæ  € à×*Ò*ØØ&Ø!Ø)ð	 +ñ ô €Dð ÔÐ( DÐ(Ð DÐ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð DÐ(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(ˆ4Ñ(Ô(Ð(Õ(Ô(ˆ4Ñ(Ô(Ð(Ð(Õ(Ô(ÐÑ(Ô(Õ(Ô( DÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ØŒ:Ð˜Ðˆ:˜Š?ÐÐÐÕÔÐÐÐÐˆ:˜ÐÑÔÐÕÔÑÔÐÐÕÔˆ4ÑÔÐÕÔˆ4ÑÔÐÐÕÔˆ:ÑÔÕÔ˜ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐØŒ>Ð4Ð4Ð4ˆ>Ð4Ò4Ð4Ð4Ð4Õ4Ô4Ð4Ð4Ð4Ð4ˆ>Ð4Ð4Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4ˆ4Ñ4Ô4Ð4Õ4Ô4ˆ4Ñ4Ô4Ð4Ð4Õ4Ô4ˆ>Ñ4Ô4Õ4Ô4Ð4Ñ4Ô4Ð4Ð4Ñ4Ð4Ð4Ð4Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4ØŒ~Ð#�3ˆ~ÑÔÐ# !Ð#Ð !Ò#Ð#Ð#Ñ#Õ#Ô#Ð#Ð#Ð#Ð#Ð !Ð#Ñ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#�3Ñ#Ô#Ð#Õ#Ô#�3Ñ#Ô#Ð#Ð#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#ˆtÑ#Ô#Ð#Õ#Ô#ˆtÑ#Ô#Ð#Ð#Õ#Ô#ˆ~Ñ#Ô#Õ#Ô#ÐÑ#Ô#Õ#Ô# !Ñ#Ô#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#ØŒ=Ð ˜DÐ ˆ=˜DÐ Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆ=˜DÐ Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˆ4Ñ Ô Ð Õ Ô ˆ4Ñ Ô Ð Ð Õ Ô ˆ=Ñ Ô Õ Ô ˜DÑ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ð Ð Ð Ð r#   c                 óü   — |                       ddt          j        t          j        d¬¦  «         t          j        t          d¬¦  «        5  |                      ddd	d¬
¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z?Character creation is rejected if league is frozen or upcoming.Úseason_02_hon_donu   MÃ¹a 2: Há»—n Ä�á»™n SÆ¡ Khaizv1.1.0)r   r   r   r   r   z$is not active for character creation©ÚmatchrG   Ú
VoDanhTangÚThieuLamrJ   N)	r   r   r   r   ÚUPCOMINGÚpytestÚraisesÚ
ValueErrorrZ   )r"   s    r!   Ú9test_cannot_create_character_in_inactive_or_frozen_leaguero   Q   sÙ   € à× Ò Ø%Ø4ÝÔ(ÝÔ$Ø$ð !ñ ô ð õ 
Œ•zÐ)OÐ	PÑ	PÔ	Pð 
ð 
Ø×'Ò'Ø Ø'Ø$Ø)ð	 	(ñ 	
ô 	
ð 	
ð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð 
ð 
s   Á
A1Á1A5Á8A5c           
      óú
  — |                       dddd¬¦  «        }|                       dddd¬¦  «        }| j        }|j        }d} |||¦  «        }d}||u }|�s!t          j        d	|fd
||f¦  «        dt          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}x}x}x}}| j        }|j        }d} |||¦  «        }d}||u }|�s!t          j        d	|fd
||f¦  «        dt          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}x}x}x}}| j        }|j        }d} |||¦  «        }d}||u }|�s!t          j        d	|fd
||f¦  «        dt          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}x}x}x}}| j        }|j        }d} |||¦  «        }d}||u }|�s!t          j        d	|fd
||f¦  «        dt          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}x}x}x}}dS )zFCharacters from Standard cannot enter Season instances and vice versa.rG   ÚKiemHiepMua1ÚVoDangr   rJ   ÚLaoTienBoiStdr   TrW   )z‡%(py9)s
{%(py9)s = %(py2)s
{%(py2)s = %(py0)s.validate_realm_access
}(%(py5)s
{%(py5)s = %(py3)s.character_id
}, %(py7)s)
} is %(py12)sr"   Úchar_season©r)   r/   r*   r,   rQ   Úpy9Úpy12úassert %(py14)sÚpy14NFÚchar_std)rZ   Úvalidate_realm_accessr[   r4   r5   r6   r7   r8   r9   r:   r;   )r"   rt   rz   r>   r_   rb   Ú@py_assert8Ú@py_assert11Ú@py_assert10Ú@py_format13Ú@py_format15s              r!   Útest_strict_realm_isolationr�   d   sX  € à ×1Ò1ØØ%ØØ)ð	 2ñ ô €Kð ×.Ò.ØØ&ØØð	 /ñ ô €Hð Ô/Ðj°Ô0HÐjÐJaÐjÐ/Ð/Ð0HÐJaÑbÔbÐjÐfjÐjÐbÐfjÐjÐjÐjÑjÕjÔjÐjÐjÐjÐjÐbÐfjÐjÑjÔjÐjÕjÔjÑjÔjÐjÐjÕjÔjˆ>ÑjÔjÐjÕjÔjˆ>ÑjÔjÐjÐjÕjÔjÐ/ÑjÔjÐjÕjÔjÑjÔjÐjÐjÕjÔj°ÑjÔjÐjÕjÔj°ÑjÔjÐjÐjÕjÔjÐ0HÑjÔjÕjÔjÐJaÑjÔjÕjÔjÐbÑjÔjÕjÔjÐfjÑjÔjÐjÐjÑjÐjÐjÐjÐjÐjÑjÐjÕjÕjÔjÐjÑjÔjÑjÔjÐjÐjÐjÐjÐjÐjÐjÐjÐjÐjÐjÐjÐjØÔ/Ð^°Ô0HÐ^È*Ð^Ð/Ð/Ð0HÈ*ÑUÔUÐ^ÐY^Ð^ÐUÐY^Ð^Ð^Ð^Ñ^Õ^Ô^Ð^Ð^Ð^Ð^ÐUÐY^Ð^Ñ^Ô^Ð^Õ^Ô^Ñ^Ô^Ð^Ð^Õ^Ô^ˆ>Ñ^Ô^Ð^Õ^Ô^ˆ>Ñ^Ô^Ð^Ð^Õ^Ô^Ð/Ñ^Ô^Ð^Õ^Ô^Ñ^Ô^Ð^Ð^Õ^Ô^°Ñ^Ô^Ð^Õ^Ô^°Ñ^Ô^Ð^Ð^Õ^Ô^Ð0HÑ^Ô^Õ^Ô^È*Ñ^Ô^Õ^Ô^ÐUÑ^Ô^Õ^Ô^ÐY^Ñ^Ô^Ð^Ð^Ñ^Ð^Ð^Ð^Ð^Ð^Ñ^Ð^Õ^Õ^Ô^Ð^Ñ^Ô^Ñ^Ô^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^ð Ô/ÐZ°Ô0EÐZÀzÐZÐ/Ð/Ð0EÀzÑRÔRÐZÐVZÐZÐRÐVZÐZÐZÐZÑZÕZÔZÐZÐZÐZÐZÐRÐVZÐZÑZÔZÐZÕZÔZÑZÔZÐZÐZÕZÔZˆ>ÑZÔZÐZÕZÔZˆ>ÑZÔZÐZÐZÕZÔZÐ/ÑZÔZÐZÕZÔZÑZÔZÐZÐZÕZÔZ°ÑZÔZÐZÕZÔZ°ÑZÔZÐZÐZÕZÔZÐ0EÑZÔZÕZÔZÀzÑZÔZÕZÔZÐRÑZÔZÕZÔZÐVZÑZÔZÐZÐZÑZÐZÐZÐZÐZÐZÑZÐZÕZÕZÔZÐZÑZÔZÑZÔZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZØÔ/Ðh°Ô0EÐhÐG^ÐhÐ/Ð/Ð0EÐG^Ñ_Ô_ÐhÐchÐhÐ_ÐchÐhÐhÐhÑhÕhÔhÐhÐhÐhÐhÐ_ÐchÐhÑhÔhÐhÕhÔhÑhÔhÐhÐhÕhÔhˆ>ÑhÔhÐhÕhÔhˆ>ÑhÔhÐhÐhÕhÔhÐ/ÑhÔhÐhÕhÔhÑhÔhÐhÐhÕhÔh°ÑhÔhÐhÕhÔh°ÑhÔhÐhÐhÕhÔhÐ0EÑhÔhÕhÔhÐG^ÑhÔhÕhÔhÐ_ÑhÔhÕhÔhÐchÑhÔhÐhÐhÑhÐhÐhÐhÐhÐhÑhÐhÕhÕhÔhÐhÑhÔhÑhÔhÐhÐhÐhÐhÐhÐhÐhÐhÐhÐhÐhÐhÐhÐhÐhr#   c                 ó�  — t          ddddd¬¦  «        }t          ddd	¬
¦  «        }||j        |j        <   |                     d¦  «        }d}||u}|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|j        }d}||k    }	|	sªt          j        d|	fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}	}|j        } |¦   «         }	d}|	|u }|s½t          j        d|fd|	|f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |	¦  «        t          j
        |¦  «        dœz  }
dd|
iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}	x}}|j        } |¦   «         }	d}|	|u }|s½t          j        d|fd|	|f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |	¦  «        t          j
        |¦  «        dœz  }
dd|
iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}	x}}t          ddd ¬
¦  «        }t!          j        t$          d!¬"¦  «        5  |                     |¦  «         ddd¦  «         dS # 1 swxY w Y   dS )#z�
    Remove-Only tabs (migrated from expired leagues) allow item withdrawal
    but strictly forbid depositing new items. When empty, they are prunable.
    Útab_migrated_01rG   r   u   [Chá»‰ RÃºt] MÃ¹a 1 Kho ChungT)Útab_idrK   r   ÚnameÚis_remove_onlyÚitem_sword_99u   BÃ­ch Huyáº¿t Kiáº¿mrR   )Ú	item_uuidÚ	item_nameÚstack_countNr%   r'   Ú	withdrawnr(   r+   r,   r-   )z1%(py2)s
{%(py2)s = %(py0)s.item_name
} == %(py5)srO   rP   rQ   rW   )zG%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_empty
}()
} is %(py7)sÚtab)r)   r/   r0   rQ   zassert %(py9)srv   )zJ%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_prunable
}()
} is %(py7)sÚitem_pill_01u   ThiÃªn Má»‡nh Ä�ané   z)Cannot deposit into Remove-Only stash tabrg   )r   r   Úitemsrˆ   Úwithdraw_itemr4   r5   r6   r7   r8   r9   r:   r;   r‰   Úis_emptyÚis_prunablerl   rm   rn   Údeposit_item)r"   rŒ   Úitemr‹   r=   r>   r?   r@   r_   rB   r`   rb   rA   Ú@py_format10Únew_items                  r!   Ú#test_remove_only_stash_tab_behaviorr—   |   s¬  € õ
 Ø ØØØ,Øðñ ô €Cõ  _Ð@VÐdeÐfÑfÔf€DØ $€C„IˆdŒnÑð ×!Ò! /Ñ2Ô2€IØ Ð ˆ9˜DÐ Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆ9˜DÐ Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˆ9Ñ Ô Ð Õ Ô ˆ9Ñ Ô Ð Ð Õ Ô ˜DÑ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð ØÔÐ8Ð"8Ð8ÐÐ"8Ò8Ð8Ð8Ð8Õ8Ô8Ð8Ð8Ð8Ð8ÐÐ"8Ð8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8ˆ9Ñ8Ô8Ð8Õ8Ô8ˆ9Ñ8Ô8Ð8Ð8Õ8Ô8ÐÑ8Ô8Õ8Ô8Ð"8Ñ8Ô8Ð8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8ØŒ<Ð!ˆ<ˆ<‰>Œ>Ð!˜TÐ!ˆ>˜TÐ!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆ>˜TÐ!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!ˆ3Ñ!Ô!Ð!Õ!Ô!ˆ3Ñ!Ô!Ð!Ð!Õ!Ô!ˆ<Ñ!Ô!Õ!Ô!ˆ>Ñ!Ô!Õ!Ô!˜TÑ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ð!ØŒ?Ð$ˆ?ˆ?ÑÔÐ$ Ð$Ð Ð$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$Ð Ð$Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$ˆ3Ñ$Ô$Ð$Õ$Ô$ˆ3Ñ$Ô$Ð$Ð$Õ$Ô$ˆ?Ñ$Ô$Õ$Ô$ÐÑ$Ô$Õ$Ô$ Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$õ ¨ÐCWÐefÐgÑgÔg€HÝ	Œ•zÐ)TÐ	UÑ	UÔ	Uð #ð #Ø×Ò˜Ñ"Ô"Ð"ð#ð #ð #ñ #ô #ð #ð #ð #ð #ð #ð #ð #øøøð #ð #ð #ð #ð #ð #s   ÎN;Î;N?ÏN?c                 ó´  — |                       dddd¬¦  «        }|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        d	œz  }d
d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}|  
                    |j        ¦  «        \  }}d}	||	u }|s—t          j        d|fd||	f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |	¦  «        dœz  }
dd|
iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}	d}||v }	|	s—t          j        d|	fd||f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }
dd|
iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}	|                      |j        ¦  «        }|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        d	œz  }d
d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}|j        }d}||u }|sªt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        d	œz  }d
d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}dS )zÅ
    In Hardcore league, character death immediately migrates the character to Standard realm.
    They cannot play in the Hardcore league anymore, but do not lose their character permanently.
    Úacc_hardcoreÚLinhHonBatDietÚCaiBangr   rJ   r-   rS   Úhc_charrO   rP   rQ   NTrW   ©z%(py0)s is %(py3)sÚsuccessr(   r+   r,   zmigrated to Standard)Úin)z%(py1)s in %(py3)sÚmsg)rU   r*   r   Úupdated_charrY   )rZ   r   r4   r5   r6   r7   r8   r9   r:   r;   Úhandle_hardcore_deathr[   Úget_characterr^   )r"   rœ   r>   r_   rB   r@   r`   rž   r    r=   r?   Ú@py_assert0r¡   s                r!   Ú,test_hardcore_permadeath_immediate_migrationr¥   ˜   s“  € ð
 ×-Ò-Ø!Ø'ØØ&ð	 .ñ ô €Gð ÔÐ4Ð 4Ð4ÐÐ 4Ò4Ð4Ð4Ð4Õ4Ô4Ð4Ð4Ð4Ð4ÐÐ 4Ð4Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4ˆ7Ñ4Ô4Ð4Õ4Ô4ˆ7Ñ4Ô4Ð4Ð4Õ4Ô4ÐÑ4Ô4Õ4Ô4Ð 4Ñ4Ô4Ð4Ð4Ñ4Ð4Ð4Ð4Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4ð "×7Ò7¸Ô8LÑMÔM�L€GˆSØÐˆ7�dˆ?ÐÐÐÕÔÐÐÐÐˆ7�dÐÑÔÐÕÔÑÔÐÐÕÔˆ7ÑÔÐÕÔˆ7ÑÔÐÐÕÔ�dÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØ!Ð(Ð! SÐ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð! SÐ(Ñ(Ô(Õ(Ô(Ð!Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô( SÑ(Ô(Ð(Õ(Ô( SÑ(Ô(Ð(Ð(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(ð "×/Ò/°Ô0DÑEÔE€LØÔ!Ð/ ZÐ/Ð! ZÒ/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð! ZÐ/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/ˆ<Ñ/Ô/Ð/Õ/Ô/ˆ<Ñ/Ô/Ð/Ð/Õ/Ô/Ð!Ñ/Ô/Õ/Ô/ ZÑ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/ØÔ Ð( DÐ(Ð  DÐ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð  DÐ(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(ˆ<Ñ(Ô(Ð(Õ(Ô(ˆ<Ñ(Ô(Ð(Ð(Õ(Ô(Ð Ñ(Ô(Õ(Ô( DÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(r#   c           
      ól  — |                       dddd¬¦  «        }|                      |j        d¬¦  «        \  }}d}||u }|s—t          j        d	|fd
||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}}| j        }|j        } ||¦  «        }	|	j        }
d}|
|k    }|�s!t          j        d|fd|
|f¦  «        dt          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |	¦  «        t          j        |
¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}	x}
x}}dS )zc
    In SSF league, player can voluntarily migrate their character to the active Trade league.
    Úacc_ssfÚDocHanhKiemrI   r   rJ   r   )r[   Útarget_trade_league_idTrW   r�   rž   r(   r+   r,   Nr-   )z•%(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.get_character
}(%(py5)s
{%(py5)s = %(py3)s.character_id
})
}.league_id
} == %(py12)sr"   Ússf_charru   rx   ry   )rZ   Úhandle_ssf_voluntary_migrationr[   r4   r5   r6   r7   r8   r9   r:   r;   r£   r   )r"   rª   rž   r    r=   r>   r?   r@   r_   rb   r|   r}   r~   r   r€   s                  r!   Ú(test_solo_self_found_voluntary_migrationr¬   °   sž  € ð ×.Ò.ØØ$Ø!Ø!ð	 /ñ ô €Hð "×@Ò@ØÔ*Ø6ð Añ ô �L€GˆSð Ðˆ7�dˆ?ÐÐÐÕÔÐÐÐÐˆ7�dÐÑÔÐÕÔÑÔÐÐÕÔˆ7ÑÔÐÕÔˆ7ÑÔÐÐÕÔ�dÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÔ'Ðc¨Ô(=ÐcÐ'Ð'Ð(=Ñ>Ô>ÐcÐ>ÔHÐcÐLcÐcÐHÐLcÒcÐcÐcÑcÕcÔcÐcÐcÐcÐcÐHÐLcÐcÑcÔcÐcÕcÔcÑcÔcÐcÐcÕcÔcˆ>ÑcÔcÐcÕcÔcˆ>ÑcÔcÐcÐcÕcÔcÐ'ÑcÔcÐcÕcÔcÑcÔcÐcÐcÕcÔc¨ÑcÔcÐcÕcÔc¨ÑcÔcÐcÐcÕcÔcÐ(=ÑcÔcÕcÔcÐ>ÑcÔcÕcÔcÐHÑcÔcÕcÔcÐLcÑcÔcÐcÐcÑcÐcÐcÐcÐcÐcÑcÐcÕcÕcÔcÐcÑcÔcÑcÔcÐcÐcÐcÐcÐcÐcÐcÐcÐcÐcÐcÐcÐcÐcÐcr#   )"Ú__doc__Úbuiltinsr6   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter4   rl   ÚtimeÚsysÚosÚpathÚinsertÚabspathÚjoinÚdirnameÚ__file__Úworld.season_league_managerr   r   r   r   r   r   r	   Úfixturer"   rE   rd   ro   r�   r—   r¥   r¬   © r#   r!   ú<module>r¾      s„  ððð ð € € € € € € € € € € € € €€€€Ø €€€Ø 
€
€
€
Ø 	€	€	€	à „‡‚��2”7—?’? 2¤7§<¢<°´·²ÀÑ0IÔ0IÈ>Ñ#ZÔ#ZÑ[Ô[Ñ \Ô \Ð \ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð „ðð ñ „ðð@2ð 2ð 2ð!ð !ð !ð
ð 
ð 
ð&ið ið ið0#ð #ð #ð8)ð )ð )ð0dð dð dð dð dr#   