§
    Ù®½jp  ã                   óÔ   — d Z ddlZddlmZmZmZmZmZ ej        defd„¦   «         Z	deddfd„Z
deddfd„Zdeddfd	„Zdeddfd
„Zdeddfd„Zdeddfd„Zdeddfd„Zdeddfd„ZdS )uÝ  
Unit test suite for FreeExile Player Hideout (TiÃªn Phá»§ Ä�á»™ng ThiÃªn) & Waygate System.
Validates:
1. Hideout instantiation, themes, and private state persistence.
2. Astral Map Device 6-portal lifecycle (PoE2 model: open 6 portals, consume 1 by 1, auto-seal at 0).
3. World Exploration Waygate routing to 10 Canonical Open World Zones.
4. Quest & Bounty Portal synchronization with QuestEngine.
5. Domestic facility interactions (Stash, Alchemy, Meridian Mat, AI Altar).
é    N)ÚHideoutEngineÚHideoutThemeÚ	AstralMapÚFacilityTypeÚCANONICAL_ZONESÚreturnc                  ó   — t          ¦   «         S )N)r   © ó    ú7C:\Projects\FreeExile\tests\unit\test_hideout_engine.pyÚenginer      s   € å‰?Œ?Ðr   r   c                 óÆ  — d}|                       |t          j        ¬¦  «        }|j        |k    sJ ‚|j        t          j        k    sJ ‚|j        j        dk    sJ ‚|j        j        du sJ ‚|j	        j        du sJ ‚|                       |¦  «        }|j
        |j
        k    sJ ‚|                      |t          j        ¦  «        \  }}|du sJ ‚|j        t          j        k    sJ ‚d S )NÚhero_swordsman_01)Úthemeé   T)Úget_or_create_hideoutr   ÚBAMBOO_SHRINEÚowner_player_idr   Ú
map_deviceÚtotal_portalsÚ
world_gateÚ	is_activeÚ
quest_gateÚ
hideout_idÚchange_hideout_themeÚLUNAR_SANCTUARY)r   Ú	player_idÚh1Úh2ÚokÚmsgs         r   Ú test_hideout_creation_and_themesr"      sÿ   € Ø#€IØ	×	%Ò	% iµ|Ô7QÐ	%Ñ	RÔ	R€BàÔ Ò*Ð*Ð*Ð*ØŒ8•|Ô1Ò1Ð1Ð1Ð1ØŒ=Ô&¨!Ò+Ð+Ð+Ð+ØŒ=Ô" dÐ*Ð*Ð*Ð*ØŒ=Ô" dÐ*Ð*Ð*Ð*ð 
×	%Ò	% iÑ	0Ô	0€BØŒ=˜BœMÒ)Ð)Ð)Ð)ð ×)Ò)¨)µ\Ô5QÑRÔR�G€BˆØ�ˆ:ˆ:ˆ:ˆ:ØŒ8•|Ô3Ò3Ð3Ð3Ð3Ð3Ð3r   c           	      ó¨  — d}t          ddddddd¬	¦  «        }|                      ||¦  «        \  }}}|d
u sJ ‚t          |¦  «        dk    sJ ‚d|v sJ ‚|D ]*}|d         d
u sJ ‚|d         dk    sJ ‚|d         dk    sJ ‚Œ+|                      |¦  «        }|d         d         dk    sJ ‚|d         d         dk    sJ ‚|d         d         dk    sJ ‚d S )Nr   Úmap_vong_xoay_u_minhõ   VÃ²ng XoÃ¡y U Minh Cá»• Ä�á»‹aé   Úzone_blood_scale_ruinsé-   é   é   )Úmap_idÚnameÚtierÚzone_template_idÚitem_quantity_bonus_pctÚitem_rarity_bonus_pctÚmonster_pack_size_pctTr   zTier 14Úis_openr-   Úcolorz#a855f7r   Úportals_remainingr   )r   Úactivate_map_deviceÚlenÚget_hideout_summary)r   r   Ú
astral_mapr    r!   ÚportalsÚpÚsummarys           r   Ú/test_astral_map_device_activation_and_6_portalsr<   .   s=  € Ø#€IÝØ%Ø-ØØ1Ø "Ø Ø ðñ ô €Jð ×1Ò1°)¸ZÑHÔHÑ€BˆˆWØ�ˆ:ˆ:ˆ:ˆ:Ýˆw‰<Œ<˜1ÒÐÐÐØ˜ÐÐÐÐð ð 'ð 'ˆØ�Œ|˜tÐ#Ð#Ð#Ð#Ø�Œy˜BŠˆˆˆØ�Œz˜YÒ&Ð&Ð&Ð&Ð&à×(Ò(¨Ñ3Ô3€GØ�<Ô Ð!4Ô5¸Ò:Ð:Ð:Ð:Ø�<Ô  Ô1°QÒ6Ð6Ð6Ð6Ø�<Ô  Ô(¨BÒ.Ð.Ð.Ð.Ð.Ð.r   c                 ó¦   — d}t          dddd¬¦  «        }|                      ||¦  «        \  }}}|du sJ ‚t          |¦  «        dk    sJ ‚d	|v sJ ‚d S )
Nr   Úmap_invalidu   Vá»±c Tháº³m VÃ´ Cá»±cr*   Úzone_boundless_sandstorm©r+   r,   r-   r.   Fr   z	Tier 1-16)r   r5   r6   )r   r   Úinvalid_mapr    r!   r9   s         r   Ú-test_astral_map_device_invalid_tier_rejectionrB   K   s€   € Ø#€IÝØØ%ØØ3ð	ñ ô €Kð ×1Ò1°)¸[ÑIÔIÑ€BˆˆWØ�ˆ;ˆ;ˆ;ˆ;Ýˆw‰<Œ<˜1ÒÐÐÐØ˜#ÐÐÐÐÐÐr   c                 ón  — d}t          dddd¬¦  «        }|                      ||¦  «         |                      |¦  «        \  }}}|du sJ ‚|€J ‚|d         d	k    sJ ‚t          d
¦  «        D ]%}|                      |¦  «        \  }}}	|du sJ ‚|	€J ‚Œ&|                      |¦  «        \  }
}}|
du sJ ‚|€J ‚|d         dk    sJ ‚d|v sJ ‚|                      |¦  «        }|j        j        �J ‚|j        j        �J ‚|j        j        dk    sJ ‚|                      |¦  «        \  }}}|du sJ ‚|�J ‚d|v sJ ‚d S )Nr   Úmap_t10_hoa_quatu&   Luyá»‡n Ngá»¥c Hoang Cá»• Há»�a Quáº­té
   Úzone_purgatory_lava_cavernr@   Tr4   é   é   r   õ   Cá»”NG CUá»�I CÃ™NGFz0/6)	r   r5   Úenter_map_portalÚranger   r   Ú
active_mapÚactive_instance_idr4   )r   r   r8   Úok1Úmsg1Úres1Úir    r!   ÚresÚok_lastÚmsg_lastÚres_lastÚhideoutÚok_failÚmsg_failÚres_fails                    r   Ú%test_map_portal_consumption_lifecyclerZ   Z   sÏ  € Ø#€IÝØ!Ø5ØØ5ð	ñ ô €Jð ×Ò˜y¨*Ñ5Ô5Ð5ð ×-Ò-¨iÑ8Ô8�O€CˆˆtØ�$ˆ;ˆ;ˆ;ˆ;ØÐÐÐØÐ#Ô$¨Ò)Ð)Ð)Ð)õ �1‰XŒXð ð ˆØ×.Ò.¨yÑ9Ô9‰ˆˆC�Ø�TˆzˆzˆzˆzØˆˆˆˆð #)×"9Ò"9¸)Ñ"DÔ"DÑ€GˆX�xØ�dˆ?ˆ?ˆ?ˆ?ØÐÐÐØÐ'Ô(¨AÒ-Ð-Ð-Ð-Ø  HÐ,Ð,Ð,Ð,ð ×*Ò*¨9Ñ5Ô5€GØÔÔ(Ð0Ð0Ð0ØÔÔ0Ð8Ð8Ð8ØÔÔ/°1Ò4Ð4Ð4Ð4ð #)×"9Ò"9¸)Ñ"DÔ"DÑ€GˆX�xØ�eÐÐÐÐØÐÐÐØ�HÐÐÐÐÐÐr   c                 óÎ   — d}|                       |d¦  «        \  }}}|du sJ ‚|d         dk    sJ ‚|d         dk    sJ ‚|                       |d¦  «        \  }}}|d	u sJ ‚d
|v sJ ‚d S )Nr   r?   TÚtarget_zone_nameu   Sa Cá»‘t Hoang Máº¡cÚ	min_levelé   Úzone_fake_realmFu   khÃ´ng tá»“n táº¡i)Úconfigure_world_gate)r   r   r    r!   ÚpayloadÚok_badÚmsg_badÚ_s           r   Útest_world_gate_configurationre   …   s¤   € Ø#€Ið ×2Ò2°9Ð>XÑYÔYÑ€BˆˆWØ�ˆ:ˆ:ˆ:ˆ:ØÐ%Ô&Ð*@Ò@Ð@Ð@Ð@Ø�;Ô 2Ò%Ð%Ð%Ð%ð  ×4Ò4°YÐ@QÑRÔRÑ€FˆG�QØ�Uˆ?ˆ?ˆ?ˆ?Ø 7Ð*Ð*Ð*Ð*Ð*Ð*r   c                 ó¨   — d}|                       |ddddd¬¦  «        \  }}}|du sJ ‚|d	         dk    sJ ‚|d
         dk    sJ ‚|d         dk    sJ ‚d S )Nr   Úquest_story_02_hac_giaou   Tráº£m Diá»‡t Háº¯c GiaoÚzone_abyssal_ice_pondg     €V@g     €f@)r   Úquest_idÚquest_titleÚtarget_zone_idÚobjective_xÚobjective_yTrj   r\   u   Vá»±c Ä�áº§m BÄƒng Ä�á»™cÚvortex_colorz#fbbf24)Úconfigure_quest_gate)r   r   r    r!   ra   s        r   Útest_quest_gate_configurationrp   ”   s”   € Ø#€Ià×2Ò2ØØ*Ø.Ø.ØØð 3ñ ô Ñ€BˆˆWð �ˆ:ˆ:ˆ:ˆ:Ø�=Ô!Ð%?Ò?Ð?Ð?Ð?ØÐ%Ô&Ð*EÒEÐEÐEÐEØ�>Ô" iÒ/Ð/Ð/Ð/Ð/Ð/r   c                 ó:  — d}|                       |t          j        ¦  «        \  }}}|du sJ ‚|d         dk    sJ ‚|                       |t          j        ¦  «        \  }}}|du sJ ‚|d         dk    sJ ‚|                       |t          j        ¦  «        \  }}}|du sJ ‚|d         dk    sJ ‚|                       |t          j        ¦  «        \  }}}|du sJ ‚|d         dk    sJ ‚|                       |t          j        ¦  «        \  }}}|du sJ ‚|d         dk    sJ ‚d S )	Nr   TÚfacilityÚSTASHÚFORGEÚMERIDIANÚ	AGENT_ORBÚ
MAP_DEVICE)Úinteract_facilityr   ÚCONSIGNMENT_STASH_VAULTÚPRIMAL_FORGE_CAULDRONÚMERIDIAN_MEDITATION_MATÚAGENT_ORB_ALTARÚASTRAL_MAP_DEVICE)r   r   r    r!   Údatas        r   Ú#test_hideout_facilities_interactionr   ¥   s\  € Ø#€Ið ×,Ò,¨Y½Ô8\Ñ]Ô]�M€BˆˆTØ�ˆ:ˆ:ˆ:ˆ:Ø�
Ô˜wÒ&Ð&Ð&Ð&ð ×,Ò,¨Y½Ô8ZÑ[Ô[�M€BˆˆTØ�ˆ:ˆ:ˆ:ˆ:Ø�
Ô˜wÒ&Ð&Ð&Ð&ð ×,Ò,¨Y½Ô8\Ñ]Ô]�M€BˆˆTØ�ˆ:ˆ:ˆ:ˆ:Ø�
Ô˜zÒ)Ð)Ð)Ð)ð ×,Ò,¨Y½Ô8TÑUÔU�M€BˆˆTØ�ˆ:ˆ:ˆ:ˆ:Ø�
Ô˜{Ò*Ð*Ð*Ð*ð ×,Ò,¨Y½Ô8VÑWÔW�M€BˆˆTØ�ˆ:ˆ:ˆ:ˆ:Ø�
Ô˜|Ò+Ð+Ð+Ð+Ð+Ð+r   c                 ó0  — ddl m}  |¦   «         }d}t          dddd¬¦  «        }|                      |||¬	¦  «        \  }}}|d
u sJ ‚|d         }||j        v sJ ‚t          d¦  «        D ].}|                      ||¬	¦  «        \  }	}}|	d
u sJ ‚||j        v sJ ‚Œ/|                      ||¬	¦  «        \  }
}}|
d
u sJ ‚|€J ‚|d         dk    sJ ‚d|v sJ ‚||j        vsJ ‚|                      |¦  «        j        }|j	        �J ‚|j
        �J ‚|j        dk    sJ ‚dS )zkVerifies that consuming all 6 portals purges InstanceSession from ZoneEngine and clears active_instance_id.r   )Ú
ZoneEnginer   Úmap_t14_blood_scaler%   r&   r'   r@   )Úzone_engineTÚinstance_idrG   Nr4   rI   )Úserver.world.zone_enginer�   r   Úcreate_map_instance_sessionÚactive_instancesrK   rJ   r   r   rM   rL   r4   )r   r�   Úzer   r8   r    rd   rR   Úinst_idÚok_enterÚok_finalÚ	msg_finalÚ	res_finalÚdevs                 r   Ú<test_map_device_portal_exhaustion_cleans_zone_engine_sessionr�   Â   s¹  € à3Ð3Ð3Ð3Ð3Ð3à	ˆ‰Œ€BØ#€IÝØ$Ø-ØØ1ð	ñ ô €Jð ×3Ò3°I¸zÐWYÐ3ÑZÔZ�J€Bˆˆ3Ø�ˆ:ˆ:ˆ:ˆ:Ø�-Ô €GØ�bÔ)Ð)Ð)Ð)Ð)õ �1‰XŒXð .ð .ˆØ×0Ò0°ÈÐ0ÑKÔK‰ˆ�!�QØ˜4ÐÐÐÐØ˜"Ô-Ð-Ð-Ð-Ð-Ð-ð &,×%<Ò%<¸YÐTVÐ%<Ñ%WÔ%WÑ"€Hˆi˜Ø�tÐÐÐÐØÐ Ð Ð ØÐ(Ô)¨QÒ.Ð.Ð.Ð.Ø  IÐ-Ð-Ð-Ð-ð ˜"Ô-Ð-Ð-Ð-Ð-Ø
×
&Ò
& yÑ
1Ô
1Ô
<€CØÔ!Ð)Ð)Ð)ØŒ>Ð!Ð!Ð!ØÔ  AÒ%Ð%Ð%Ð%Ð%Ð%r   )Ú__doc__ÚpytestÚserver.world.hideout_enginer   r   r   r   r   Úfixturer   r"   r<   rB   rZ   re   rp   r   r�   r
   r   r   ú<module>r”      s¥  ððð ð €€€ðð ð ð ð ð ð ð ð ð ð ð ð ð ð „ð�ð ð ð ñ „ðð4¨]ð 4¸tð 4ð 4ð 4ð 4ð(/¸Mð /Èdð /ð /ð /ð /ð:¸-ð ÈDð ð ð ð ð(°-ð (ÀDð (ð (ð (ð (ðV+¨-ð +¸Dð +ð +ð +ð +ð0¨-ð 0¸Dð 0ð 0ð 0ð 0ð",°ð ,À$ð ,ð ,ð ,ð ,ð:$&Èð $&Ð[_ð $&ð $&ð $&ð $&ð $&ð $&r   