§
    Ùz¿j#  ã            
       óÆ   — U d Z ddlmZ ddlZddlZddlmZ ddlmZ dddd	d
dddddœ	Z	e
eeeeeef         f         ed<   ej        defd„¦   «         Z G d„ d¦  «        ZdS )a•  
Unit tests for Requirement R1: Wilderness Map Expansion in FreeExile.
Verifies that:
1. All 9 wilderness zones have their bounds doubled from original specs.
2. The initial wilderness zone (zone_tang_kiem_nhai) has bounds >= 1600.0 x 1600.0.
3. Safe Haven / Sanctuary zones (zone_boundless_sanctuary, zone_player_hideout)
   remain strictly at 800.0 x 800.0.
4. Server-authoritative movement engine (ZoneEngine.update_player_position)
   correctly permits player navigation into the expanded coordinates (e.g. x=900.0)
   and clamps/rejects movements beyond the new half-extents.
5. Central Game Design Matrix SQLite database reflects the expanded dimensions.
é    )ÚPathN©Ú
ZoneEngine)ÚZoneType)ç     @�@r   ç     @Ÿ@r   )ç     À’@r	   ç     À¢@r
   )ç     p—@r   ç     p§@r   )ç      ™@r   ç      ©@r   )ç      œ@r   ç      ¬@r   )r   r   ç     @¯@r   )ç     0¡@r   ç     0±@r   )r
   r
   ç     À²@r   )ç     ˆ£@r   ç     ˆ³@r   )	Úzone_tang_kiem_nhaiÚzone_ancient_sword_barrowÚzone_boundless_sandstormÚzone_blood_scale_ruinsÚzone_five_elements_altarÚzone_abyssal_ice_pondÚzone_infinite_blood_riftÚzone_purgatory_lava_cavernÚzone_boundless_celestial_palaceÚEXPECTED_WILDERNESS_BOUNDSÚreturnc                  ó   — t          ¦   «         S )Nr   © ó    ú>C:\Projects\FreeExile\tests\unit\test_zone_bounds_expansion.pyÚzone_enginer&   $   s   € å‰<Œ<Ðr$   c                   óŠ   — e Zd Z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d„Zdd„Zdd„ZdS )ÚTestZoneBoundsExpansionzPValidates wilderness zone expansion across server engine, catalog, and database.r&   r!   Nc                 ó    — |                      d¦  «        }|€J ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚dS )zNVerifies zone_tang_kiem_nhai meets or exceeds the 1600.0 x 1600.0 requirement.r   Nr   r   )Úget_zoneÚbounds_widthÚbounds_height)Úselfr&   Úzones      r%   Ú6test_tang_kiem_nhai_exceeds_minimum_expanded_thresholdzNTestZoneBoundsExpansion.test_tang_kiem_nhai_exceeds_minimum_expanded_threshold,   sz   € ð ×#Ò#Ð$9Ñ:Ô:ˆØÐÐÐØÔ  FÒ*Ð*Ð*Ð*ØÔ! VÒ+Ð+Ð+Ð+ØÔ  FÒ*Ð*Ð*Ð*ØÔ! VÒ+Ð+Ð+Ð+Ð+Ð+r$   c                 ób  — t                                ¦   «         D ]”\  }\  }}}}|                     |¦  «        }|€J d|› d�¦   «         ‚|j        t          j        k    sJ ‚|j        |k    sJ d|› d|j        › d|› d|› d�	¦   «         ‚|j        |k    sJ d|› d|j        › d|› d|› d�	¦   «         ‚Œ•dS )	zIVerifies that all 9 wilderness zones have their width and height doubled.NzZone 'z' not found in ZoneEnginez' width ú != expected z (2x ú)z	' height )r    Úitemsr*   Ú	zone_typer   Ú
OPEN_WORLDr+   r,   )r-   r&   Úzone_idÚbase_wÚbase_hÚexp_wÚexp_hr.   s           r%   Ú&test_all_nine_wilderness_zones_doubledz>TestZoneBoundsExpansion.test_all_nine_wilderness_zones_doubled7   s  € õ 8R×7WÒ7WÑ7YÔ7Yð 		ð 		Ñ3ˆGÑ3�f˜f e¨UØ×'Ò'¨Ñ0Ô0ˆDØÐ#Ð#Ð%P¨gÐ%PÐ%PÐ%PÑ#Ô#Ð#Ø”>¥XÔ%8Ò8Ð8Ð8Ð8ØÔ$¨Ò-Ð-Ð-Ø_˜Ð_Ð_¨$Ô*;Ð_Ð_È%Ð_Ð_ÐV\Ð_Ð_Ð_ñ .Ô-Ð-ð Ô%¨Ò.Ð.Ð.Øa˜ÐaÐa¨4Ô+=ÐaÐaÈEÐaÐaÐX^ÐaÐaÐañ /Ô.Ð.Ð.ð		ð 		r$   c                 ó.  — |                      d¦  «        }|€J ‚|j        t          j        k    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|                      d¦  «        }|€J ‚|j        t          j        k    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚dS )zLEnsures sanctuary hubs and hideouts are never expanded beyond 800.0 x 800.0.Úzone_boundless_sanctuaryNç      ‰@Úzone_player_hideout)r*   r4   r   Ú	SANCTUARYr+   r,   )r-   r&   Ú	sanctuaryÚhideouts       r%   Ú(test_sanctuary_zones_remain_strictly_800z@TestZoneBoundsExpansion.test_sanctuary_zones_remain_strictly_800F   sÈ   € ð  ×(Ò(Ð)CÑDÔDˆ	ØÐ$Ð$Ð$ØÔ"¥hÔ&8Ò8Ð8Ð8Ð8ØÔ%¨Ò.Ð.Ð.Ð.ØÔ&¨%Ò/Ð/Ð/Ð/à×&Ò&Ð'<Ñ=Ô=ˆØÐ"Ð"Ð"ØÔ ¥HÔ$6Ò6Ð6Ð6Ð6ØÔ# uÒ,Ð,Ð,Ð,ØÔ$¨Ò-Ð-Ð-Ð-Ð-Ð-r$   c                 ó€  — d}|                      |d¦  «         |                     |dd¦  «        \  }}|du sJ ‚|dk    sJ ‚|                     |¦  «        }|j        dk    sJ ‚|j        dk    sJ ‚|                     |dd¦  «        \  }}|du sJ ‚|dk    sJ ‚|                     |dd	¦  «        \  }}	|d
u sJ ‚d|	v sJ ‚dS )zUTests that player movement allows coordinates in expanded half-bounds (up to 1000.0).Útest_wanderer_01r   g      Œ@TÚ g     °�Àg     �ŠÀg     h�@g      I@Fõ$   VÆ°á»£t quÃ¡ ranh giá»›i báº£n Ä‘á»“N)Úspawn_playerÚupdate_player_positionÚget_player_locationÚxÚy)
r-   r&   Ú	player_idÚsuccessÚerrÚlocÚneg_okÚneg_errÚ	exceed_okÚ
exceed_errs
             r%   Ú=test_movement_engine_allows_expanded_coordinates_in_tang_kiemzUTestZoneBoundsExpansion.test_movement_engine_allows_expanded_coordinates_in_tang_kiemV   s  € ð 'ˆ	Ø× Ò  Ð,AÑBÔBÐBð #×9Ò9¸)ÀUÈEÑRÔR‰ˆ�Ø˜$ˆˆˆˆØ�bŠyˆyˆyˆyà×-Ò-¨iÑ8Ô8ˆØŒu˜Š~ˆ~ˆ~ˆ~ØŒu˜Š~ˆ~ˆ~ˆ~ð &×<Ò<¸YÈÐPVÑWÔW‰ˆ�Ø˜ˆ~ˆ~ˆ~ˆ~Ø˜"Š}ˆ}ˆ}ˆ}ð !,× BÒ BØ�v˜tñ!
ô !
Ñˆ	�:ð ˜EÐ!Ð!Ð!Ð!Ø5¸ÐCÐCÐCÐCÐCÐCr$   c                 óÒ   — d}|                      |d¦  «         |                     |dd¦  «        \  }}|du sJ ‚|dk    sJ ‚|                     |dd¦  «        \  }}|du sJ ‚d	|v sJ ‚d
S )zOVerifies that sanctuary movement boundary remains strictly at half-bound 400.0.Útest_wanderer_sanctuaryr=   g     àu@TrF   g      |@ç        FrG   N©rH   rI   ©r-   r&   rM   ÚokrO   ÚblockedÚ	block_errs          r%   Ú2test_movement_engine_respects_sanctuary_800_boundszJTestZoneBoundsExpansion.test_movement_engine_respects_sanctuary_800_boundsr   sž   € ð .ˆ	Ø× Ò  Ð,FÑGÔGÐGð ×4Ò4°YÀÀuÑMÔM‰ˆˆCØ�TˆzˆzˆzˆzØ�bŠyˆyˆyˆyð )×?Ò?À	È5ÐRUÑVÔVÑˆ�Ø˜%ÐÐÐÐØ5¸ÐBÐBÐBÐBÐBÐBr$   c                 óÒ   — d}|                      |d¦  «         |                     |dd¦  «        \  }}|du sJ ‚|dk    sJ ‚|                     |dd¦  «        \  }}|d	u sJ ‚d
|v sJ ‚dS )zXVerifies bounds in zone_boundless_celestial_palace (5000.0 x 5000.0, half-bound 2500.0).Útest_wanderer_celestialr   r
   g     À¢ÀTrF   g     P¤@rX   FrG   NrY   rZ   s          r%   Ú/test_movement_engine_in_highest_tier_wildernesszGTestZoneBoundsExpansion.test_movement_engine_in_highest_tier_wildernessƒ   sž   € ð .ˆ	Ø× Ò  Ð,MÑNÔNÐNð ×4Ò4°YÀÈÑPÔP‰ˆˆCØ�TˆzˆzˆzˆzØ�bŠyˆyˆyˆyð )×?Ò?À	È6ÐSVÑWÔWÑˆ�Ø˜%ÐÐÐÐØ5¸ÐBÐBÐBÐBÐBÐBr$   c           	      ól  — t          d¦  «        }|                     ¦   «         s
J d¦   «         ‚t          j        t	          |¦  «        ¦  «        }	 |                     ¦   «         }|                     d¦  «                             ¦   «         }d„ |D ¦   «         }|d         dk    sJ ‚|d         dk    sJ ‚t           	                    ¦   «         D ]9\  }\  }}}}	||v sJ ‚||         ||	fk    sJ d|› d	||         › d
||	f› �¦   «         ‚Œ:	 | 
                    ¦   «          dS # | 
                    ¦   «          w xY w)zSVerifies that data/game_design_matrix.db contains the synchronized expanded bounds.zdata/game_design_matrix.dbz game_design_matrix.db must existz6SELECT zone_id, bounds_width, bounds_height FROM zonesc                 óp   — i | ]3}|d          t          |d         ¦  «        t          |d         ¦  «        f“Œ4S )r   é   é   )Úfloat)Ú.0Úrows     r%   ú
<dictcomp>z^TestZoneBoundsExpansion.test_database_matrix_sync_reflects_expanded_bounds.<locals>.<dictcomp>Ÿ   s7   € ÐUÐUÐUÈ˜c !œf¥u¨S°¬V¡}¤}µe¸CÀ¼F±m´mÐ&DÐUÐUÐUr$   r=   )r>   r>   r?   zDB bounds for z: r1   N)r   ÚexistsÚsqlite3ÚconnectÚstrÚcursorÚexecuteÚfetchallr    r3   Úclose)
r-   Údb_pathÚconnrn   ÚrowsÚbounds_by_zoner6   Ú_r9   r:   s
             r%   Ú2test_database_matrix_sync_reflects_expanded_boundszJTestZoneBoundsExpansion.test_database_matrix_sync_reflects_expanded_bounds”   ss  € åÐ3Ñ4Ô4ˆØ�~Š~ÑÔÐCÐCÐ!CÑCÔCÐåŒ�s 7™|œ|Ñ,Ô,ˆð	Ø—[’[‘]”]ˆFØ—>’>ØHñô çŠh‰jŒjð ð VÐUÐPTÐUÑUÔUˆNð "Ð"<Ô=ÀÒOÐOÐOÐOØ!Ð"7Ô8¸NÒJÐJÐJÐJõ 2L×1QÒ1QÑ1SÔ1Sð ð Ñ-�Ñ-˜!˜Q  uØ .Ð0Ð0Ð0Ð0Ø% gÔ.°5¸%°.Ò@Ð@Ð@Øf WÐfÐf°¸wÔ0GÐfÐfÐW\Ð^cÐVdÐfÐfñ AÔ@Ð@Ð@ðð �JŠJ‰LŒLˆLˆLˆLøˆD�JŠJ‰LŒLˆLˆLøøøs   ÁB6D ÄD3c                 óÜ   — t          d¦  «        }|                     ¦   «         sJ ‚|                     d¬¦  «        }d|v sJ ‚d|v sJ ‚d|v sJ ‚d|v sJ ‚d|v sJ ‚d	|v sJ ‚d
|v sJ ‚d|v sJ ‚dS )zNVerifies that client/webapp/js/engine/collision_engine.js has expanded bounds.z+client/webapp/js/engine/collision_engine.jsúutf-8©ÚencodingzminWx: -22.0, maxWx: 22.0zminWy: -17.0, maxWy: 17.0zminCamWx: -16.5, maxCamWx: 16.5zminCamWy: -12.5, maxCamWy: 12.5zminWx: -20.0, maxWx: 20.0zminCamWx: -15.0, maxCamWx: 15.0zminWx: -45.0, maxWx: 45.0zminCamWx: -40.0, maxCamWx: 40.0N©r   rj   Ú	read_text)r-   Úcollision_fileÚcontents      r%   Ú0test_client_collision_engine_has_expanded_boundszHTestZoneBoundsExpansion.test_client_collision_engine_has_expanded_bounds®   sÒ   € åÐKÑLÔLˆØ×$Ò$Ñ&Ô&Ð&Ð&Ð&Ø ×*Ò*°GÐ*Ñ<Ô<ˆð +¨gÐ5Ð5Ð5Ð5Ø*¨gÐ5Ð5Ð5Ð5Ø0°GÐ;Ð;Ð;Ð;Ø0°GÐ;Ð;Ð;Ð;ð +¨gÐ5Ð5Ð5Ð5Ø0°GÐ;Ð;Ð;Ð;ð +¨gÐ5Ð5Ð5Ð5Ø0°GÐ;Ð;Ð;Ð;Ð;Ð;r$   c                 ó”   — t          d¦  «        }|                     ¦   «         sJ ‚|                     d¬¦  «        }d|v sJ ‚d|v sJ ‚dS )zTVerifies that client/webapp/js/engine/world_renderer.js centers tile loop on camera.z)client/webapp/js/engine/world_renderer.jsry   rz   zcamWx - tileRadiuszcamWy - tileRadiusNr|   )r-   Úrenderer_filer   s      r%   Ú:test_client_world_renderer_centers_ambient_tiles_on_camerazRTestZoneBoundsExpansion.test_client_world_renderer_centers_ambient_tiles_on_cameraÂ   sf   € åÐHÑIÔIˆØ×#Ò#Ñ%Ô%Ð%Ð%Ð%Ø×)Ò)°7Ð)Ñ;Ô;ˆà# wÐ.Ð.Ð.Ð.Ø# wÐ.Ð.Ð.Ð.Ð.Ð.r$   )r!   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r/   r;   rC   rU   r^   ra   rw   r€   rƒ   r#   r$   r%   r(   r(   )   s@  € € € € € ØZÐZð	,Ø%ð	,à	ð	,ð 	,ð 	,ð 	,ðØ%ðà	ðð ð ð ð.Ø%ð.à	ð.ð .ð .ð .ð DØ%ðDà	ðDð Dð Dð Dð8CØ%ðCà	ðCð Cð Cð Cð"CØ%ðCà	ðCð Cð Cð Cð"ð ð ð ð4<ð <ð <ð <ð(/ð /ð /ð /ð /ð /r$   r(   )r‡   Úpathlibr   rk   ÚpytestÚserver.world.zone_enginer   Úserver.world.zone_typesr   r    Údictrm   Útuplerf   Ú__annotations__Úfixturer&   r(   r#   r$   r%   ú<module>r�      s  ððð ð ð Ð Ð Ð Ð Ð Ø €€€Ø €€€à /Ð /Ð /Ð /Ð /Ð /Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,ð
 <Ø!AØ @Ø>Ø @Ø=Ø @Ø"BØ'GðLð LÐ ˜D  e¨E°5¸%ÀÐ,FÔ&GÐ!GÔHð ð ñ ð „ð�Zð ð ð ñ „ðð`/ð `/ð `/ð `/ð `/ñ `/ô `/ð `/ð `/ð `/r$   