§
    WI¾jE'  ã                   ó~   — 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 ej	        defd„¦   «         Z
 G d„ d	¦  «        ZdS )
aT  
Adversarial and empirical verification suite for Milestone 1 (R1: Wilderness Map Expansion).

Directly challenges and stress-tests:
1. Extreme coordinates in zone_tang_kiem_nhai (x=999.0 valid, x=1001.0 rejected).
2. Boundary expansion transition (old edge x=500.0 vs new valid coordinate x=800.0).
3. Sanctuary zone bounds rejection (x=401.0 rejected in zone_player_hideout, half-width 400.0).
4. JS camera bounds in ZONE_BOUNDS (minCamWx < maxCamWx, minCamWy < maxCamWy for all zones).
5. All 9 wilderness zones upper/lower boundary stress.
6. Non-finite coordinate handling (inf, -inf, nan).
é    )ÚPathN©Ú
ZoneEngine)ÚZoneTypeÚreturnc                  ó   — t          ¦   «         S )Nr   © ó    ú@C:\Projects\FreeExile\tests\unit\test_adversarial_zone_bounds.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d„Ze	j
                             d	g d
¢¦  «        ded	eddfd„¦   «         Zdeddfd„ZdS )ÚTestAdversarialZoneBoundszJEmpirical challenges against zone bounds expansion and safety constraints.r   r   Nc                 ó¦  — d}|                      |d¦  «         |                     |dd¦  «        \  }}|du sJ d|› �¦   «         ‚|dk    sJ ‚|                     |¦  «        j        dk    sJ ‚|                     |dd¦  «        \  }}|du sJ d	|› �¦   «         ‚|                     |d
d¦  «        \  }}|du s
J d¦   «         ‚d|v sJ ‚|                     |dd¦  «        \  }	}
|	du sJ ‚|                     |dd¦  «        \  }}|du sJ ‚d|v sJ ‚|                     |dd¦  «        \  }}
|du sJ ‚|                     |dd
¦  «        \  }}|du sJ ‚d|v sJ ‚dS )zº
        Challenge 1: Extreme coordinates in zone_tang_kiem_nhai.
        Half-width is 1000.0 (bounds 2000.0 x 2000.0).
        x=999.0 must succeed; x=1001.0 must be rejected.
        Úadv_player_tang_kiemÚzone_tang_kiem_nhaig     8�@ç        Tz*Expected x=999.0 to succeed, failed with: Ú g     @�@z5Expected exact boundary x=1000.0 to succeed, failed: g     H�@Fz0Expected x=1001.0 to be rejected, but succeeded!õ$   VÆ°á»£t quÃ¡ ranh giá»›i báº£n Ä‘á»“g     8�Àg     H�ÀN)Úspawn_playerÚupdate_player_positionÚget_player_locationÚx)Úselfr   Ú	player_idÚok_999Úerr_999Úok_1000Úerr_1000Úok_1001Úerr_1001Ú
ok_neg_999Ú_Úok_neg_1001Úerr_neg_1001Úok_y_999Ú	ok_y_1001Ú
err_y_1001s                   r   Ú'test_extreme_coordinates_tang_kiem_nhaizATestAdversarialZoneBounds.test_extreme_coordinates_tang_kiem_nhai   sï  € ð +ˆ	Ø× Ò  Ð,AÑBÔBÐBð &×<Ò<¸YÈÈsÑSÔS‰ˆ�Ø˜ˆ~ˆ~ˆ~ÐUÈGÐUÐU‰~Œ~ˆ~Ø˜"Š}ˆ}ˆ}ˆ}Ø×.Ò.¨yÑ9Ô9Ô;¸uÒDÐDÐDÐDð (×>Ò>¸yÈ&ÐRUÑVÔVÑˆ�Ø˜$ˆˆˆÐ bÐX`Ð bÐ b‰Œˆð (×>Ò>¸yÈ&ÐRUÑVÔVÑˆ�Ø˜%ÐÐÐÐ!SÑÔÐØ5¸ÐAÐAÐAÐAð $×:Ò:¸9ÀfÈcÑRÔR‰ˆ
�AØ˜TÐ!Ð!Ð!Ð!à$/×$FÒ$FÀyÐRYÐ[^Ñ$_Ô$_Ñ!ˆ�\Ø˜eÐ#Ð#Ð#Ð#Ø5¸ÐEÐEÐEÐEð "×8Ò8¸ÀCÈÑOÔO‰ˆ�!Ø˜4ÐÐÐÐà +× BÒ BÀ9ÈcÐSYÑ ZÔ ZÑˆ	�:Ø˜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|› �¦   «         ‚|dk    sJ ‚|                     |dd¦  «        \  }}|du sJ ‚|dk    sJ ‚d	S )
zŠ
        Challenge 2: Verify old boundary x=500.0 was previously the edge,
        but now x=800.0 is valid and freely navigable.
        Úadv_player_expansionr   g     @@Tr   g      ‰@zx=800.0 failed: g      ‰ÀN©r   r   )	r   r   r   Úok_500Úerr_500Úok_800Úerr_800Ú
ok_neg_800Úerr_neg_800s	            r   Ú*test_old_boundary_vs_new_expanded_boundaryzDTestAdversarialZoneBounds.test_old_boundary_vs_new_expanded_boundaryE   så   € ð
 +ˆ	Ø× Ò  Ð,AÑBÔBÐBð &×<Ò<¸YÈÈuÑUÔU‰ˆ�Ø˜ˆ~ˆ~ˆ~ˆ~Ø˜"Š}ˆ}ˆ}ˆ}ð &×<Ò<¸YÈÈuÑUÔU‰ˆ�Ø˜ˆ~ˆ~ˆ~Ð;°'Ð;Ð;‰~Œ~ˆ~Ø˜"Š}ˆ}ˆ}ˆ}ð #.×"DÒ"DÀYÐPVÐX^Ñ"_Ô"_Ñˆ
�KØ˜TÐ!Ð!Ð!Ð!Ø˜bÒ Ð Ð Ð Ð Ð r
   c                 ó°  — d}|                      |d¦  «         |                     |dd¦  «        \  }}|du sJ d|› �¦   «         ‚|                     |dd¦  «        \  }}|du s
J d	¦   «         ‚d
|v sJ ‚|                     |dd¦  «        \  }}|du sJ ‚d
|v sJ ‚d}	|                      |	d¦  «         |                     |	dd¦  «        \  }
}|
du sJ ‚d
|v sJ ‚dS )z¡
        Challenge 3: Test sanctuary zone bounds rejection: player moving to
        x=401.0 in zone_player_hideout must be rejected (half-width 400.0).
        Úadv_player_hideoutÚzone_player_hideoutg      y@r   Tzx=400.0 failed: g     y@Fz:Expected x=401.0 in hideout to be rejected, but it passed!r   Úadv_player_sanctuaryÚzone_boundless_sanctuaryNr+   )r   r   r   Úok_400Úerr_400Úok_401Úerr_401Úok_y_401Ú	err_y_401Úp2Úok_sanc_401Úerr_sanc_401s               r   Ú$test_sanctuary_zone_bounds_rejectionz>TestAdversarialZoneBounds.test_sanctuary_zone_bounds_rejection\   s?  € ð
 )ˆ	Ø× Ò  Ð,AÑBÔBÐBð &×<Ò<¸YÈÈsÑSÔS‰ˆ�Ø˜ˆ~ˆ~ˆ~Ð;°'Ð;Ð;‰~Œ~ˆ~ð &×<Ò<¸YÈÈsÑSÔS‰ˆ�Ø˜ˆˆˆÐ \‰ŒˆØ5¸Ð@Ð@Ð@Ð@ð *×@Ò@ÀÈCÐQVÑWÔWÑˆ�)Ø˜5Ð Ð Ð Ð Ø5¸ÐBÐBÐBÐBð $ˆØ× Ò  Ð%?Ñ@Ô@Ð@Ø$/×$FÒ$FÀrÈ5ÐRUÑ$VÔ$VÑ!ˆ�\Ø˜eÐ#Ð#Ð#Ð#Ø5¸ÐEÐEÐEÐEÐEÐEr
   c           	      ó  — t          d¦  «        }|                     ¦   «         sJ ‚|                     d¬¦  «        }t          j        d¦  «        }|                     |¦  «        }t          |¦  «        dk    sJ dt          |¦  «        › �¦   «         ‚|D �]w}|d         }t          |d         ¦  «        }t          |d	         ¦  «        }t          |d
         ¦  «        }	t          |d         ¦  «        }
t          |d         ¦  «        }t          |d         ¦  «        }t          |d         ¦  «        }t          |d         ¦  «        }||k     sJ d|› d|› d|› d�¦   «         ‚||k     sJ d|› d|› d|› d�¦   «         ‚||k     sJ d|› d�¦   «         ‚|	|
k     sJ d|› d�¦   «         ‚||k    sJ d|› d|› d|› d�¦   «         ‚||k    sJ d|› d|› d|› d�¦   «         ‚|	|k    sJ d|› d|	› d|› d�¦   «         ‚||
k    sJ d|› d|› d|
› d�¦   «         ‚�Œyd S )!zÌ
        Challenge 4: Test camera bounds in JS: ensure minCamWx < maxCamWx
        and minCamWy < maxCamWy for all zones in ZONE_BOUNDS.
        Also check minWx <= minCamWx <= maxCamWx <= maxWx.
        z+client/webapp/js/engine/collision_engine.jszutf-8)ÚencodingzÈ(\w+):\s*\{[^}]*minWx:\s*([-\d.]+),\s*maxWx:\s*([-\d.]+),\s*minWy:\s*([-\d.]+),\s*maxWy:\s*([-\d.]+),\s*minCamWx:\s*([-\d.]+),\s*maxCamWx:\s*([-\d.]+),\s*minCamWy:\s*([-\d.]+),\s*maxCamWy:\s*([-\d.]+)é   z)Expected at least 11 zone entries, found r   é   é   é   é   é   é   é   é   zZone z: minCamWx (z) >= maxCamWx (ú)z: minCamWy (z) >= maxCamWy (z: minWx >= maxWxz: minWy >= maxWyz	: minWx (z) > minCamWx (z: maxCamWx (z) > maxWx (z	: minWy (z) > minCamWy (z: maxCamWy (z) > maxWy (N)r   ÚexistsÚ	read_textÚreÚcompileÚfindallÚlenÚfloat)r   Úcollision_fileÚcontentÚzone_patternÚmatchesÚmatchÚzone_idÚmin_wxÚmax_wxÚmin_wyÚmax_wyÚ
min_cam_wxÚ
max_cam_wxÚ
min_cam_wyÚ
max_cam_wys                  r   Ú$test_camera_bounds_in_js_zone_boundsz>TestAdversarialZoneBounds.test_camera_bounds_in_js_zone_boundsy   sÐ  € õ ÐKÑLÔLˆØ×$Ò$Ñ&Ô&Ð&Ð&Ð&Ø ×*Ò*°GÐ*Ñ<Ô<ˆõ ”zð>ñ
ô 
ˆð ×&Ò& wÑ/Ô/ˆÝ�7‰|Œ|˜rÒ!Ð!Ð!Ð#]ÍsÐSZÉ|Ì|Ð#]Ð#]Ñ!Ô!Ð!àð #	ñ #	ˆEØ˜A”hˆGÝ˜5 œ8‘_”_ˆFÝ˜5 œ8‘_”_ˆFÝ˜5 œ8‘_”_ˆFÝ˜5 œ8‘_”_ˆFÝ˜u Qœx™œˆJÝ˜u Qœx™œˆJÝ˜u Qœx™œˆJÝ˜u Qœx™œˆJð  
Ò*Ð*Ð*ØU˜ÐUÐU¨ZÐUÐUÈ
ÐUÐUÐUñ +Ô*Ð*ð  
Ò*Ð*Ð*ØU˜ÐUÐU¨ZÐUÐUÈ
ÐUÐUÐUñ +Ô*Ð*ð
 ˜F’?�?�?Ð$E¨GÐ$EÐ$EÐ$E‘?”?�?Ø˜F’?�?�?Ð$E¨GÐ$EÐ$EÐ$E‘?”?�?ð ˜ZÒ'Ð'Ð'ØM˜ÐMÐM¨&ÐMÐMÀ
ÐMÐMÐMñ (Ô'Ð'ð  Ò'Ð'Ð'ØM˜ÐMÐM¨ZÐMÐMÀFÐMÐMÐMñ (Ô'Ð'ð ˜ZÒ'Ð'Ð'ØM˜ÐMÐM¨&ÐMÐMÀ
ÐMÐMÐMñ (Ô'Ð'ð  Ò'Ð'Ð'ØM˜ÐMÐM¨ZÐMÐMÀFÐMÐMÐMñ (Ô'Ð'Ñ'ðC#	ð #	r
   rZ   )	r   Ú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_palacec           	      ó,  — |                      |¦  «        }|€J ‚|j        t          j        k    sJ ‚|j        dz  }|j        dz  }d|› �}|                     ||¦  «         |                     ||dz
  |dz
  ¦  «        \  }}|du sJ d|dz
  › d|dz
  › d|› d	|› �¦   «         ‚|                     ||dz   d
¦  «        \  }	}
|	du sJ d|dz   › d|› �¦   «         ‚d|
v sJ ‚|                     |d
|dz   ¦  «        \  }}|du sJ d|dz   › d|› �¦   «         ‚d|v sJ ‚dS )z9Adversarial boundary check across all 9 wilderness zones.Ng       @Úadv_stress_g      ð?TzFailed at (z, z) in z: r   FzUnexpectedly allowed x=z in r   zUnexpectedly allowed y=)Úget_zoneÚ	zone_typer   Ú
OPEN_WORLDÚbounds_widthÚbounds_heightr   r   )r   r   rZ   ÚzoneÚhalf_wÚhalf_hÚpidÚok_inÚerr_inÚok_out_xÚ	err_out_xÚok_out_yÚ	err_out_ys                r   Ú)test_all_wilderness_zones_boundary_limitszCTestAdversarialZoneBounds.test_all_wilderness_zones_boundary_limits²   s£  € ð$ ×#Ò# GÑ,Ô,ˆØÐÐÐØŒ~¥Ô!4Ò4Ð4Ð4Ð4àÔ" SÑ(ˆØÔ# cÑ)ˆà%˜GÐ%Ð%ˆØ× Ò   gÑ.Ô.Ð.ð $×:Ò:¸3ÀÈÁÈfÐWZÉlÑ[Ô[‰ˆˆvØ˜ˆ}ˆ}ˆ}Ðb¨F°S©LÐbÐb¸FÀS¹LÐbÐbÈwÐbÐbÐZ`ÐbÐb‰}Œ}ˆ}ð *×@Ò@ÀÀfÈsÁlÐTWÑXÔXÑˆ�)Ø˜5Ð Ð Ð Ð"W¸FÀS¹LÐ"WÐ"WÈgÐ"WÐ"WÑ Ô Ð Ø5¸ÐBÐBÐBÐBð *×@Ò@ÀÀcÈ6ÐTWÉ<ÑXÔXÑˆ�)Ø˜5Ð Ð Ð Ð"W¸FÀS¹LÐ"WÐ"WÈgÐ"WÐ"WÑ Ô Ð Ø5¸ÐBÐBÐBÐBÐBÐBr
   c                 óê   — d}|                      |d¦  «         |                     |t          d¦  «        d¦  «        \  }}|du sJ ‚|                     |t          d¦  «        d¦  «        \  }}|du sJ ‚dS )z:Adversarial stress: infinite coordinates must be rejected.Úadv_inf_playerr   Úinfr   Fz-infN)r   r   rT   )r   r   rv   Ú
ok_inf_posr"   Ú
ok_inf_negs         r   Ú"test_infinite_coordinates_rejectedz<TestAdversarialZoneBounds.test_infinite_coordinates_rejectedÜ   sˆ   € àˆØ× Ò  Ð&;Ñ<Ô<Ð<à#×:Ò:¸3ÅÀeÁÄÈcÑRÔR‰ˆ
�AØ˜UÐ"Ð"Ð"Ð"à#×:Ò:¸3ÅÀfÁÄÈsÑSÔS‰ˆ
�AØ˜UÐ"Ð"Ð"Ð"Ð"Ð"r
   )r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r(   r2   rA   rc   ÚpytestÚmarkÚparametrizeÚstrr}   rƒ   r	   r
   r   r   r      s,  € € € € € ØTÐTð&DÀ:ð &DÐRVð &Dð &Dð &Dð &DðP!Àjð !ÐUYð !ð !ð !ð !ð.FÀ
ð FÈtð Fð Fð Fð Fð:7ð 7ð 7ð 7ðr „[×ÒØð
	
ð 
	
ð 
	
ñô ðCØ%ðCØ03ðCà	ðCð Cð Cñô ðCð8	#¸jð 	#ÈTð 	#ð 	#ð 	#ð 	#ð 	#ð 	#r
   r   )r‡   Úpathlibr   rP   rˆ   Úserver.world.zone_enginer   Úserver.world.zone_typesr   Úfixturer   r   r	   r
   r   ú<module>r�      s¾   ðð
ð 
ð Ð Ð Ð Ð Ð Ø 	€	€	€	Ø €€€à /Ð /Ð /Ð /Ð /Ð /Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,ð „ð�Zð ð ð ñ „ððK#ð K#ð K#ð K#ð K#ñ K#ô K#ð K#ð K#ð K#r
   