§
    ri»j  ã            
       ó–  — d Z ddlZddlZddlZej                             dej                             ej                             ej                             e	¦  «        d¦  «        ¦  «        ¦  «         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mZmZ ddlmZmZmZ  G d	„ d
ej        ¦  «        Zedk    r ej        ¦   «          dS dS )u	  
Unit tests for Autonomous Agent Decision Core in FreeExile.
Verifies Perception extraction from ServerEngineLoop, high-level tactical intent,
low-level 30Hz reflex behavior (NgÅ© HÃ nh counter, auto-dodge, auto-loot),
and command dispatch to Server Engine queues.
é    Nz../../server)ÚServerEngineLoopÚClientMoveCommandÚClientSkillCommand)ÚFiveElements)ÚCombatActor)ÚAgentPerceptionSnapshotÚTacticalStanceÚAgentDecisionCoreÚAgentActionPlan)ÚAgentActionTypeÚLLMProviderTypeÚLLMProviderConfigc                   ó2   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestAgentDecisionCorec           	      óJ  — t          ¦   «         | _        | j                             ddddt          j        dd¬¦  «         | j                             ddddt          j        d	d
¬¦  «         t          dt          t          j	        ¬¦  «        t          j        ¬¦  «        | _        d S )Né   ç      $@ç        g      @g     @�@)Ú	entity_idÚ	initial_xÚ	initial_yÚ	initial_zÚelementÚ
move_speedÚmax_hpée   ç      (@g      @g     @@)Úprovider)Ú	player_idÚprovider_configÚstance)r   ÚengineÚregister_playerr   ÚKIMÚTHOr
   r   r   ÚLOCAL_TACTICALr	   ÚBALANCEDÚcore)Úselfs    ú<C:\Projects\FreeExile\tests\unit\test_agent_decision_core.pyÚsetUpzTestAgentDecisionCore.setUp   sµ   € Ý&Ñ(Ô(ˆŒàŒ×#Ò#ØØØØÝ Ô$ØØð 	$ñ 	
ô 	
ð 	
ð 	Œ×#Ò#ØØØØÝ Ô$ØØð 	$ñ 	
ô 	
ð 	
õ &ØÝ-µÔ7UÐVÑVÔVÝ!Ô*ð
ñ 
ô 
ˆŒ	ˆ	ˆ	ó    c                 ó~  — | j                              | j        ¦  «        }|                      |j        d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |  	                    t          d„ |j        D ¦   «         ¦  «        ¦  «         dS )z\Verifies that Agent extracts spatial coordinates, HP ratio, and visible entities accurately.r   r   g      ð?c              3   ó,   K  — | ]}|j         d k    V — ŒdS )r   N)r   )Ú.0Úes     r*   ú	<genexpr>zNTestAgentDecisionCore.test_perception_extraction_from_world.<locals>.<genexpr>?   s)   è è € ÐSÐS°1˜AœK¨3Ò.ÐSÐSÐSÐSÐSÐSr,   N)r(   Úbuild_perceptionr"   ÚassertEqualr   ÚassertAlmostEqualÚplayer_xÚplayer_yÚhp_ratioÚ
assertTrueÚanyÚnearby_entities)r)   Ú
perceptions     r*   Ú%test_perception_extraction_from_worldz;TestAgentDecisionCore.test_perception_extraction_from_world7   s¯   € à”Y×/Ò/°´Ñ<Ô<ˆ
Ø×Ò˜Ô-¨qÑ1Ô1Ð1Ø×Ò˜zÔ2°DÑ9Ô9Ð9Ø×Ò˜zÔ2°DÑ9Ô9Ð9Ø×Ò˜zÔ2°CÑ8Ô8Ð8à�Š�ÐSÐS¸
Ô8RÐSÑSÔSÑSÔSÑTÔTÐTÐTÐTr,   c                 ót  — | j                              | j        ¦  «        }| j                              |¦  «        }|                      |t
          ¦  «         |                      |j        t          j	        t          j
        g¦  «         |j        t          j	        k    r|                      |j        d¦  «         dS dS )uc   When targeting an Earth enemy (Thá»•), Agent chooses Má»™c (Wood overcomes Earth) or optimal skill.r   N)r(   r2   r"   Úevaluate_tick_actionÚassertIsInstancer   ÚassertInÚaction_typer   ÚATTACK_SKILLÚMOVE_TOWARDSr3   Útarget_entity_id©r)   r;   Úplans      r*   Ú%test_combat_element_counter_selectionz;TestAgentDecisionCore.test_combat_element_counter_selectionA   sž   € à”Y×/Ò/°´Ñ<Ô<ˆ
ØŒy×-Ò-¨jÑ9Ô9ˆà×Ò˜d¥OÑ4Ô4Ð4à�Š�dÔ&­Ô)EÅÔGcÐ(dÑeÔeÐeØÔ�Ô;Ò;Ð;Ø×Ò˜TÔ2°CÑ8Ô8Ð8Ð8Ð8ð <Ð;r,   c                 ób  — | j         j        j        d         }d|_        | j                             | j         ¦  «        }|                      |j        d¦  «         | j                             |¦  «        }|  	                    |j
        t          j        t          j        t          j        g¦  «         dS )zKWhen HP drops below 25%, agent immediately reflexes into DODGE or retreats.r   g      i@g      Ð?N)r"   Úcombat_engineÚactorsÚ
current_hpr(   r2   Ú
assertLessr7   r>   r@   rA   r   ÚDODGEÚ
USE_POTIONÚ	MOVE_AWAY)r)   Úactorr;   rF   s       r*   Ú*test_emergency_survival_reflex_when_low_hpz@TestAgentDecisionCore.test_emergency_survival_reflex_when_low_hpL   s�   € à”Ô)Ô0°Ô3ˆØ ˆÔà”Y×/Ò/°´Ñ<Ô<ˆ
Ø�Š˜
Ô+¨TÑ2Ô2Ð2àŒy×-Ò-¨jÑ9Ô9ˆà�Š�dÔ&­Ô)>ÅÔ@ZÕ\kÔ\uÐ(vÑwÔwÐwÐwÐwr,   c                 ób  — t           j        | j        _        | j                             ddddd¬¦  «         | j                             | j        ¦  «        }| j                             |¦  «        }|                      |j	        t          j        ¦  «         |                      |j        d¦  «         dS )zbIn TREASURE_HUNTER stance, rare drops like Primal Chaos Stone take priority over standard farming.Údrop_chaos_1Úcurr_chaos_stoneg      '@r   é   )Údrop_idÚitem_idÚxÚyÚrarityN)r	   ÚTREASURE_HUNTERr(   r!   Úregister_ground_dropr2   r"   r>   r3   rA   r   ÚLOOTÚtarget_drop_idrE   s      r*   Ú,test_treasure_hunter_stance_prioritizes_lootzBTestAgentDecisionCore.test_treasure_hunter_stance_prioritizes_lootX   s›   € å)Ô9ˆŒ	ÔàŒ	×&Ò&¨~ÐGYÐ]aÐeiÐrsÐ&ÑtÔtÐtà”Y×/Ò/°´Ñ<Ô<ˆ
ØŒy×-Ò-¨jÑ9Ô9ˆà×Ò˜Ô)­?Ô+?Ñ@Ô@Ð@Ø×Ò˜Ô,¨nÑ=Ô=Ð=Ð=Ð=r,   c                 ón  — t          t          j        ddd¬¦  «        }| j                             || j        d¬¦  «         |                      t          | j        j        ¦  «        d¦  «         | j        j        d         }|                      |j	        d¦  «         |  
                    |j        d	¦  «         d
S )zZVerifies that generated plan translates into valid commands submitted to ServerEngineLoop.r   r   z Closing distance to attack enemy)rA   Útarget_xÚtarget_yÚ	reasoningg±áé•²¡?)Údtr   r   r   N)r   r   rC   r(   Údispatch_plan_to_serverr"   r3   ÚlenÚ
move_queuer   ÚassertGreaterÚdir_x)r)   rF   Úcmds      r*   Ú'test_dispatch_commands_to_server_enginez=TestAgentDecisionCore.test_dispatch_commands_to_server_engined   s®   € åÝ'Ô4ØØØ8ð	
ñ 
ô 
ˆð 	Œ	×)Ò)¨$°´ÀÐ)ÑGÔGÐGà×Ò�˜Tœ[Ô3Ñ4Ô4°aÑ8Ô8Ð8ØŒkÔ$ QÔ'ˆØ×Ò˜œ¨Ñ*Ô*Ð*Ø×Ò˜3œ9 cÑ*Ô*Ð*Ð*Ð*r,   N)	Ú__name__Ú
__module__Ú__qualname__r+   r<   rG   rQ   r_   rk   © r,   r*   r   r      st   € € € € € ð
ð 
ð 
ð8Uð Uð Uð	9ð 	9ð 	9ð
xð 
xð 
xð
>ð 
>ð 
>ð+ð +ð +ð +ð +r,   r   Ú__main__)Ú__doc__ÚunittestÚsysÚosÚpathÚinsertÚabspathÚjoinÚdirnameÚ__file__Úworld.server_engine_loopr   r   r   Úworld.martial_matrixr   Úworld.combat_enginer   Úagent.agent_decision_corer   r	   r
   r   Úagent.llm_provider_clientr   r   r   ÚTestCaser   rl   Úmainro   r,   r*   ú<module>r‚      si  ððð ð €€€Ø 
€
€
€
Ø 	€	€	€	à „‡‚��2”7—?’? 2¤7§<¢<°´·²ÀÑ0IÔ0IÈ>Ñ#ZÔ#ZÑ[Ô[Ñ \Ô \Ð \à \Ð \Ð \Ð \Ð \Ð \Ð \Ð \Ð \Ð \Ø -Ð -Ð -Ð -Ð -Ð -Ø +Ð +Ð +Ð +Ð +Ð +ðð ð ð ð ð ð ð ð ð ð ð ð ZÐ YÐ YÐ YÐ YÐ YÐ YÐ YÐ YÐ YðW+ð W+ð W+ð W+ð W+˜HÔ-ñ W+ô W+ð W+ðt ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr,   