§
    àæ¾jà   ã                  óÞ   — d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	 ddl
mZmZmZmZ ddlmZmZ ddlmZmZmZmZ ddlmZmZ  G d	„ d
ej        ¦  «        Z G d„ dej        ¦  «        ZdS )ax  
Milestone M6 Phase 2 Challenger Empirical Adversarial Stress Suite (Part 1).
Stress Tests:
1. Procedural Generation with extreme seeds (0, -1, 2**31-1, 2**32-1, float, string).
2. Binary serialization with corrupted payloads (truncated buffers, invalid magic, size mismatches).
3. Runtime tile collision and 2-axis sliding physics with high-speed vectors and corner pinches.
é    )ÚannotationsN)ÚListÚTupleÚAny)ÚTileTypeÚTileCellÚMapGridDataÚEncounterZone)ÚWildernessMapGeneratorÚZONE_DEFAULT_SIZES)Úserialize_map_gridÚdeserialize_map_gridÚHEADER_MAGICÚHEADER_SIZE)Úis_position_blockedÚresolve_movement_with_slidingc                  ó2   — e Zd ZdZd	d„Zd	d„Zd	d„Zd	d„ZdS )
Ú%TestChallengerM6ProcgenAndCompressionzPStress tests procedural map generation and binary serialization/deserialization.ÚreturnÚNonec                óò  — g d¢}t          ddd¬¦  «        }|D �]Ü}t          |t          t          f¦  «        rt	          |¦  «        n|}|                     |d¬¦  «        }|                      |j        d¦  «         |                      |j        d¦  «         |  	                    |j
        ¦  «         |                      t          |j        ¦  «        d¦  «         |                      t          |j        ¦  «        d	¦  «         |j        \  }}t!          d
d¦  «        D ]Ú}t!          d
d¦  «        D ]Ç}	|	|	z  ||z  z   dk    r¶||	z   ||z   }}
d|
cxk    r|j        k     ršn Œ0d|cxk    r|j        k     r…n ŒE|j        |         |
         }|                      |j        t(          j        t(          j        fd|
› d|› d|› �¦  «         |                      |j        ¦  «         |                      |j        ¦  «         ŒÈŒÛ�ŒÞdS )zIVerify generation succeeds and satisfies invariants across extreme seeds.)
r   éÿÿÿÿiÿÿÿl   ÿÿ i   €i6eÄgDATû!	@g-Cëâ6¿Úseed_string_adversarialÚ
1234567890é<   é-   ÚBLEACHED_BONE_CANYON)ÚwidthÚheightÚbiome_idÚzone_tang_kiem_nhai)ÚseedÚzone_idé   é   iøÿÿÿé	   é@   r   zNon-floor/path tile at (ú,z) for seed N)r   Ú
isinstanceÚstrÚfloatÚhashÚgenerateÚassertEqualr   r   ÚassertIsNotNoneÚ	boss_gateÚassertGreaterEqualÚlenÚ
poi_pointsÚencounter_zonesÚspawn_pointÚrangeÚtilesÚassertInÚ	tile_typer   ÚFLOORÚPATHÚ
assertTrueÚwalkableÚassertFalseÚblocks_vision)ÚselfÚextreme_seedsÚgenr"   Úint_seedÚgridÚsxÚsyÚdyÚdxÚtxÚtyÚcells                úNC:\Projects\FreeExile\tests\unit\test_challenger_m6_2_procgen_and_collision.pyÚtest_extreme_seeds_generationzCTestChallengerM6ProcgenAndCompression.test_extreme_seeds_generation(   sB  € ð$
ð $
ð $
ˆõ %¨2°bÐCYÐZÑZÔZˆØ!ð 	Añ 	AˆDå%/°µs½E°lÑ%CÔ%CÐM•t˜D‘z”z�zÈˆHØ—<’< XÐ7L�<ÑMÔMˆDØ×Ò˜TœZ¨Ñ,Ô,Ð,Ø×Ò˜Tœ[¨"Ñ-Ô-Ð-Ø× Ò  ¤Ñ0Ô0Ð0Ø×#Ò#¥C¨¬Ñ$8Ô$8¸!Ñ<Ô<Ð<Ø×#Ò#¥C¨Ô(<Ñ$=Ô$=¸qÑAÔAÐAð Ô%‰FˆB�Ý˜B ‘l”lð Að A�Ý  A™,œ,ð Að A�BØ˜B‘w  b¡Ñ(¨BÒ.Ð.Ø!# b¡¨"¨r©'˜B˜Ø Ð/Ð/Ò/Ð/ T¤ZÒ/Ð/Ð/Ð/Ð/°A¸Ð4IÐ4IÒ4IÐ4I¸d¼kÒ4IÐ4IÐ4IÐ4IÐ4IØ#'¤:¨b¤>°"Ô#5˜DØ ŸMšMØ $¤Ý!)¤µ´Ð ?Ø U¸2Ð UÐ UÀÐ UÐ UÈtÐ UÐ Uñô ð ð
 !ŸOšO¨D¬MÑ:Ô:Ð:Ø ×,Ò,¨TÔ-?Ñ@Ô@Ð@øðAñAð	Að 	Aó    c                óD  — t          dd¬¦  «                             d¬¦  «        }t          |¦  «        }dD ]K}|                      t          ¦  «        5  t          |d|…         ¦  «         ddd¦  «         n# 1 swxY w Y   ŒLt          t          dz   t          d	z   t          |¦  «        d
z
  t          |¦  «        dz
  g}|D ]^}|t          |¦  «        k     rI|                      t          ¦  «        5  t          |d|…         ¦  «         ddd¦  «         n# 1 swxY w Y   Œ_dS )z@Verify deserializer raises ValueError on truncated byte buffers.r   r   ©r   r   é*   ©r"   )r   r$   é   é
   é   Nr%   rT   r$   iô  )r   r-   r   ÚassertRaisesÚ
ValueErrorr   r   r2   )r@   Ú
valid_gridÚvalid_bytesÚtruncate_lenÚtruncation_pointsÚt_lens         rL   Ú!test_corrupted_binary_truncationszGTestChallengerM6ProcgenAndCompression.test_corrupted_binary_truncationsQ   sÂ  € å+°"¸RÐ@Ñ@Ô@×IÒIÈrÐIÑRÔRˆ
Ý(¨Ñ4Ô4ˆð .ð 	Að 	AˆLØ×"Ò"¥:Ñ.Ô.ð Að AÝ$ [°°,°Ô%?Ñ@Ô@Ð@ðAð Að Añ Aô Að Að Að Að Að Að Aøøøð Að Að Að Aøõ
 Ý˜!‰OÝ˜"ÑÝ�ÑÔ˜qÑ Ý�ÑÔ˜sÑ"ð
Ðð 'ð 	>ð 	>ˆEØ•s˜;Ñ'Ô'Ò'Ð'Ø×&Ò&¥zÑ2Ô2ð >ð >Ý(¨°V°e°VÔ)<Ñ=Ô=Ð=ð>ð >ð >ñ >ô >ð >ð >ð >ð >ð >ð >øøøð >ð >ð >ð >øð	>ð 	>s$   ÁA7Á7A;	Á>A;	Ã0DÄD	ÄD	c                óF  — t          dd¬¦  «                             d¬¦  «        }t          t          |¦  «        ¦  «        }dD ]f}t          |¦  «        }||dd…<   |                      t
          ¦  «        5  t          t          |¦  «        ¦  «         d	d	d	¦  «         n# 1 swxY w Y   Œgt          |¦  «        }t          j	        d
|ddd¦  «         |                      t
          ¦  «        5  t          t          |¦  «        ¦  «         d	d	d	¦  «         d	S # 1 swxY w Y   d	S )zBVerify rejection of invalid magic bytes and mismatched dimensions.r   r   rP   rQ   rR   )s   XXs     s   fes   ZZr   r%   Nz<HHé   iè  )
r   r-   Ú	bytearrayr   rV   rW   r   ÚbytesÚstructÚ	pack_into)r@   rX   rY   Ú	bad_magicÚ	corruptedÚcorrupted_dims         rL   Útest_corrupted_header_payloadszDTestChallengerM6ProcgenAndCompression.test_corrupted_header_payloadsh   sœ  € å+°"¸RÐ@Ñ@Ô@×IÒIÈrÐIÑRÔRˆ
ÝÕ 2°:Ñ >Ô >Ñ?Ô?ˆð <ð 	7ð 	7ˆIÝ! +Ñ.Ô.ˆIØ&ˆI�a˜�c‰NØ×"Ò"¥:Ñ.Ô.ð 7ð 7Ý$¥U¨9Ñ%5Ô%5Ñ6Ô6Ð6ð7ð 7ð 7ñ 7ô 7ð 7ð 7ð 7ð 7ð 7ð 7øøøð 7ð 7ð 7ð 7øõ " +Ñ.Ô.ˆÝÔ˜ ¨q°$¸Ñ=Ô=Ð=Ø×Ò�zÑ*Ô*ð 	7ð 	7Ý ¥ }Ñ!5Ô!5Ñ6Ô6Ð6ð	7ð 	7ð 	7ñ 	7ô 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7øøøð 	7ð 	7ð 	7ð 	7ð 	7ð 	7s$   Á6BÂB#	Â&B#	Ã,DÄDÄDc                ó¤  — t          dd¬¦  «                             d¬¦  «        }t          t          |¦  «        ¦  «        }t          t          |j        ¦  «        dz  z   t          |j        ¦  «        dz  z   }d||<   t          t          |¦  «        ¦  «        }|  
                    |j        d	         d	         j        t          j        ¦  «         d
S )zCVerify unknown tile codes in valid-length payload fallback to WALL.r   r   rP   rQ   rR   é   rS   éú   r   N)r   r-   r`   r   r   r2   r3   r4   r   ra   r.   r7   r9   r   ÚWALL)r@   rX   rY   Útile_offsetÚdeserializeds        rL   Ú)test_unknown_tile_codes_graceful_fallbackzOTestChallengerM6ProcgenAndCompression.test_unknown_tile_codes_graceful_fallbackz   sº   € å+°"¸RÐ@Ñ@Ô@×IÒIÈrÐIÑRÔRˆ
ÝÕ 2°:Ñ >Ô >Ñ?Ô?ˆõ "¥C¨
Ô(=Ñ$>Ô$>ÀÑ$BÑBÅSÈÔIcÑEdÔEdÐghÑEhÑhˆØ#&ˆ�KÑ å+­E°+Ñ,>Ô,>Ñ?Ô?ˆØ×Ò˜Ô+¨AÔ.¨qÔ1Ô;½X¼]ÑKÔKÐKÐKÐKrN   N©r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rM   r]   rg   rn   © rN   rL   r   r   %   su   € € € € € ØZÐZð'Að 'Að 'Að 'AðR>ð >ð >ð >ð.7ð 7ð 7ð 7ð$
Lð 
Lð 
Lð 
Lð 
Lð 
LrN   r   c                  ó2   — e Zd ZdZd	d„Zd	d„Zd	d„Zd	d„ZdS )
Ú#TestChallengerM6CollisionAndPhysicsz?Stress tests runtime tile collision and 2-axis sliding physics.r   r   c                ó†  ‡ — d\  ‰ _         ‰ _        ˆ fd„t          ‰ j        ¦  «        D ¦   «         ‰ _        t          dd¦  «        D ]F}t          j        ‰ j        d         |         _        t          j        ‰ j        d         |         _        ŒGt          dd¦  «        D ]F}t          j        ‰ j        |         d         _        t          j        ‰ j        |         d         _        ŒGt          dd¦  «        D ]$}t          j        ‰ j        |         |         _        Œ%t          ‰ j         ‰ j        dd	‰ j        ¬
¦  «        ‰ _        d S )N)é2   rx   c                óR   •‡— g | ]"Šˆfd „t          ‰j        ¦  «        D ¦   «         ‘Œ#S )c                óJ   •— g | ]}t          |‰t          j        d ¬¦  «        ‘Œ S )T)ÚxÚyr9   r=   )r   r   r:   )Ú.0r{   r|   s     €rL   ú
<listcomp>zHTestChallengerM6CollisionAndPhysics.setUp.<locals>.<listcomp>.<listcomp>�   s,   ø€ Ð`Ð`Ð`ÈQ�X˜˜Q­(¬.À4ÐHÑHÔHÐ`Ð`Ð`rN   )r6   Úw)r}   r|   r@   s    @€rL   r~   z=TestChallengerM6CollisionAndPhysics.setUp.<locals>.<listcomp>Œ   sL   øø€ ð 
ð 
ð 
àð aÐ`Ð`Ð`ÕRWÐX\ÔX^ÑR_ÔR_Ð`Ñ`Ô`ð
ð 
ð 
rN   é   é   é   rS   rU   i9  r   )r   r   r"   Úbiomer7   )	r   Úhr6   r7   r   rk   r9   r	   rD   )r@   r{   r|   Úis   `   rL   ÚsetUpz)TestChallengerM6CollisionAndPhysics.setUpŠ   s*  ø€ Ø‰ˆŒ�”ð
ð 
ð 
ð 
å˜4œ6‘]”]ð
ñ 
ô 
ˆŒ
õ
 �r˜2‘”ð 	8ð 	8ˆAÝ*2¬-ˆDŒJ�rŒN˜1ÔÔ'Ý*2¬-ˆDŒJ�rŒN˜1ÔÔ'Ð'Ý�r˜2‘”ð 	8ð 	8ˆAÝ*2¬-ˆDŒJ�qŒM˜"ÔÔ'Ý*2¬-ˆDŒJ�qŒM˜"ÔÔ'Ð'å�q˜"‘”ð 	7ð 	7ˆAÝ)1¬ˆDŒJ�qŒM˜!ÔÔ&Ð&åØ”&Ø”6ØØ(Ø”*ð
ñ 
ô 
ˆŒ	ˆ	ˆ	rN   c                óÎ  — d\  }}d}g d¢}|D ]Ö\  }}t          | j        |||||¦  «        \  }}}	|                      t          | j        |||¦  «        d|› d|› d|› d|› d�	¦  «         |                      |d¦  «         |                      |t          | j        ¦  «        ¦  «         |                      |d¦  «         |                      |t          | j        ¦  «        ¦  «         Œ×d	S )
zKHigh speed vectors (dx=100, dy=100) must slide or stop without penetrating.)ç      3@rˆ   çffffffÖ?))ç      Y@rŠ   )ç      IÀr‹   )ç     @�@ç        )r�   rŒ   )g      YÀrŠ   z*Position blocked after high-speed vector (r(   z): (ú)r�   N)	r   rD   r>   r   r1   Ú
assertLessr+   r   r„   )
r@   Ústart_xÚstart_yÚradiusÚhigh_speed_vectorsÚvxÚvyÚrxÚryÚ_s
             rL   Ú-test_high_speed_movement_vectors_no_tunnelingzQTestChallengerM6CollisionAndPhysics.test_high_speed_movement_vectors_no_tunneling£   s  € à%Ñˆ�Øˆð9
ð 9
ð 9
Ðð )ð 
	/ð 
	/‰FˆB�Ý5°d´iÀÈ'ÐSUÐWYÐ[aÑbÔb‰IˆB��AØ×ÒÝ# D¤I¨r°2°vÑ>Ô>ØT¸RÐTÐTÀ"ÐTÐTÈ"ÐTÐTÈrÐTÐTÐTñô ð ð
 ×#Ò# B¨Ñ,Ô,Ð,Ø�OŠO˜B¥ d¤f¡¤Ñ.Ô.Ð.Ø×#Ò# B¨Ñ,Ô,Ð,Ø�OŠO˜B¥ d¤f¡¤Ñ.Ô.Ð.Ð.ð
	/ð 
	/rN   c                óä   — d}d\  }}t          | j        ||dd|¦  «        \  }}}|                      t          | j        |||¦  «        ¦  «         |                      |p||k    o||k    ¦  «         dS )zBSliding into a concave corner pinch must not penetrate or lock up.r‰   )ç     €3@r›   g      ð?N)r   rD   r>   r   r<   )r@   r’   Úcur_xÚcur_yr–   r—   Ú
is_slidings          rL   Útest_corner_pinch_slidingz=TestChallengerM6CollisionAndPhysics.test_corner_pinch_slidingº   s‚   € àˆà!‰ˆˆuå:¸4¼9ÀeÈUÐTWÐY\Ð^dÑeÔeÑˆˆB�
Ø×ÒÕ,¨T¬Y¸¸BÀÑGÔGÑHÔHÐHØ�Š˜
ÐC r¨U¢{Ð'B°r¸U²{ÑDÔDÐDÐDÐDrN   c           	     óÎ   — d}d\  }}t          d¦  «        D ]M}t          | j        ||dd|¦  «        \  }}}|                      t	          | j        |||¦  «        ¦  «         ||}}ŒNdS )z>Sliding along diagonal wall steps should allow axial progress.r‰   )g      @g      @rT   gš™™™™™É?g      à?N)r6   r   rD   r>   r   )r@   r’   rœ   r�   r˜   r–   r—   s          rL   Útest_diagonal_wall_slidingz>TestChallengerM6CollisionAndPhysics.test_diagonal_wall_slidingÄ   s€   € àˆØ‰ˆˆuå�r‘”ð 	"ð 	"ˆAÝ5°d´iÀÈÈsÐTWÐY_Ñ`Ô`‰IˆB��AØ×ÒÕ0°´¸BÀÀFÑKÔKÑLÔLÐLØ˜r�5ˆEˆEð	"ð 	"rN   Nro   )rp   rq   rr   rs   r†   r™   rŸ   r¡   rt   rN   rL   rv   rv   ‡   sn   € € € € € ØIÐIð
ð 
ð 
ð 
ð2/ð /ð /ð /ð.Eð Eð Eð Eð"ð "ð "ð "ð "ð "rN   rv   )rs   Ú
__future__r   Úmathrb   ÚunittestÚtypingr   r   r   Úserver.world.map_data_typesr   r   r	   r
   Ú%server.world.wilderness_map_generatorr   r   Ú"server.world.map_binary_serializerr   r   r   r   Útests.unit.test_tile_collisionr   r   ÚTestCaser   rv   rt   rN   rL   ú<module>r«      s£  ððð ð #Ð "Ð "Ð "Ð "Ð "Ø €€€Ø €€€Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ð #ðð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð_Lð _Lð _Lð _Lð _L¨HÔ,=ñ _Lô _Lð _LðDE"ð E"ð E"ð E"ð E"¨(Ô*;ñ E"ô E"ð E"ð E"ð E"rN   