§
    q�Áju'  ã                   ó  — d Z ddlZddlZddlZddlZej                             ej                             ej                             e	¦  «        d¦  «        ¦  «        Z
ej                             e
d¦  «        Zeej        vrej                             de¦  «         e
ej        vrej                             de
¦  «         ddlmZmZmZ ddlmZmZ ddlmZ ddlmZ  G d	„ d
ej        ¦  «        Zedk    r ej        ¦   «          dS dS )u¸  
Sprint 2 Unit & Integration Test Suite for FreeExile Martial Combat System:
- Ma VÃµ TÃ n Cá»‘t & Dá»‹ Biáº¿n TÃ  áº¤n (Skill Gems & Support Sigils trade-offs)
- Huyá»…n áº¢nh Bá»™ 0.25s i-frame Animation Cancel (Server-Authoritative)
- Song Binh Tá»± Ä�á»™ng HoÃ¡n Ä�á»•i (PoE2 Spirit 0ms Dual Weapon Auto-Swap)
- Ká»³ Kinh BÃ¡t Máº¡ch (Meridian Integration) & NgÅ© HÃ nh TÆ°Æ¡ng Kháº¯c
- Strict Code Hygiene & Deterministic Verification
é    Nz../..Úserver)ÚCombatEngineÚCombatActorÚSkillCastResult)ÚFiveElementsÚWeaponCategory)ÚSkillDatabaseService)ÚMeridianServicec                   óD   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
S )ÚTestSprint2MartialCombatSystemc                 ó   — t          ¦   «         | _        t          d¬¦  «        | _        | j                             d¬¦  «         t          ddt          j        dddd	d	d
dddd¬¦  «        | _        t          ddt          j	        dddt          j	        dt          j
        dt          j        dt          j        dt          j        di¬¦  «        | _        | j                             | j        ¦  «         | j                             | j        ¦  «         d S )Nú:memory:©Údb_pathT)Úforceé   u   TiÃªu Dao Kiáº¿m KhÃ¡chç     @�@g      I@g      Y@ÚSWORDÚPROJECTILE_WEAPONÚplayer_sprint2)Úactor_idÚnameÚelementÚ
current_hpÚmax_hpÚbase_attackÚcurrent_energyÚ
max_energyÚweapon_set_1Úweapon_set_2Úactive_weapon_setÚ	is_playerÚ	player_idé   u   Kim Cang ThÃº VÆ°Æ¡ngg     @Ÿ@g      N@g333333Ã?gš™™™™™©?g333333Ó?ç        gš™™™™™É?)r   r   r   r   r   r   Úresistances)r   Úenginer	   Úskill_dbÚseed_canonical_datar   r   ÚHOAÚattackerÚKIMÚMOCÚTHUYÚTHOÚdefenderÚregister_actor©Úselfs    úGC:\Projects\FreeExile\tests\unit\test_sprint_2_martial_combat_system.pyÚsetUpz$TestSprint2MartialCombatSystem.setUp   s
  € Ý"‘n”nˆŒÝ,°ZÐ@Ñ@Ô@ˆŒØŒ×)Ò)°Ð)Ñ5Ô5Ð5å#ØØ*Ý Ô$ØØØØ ØØ Ø,ØØØ&ð
ñ 
ô 
ˆŒõ $ØØ(Ý Ô$ØØØåÔ  $ÝÔ  $ÝÔ! 4ÝÔ  #ÝÔ  $ðð
ñ 
ô 
ˆŒð 	Œ×"Ò" 4¤=Ñ1Ô1Ð1ØŒ×"Ò" 4¤=Ñ1Ô1Ð1Ð1Ð1ó    c                 ó8   — | j                              ¦   «          d S )N)r(   Úcloser2   s    r4   ÚtearDownz'TestSprint2MartialCombatSystem.tearDownC   s   € ØŒ×ÒÑÔÐÐÐr6   c                 óh  — t          t          j        ¦   «         dz  ¦  «        }| j                             ddd|dg| j        ¬¦  «        }|                      |j        ¦  «         |                      |j        d¦  «         |                      |j	        d¦  «         |  
                    |j        dd¬	¦  «         |  
                    | j        j        d
d¬	¦  «         |                      |j        ¦  «         |                      |j        j        ¦  «         |                      |j        j        d¦  «         dS )z\Skill 1001 + Sigil 2001 (Multi-Projectile) multiplies projectiles and increases energy cost.éè  r   éé  r$   éÑ  ©Úattacker_idÚskill_idÚ	target_idÚtimestamp_msÚlinked_sigil_idsr(   é   g     PP@)Úplacesg     `A@r%   N)ÚintÚtimer'   Úexecute_skill_castr(   Ú
assertTrueÚsuccessÚassertEqualr@   ÚprojectilesÚassertAlmostEqualÚenergy_consumedr+   r   ÚassertIsNotNoneÚdamage_resultÚassertFalseÚ	is_evadedÚassertGreaterÚfinal_damage©r3   Únow_msÚress      r4   Ú,test_sigil_linking_modifiers_and_projectileszKTestSprint2MartialCombatSystem.test_sigil_linking_modifiers_and_projectilesF   s$  € å•T”Y‘[”[ 4Ñ'Ñ(Ô(ˆØŒk×,Ò,ØØØØØ"˜VØ”]ð -ñ 
ô 
ˆð 	�Š˜œÑ$Ô$Ð$Ø×Ò˜œ tÑ,Ô,Ð,à×Ò˜œ¨!Ñ,Ô,Ð,à×Ò˜sÔ2°EÀ!ÐÑDÔDÐDØ×Ò˜tœ}Ô;¸]ÐSTÐÑUÔUÐUØ×Ò˜SÔ.Ñ/Ô/Ð/Ø×Ò˜Ô*Ô4Ñ5Ô5Ð5Ø×Ò˜3Ô,Ô9¸3Ñ?Ô?Ð?Ð?Ð?r6   c                 óâ  — | j                              dd¦  «        \  }}|                      |¦  «         |                      d|¦  «         d| j        _        t          t          j        ¦   «         dz  ¦  «        }| j         	                    ddd|dg| j         ¬¦  «        }|  
                    |j        ¦  «         |                      |j        d¦  «         |                      |j        d	¦  «         d
S )uS   Incompatible Sigil (PhÃ¢n Quang on Melee Skill 1007) is filtered by tag validation.iï  r=   u   xung Ä‘á»™tÚBLADEr;   r   r$   r>   g      6@N)r(   Úvalidate_gem_linkrQ   ÚassertInr+   r   rF   rG   r'   rH   rI   rJ   rK   rL   rN   )r3   ÚvalidÚmsgrV   rW   s        r4   Ú$test_incompatible_sigil_tag_conflictzCTestSprint2MartialCombatSystem.test_incompatible_sigil_tag_conflict\   sè   € à”]×4Ò4°T¸4Ñ@Ô@‰
ˆˆsØ×Ò˜ÑÔÐØ�Š�m SÑ)Ô)Ð)ð &-ˆŒÔ"Ý•T”Y‘[”[ 4Ñ'Ñ(Ô(ˆØŒk×,Ò,ØØØØØ"˜VØ”]ð -ñ 
ô 
ˆð 	�Š˜œÑ$Ô$Ð$à×Ò˜œ¨!Ñ,Ô,Ð,à×Ò˜Ô,¨dÑ3Ô3Ð3Ð3Ð3r6   c                 ó†  — t          t          j        ¦   «         dz  ¦  «        }| j                             ddd|¬¦  «        }|                      |j        ¦  «         |dz   }|                      | j                             d|¦  «        ¦  «         | j                             ddd|¬¦  «        }|                      |j        ¦  «         |                      |j	        d¦  «         | j         
                    d|¦  «        }|                      |¦  «         |                      | j                             d|¦  «        ¦  «         | j                             dddt          j        |d	z   ¬
¦  «        }|                      |j        ¦  «         |                      |j        d¦  «         |                      | j        j        d¦  «         dS )ub   Huyá»…n áº¢nh Bá»™ cancels ongoing animation lock and evades incoming attacks during 250ms window.r;   r   r<   r$   ©r?   r@   rA   rB   éd   ÚANIMATION_LOCKEDg      ^@é2   )r?   Údefender_idÚ
raw_damageÚdamage_elementÚcurrent_timestamp_msr%   r   N)rF   rG   r'   rH   rI   rJ   Úis_animation_lockedrQ   rK   Úerror_reasonÚtrigger_phantom_evasionÚcalculate_damager   r,   rR   rT   r+   r   )r3   rV   rW   Úmid_cast_msÚsecond_castÚevade_okÚincoming_dmgs          r4   Ú%test_phantom_evasion_animation_cancelzDTestSprint2MartialCombatSystem.test_phantom_evasion_animation_cancels   s¹  € å•T”Y‘[”[ 4Ñ'Ñ(Ô(ˆàŒk×,Ò,ØØØØð	 -ñ 
ô 
ˆð 	�Š˜œÑ$Ô$Ð$à˜s‘lˆØ�Š˜œ×7Ò7¸¸;ÑGÔGÑHÔHÐHð ”k×4Ò4ØØØØ$ð	 5ñ 
ô 
ˆð 	×Ò˜Ô,Ñ-Ô-Ð-Ø×Ò˜Ô1Ð3EÑFÔFÐFð ”;×6Ò6°q¸+ÑFÔFˆØ�Š˜Ñ!Ô!Ð!Ø×Ò˜œ×8Ò8¸¸KÑHÔHÑIÔIÐIð ”{×3Ò3ØØØÝ'Ô+Ø!,¨rÑ!1ð 4ñ 
ô 
ˆð 	�Š˜Ô.Ñ/Ô/Ð/Ø×Ò˜Ô2°CÑ8Ô8Ð8Ø×Ò˜œÔ1°6Ñ:Ô:Ð:Ð:Ð:r6   c                 ó¦  — |                       | j        j        d¦  «         t          t	          j        ¦   «         dz  ¦  «        }| j                             ddd|¬¦  «        }|                      |j        ¦  «         |                      |j	        ¦  «         |                       |j
        d¦  «         |                       | j        j        d¦  «         dS )z^Casting a projectile skill while holding SWORD auto-swaps to PROJECTILE_WEAPON with 0ms delay.r   r;   ië  r$   ra   N)rK   r+   r!   rF   rG   r'   rH   rI   rJ   Úswapped_weaponÚnew_weapon_setrU   s      r4   Útest_dual_weapon_auto_swapz9TestSprint2MartialCombatSystem.test_dual_weapon_auto_swap�   sÄ   € à×Ò˜œÔ8¸!Ñ<Ô<Ð<Ý•T”Y‘[”[ 4Ñ'Ñ(Ô(ˆð Œk×,Ò,ØØØØð	 -ñ 
ô 
ˆð 	�Š˜œÑ$Ô$Ð$Ø�Š˜Ô*Ñ+Ô+Ð+Ø×Ò˜Ô+¨QÑ/Ô/Ð/Ø×Ò˜œÔ8¸!Ñ<Ô<Ð<Ð<Ð<r6   c                 ó&  — t          t          j        ¦   «         dz  ¦  «        }| j                             ddd|¬¦  «        }|                      |j        ¦  «         |                      |j        d¦  «         |                      |j        ¦  «         dS )zNFails with WEAPON_INCOMPATIBLE if neither weapon set meets skill requirements.r;   r   ið  r$   ra   ÚWEAPON_INCOMPATIBLEN)	rF   rG   r'   rH   rQ   rJ   rK   rj   rs   rU   s      r4   Ú"test_weapon_incompatible_both_setszATestSprint2MartialCombatSystem.test_weapon_incompatible_both_sets®   s‘   € å•T”Y‘[”[ 4Ñ'Ñ(Ô(ˆàŒk×,Ò,ØØØØð	 -ñ 
ô 
ˆð 	×Ò˜œÑ%Ô%Ð%Ø×Ò˜Ô)Ð+@ÑAÔAÐAØ×Ò˜Ô+Ñ,Ô,Ð,Ð,Ð,r6   c                 ó$  — t          t          j        ¦   «         dz  ¦  «        }| j                             ddd|¬¦  «        }|                      |j        ¦  «         |j        j        }t          d¬¦  «        }| 	                    dd	¦  «         | 
                    dd
¦  «        }|                      |j        ¦  «         | 
                    dd¦  «        }|                      |j        ¦  «         | j        j        }|                     d| j        ¦  «         |                      | j        j        |¦  «         | j                             ddd|dz   ¬¦  «        }|                      |j        ¦  «         |                      |j        j        |¦  «         dS )zVUnlocking Meridian nodes amplifies base_attack and scales Five Elements combat damage.r;   r   r<   r$   ra   r   r   r   é
   Úm_c1Úm_c3éÐ  N)rF   rG   r'   rH   rI   rJ   rP   rT   r
   Ú
add_pointsÚunlock_noder+   r   Úapply_to_combat_actorrS   )	r3   rV   Úres_baselineÚdmg_baselineÚmeridian_svcÚr1Úr2Úinitial_atkÚ
res_buffeds	            r4   Ú8test_meridian_service_stat_integration_and_five_elementszWTestSprint2MartialCombatSystem.test_meridian_service_stat_integration_and_five_elements¼   s‚  € å•T”Y‘[”[ 4Ñ'Ñ(Ô(ˆà”{×5Ò5Ø D°AÀFð 6ñ 
ô 
ˆð 	�Š˜Ô,Ñ-Ô-Ð-Ø#Ô1Ô>ˆõ '¨zÐ:Ñ:Ô:ˆØ×ÒÐ 0°"Ñ5Ô5Ð5Ø×%Ò%Ð&6¸Ñ?Ô?ˆØ�Š˜œ
Ñ#Ô#Ð#Ø×%Ò%Ð&6¸Ñ?Ô?ˆØ�Š˜œ
Ñ#Ô#Ð#ð ”mÔ/ˆØ×*Ò*Ð+;¸T¼]ÑKÔKÐKØ×Ò˜4œ=Ô4°kÑBÔBÐBð ”[×3Ò3Ø D°AÀFÈTÁMð 4ñ 
ô 
ˆ
ð 	�Š˜
Ô*Ñ+Ô+Ð+Ø×Ò˜:Ô3Ô@À,ÑOÔOÐOÐOÐOr6   c                 óÐ  — t          t          j        ¦   «         dz  ¦  «        }| j                             ddd|¦  «        }|                      |j        ¦  «         | j                             ddd|dz   ¦  «        }|                      |j        ¦  «         |                      |j        d¦  «         | j                             ddd|dz   ¦  «        }|                      |j        ¦  «         |                      |j        d¦  «         d	| j	        _
        | j                             ddd|d
z   ¦  «        }|                      |j        ¦  «         |                      |j        d¦  «         dS )zGCooldown active and insufficient energy correctly gate skill execution.r;   r   r<   r$   éÈ   rc   i   ÚCOOLDOWN_ACTIVEg      @r}   ÚINSUFFICIENT_ENERGYN)rF   rG   r'   rH   rI   rJ   rQ   rK   rj   r+   r   )r3   rV   ÚfirstÚduring_lockÚrepeatÚ	no_energys         r4   Ú"test_cooldown_and_energy_depletionzATestSprint2MartialCombatSystem.test_cooldown_and_energy_depletionÚ   sN  € å•T”Y‘[”[ 4Ñ'Ñ(Ô(ˆà”×.Ò.¨q°$¸¸6ÑBÔBˆØ�Š˜œÑ&Ô&Ð&ð ”k×4Ò4°Q¸¸aÀÈ#ÁÑNÔNˆØ×Ò˜Ô,Ñ-Ô-Ð-Ø×Ò˜Ô1Ð3EÑFÔFÐFð ”×/Ò/°°4¸¸FÀS¹LÑIÔIˆØ×Ò˜œÑ(Ô(Ð(Ø×Ò˜Ô,Ð.?Ñ@Ô@Ð@ð (+ˆŒÔ$Ø”K×2Ò2°1°d¸A¸vÈ¹}ÑMÔMˆ	Ø×Ò˜Ô*Ñ+Ô+Ð+Ø×Ò˜Ô/Ð1FÑGÔGÐGÐGÐGr6   N)Ú__name__Ú
__module__Ú__qualname__r5   r9   rX   r_   rq   ru   rx   rˆ   r‘   © r6   r4   r   r      s¨   € € € € € ð$2ð $2ð $2ðLð ð ð@ð @ð @ð,4ð 4ð 4ð.(;ð (;ð (;ðT=ð =ð =ð"-ð -ð -ðPð Pð Pð<Hð Hð Hð Hð Hr6   r   Ú__main__)Ú__doc__ÚosÚsysrG   ÚunittestÚpathÚabspathÚjoinÚdirnameÚ__file__ÚPROJECT_ROOTÚ
SERVER_DIRÚinsertÚworld.combat_enginer   r   r   Úworld.martial_matrixr   r   Úworld.skill_database_servicer	   Úworld.meridian_servicer
   ÚTestCaser   r’   Úmainr•   r6   r4   ú<module>r©      s  ððð ð 
€	€	€	Ø 
€
€
€
Ø €€€Ø €€€àŒw�Š˜rœwŸ|š|¨B¬G¯OªO¸HÑ,EÔ,EÀwÑOÔOÑPÔP€ØŒW�\Š\˜,¨Ñ1Ô1€
Ø�S”XÐÐØ„H‡O‚O�A�zÑ"Ô"Ð"Ø�s”xÐÐØ„H‡O‚O�A�|Ñ$Ô$Ð$à JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JØ =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø =Ð =Ð =Ð =Ð =Ð =Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2ðSHð SHð SHð SHð SH XÔ%6ñ SHô SHð SHðl ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr6   