§
    ±“«j   ã                   ó¼   — d Z ddlZddlmc mZ ddlZddlZddl	m
Z
mZ ddlmZmZmZmZ ddlmZ  G d„ dej        ¦  «        Zedk    r ej        ¦   «          dS dS )	uô  
AutoPOE2 - Closed-Loop Logistics & Resilience Unit Tests (Doc 69)
================================================================
Kiá»ƒm thá»­ tá»± Ä‘á»™ng:
1. Auto-Restock Waystone tá»« Stash khi tÃºi Ä‘á»“ rá»—ng (INV-WAYSTONE-RESTOCK-MIN).
2. Lá»�c bá»� Waystone chá»©a Brick Mod (INV-MAP-NO-BRICK).
3. Tá»± Ä‘á»™ng kÃ­ch hoáº¡t chu trÃ¬nh cáº¥t Ä‘á»“ háº­u map (Post-Map Stash Routine).
4. Phá»¥c há»“i vÃ  click há»“i sinh khi phÃ¡t hiá»‡n mÃ n hÃ¬nh tá»­ tráº­n (INV-DEATH-RECOVERY-TIMEOUT).
é    N)Ú	MagicMockÚpatch)ÚCraftActionÚWaystoneAutoCrafterÚWaystoneItemÚWaystoneRarity)ÚAutonomousMappingCoordinatorc                   ó~   — e Zd Zd„ Z edd¬¦  «        d„ ¦   «         Z edd¬¦  «        d„ ¦   «         Zd„ Zd„ Zd	„ Z	d
S )ÚTestClosedLoopLogisticsc                 óþ   — t          dddd¬¦  «        | _        t          d¬¦  «        | j        _        t          ¦   «         | j        _        t          ¦   «         | j        _        t          d¬¦  «        | j        _        d S )Ni 
  i   z!tests/test_fixtures_real_capturesT)Úscreen_wÚscreen_hÚcapture_dirÚis_simulated©Úreturn_valuezmock_capture.png)r	   Úcoordinatorr   Úensure_focusÚ	press_keyÚclickÚcapture_step)Úselfs    ú8C:\Projects\AutoPOE2\tests\test_closed_loop_logistics.pyÚsetUpzTestClosedLoopLogistics.setUp   sx   € Ý7ØØØ;Øð	
ñ 
ô 
ˆÔõ )2¸tÐ(DÑ(DÔ(DˆÔÔ%Ý%.¡[¤[ˆÔÔ"Ý!*¡¤ˆÔÔÝ(1Ð?QÐ(RÑ(RÔ(RˆÔÔ%Ð%Ð%ó    zos.path.existsTr   c                 ó
  — t          d¬¦  «        | j        _        t          dddœ¬¦  «        | j        j        _        ddddd	d
œ}t          g |gg¬¦  «        | j        j        _        t          ddddœ¬¦  «        | j        _        | j                             d¬¦  «        }|                      |d         d¦  «         | j        j         	                    ¦   «          |                      t          |d         ¦  «        d¦  «         dS )us   Khi tÃºi Ä‘á»“ rá»—ng Waystone, Stage 1 pháº£i tá»± Ä‘á»™ng gá»�i execute_stage0_stash_routine Ä‘á»ƒ rÃºt Waystone.Tr   é   F©Úoccupied_countÚis_fullr   éÂ  é4  ç     Àb@©ÚcolÚrowÚcenter_xÚcenter_yÚavg_rgb©Úside_effectÚSUCCESS)ÚstatusÚsuccessÚwaystone_withdrawn©Útarget_slot_idxr-   Úwaystones_foundé   N)r   r   Úis_inventory_openÚscannerÚscan_full_inventoryÚscan_all_waystonesÚexecute_stage0_stash_routineÚexecute_stage1_precheckÚassertEqualÚassert_called_onceÚlen)r   Úmock_existsÚmock_wsÚress       r   Ú-test_stage1_auto_restock_when_inventory_emptyzETestClosedLoopLogistics.test_stage1_auto_restock_when_inventory_empty%   s"  € õ .7ÀDÐ-IÑ-IÔ-IˆÔÔ*Ý7@Ø,-¸%Ð@Ð@ð8
ñ 8
ô 8
ˆÔÔ Ô4ð
  A°4ÀSÐUZÐ[Ð[ˆÝ6?Ø˜g˜Y˜ð7
ñ 7
ô 7
ˆÔÔ Ô3õ
 9BØ$-¸$ÐVZÐ[Ð[ð9
ñ 9
ô 9
ˆÔÔ5ð Ô×6Ò6ÀqÐ6ÑIÔIˆð 	×Ò˜˜Xœ¨	Ñ2Ô2Ð2àÔÔ5×HÒHÑJÔJÐJØ×Ò�˜SÐ!2Ô3Ñ4Ô4°aÑ8Ô8Ð8Ð8Ð8r   c                 óF  — d| j         _        t          d¬¦  «        | j         _        t          dddœ¬¦  «        | j         j        _        ddddd	d
œ}dddddd
œ}t          ||g¬¦  «        | j         j        _        dd„}t          |¬¦  «        | j         j        _        | j          	                    d¬¦  «        }|  
                    |d         d¦  «         t          |d         t          ¦  «        r|d         d         n|d         d         }|  
                    |d¦  «         dS )uj   Stage 1 pháº£i tá»± Ä‘á»™ng bá»� qua viÃªn Waystone dÃ­nh Brick Mod vÃ  chá»�n viÃªn an toÃ n tiáº¿p theo.Tr   r   Fr   r   r!   r"   r#   r$   r3   iö  g      d@c                 óH   — | j         dk    rt          j        S t          j        S )Nr   )Úinventory_colr   ÚSKIP_DANGEROUSÚ
SKIP_CRAFT)ÚwaystoneÚalchemy_countÚis_in_safe_areaÚscour_counts       r   Ú	mock_evalzKTestClosedLoopLogistics.test_stage1_skips_brick_waystone.<locals>.mock_evalO   s"   € ØÔ%¨Ò*Ð*Ý"Ô1Ð1ÝÔ)Ð)r   r*   r0   r-   r,   Úselected_slotr%   N)Tr   )r   Úskip_dangerousr   r4   r5   r6   r7   ÚcrafterÚevaluate_craft_actionr9   r:   Ú
isinstanceÚdict)r   r=   Úws_brickÚws_saferJ   r?   Ú
chosen_cols          r   Ú test_stage1_skips_brick_waystonez8TestClosedLoopLogistics.test_stage1_skips_brick_waystone@   sK  € ð +/ˆÔÔ'Ý-6ÀDÐ-IÑ-IÔ-IˆÔÔ*Ý7@Ø,-¸%Ð@Ð@ð8
ñ 8
ô 8
ˆÔÔ Ô4ð
  Q°DÀcÐV[Ð\Ð\ˆØ A°4ÀSÐUZÐ[Ð[ˆÝ6?ÈhÐX_ÐM`Ð6aÑ6aÔ6aˆÔÔ Ô3ð	*ð 	*ð 	*ð 	*õ
 :CÈyÐ9YÑ9YÔ9YˆÔÔ Ô6àÔ×6Ò6ÀqÐ6ÑIÔIˆà×Ò˜˜Xœ¨	Ñ2Ô2Ð2å4>¸sÀ?Ô?SÕUYÑ4ZÔ4ZÐw�S˜Ô)¨%Ô0Ð0Ð`cÐdsÔ`tÐuvÔ`wˆ
Ø×Ò˜ QÑ'Ô'Ð'Ð'Ð'r   c                 óÂ  — t          ¦   «         | j        _        t          dddœ¬¦  «        | j        _        t          dg d¢dœ¬¦  «        | j        _        t          ddi¬¦  «        | j        _        t          ddi¬¦  «        | j        _        t          ddd	œ¬¦  «        | j        _        t          dd
d
dœ¬¦  «        | j        _        t          dddœ¬¦  «        | j        _	        | j         
                    ddd¬¦  «        }|                      |d         d¦  «         |                      d|d         ¦  «         |                      | j        j        j        d¦  «         d
S )up   Khi cÃ y xong map, pipeline pháº£i tá»± Ä‘á»™ng gá»�i chu trÃ¬nh cáº¥t Ä‘á»“ háº­u map (Post-Map Stash Routine).r,   é   )r-   Úitems_depositedr   )r   r   éd   rX   r#   )r-   rK   r-   ÚDeserted)r-   Úentered_zoneN)r-   Úrunner_instanceÚrunner_resultT)r-   Úreturned_to_hideoutr   )r1   Úenable_stashingÚenable_post_stashingÚSTAGE0_POST_STASHÚstages_completedé   )r   r   Údismiss_modalsr8   r9   Úexecute_stage2_map_deviceÚexecute_stage3_atlas_activationÚexecute_stage4_map_entranceÚexecute_stage5_map_clearÚexecute_stage6_portal_returnÚexecute_pipeliner:   ÚassertInÚ
call_count)r   Úreports     r   Ú0test_post_map_stash_routine_executed_in_pipelinezHTestClosedLoopLogistics.test_post_map_stash_routine_executed_in_pipeline]   sš  € å*3©+¬+ˆÔÔ'Ý8AØ$-À!ÐDÐDð9
ñ 9
ô 9
ˆÔÔ5õ 4=Ø$-Ð@WÐ@WÐ@WÐXÐXð4
ñ 4
ô 4
ˆÔÔ0õ 6?ÈXÐW`ÐLaÐ5bÑ5bÔ5bˆÔÔ2Ý;DÐS[Ð]fÐRgÐ;hÑ;hÔ;hˆÔÔ8Ý7@Ø$-¸zÐJÐJð8
ñ 8
ô 8
ˆÔÔ4õ 5>Ø$-À$ÐY]Ð^Ð^ð5
ñ 5
ô 5
ˆÔÔ1õ 9BØ$-ÀdÐKÐKð9
ñ 9
ô 9
ˆÔÔ5ð Ô!×2Ò2Ø¨tÈ$ð 3ñ 
ô 
ˆð 	×Ò˜ Ô)¨9Ñ5Ô5Ð5à�ŠÐ)¨6Ð2DÔ+EÑFÔFÐFØ×Ò˜Ô)ÔFÔQÐSTÑUÔUÐUÐUÐUr   c                 óZ  — t          d¬¦  «        | j        _        d| j        _        | j                             dd¬¦  «        }|                      |d         d¦  «         |                      |d         ¦  «         | j        j                             d	d
t          j
        j        ¬¦  «         dS )u`   Khi phÃ¡t hiá»‡n mÃ n hÃ¬nh tá»­ tráº­n, Stage 6 pháº£i tá»± Ä‘á»™ng click Resurrect in Hideout.)é   é   r   NrY   )ÚrunnerÚmap_zoner-   r,   r]   ro   rp   )Údelay_after)r   r   Ú_find_resurrect_buttonÚlog_watcherrh   r:   Ú
assertTruer   Úassert_called_withÚunittestÚmockÚANY)r   r?   s     r   Ú)test_death_resurrect_detected_and_handledzATestClosedLoopLogistics.test_death_resurrect_detected_and_handled{   s�   € å2;ÈÐ2UÑ2UÔ2UˆÔÔ/Ø'+ˆÔÔ$àÔ×;Ò;À4ÐR\Ð;Ñ]Ô]ˆà×Ò˜˜Xœ¨	Ñ2Ô2Ð2Ø�Š˜Ð1Ô2Ñ3Ô3Ð3àÔÔ×1Ò1°$¸ÍÌÔIZÐ1Ñ[Ô[Ð[Ð[Ð[r   c                 óº  — ddl m} d| j        _        t	          j        |dd¬¦  «        5  t	          j        |dd¬¦  «        5 }t	          d¦  «        5  | j                             ¦   «         }|                      |¦  «         |                     ¦   «          d	d	d	¦  «         n# 1 swxY w Y   d	d	d	¦  «         n# 1 swxY w Y   d	d	d	¦  «         d	S # 1 swxY w Y   d	S )
uo   INV-CLIENT-CRASH-RECOVER: Khi game client bá»‹ táº¯t/crash, coordinator pháº£i gá»�i recover_client_if_crashed.r   )ÚPoe2ClientLauncherFÚis_client_runningr   Úrecover_client_if_crashedTz
time.sleepN)	Ú"src.assistant_tool.client_launcherr}   r   r   r   ÚobjectÚ#recover_from_client_crash_if_neededrv   r;   )r   r}   Úmock_recoverÚ	recovereds       r   Ú)test_client_crash_recovery_in_coordinatorzATestClosedLoopLogistics.test_client_crash_recovery_in_coordinator‡   s§  € àIÐIÐIÐIÐIÐIØ(-ˆÔÔ%ÝŒ\Ð,Ð.AÐPUÐVÑVÔVð 	.ð 	.ÝŒ\Ð,Ð.IÐX\Ð]Ñ]Ô]ð	.ØamÝ�<Ñ Ô ð	.ð 	.ð Ô(×LÒLÑNÔNˆIØ�OŠO˜IÑ&Ô&Ð&Ø×+Ò+Ñ-Ô-Ð-ð	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.ð 	.ð 	.sZ   ªCÁB8ÁAB!ÂB8Â!B%Â%B8Â(B%Â)B8Â,CÂ8B<	Â<CÂ?B<	Ã CÃCÃCN)
Ú__name__Ú
__module__Ú__qualname__r   r   r@   rT   rm   r{   r…   © r   r   r   r      s±   € € € € € ð
Sð 
Sð 
Sð €UÐ¨$Ð/Ñ/Ô/ð9ð 9ñ 0Ô/ð9ð4 €UÐ¨$Ð/Ñ/Ô/ð(ð (ñ 0Ô/ð(ð8Vð Vð Vð<
\ð 
\ð 
\ð	.ð 	.ð 	.ð 	.ð 	.r   r   Ú__main__)Ú__doc__ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arÚosrx   Úunittest.mockr   r   Ú*src.assistant_tool.pickit.waystone_crafterr   r   r   r   Ú$tools.autonomous_mapping_coordinatorr	   ÚTestCaser   r†   Úmainr‰   r   r   ú<module>r˜      s  ððð ð € € € € € € € € € € € € €	€	€	€	Ø €€€Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *ðð ð ð ð ð ð ð ð ð ð ð ð NÐ MÐ MÐ MÐ MÐ Mðx.ð x.ð x.ð x.ð x.˜hÔ/ñ x.ô x.ð x.ðv ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   