§
    æÀj}  ã            
       óR  — 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¦  «        ¦  «        ¦  «         ej                             dej                             ej                             ej                             e	¦  «        d¦  «        ¦  «        ¦  «         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 dd	lmZmZ  G d
„ dej        ¦  «        Zedk    r ej        ¦   «          dS dS )uÛ   
Unit tests for Agent Orb Delegation Service in FreeExile.
Verifies Agent_Orb inventory consumption, session activation, offline persistence,
harvest tracking (EXP, Linh Tháº¡ch, kills), and player control reclamation.
é    Nz../../serverz../../)ÚServerEngineLoop)ÚFiveElements)ÚAgentOrbServiceÚAgentOrbTierÚDelegationSessionÚDelegationHarvestReport)ÚTacticalStance)ÚLLMProviderTypeÚLLMProviderConfigc                   ó8   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	dS )	ÚTestAgentOrbServicec           	      ó,  — t          ¦   «         | _        t          | j        d¬¦  «        | _        | j                             ddddt
          j        dd¬¦  «         | j                             ddd	¬
¦  «         | j                             ddd¬
¦  «         d S )Nz:memory:)ÚengineÚdb_pathé   g        g      @g     @�@)Ú	entity_idÚ	initial_xÚ	initial_yÚ	initial_zÚelementÚ
move_speedÚmax_hpÚitem_agent_orb_tier1é   )Ú	player_idÚorb_idÚcountÚitem_agent_orb_tier2)r   r   r   ÚserviceÚregister_playerr   ÚHOAÚgrant_agent_orb)Úselfs    ú:C:\Projects\FreeExile\tests\unit\test_agent_orb_service.pyÚsetUpzTestAgentOrbService.setUp   s¢   € Ý&Ñ(Ô(ˆŒÝ&¨d¬kÀ:ÐNÑNÔNˆŒàŒ×#Ò#ØØØØÝ Ô$ØØð 	$ñ 	
ô 	
ð 	
ð 	Œ×$Ò$¨qÐ9OÐWXÐ$ÑYÔYÐYØŒ×$Ò$¨qÐ9OÐWXÐ$ÑYÔYÐYÐYÐYó    c                 ó4  — | j                              d¬¦  «        }|                      |                     d¦  «        d¦  «         |                      |                     d¦  «        d¦  «         |                      |                     dd¦  «        d¦  «         dS )	z%Verifies player orb balance tracking.r   ©r   r   r   r   Úitem_agent_orb_tier3r   N)r   Úget_player_orb_balanceÚassertEqualÚget)r#   Úbalances     r$   Ú test_grant_and_inventory_balancez4TestAgentOrbService.test_grant_and_inventory_balance,   s‹   € à”,×5Ò5ÀÐ5ÑBÔBˆØ×Ò˜ŸšÐ%;Ñ<Ô<¸aÑ@Ô@Ð@Ø×Ò˜ŸšÐ%;Ñ<Ô<¸aÑ@Ô@Ð@Ø×Ò˜ŸšÐ%;¸QÑ?Ô?ÀÑCÔCÐCÐCÐCr&   c                 ó\  — t          t          j        d¬¦  «        }| j                             ddt
          j        |¬¦  «        }|                      |¦  «         |                      |j	        ¦  «         |  
                    |j        d¦  «         |  
                    |j        d¦  «         |  
                    |j        t
          j        ¦  «         |  
                    |j        j        t          j        ¦  «         |  
                    | j                             d¦  «        d         d¦  «         dS )zYActivating delegation consumes 1 orb and creates an active session with correct duration.zsk-ds-dummy)ÚproviderÚapi_keyr   r   )r   r   ÚstanceÚ
llm_configi   N)r   r
   ÚDEEPSEEKr   Úactivate_delegationr	   Ú
AGGRESSIVEÚassertIsNotNoneÚ
assertTrueÚ	is_activer+   Útotal_duration_secÚremaining_duration_secr2   r3   r0   r*   ©r#   ÚcfgÚsessions      r$   Ú%test_activate_delegation_consumes_orbz9TestAgentOrbService.test_activate_delegation_consumes_orb3   s  € å­Ô)AÈ=ÐYÑYÔYˆØ”,×2Ò2ØØ)Ý!Ô,Øð	 3ñ 
ô 
ˆð 	×Ò˜WÑ%Ô%Ð%Ø�Š˜Ô)Ñ*Ô*Ð*Ø×Ò˜Ô3°TÑ:Ô:Ð:Ø×Ò˜Ô7¸Ñ>Ô>Ð>Ø×Ò˜œ­Ô)BÑCÔCÐCØ×Ò˜Ô+Ô4µoÔ6NÑOÔOÐOð 	×Ò˜œ×<Ò<¸QÑ?Ô?Ð@VÔWÐYZÑ[Ô[Ð[Ð[Ð[r&   c                 óˆ  — t          t          j        ¬¦  «        }| j                             ddt
          j        |¦  «         | j                             dd¬¦  «         | j                             d¬¦  «        }|  	                    |¦  «         |  
                    |j        ¦  «         |  
                    |j        ¦  «         dS )zZWhen player goes offline, session is flagged as offline and continues autonomous gameplay.©r0   r   r   T)r   Ú
is_offliner(   N)r   r
   ÚLOCAL_TACTICALr   r5   r	   ÚBALANCEDÚset_player_offline_stateÚget_active_sessionr7   r8   rB   r9   r<   s      r$   Ú$test_offline_delegation_continuationz8TestAgentOrbService.test_offline_delegation_continuationF   s­   € å­Ô)GÐHÑHÔHˆØŒ×(Ò(¨Ð,BÅNÔD[Ð]`ÑaÔaÐaàŒ×-Ò-¸ÀdÐ-ÑKÔKÐKØ”,×1Ò1¸AÐ1Ñ>Ô>ˆØ×Ò˜WÑ%Ô%Ð%Ø�Š˜Ô*Ñ+Ô+Ð+Ø�Š˜Ô)Ñ*Ô*Ð*Ð*Ð*r&   c                 óœ  — t          t          j        ¬¦  «        }| j                             ddt
          j        |¦  «        }|j        }| j                             dd¬¦  «        }|  	                    |¦  «         |  
                    |j        |dz   ¦  «         |  
                    | j                             d¦  «        d         d¦  «         dS )	zRUsing a second orb extends the remaining duration without resetting harvest stats.rA   r   r   r   )r   r   i€p  r   N)r   r
   rC   r   r5   r	   rD   r;   Úextend_delegationr8   r+   r*   )r#   r=   r>   Úinitial_remainingÚextendeds        r$   Ú&test_extend_delegation_stacks_durationz:TestAgentOrbService.test_extend_delegation_stacks_durationQ   s¿   € å­Ô)GÐHÑHÔHˆØ”,×2Ò2°1Ð6LÍnÔNeÐgjÑkÔkˆØ#Ô:Ðð ”<×1Ò1¸AÐF\Ð1Ñ]Ô]ˆØ�Š˜Ñ!Ô!Ð!Ø×Ò˜Ô7Ð9JÈUÑ9RÑSÔSÐSØ×Ò˜œ×<Ò<¸QÑ?Ô?Ð@VÔWÐYZÑ[Ô[Ð[Ð[Ð[r&   c                 óF  — t          t          j        ¬¦  «        }| j                             ddt
          j        |¦  «        }d|_        | j                             ddd¬¦  «         | j         	                    dd¬	¦  «         | j         
                    d
¬¦  «         |                      |j        ¦  «         |                      |j        d
¦  «         | j         
                    d¬¦  «         |                      |j        ¦  «         |                      |j        ¦  «         dS )zHVerifies harvest increments and automatic termination upon timer expiry.rA   r   r   g       @Úcurr_chaos_stoneé   )r   Úitem_idr   iÜ  )r   Úexpg      ð?)ÚdtN)r   r
   rC   r   r5   r	   rD   r;   Úrecord_loot_harvestÚrecord_monster_slainÚ	step_tickr8   r9   ÚassertAlmostEqualÚassertFalseÚ
is_expiredr<   s      r$   Ú-test_tick_harvest_accumulation_and_expirationzATestAgentOrbService.test_tick_harvest_accumulation_and_expiration]   s  € å­Ô)GÐHÑHÔHˆØ”,×2Ò2°1Ð6LÍnÔNeÐgjÑkÔkˆà),ˆÔ&ð 	Œ×(Ò(°1Ð>PÐXYÐ(ÑZÔZÐZØŒ×)Ò)°A¸4Ð)Ñ@Ô@Ð@ð 	Œ×Ò #ÐÑ&Ô&Ð&Ø�Š˜Ô)Ñ*Ô*Ð*Ø×Ò˜wÔ=¸sÑCÔCÐCð 	Œ×Ò #ÐÑ&Ô&Ð&Ø×Ò˜Ô*Ñ+Ô+Ð+Ø�Š˜Ô*Ñ+Ô+Ð+Ð+Ð+r&   c                 óP  — t          t          j        ¬¦  «        }| j                             ddt
          j        |¦  «         | j                             ddd¦  «         | j                             ddd¦  «         | j                             dd¬¦  «         | j         	                    d¬	¦  «        }|  
                    |t          ¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                      |j                             d¦  «        d¦  «         |                      |j                             d¦  «        d¦  «         |                      | j                             d¦  «        ¦  «         d
S )zUPlayer logs in, clicks 'Reclaim Control', and receives comprehensive harvest summary.rA   r   r   rN   é   Úcurr_destiny_runei4!  )rQ   r(   N)r   r
   rC   r   r5   r	   ÚTREASURE_HUNTERrS   rT   Úreclaim_controlÚassertIsInstancer   r+   r   Úmonsters_slainÚ
exp_gainedÚspirit_stones_lootedr,   ÚassertIsNonerF   )r#   r=   Úreports      r$   Ú+test_reclaim_control_returns_harvest_reportz?TestAgentOrbService.test_reclaim_control_returns_harvest_reportr   s}  € å­Ô)GÐHÑHÔHˆØŒ×(Ò(¨Ð,BÅNÔDbÐdgÑhÔhÐhØŒ×(Ò(¨Ð,>ÀÑBÔBÐBØŒ×(Ò(¨Ð,?ÀÑCÔCÐCØŒ×)Ò)¨!°Ð)Ñ6Ô6Ð6à”×-Ò-¸Ð-Ñ:Ô:ˆØ×Ò˜fÕ&=Ñ>Ô>Ð>Ø×Ò˜Ô)¨1Ñ-Ô-Ð-Ø×Ò˜Ô.°Ñ2Ô2Ð2Ø×Ò˜Ô*¨DÑ1Ô1Ð1Ø×Ò˜Ô4×8Ò8Ð9KÑLÔLÈaÑPÔPÐPØ×Ò˜Ô4×8Ò8Ð9LÑMÔMÈqÑQÔQÐQð 	×Ò˜$œ,×9Ò9¸!Ñ<Ô<Ñ=Ô=Ð=Ð=Ð=r&   N)
Ú__name__Ú
__module__Ú__qualname__r%   r.   r?   rG   rL   rY   re   © r&   r$   r   r      s‰   € € € € € ðZð Zð Zð"Dð Dð Dð\ð \ð \ð&	+ð 	+ð 	+ð
\ð 
\ð 
\ð,ð ,ð ,ð*>ð >ð >ð >ð >r&   r   Ú__main__)Ú__doc__ÚunittestÚsysÚosÚpathÚinsertÚabspathÚjoinÚdirnameÚ__file__Úworld.server_engine_loopr   Úworld.martial_matrixr   Úworld.agent_orb_servicer   r   r   r   Úagent.agent_decision_corer	   Úagent.llm_provider_clientr
   r   ÚTestCaser   rf   Úmainri   r&   r$   ú<module>r|      s˜  ððð ð €€€Ø 
€
€
€
Ø 	€	€	€	à „‡‚��2”7—?’? 2¤7§<¢<°´·²ÀÑ0IÔ0IÈ>Ñ#ZÔ#ZÑ[Ô[Ñ \Ô \Ð \Ø „‡‚��2”7—?’? 2¤7§<¢<°´·²ÀÑ0IÔ0IÈ8Ñ#TÔ#TÑUÔUÑ VÔ VÐ Và 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø -Ð -Ð -Ð -Ð -Ð -ðð ð ð ð ð ð ð ð ð ð ð ð 5Ð 4Ð 4Ð 4Ð 4Ð 4Ø HÐ HÐ HÐ HÐ HÐ HÐ HÐ Hði>ð i>ð i>ð i>ð i>˜(Ô+ñ i>ô i>ð i>ðX ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr&   