§
    ­j°&  ã                  óä   — d Z ddlm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 ddlmZmZmZmZ ddlmZmZmZmZmZ  G d„ dej        ¦  «        Zed	k    r ej        ¦   «          dS dS )
uÂ  AutoPOE2 - Test Suite Kiá»ƒm Chá»©ng Minimap Navigation Adapter (Doc 69 Â§3.4 / Stage 5).
=====================================================================================
Kiá»ƒm thá»­ toÃ n diá»‡n:
1. Ã�nh xáº¡ vector vÃ  gÃ³c phÆ°Æ¡ng vá»‹ sang 8 hÆ°á»›ng WASD (W, WD, D, SD, S, SA, A, WA) vÃ  deadzone.
2. Kiá»ƒm chá»©ng cháº¿ Ä‘á»™ chiáº¿u Isometric World Projection (math2d.hpp).
3. Kiá»ƒm chá»©ng quy trÃ¬nh tá»± Ä‘á»™ng cáº¯t vÃ¹ng Minimap tá»« áº£nh toÃ n mÃ n hÃ¬nh.
4. Báº¥t biáº¿n Dwell Time (INV-WASD-MIN-DWELL >= 0.30s).
5. TÆ°Æ¡ng thÃ­ch Dynamic Resolution Scaler (1080p, 1440p, Windowed 1189x891 PID 22632, 720p).
6. TÃ­ch há»£p thá»±c táº¿ vá»›i MinimapFogExplorer trÃªn cÃ¡c artifact tháº­t tá»« captures/.
7. Kiá»ƒm thá»­ Ä‘iá»�u phá»‘i phÃ¡t lá»‡nh di chuyá»ƒn tá»›i Character Controller (dispatch_to_controller).

TuÃ¢n thá»§ nghiÃªm ngáº·t:
- Rule 5: Sá»­ dá»¥ng artifact tháº­t tá»« captures/.
- Rule 14: Quality Gate, 100% tests PASS.
é    )ÚannotationsN)ÚImage)ÚMinimapNavigationAdapterÚProjectionModeÚWasdCommandÚWasdDirection)Ú	RES_1080PÚ	RES_1440PÚRES_720PÚRES_WINDOWED_DEFAULTÚ
Resolutionc                  óZ   — e Zd ZdZdd„Zdd„Zdd„Zdd„Zdd„Zdd	„Z	dd
„Z
dd„Zdd„ZdS )ÚTestMinimapNavigationAdapteru1   Test suite kiá»ƒm thá»­ MinimapNavigationAdapter.ÚreturnÚNonec                ó–   — t           j                             t           j                             t          ¦  «        dd¦  «        | _        d S )Nz..Úcaptures)ÚosÚpathÚjoinÚdirnameÚ__file__Úcaptures_dir)Úselfs    ú=C:\Projects\AutoPOE2\tests\test_minimap_navigation_adapter.pyÚsetUpz"TestMinimapNavigationAdapter.setUp+   s0   € ÝœGŸLšL­¬¯ª½Ñ)BÔ)BÀDÈ*ÑUÔUˆÔÐÐó    c                ó"  — ddt           j        dfddt           j        dfddt           j        dfddt           j        dfddt           j        dfddt           j        d	fddt           j        d
fddt           j        dfg}|D ]‘\  }}}}t          j
        ||t          j        ¬¦  «        \  }}}|                      ||d|› d|› d|› d|› d|d›d�¦  «         |                      t          |¦  «        t          |¦  «        d|› d|› d|› d|› �¦  «         Œ’dS )uM   Kiá»ƒm chá»©ng Ã¡nh xáº¡ 8 hÆ°á»›ng WASD trong há»‡ Direct Screen Projection.ç      ð?ç        )ÚD)ÚSr!   )r"   ç      ð¿)r"   ÚA)r$   )ÚWr$   )r%   ©r%   r!   ©Úmodeu   Lá»‡ch hÆ°á»›ng: (z, z	) -> got z, expected z (angle=z.1fú)u   Lá»‡ch tá»• há»£p phÃ­m: (N)r   ÚEASTÚ
SOUTH_EASTÚSOUTHÚ
SOUTH_WESTÚWESTÚ
NORTH_WESTÚNORTHÚ
NORTH_EASTr   Úvector_to_8way_directionr   ÚDIRECT_SCREENÚassertEqualÚset)	r   Útest_vectorsÚdxÚdyÚexp_dirÚexp_keysÚ	directionÚkeysÚangles	            r   Ú6test_8way_direction_mapping_all_cardinal_and_diagonalszSTestMinimapNavigationAdapter.test_8way_direction_mapping_all_cardinal_and_diagonals.   st  € ð �#•}Ô)¨6Ð2Ø�#•}Ô/°Ð<Ø�#•}Ô*¨FÐ3Ø�3�Ô0°*Ð=Ø�3�Ô*¨FÐ3Ø�4�Ô1°:Ð>Ø�$�Ô+¨VÐ4Ø�$�Ô0°*Ð=ð

ˆð *6ð 	ð 	Ñ%ˆB��G˜XÝ%=Ô%VØ�B�^Ô9ð&ñ &ô &Ñ"ˆI�t˜Uð ×ÒØ˜7Øk RÐkÐk¨2ÐkÐk¸	ÐkÐkÈgÐkÐkÐ_dÐkÐkÐkÐkñô ð ð ×ÒÝ�D‘	”	�3˜x™=œ=Ø[¨RÐ[Ð[°2Ð[Ð[ÀÐ[Ð[ÐQYÐ[Ð[ñô ð ð ð	ð 	r   c                óÔ   — t          j        ddd¬¦  «        \  }}}|                      |t          j        ¦  «         |                      |d¦  «         |                      |d¦  «         dS )uZ   Kiá»ƒm chá»©ng vÃ¹ng cháº¿t (Deadzone): Vector quÃ¡ nhá»� khÃ´ng phÃ¡t lá»‡nh di chuyá»ƒn.gü©ñÒMbP?gü©ñÒMb`¿gš™™™™™©?)Údeadzone© r    N)r   r2   r4   r   ÚNONE)r   r;   r<   r=   s       r   Ú%test_deadzone_produces_none_directionzBTestMinimapNavigationAdapter.test_deadzone_produces_none_directionI   st   € å!9Ô!RØ�6 Dð"
ñ "
ô "
Ñˆ	�4˜ð 	×Ò˜¥MÔ$6Ñ7Ô7Ð7Ø×Ò˜˜rÑ"Ô"Ð"Ø×Ò˜ Ñ$Ô$Ð$Ð$Ð$r   c                óò   — t          j        ddt          j        ¬¦  «        \  }}}|                      d|¦  «         t          j        ddt          j        ¬¦  «        \  }}}|                      d|¦  «         dS )uT   Kiá»ƒm chá»©ng há»‡ chiáº¿u Isometric World Projection theo cÃ´ng thá»©c math2d.hpp.r   r'   r%   r#   r"   N)r   r2   r   ÚISOMETRIC_WORLDÚassertIn)r   r;   r<   Ú_s       r   Ú'test_isometric_world_projection_mappingzDTestMinimapNavigationAdapter.test_isometric_world_projection_mappingR   sˆ   € õ 6ÔNØ��>Ô9ð
ñ 
ô 
Ñˆ	�4˜ð 	�Š�c˜4Ñ Ô Ð õ 6ÔNØ�$�^Ô;ð
ñ 
ô 
Ñˆ	�4˜ð 	�Š�c˜4Ñ Ô Ð Ð Ð r   c                óD  — t          d¬¦  «        }|                      |j        dd¦  «         t          j        ddt          j        ¬¦  «        }d|d	d	…d
d	…f<   |                     |¦  «        }|j        t          j	        k    r|                      |j
        d¦  «         d	S d	S )uJ   Kiá»ƒm chá»©ng báº¥t biáº¿n INV-WASD-MIN-DWELL: Dwell time luÃ´n >= 0.30s.g333333Ã?)Údefault_dwell_secç333333Ó?u[   Adapter pháº£i tá»± Ä‘á»™ng clamp dwell time tá»‘i thiá»ƒu >= 0.30s theo INV-WASD-MIN-DWELL)éd   rL   é2   )Údtyper   NéP   )r   ÚassertGreaterEqualrJ   ÚnpÚfullÚuint8Úcompute_navigation_stepr;   r   rB   Ú	dwell_sec)r   ÚadapterÚfake_minimapÚcmds       r   Ú#test_dwell_time_invariant_min_300msz@TestMinimapNavigationAdapter.test_dwell_time_invariant_min_300msa   s®   € å*¸TÐBÑBÔBˆØ×ÒØÔ% tØiñ	
ô 	
ð 	
õ
 ”w˜z¨2µR´XÐ>Ñ>Ô>ˆØ ˆ�Q�Q�Q˜˜˜�VÑØ×-Ò-¨lÑ;Ô;ˆàŒ=�MÔ.Ò.Ð.Ø×#Ò# C¤M°4Ñ8Ô8Ð8Ð8Ð8ð /Ð.r   c                ó   — t           t          t          t          g}|D ]à}t	          |¬¦  «        }t          j        d|j        |j        fd¬¦  «        }| 	                    |¦  «        }|  
                    |t
          j        ¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                      |j        |j        ¦  «         |                      |j        |j        ¦  «         ŒádS )uu   Kiá»ƒm chá»©ng tá»± Ä‘á»™ng cáº¯t vÃ¹ng Minimap trÃªn cÃ¡c Ä‘á»™ phÃ¢n giáº£i: 1080p, 1440p, Windowed 1189x891, 720p.)Útarget_resolutionÚRGB)é   r]   r]   )ÚcolorrM   N)r	   r
   r   r   r   r   ÚnewÚwidthÚheightÚextract_minimap_cropÚassertIsInstanceÚassertGreaterÚ
assertLess)r   ÚresolutionsÚresrV   Ú
fullscreenÚcrops         r   Ú,test_dynamic_resolution_scaling_minimap_cropzITestMinimapNavigationAdapter.test_dynamic_resolution_scaling_minimap_cropp   sï   € õ ÝÝ Ýð	
ˆð ð 
	5ð 
	5ˆCÝ.ÀÐEÑEÔEˆGåœ 5¨3¬9°c´jÐ*AÈÐVÑVÔVˆJØ×/Ò/°
Ñ;Ô;ˆDà×!Ò! $­¬Ñ4Ô4Ð4Ø×Ò˜tœz¨2Ñ.Ô.Ð.Ø×Ò˜tœ{¨BÑ/Ô/Ð/Ø�OŠO˜DœJ¨¬	Ñ2Ô2Ð2Ø�OŠO˜DœK¨¬Ñ4Ô4Ð4Ð4ð
	5ð 
	5r   c                ó„  — t           j                             | j        d¦  «        }t           j                             |¦  «        s|                      d|› �¦  «         t          j        |¦  «        }t          t          d¬¦  «        }| 
                    |¦  «        }|                      |t          ¦  «         |                      |j        t          ¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |j        s¬|                      |j        t          j        ¦  «         |                      t-          |j        ¦  «        d¦  «         |                      |j        d¦  «         |                      |j        d         d¦  «         |                      |j        d	         d¦  «         d
S d
S )uZ   Kiá»ƒm chá»©ng trá»�n gÃ³i quy trÃ¬nh sinh lá»‡nh WASD tá»« artifact tháº­t minimap_1.png.zminimap_1.pngu   KhÃ´ng tÃ¬m tháº¥y capture: çffffffÖ?)r[   rJ   r    r   r   rK   é   N)r   r   r   r   ÚexistsÚskipTestr   Úopenr   r   rT   rc   r   r;   r   rP   Úcoverage_ratioÚassertLessEqualÚis_fully_exploredÚassertNotEqualrB   rd   Úlenr<   rU   Úscreen_target)r   Úimg_pathÚimgrV   rX   s        r   Ú/test_end_to_end_navigation_step_on_real_capturezLTestMinimapNavigationAdapter.test_end_to_end_navigation_step_on_real_capture…   s”  € å”7—<’< Ô 1°?ÑCÔCˆÝŒw�~Š~˜hÑ'Ô'ð 	EØ�MŠMÐC¸ÐCÐCÑDÔDÐDåŒj˜Ñ"Ô"ˆÝ*Ý2Ø"ð
ñ 
ô 
ˆð ×-Ò-¨cÑ2Ô2ˆà×Ò˜c¥;Ñ/Ô/Ð/Ø×Ò˜cœm­]Ñ;Ô;Ð;Ø×Ò Ô 2°CÑ8Ô8Ð8Ø×Ò˜SÔ/°Ñ5Ô5Ð5ð Ô$ð 	8Ø×Ò ¤­}Ô/AÑBÔBÐBØ×Ò�s 3¤8™}œ}¨aÑ0Ô0Ð0Ø×#Ò# C¤M°4Ñ8Ô8Ð8Ø×Ò˜sÔ0°Ô3°QÑ7Ô7Ð7Ø×Ò˜sÔ0°Ô3°QÑ7Ô7Ð7Ð7Ð7ð	8ð 	8r   c                óÈ  ‡— t          ¦   «         }g Šdˆfd„}t          t          j        dd	d
ddddd¬¦	  «	        }|                     ||¬¦  «        }|                      |¦  «         |                      t          ‰¦  «        d¦  «         |                      ‰d         d         dd¬¦  «         |                      ‰d         d         dd¬¦  «         |                      ‰d         d         d¦  «         t          t          j	        dddddddd¬¦	  «	        }|  
                    |                     ||¬¦  «        ¦  «         |                      t          ‰¦  «        d¦  «         dS ) uH   Kiá»ƒm chá»©ng cÆ¡ cháº¿ dispatch lá»‡nh WASD sang Character Controller.ÚvxÚfloatÚvyÚdwellr   r   c                ó8   •— ‰                      | ||f¦  «         d S )N)Úappend)r{   r}   r~   Údispatched_payloads      €r   Úmock_wasd_senderz[TestMinimapNavigationAdapter.test_dispatch_to_controller_callback.<locals>.mock_wasd_sender¦   s#   ø€ Ø×%Ò% r¨2¨u oÑ6Ô6Ð6Ð6Ð6r   r&   )ç9´Èv¾Ÿæ?ç9´Èv¾Ÿæ¿g     °s@rl   )i@  rL   )i,  rM   g      à?F)	r;   r<   ÚvectorÚ	angle_degrU   rv   Úminimap_targetrq   rs   )Úsender_funcrm   r   rƒ   é   )Úplacesr„   rA   )r    r    r    )r   r   g\�Âõ(\ï?TN)r{   r|   r}   r|   r~   r|   r   r   )r   r   r   r1   Údispatch_to_controllerÚ
assertTruer4   ru   ÚassertAlmostEqualrB   ÚassertFalse)r   rV   r‚   Ú	valid_cmdÚsuccessÚnone_cmdr�   s         @r   Ú$test_dispatch_to_controller_callbackzATestMinimapNavigationAdapter.test_dispatch_to_controller_callback¡   s¢  ø€ å*Ñ,Ô,ˆØÐð	7ð 	7ð 	7ð 	7ð 	7ð 	7õ  Ý#Ô.ØØ"ØØØ%Ø$ØØ#ð

ñ 

ô 

ˆ	ð ×0Ò0°ÐHXÐ0ÑYÔYˆØ�Š˜Ñ Ô Ð Ø×Ò�Ð/Ñ0Ô0°!Ñ4Ô4Ð4Ø×ÒÐ1°!Ô4°QÔ7¸ÀqÐÑIÔIÐIØ×ÒÐ1°!Ô4°QÔ7¸ÈÐÑJÔJÐJØ×ÒÐ+¨AÔ.¨qÔ1°4Ñ8Ô8Ð8õ Ý#Ô(ØØØØØ Ø!ØØ"ð

ñ 

ô 

ˆð 	×Ò˜×7Ò7¸ÐN^Ð7Ñ_Ô_Ñ`Ô`Ð`Ø×Ò�Ð/Ñ0Ô0°!Ñ4Ô4Ð4Ð4Ð4r   c                óÈ  — t          ¦   «         }|                     d¦  «        }|                      |d         d¦  «         |                      |d         d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                     d¦  «        }|                      |d         d¦  «         |                      |d         d	¦  «         |                      |j        d	¦  «         |                     d
¦  «        }|                      |d         d¦  «         |                      |d         d¦  «         |                      |j        d¦  «         dS )u^   Kiá»ƒm chá»©ng Ä‘á»“ng bá»™ Ä‘áº·c tÃ­nh layout T15 cho Monk CI vÃ o MinimapNavigationAdapter.zDeserted MapÚlayout_typeÚ	WIDE_OPENrU   gÍÌÌÌÌÌÜ?gq=
×£pí?zFortress MapÚSEMI_OPEN_CORRIDORrl   z	Creek MapÚWETLAND_MEANDERgR¸…ëQØ?N)r   Úapply_map_layout_intelligencer4   rJ   Útarget_coverage)r   rV   Úres_desÚres_fortÚres_crks        r   Ú"test_apply_map_layout_intelligencez?TestMinimapNavigationAdapter.test_apply_map_layout_intelligenceË   sZ  € å*Ñ,Ô,ˆð ×7Ò7¸ÑGÔGˆØ×Ò˜ Ô/°Ñ=Ô=Ð=Ø×Ò˜ Ô-¨tÑ4Ô4Ð4Ø×Ò˜Ô2°DÑ9Ô9Ð9Ø×Ò˜Ô0°$Ñ7Ô7Ð7ð ×8Ò8¸ÑHÔHˆØ×Ò˜ -Ô0Ð2FÑGÔGÐGØ×Ò˜ +Ô.°Ñ5Ô5Ð5Ø×Ò˜Ô2°DÑ9Ô9Ð9ð ×7Ò7¸ÑDÔDˆØ×Ò˜ Ô/Ð1BÑCÔCÐCØ×Ò˜ Ô-¨tÑ4Ô4Ð4Ø×Ò˜Ô2°DÑ9Ô9Ð9Ð9Ð9r   N)r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r>   rC   rH   rY   rj   ry   r’   r�   rA   r   r   r   r   (   sÓ   € € € € € Ø;Ð;ðVð Vð Vð Vðð ð ð ð6%ð %ð %ð %ð!ð !ð !ð !ð9ð 9ð 9ð 9ð5ð 5ð 5ð 5ð*8ð 8ð 8ð 8ð8(5ð (5ð (5ð (5ðT:ð :ð :ð :ð :ð :r   r   Ú__main__)r¡   Ú
__future__r   ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arÚmathr   ÚunittestÚnumpyrQ   ÚPILr   Ú8src.assistant_tool.navigation.minimap_navigation_adapterr   r   r   r   Úsrc.common.coordinate_transformr	   r
   r   r   r   ÚTestCaser   rž   ÚmainrA   r   r   ú<module>r²      sT  ððð ð  #Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € €€€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ðx:ð x:ð x:ð x:ð x: 8Ô#4ñ x:ô x:ð x:ðv ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   