§
    šÎ¾jr  ã                   óÔ   — d Z ddlZddlmc mZ ddl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 ddlmZ ddlmZmZ  G d„ de
j        ¦  «        Zed	k    r e
j        ¦   «          dS dS )
a  
Adversarial Collision & Sliding Stress Test Suite for FreeExile (Milestone M3).

Empirical verification of:
1. 10,000 movement ticks stress simulation on procedural map grids with random vectors.
2. Exact Circle-AABB clamping constraints satisfaction at all times (zero penetration).
3. Corner sliding, diagonal wall navigation, and narrow chasm traversal.
4. Degenerate and boundary inputs (NaN/Inf, zero vectors, large leaps, negative coordinates).
5. Tracemalloc zero-leak verification across 10,000 movement ticks.
é    N)ÚMapGridDataÚTileCellÚTileType)Ú
ZoneEngine)ÚProceduralMapEngine)Úis_position_blockedÚresolve_movement_with_slidingc                   ó&   — e Zd Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestCollisionStressAdversarialc                 óÐ  ‡ — t          j        d¦  «         d\  ‰ _        ‰ _        ˆ fd„t	          ‰ j        ¦  «        D ¦   «         ‰ _        t	          dd¦  «        D ]Q}t          j        ‰ j        |         |         _        t          j        ‰ j        |         ‰ j        dz
  |z
           _        ŒRt	          ddd	¦  «        D ]8}t	          ddd	¦  «        D ]$}t          j        ‰ j        |         |         _        Œ%Œ9t	          dd¦  «        D ]$}t          j	        ‰ j        d
         |         _        Œ%t          ‰ j        ‰ j        dd‰ j        ¬¦  «        ‰ _        t          ¦   «         ‰ _        d S )Né*   )é(   r   c                 óR   •‡— g | ]"Šˆfd „t          ‰j        ¦  «        D ¦   «         ‘Œ#S )c                 óJ   •— g | ]}t          |‰t          j        d ¬¦  «        ‘Œ S )T)ÚxÚyÚ	tile_typeÚwalkable)r   r   ÚFLOOR)Ú.0r   r   s     €úEC:\Projects\FreeExile\tests\unit\test_collision_stress_adversarial.pyú
<listcomp>zCTestCollisionStressAdversarial.setUp.<locals>.<listcomp>.<listcomp>    s,   ø€ Ð`Ð`Ð`ÈQ�X˜˜Q­(¬.À4ÐHÑHÔHÐ`Ð`Ð`ó    )ÚrangeÚw)r   r   Úselfs    @€r   r   z8TestCollisionStressAdversarial.setUp.<locals>.<listcomp>   sL   øø€ ð 
ð 
ð 
àð aÐ`Ð`Ð`ÕRWÐX\ÔX^ÑR_ÔR_Ð`Ñ`Ô`ð
ð 
ð 
r   é   é#   é   é   é   é   é   ÚBLEACHED_BONE_CANYON)ÚwidthÚheightÚseedÚbiomeÚtiles)Úrandomr'   r   Úhr   r)   r   ÚWALLr   ÚCHASMr   Úgridr   Úengine)r   Úir   r   s   `   r   ÚsetUpz$TestCollisionStressAdversarial.setUp   sa  ø€ ÝŒ�B‰ŒˆØ‰ˆŒ�”ð
ð 
ð 
ð 
å˜4œ6‘]”]ð
ñ 
ô 
ˆŒ
õ
 �q˜"‘”ð 	Dð 	DˆAÝ)1¬ˆDŒJ�qŒM˜!ÔÔ&Ý6>´mˆDŒJ�qŒM˜$œ& 1™* q™.Ô)Ô3Ð3å�r˜2˜qÑ!Ô!ð 	;ð 	;ˆAÝ˜2˜r 1Ñ%Ô%ð ;ð ;�Ý-5¬]�”
˜1”˜aÔ Ô*Ð*ð;õ �q˜"‘”ð 	9ð 	9ˆAÝ*2¬.ˆDŒJ�rŒN˜1ÔÔ'Ð'åØ”&Ø”6ØØ(Ø”*ð
ñ 
ô 
ˆŒ	õ !‘l”lˆŒˆˆr   c                 ó4  — d}d\  }}|                       t          | j        |||¦  «        ¦  «         d}t          d¦  «        }t	          d¦  «        D �]}t          j        ddt          j        z  ¦  «        }t          j        dd¦  «        }t          j	        |¦  «        |z  }	t          j
        |¦  «        |z  }
t          | j        |||	|
|¬	¦  «        \  }}}|r|d
z  }t          dt          t          j        ||z
  d
z
  ¦  «        ¦  «        ¦  «        }t          | j        d
z
  t          t          j        ||z   d
z   ¦  «        ¦  «        ¦  «        }t          dt          t          j        ||z
  d
z
  ¦  «        ¦  «        ¦  «        }t          | j        d
z
  t          t          j        ||z   d
z   ¦  «        ¦  «        ¦  «        }t	          ||d
z   ¦  «        D �]}t	          ||d
z   ¦  «        D �]}| j        j        |         |         j        }|t(          j        t(          j        t(          j        t(          j        fv s|                     ¦   «         sžt          |t          |d
z   |¦  «        ¦  «        }t          |t          |d
z   |¦  «        ¦  «        }||z
  dz  ||z
  dz  z   }t          j        |¦  «        }||z
  }||k     r|}|                      |||z  dz
  d|› d|› d|› d|› d�	¦  «         �Œ�Œ|                      ||z
  d¦  «         |                      ||z   | j        dz   ¦  «         |                      ||z
  d¦  «         |                      ||z   | j        dz   ¦  «         ||}}�Œ|                      |d¦  «         |                      |d¦  «         dS )zOExecute 10,000 movement ticks with random velocities pushing into walls/chasms.çffffffÖ?)ç      (@g       @r   Úinfé'  é   g{®Gáz¤?g333333Ó?)Úradiusr   gê-�™—q=zWall penetration at (z, z) vs tile (z)!gê-�™—q½éd   N)ÚassertFalser   r.   Úfloatr   r*   ÚuniformÚmathÚpiÚcosÚsinr	   ÚmaxÚintÚfloorÚminr   r+   r)   r   r   r,   r-   ÚWATERÚVOIDÚis_passableÚsqrtÚassertGreaterEqualÚassertLessEqualÚassertGreater)r   r8   Úcur_xÚcur_yÚsliding_countÚmin_distance_marginÚ_ÚangleÚspeedÚdxÚdyÚnew_xÚnew_yÚslidingÚmin_txÚmax_txÚmin_tyÚmax_tyÚtyÚtxÚtileÚcxÚcyÚdist_sqÚdistÚmargins                             r   Ú6test_01_ten_thousand_tick_continuous_stress_simulationzUTestCollisionStressAdversarial.test_01_ten_thousand_tick_continuous_stress_simulation8   s¡  € àˆØ ‰ˆˆuØ×ÒÕ,¨T¬Y¸¸uÀfÑMÔMÑNÔNÐNàˆÝ# E™lœlÐå�u‘”ð )	(ñ )	(ˆAÝ”N 1 a­$¬'¡kÑ2Ô2ˆEÝ”N 4¨Ñ.Ô.ˆEÝ”˜%‘” 5Ñ(ˆBÝ”˜%‘” 5Ñ(ˆBå$AØ”	˜5 %¨¨R¸ð%ñ %ô %Ñ!ˆE�5˜'ð ð #Ø Ñ"�õ ˜�C¥¤
¨5°6©>¸AÑ+=Ñ >Ô >Ñ?Ô?Ñ@Ô@ˆFÝ˜œ !™¥S­¬°E¸F±NÀQÑ4FÑ)GÔ)GÑ%HÔ%HÑIÔIˆFÝ˜�C¥¤
¨5°6©>¸AÑ+=Ñ >Ô >Ñ?Ô?Ñ@Ô@ˆFÝ˜œ !™¥S­¬°E¸F±NÀQÑ4FÑ)GÔ)GÑ%HÔ%HÑIÔIˆFå˜F F¨Q¡JÑ/Ô/ð ñ �Ý ¨°©
Ñ3Ô3ð ñ �BØœ9œ?¨2Ô.¨rÔ2Ô<�DØ¥¤­x¬~½x¼~ÍxÌ}Ð]Ð]Ð]Ðei×euÒeuÑewÔewÐ]Ý  ¥S¨¨a©°Ñ%7Ô%7Ñ8Ô8˜Ý  ¥S¨¨a©°Ñ%7Ô%7Ñ8Ô8˜Ø#(¨2¡:°!Ñ"3°u¸r±zÀaÑ6GÑ"G˜Ý#œy¨Ñ1Ô1˜Ø!%¨¡˜Ø!Ð$7Ò7Ð7Ø28Ð/Ø×/Ò/Ø#Ø" V™O¨eÑ3Ø[°EÐ[Ð[¸UÐ[Ð[ÈrÐ[Ð[ÐUWÐ[Ð[Ð[ñô ð ùñð" ×#Ò# E¨F¡N°FÑ;Ô;Ð;Ø× Ò  ¨¡°´¸%±Ñ@Ô@Ð@Ø×#Ò# E¨F¡N°FÑ;Ô;Ð;Ø× Ò  ¨¡°´¸%±Ñ@Ô@Ð@à  %�5ˆE‰Eà×Ò˜=¨#Ñ.Ô.Ð.Ø×ÒÐ 3°VÑ<Ô<Ð<Ð<Ð<r   c                 ó  — d}t          | j        dddd|¦  «        \  }}}|                      |||fd¦  «         t          | j        dddd|¦  «        \  }}}|                      t	          | j        |||¦  «        ¦  «         t
          j        | j        j        d         d         _        t          | j        d	d
dd|¦  «        \  }}}|                      t	          | j        |||¦  «        ¦  «         |  	                    |d	d¬¦  «         dS )z:Test degenerate velocities, zero steps, and corner pushes.r3   ç      $@g        )rf   rf   Fg      @g      @g      @é
   gffffff"@g      %@g      à?r7   )ÚplacesN)
r	   r.   ÚassertEqualr:   r   r   r,   r)   r   ÚassertAlmostEqual)r   r8   ÚnxÚnyÚsrP   rW   s          r   Ú*test_02_degenerate_and_adversarial_vectorszITestCollisionStressAdversarial.test_02_degenerate_and_adversarial_vectorso   s  € àˆå1°$´)¸TÀ4ÈÈcÐSYÑZÔZ‰	ˆˆB�Ø×Ò˜"˜b !˜Ð&9Ñ:Ô:Ð:õ 2°$´)¸SÀ#ÀsÈCÐQWÑXÔX‰	ˆˆB�Ø×ÒÕ,¨T¬Y¸¸BÀÑGÔGÑHÔHÐHõ -5¬MˆŒ	Œ˜Ô˜BÔÔ)å7¸¼	À3ÈÈcÐSVÐX^Ñ_Ô_‰ˆˆB�Ø×ÒÕ,¨T¬Y¸¸BÀÑGÔGÑHÔHÐHØ×Ò˜r 3¨qÐÑ1Ô1Ð1Ð1Ð1r   c                 óê  — t          j        ¦   «          d\  }}t          d¦  «        D ]}t          | j        ||dd¦  «        \  }}}Œt          j        ¦   «         }t          d¦  «        D ]}t          | j        ||dd¦  «        \  }}}Œt          j        ¦   «         }|                     |d¦  «        }t          d„ |D ¦   «         ¦  «        }t          j        ¦   «          |  	                    |d¦  «         d	S )
zFVerify zero residual memory accumulation during 10,000 movement ticks.)r4   r4   iô  gš™™™™™©?r6   gš™™™™™©¿Úlinenoc              3   ó:   K  — | ]}|j         d k    ¯|j         V — ŒdS )r   N)Ú	size_diff)r   Ústats     r   ú	<genexpr>z[TestCollisionStressAdversarial.test_03_memory_leak_profiling_tracemalloc.<locals>.<genexpr>�   s1   è è € ÐRÐR¨d¸t¼~ÐPQÒ?QÐ?Q˜4œ>Ð?QÐ?QÐ?QÐ?QÐRÐRr   i � N)
ÚtracemallocÚstartr   r	   r.   Útake_snapshotÚ
compare_toÚsumÚstopÚ
assertLess)r   rL   rM   rP   Ú	snapshot1Ú	snapshot2ÚstatsÚtotal_growths           r   Ú)test_03_memory_leak_profiling_tracemalloczHTestCollisionStressAdversarial.test_03_memory_leak_profiling_tracemalloc�   s   € åÔÑÔÐØ!‰ˆˆuå�s‘”ð 	að 	aˆAÝ;¸D¼IÀuÈeÐUYÐ[_Ñ`Ô`‰OˆE�5˜!˜!åÔ-Ñ/Ô/ˆ	Ý�u‘”ð 	bð 	bˆAÝ;¸D¼IÀuÈeÐUYÐ[`ÑaÔa‰OˆE�5˜!˜!ÝÔ-Ñ/Ô/ˆ	à×$Ò$ Y°Ñ9Ô9ˆÝÐRÐR°eÐRÑRÔRÑRÔRˆÝÔÑÔÐà�Š˜ jÑ1Ô1Ð1Ð1Ð1r   N)Ú__name__Ú
__module__Ú__qualname__r1   rd   rn   r€   © r   r   r   r      sQ   € € € € € ð#ð #ð #ð85=ð 5=ð 5=ðn2ð 2ð 2ð$2ð 2ð 2ð 2ð 2r   r   Ú__main__)Ú__doc__ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arr=   r*   ru   ÚunittestÚserver.world.map_data_typesr   r   r   Úserver.world.zone_enginer   Ú"server.world.procedural_map_enginer   Útests.unit.test_tile_collisionr   r	   ÚTestCaser   r�   Úmainr„   r   r   ú<module>r”      s  ðð	ð 	ð € € € € € € € € € € € € €€€€Ø €€€Ø Ð Ð Ð Ø €€€ðð ð ð ð ð ð ð ð ð ð
 0Ð /Ð /Ð /Ð /Ð /Ø BÐ BÐ BÐ BÐ BÐ BØ ]Ð ]Ð ]Ð ]Ð ]Ð ]Ð ]Ð ]ðw2ð w2ð w2ð w2ð w2 XÔ%6ñ w2ô w2ð w2ðt ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   