§
    ži»jE  ã            
       ó`  — d 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¦  «        }|€J ‚|j        t          j        k    sJ ‚|j        t
          j        k    sJ ‚dS )uD   Standard (ThÃ¡i HÆ° Giá»›i) must always exist and never be archived.r   N)Ú
get_leaguer   r   ÚSTANDARDr   r   r   )r"   r   s     r!   Ú*test_standard_realm_initialized_by_defaultr'   :   sT   € à×(Ò(¨Ñ4Ô4€HØÐÐÐØÔ¥:Ô#6Ò6Ð6Ð6Ð6ØŒ?�lÔ1Ò1Ð1Ð1Ð1Ð1Ð1r#   c                 óÈ   — |                       dddd¬¦  «        }|j        €J ‚|j        dk    sJ ‚|j        dk    sJ ‚t	          |j        ¦  «        dk    sJ ‚|j        d	u sJ ‚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   Né   r   T)Úcreate_characterÚcharacter_idÚlevelr   ÚlenÚ	inventoryÚis_alive)r"   Úchars     r!   Ú&test_seasonal_fresh_character_creationr8   B   s�   € à×*Ò*ØØ&Ø!Ø)ð	 +ñ ô €Dð ÔÐ(Ð(Ð(ØŒ:˜Š?ˆ?ˆ?ˆ?ØŒ>Ð4Ò4Ð4Ð4Ð4ÝˆtŒ~ÑÔ !Ò#Ð#Ð#Ð#ØŒ=˜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©Úmatchr)   Ú
VoDanhTangÚThieuLamr,   N)	r   r   r   r   ÚUPCOMINGÚpytestÚraisesÚ
ValueErrorr1   )r"   s    r!   Ú9test_cannot_create_character_in_inactive_or_frozen_leaguerC   Q   sÙ   € à× Ò Ø%Ø4ÝÔ(ÝÔ$Ø$ð !ñ ô ð õ 
Œ•zÐ)OÐ	PÑ	PÔ	Pð 
ð 
Ø×'Ò'Ø Ø'Ø$Ø)ð	 	(ñ 	
ô 	
ð 	
ð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð 
ð 
s   Á
A1Á1A5Á8A5c                 ób  — |                       dddd¬¦  «        }|                       dddd¬¦  «        }|                      |j        d¦  «        du sJ ‚|                      |j        d¦  «        d	u sJ ‚|                      |j        d¦  «        du sJ ‚|                      |j        d¦  «        d	u sJ ‚d
S )zFCharacters from Standard cannot enter Season instances and vice versa.r)   ÚKiemHiepMua1ÚVoDangr   r,   ÚLaoTienBoiStdr   TFN)r1   Úvalidate_realm_accessr2   )r"   Úchar_seasonÚchar_stds      r!   Útest_strict_realm_isolationrK   d   sð   € à ×1Ò1ØØ%ØØ)ð	 2ñ ô €Kð ×.Ò.ØØ&ØØð	 /ñ ô €Hð ×/Ò/°Ô0HÐJaÑbÔbÐfjÐjÐjÐjÐjØ×/Ò/°Ô0HÈ*ÑUÔUÐY^Ð^Ð^Ð^Ð^ð ×/Ò/°Ô0EÀzÑRÔRÐVZÐZÐZÐZÐZØ×/Ò/°Ô0EÐG^Ñ_Ô_ÐchÐhÐhÐhÐhÐhÐhr#   c                 óÒ  — t          ddddd¬¦  «        }t          ddd	¬
¦  «        }||j        |j        <   |                     d¦  «        }|€J ‚|j        dk    sJ ‚|                     ¦   «         du sJ ‚|                     ¦   «         du sJ ‚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_01r)   r   u   [Chá»‰ RÃºt] MÃ¹a 1 Kho ChungT)Útab_idr-   r   ÚnameÚis_remove_onlyÚitem_sword_99u   BÃ­ch Huyáº¿t Kiáº¿mr0   )Ú	item_uuidÚ	item_nameÚstack_countNÚitem_pill_01u   ThiÃªn Má»‡nh Ä�ané   z)Cannot deposit into Remove-Only stash tabr;   )r   r   ÚitemsrR   Úwithdraw_itemrS   Úis_emptyÚis_prunabler@   rA   rB   Údeposit_item)r"   ÚtabÚitemÚ	withdrawnÚnew_items        r!   Ú#test_remove_only_stash_tab_behaviorr`   |   s]  € õ
 Ø ØØØ,Øðñ ô €Cõ  _Ð@VÐdeÐfÑfÔf€DØ $€C„IˆdŒnÑð ×!Ò! /Ñ2Ô2€IØÐ Ð Ð ØÔÐ"8Ò8Ð8Ð8Ð8Ø�<Š<‰>Œ>˜TÐ!Ð!Ð!Ð!Ø�?Š?ÑÔ Ð$Ð$Ð$Ð$õ ¨ÐCWÐefÐgÑgÔg€HÝ	Œ•zÐ)TÐ	UÑ	UÔ	Uð #ð #Ø×Ò˜Ñ"Ô"Ð"ð#ð #ð #ñ #ô #ð #ð #ð #ð #ð #ð #ð #øøøð #ð #ð #ð #ð #ð #s   Â9CÃC Ã#C c                 ó  — |                       dddd¬¦  «        }|j        dk    sJ ‚|                      |j        ¦  «        \  }}|du sJ ‚d|v sJ ‚|                      |j        ¦  «        }|j        dk    sJ ‚|j        du sJ ‚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   r,   Tzmigrated to Standardr   N)r1   r   Úhandle_hardcore_deathr2   Úget_characterr6   )r"   Úhc_charÚsuccessÚmsgÚupdated_chars        r!   Ú,test_hardcore_permadeath_immediate_migrationrk   ˜   sÁ   € ð
 ×-Ò-Ø!Ø'ØØ&ð	 .ñ ô €Gð ÔÐ 4Ò4Ð4Ð4Ð4ð "×7Ò7¸Ô8LÑMÔM�L€GˆSØ�dˆ?ˆ?ˆ?ˆ?Ø! SÐ(Ð(Ð(Ð(ð "×/Ò/°Ô0DÑEÔE€LØÔ! ZÒ/Ð/Ð/Ð/ØÔ  DÐ(Ð(Ð(Ð(Ð(Ð(r#   c                 óÌ   — |                       dddd¬¦  «        }|                      |j        d¬¦  «        \  }}|du sJ ‚|                      |j        ¦  «        j        dk    sJ ‚d	S )
zc
    In SSF league, player can voluntarily migrate their character to the active Trade league.
    Úacc_ssfÚDocHanhKiemr+   r   r,   r   )r2   Útarget_trade_league_idTN)r1   Úhandle_ssf_voluntary_migrationr2   rf   r   )r"   Ússf_charrh   ri   s       r!   Ú(test_solo_self_found_voluntary_migrationrr   °   s�   € ð ×.Ò.ØØ$Ø!Ø!ð	 /ñ ô €Hð "×@Ò@ØÔ*Ø6ð Añ ô �L€GˆSð �dˆ?ˆ?ˆ?ˆ?Ø×'Ò'¨Ô(=Ñ>Ô>ÔHÐLcÒcÐcÐcÐcÐcÐcr#   )Ú__doc__r@   ÚtimeÚsysÚosÚpathÚinsertÚabspathÚjoinÚdirnameÚ__file__Úworld.season_league_managerr   r   r   r   r   r   r	   Úfixturer"   r'   r8   rC   rK   r`   rk   rr   © r#   r!   ú<module>r€      sj  ððð ð €€€Ø €€€Ø 
€
€
€
Ø 	€	€	€	à „‡‚��2”7—?’? 2¤7§<¢<°´·²ÀÑ0IÔ0IÈ>Ñ#ZÔ#ZÑ[Ô[Ñ \Ô \Ð \ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð „ðð ñ „ðð@2ð 2ð 2ð!ð !ð !ð
ð 
ð 
ð&ið ið ið0#ð #ð #ð8)ð )ð )ð0dð dð dð dð dr#   