§
    i6¬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 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 Camera Calibrator (Doc 69 Â§3.4 / Stage 5).
=====================================================================================
Kiá»ƒm thá»­ toÃ n diá»‡n:
1. Báº¥t biáº¿n toÃ¡n há»�c ma tráº­n xoay 2D (Orthogonality, Inversion, Determinant = 1.0).
2. Kiá»ƒm chá»©ng bÃ¹ trá»« gÃ³c xoay vector (Rotation compensation) trÃªn cÃ¡c gÃ³c (0, 45, 90, 180, -45 Ä‘á»™).
3. Nháº­n diá»‡n Zoom level tá»« chuá»—i kÃ½ tá»± OCR banner trÃªn HUD client thá»±c táº¿.
4. Æ¯á»›c lÆ°á»£ng gÃ³c xoay báº£n Ä‘á»“ Isometric tá»« phá»• gradient cáº¡nh Sobel.
5. Báº¥t biáº¿n Dwell Time Scaling (INV-WASD-MIN-DWELL >= 0.30s) trÃªn dáº£i zoom rá»™ng (0.2x .. 32.0x).
6. TÆ°Æ¡ng thÃ­ch Dynamic Resolution Scaler (1080p, 1440p, Windowed 1189x891 PID 22632, 720p).
7. TÃ­ch há»£p liá»�n máº¡ch vá»›i MinimapNavigationAdapter tá»± Ä‘á»™ng bÃ¹ trá»« hÆ°á»›ng phÃ­m WASD.
8. Kiá»ƒm thá»­ trÃªn cÃ¡c artifact áº£nh tháº­t tá»« captures/ (test_after_minimap_zoom.png, test_minimap_scale_05.png).

TuÃ¢n thá»§ nghiÃªm ngáº·t:
- Rule 5: Sá»­ dá»¥ng artifact tháº­t tá»« captures/.
- Rule 14: Quality Gate, 100% tests PASS.
- Báº¥t biáº¿n: INV-WASD-MIN-DWELL, INV-SCALE-IDEMPOTENT-1PX, INV-NAV-FRONTIER-MOMENTUM.
é    )ÚannotationsN)ÚImage)ÚCameraMinimapProfileÚMinimapCameraCalibrator)Ú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 )ÚTestMinimapCameraCalibratoru0   Test suite kiá»ƒm thá»­ MinimapCameraCalibrator.Ú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_camera_calibrator.pyÚsetUpz!TestMinimapCameraCalibrator.setUp1   s0   € ÝœGŸLšL­¬¯ª½Ñ)BÔ)BÀDÈ*ÑUÔUˆÔÐÐó    c           	     óè  — dD ]î}t          d|¬¦  «        }|j        }|j        }t          j                             |¦  «        }|                      |ddd|› d�¬¦  «         t          j        d¦  «        }t          j        ||j	        ¦  «        }t          j
                             ||d	d
|› d�¬¦  «         t          j        ||¦  «        }t          j
                             ||d	d|› d�¬¦  «         ŒïdS )ug   Kiá»ƒm chá»©ng báº¥t biáº¿n toÃ¡n há»�c cá»§a ma tráº­n xoay: Det=1, R^T * R = I, R(theta)*R(-theta)=I.)ç        ç      >@g     €F@ç     €V@g     à`@ç     €f@g     àp@g     €FÀç      ð?©Ú	base_zoomÚbase_orientation_degé   zDet != 1.0 at z deg)ÚplacesÚmsgé   g�íµ ÷Æ°>zR*R^T != I at )ÚatolÚerr_msgzR*InvR != I at N)r   Ú_rot_matrixÚ_inv_rot_matrixÚnpÚlinalgÚdetÚassertAlmostEqualÚeyeÚdotÚTÚtestingÚassert_allclose)	r   ÚangleÚ
calibratorÚrotÚinv_rotr3   ÚidentityÚprodÚinv_prods	            r   Ú0test_rotation_matrix_orthogonality_and_inversionzLTestMinimapCameraCalibrator.test_rotation_matrix_orthogonality_and_inversion4   s  € àHð 	mð 	mˆEÝ0¸3ÐUZÐ[Ñ[Ô[ˆJØÔ(ˆCØ Ô0ˆGõ ”)—-’- Ñ$Ô$ˆCØ×"Ò" 3¨°AÐ;WÈEÐ;WÐ;WÐ;WÐ"ÑXÔXÐXõ ”v˜a‘y”yˆHÝ”6˜#˜sœuÑ%Ô%ˆDÝŒJ×&Ò& t¨X¸DÐJfÐ[`ÐJfÐJfÐJfÐ&ÑgÔgÐgõ ”v˜c 7Ñ+Ô+ˆHÝŒJ×&Ò& x°ÀÐNkÐ`eÐNkÐNkÐNkÐ&ÑlÔlÐlÐlð!	mð 	mr   c                ó„  — t          dd¬¦  «        }|                     dd¦  «        \  }}|                      |dd¬¦  «         |                      |dd¬¦  «         t          dd¬¦  «        }|                     dd¦  «        \  }}|                      |dd¬¦  «         |                      |dd¬¦  «         t          dd¬¦  «        }|                     dd¦  «        \  }}	|                      |dd¬¦  «         |                      |	dd¬¦  «         |                     dd¦  «        \  }
}|                      |
|fd	¦  «         d
S )ud   Kiá»ƒm chá»©ng bÃ¹ trá»« gÃ³c xoay: Vector mÃ n hÃ¬nh Ä‘Æ°á»£c xoay ngÆ°á»£c má»™t gÃ³c orientation.r%   r!   r&   é   ©r*   r#   g      ð¿r$   )r!   r!   N)r   Útransform_vectorr4   ÚassertEqual)r   Úcalibrator_0ÚvxÚvyÚcalibrator_90Úvx90Úvy90Úcalibrator_180Úvx180Úvy180Úvx_zeroÚvy_zeros               r   Ú7test_vector_transformation_and_orientation_compensationzSTestMinimapCameraCalibrator.test_vector_transformation_and_orientation_compensationH   sk  € õ /¸ÐSVÐWÑWÔWˆØ×.Ò.¨s°CÑ8Ô8‰ˆˆBØ×Ò˜r 3¨qÐÑ1Ô1Ð1Ø×Ò˜r 3¨qÐÑ1Ô1Ð1õ
 0¸#ÐTXÐYÑYÔYˆØ"×3Ò3°C¸Ñ=Ô=‰
ˆˆdØ×Ò˜t S°ÐÑ3Ô3Ð3Ø×Ò˜t T°!ÐÑ4Ô4Ð4õ 1¸3ÐUZÐ[Ñ[Ô[ˆØ%×6Ò6°s¸CÑ@Ô@‰ˆˆuØ×Ò˜u d°1ÐÑ5Ô5Ð5Ø×Ò˜u c°!ÐÑ4Ô4Ð4ð )×9Ò9¸#¸sÑCÔCÑˆ�Ø×Ò˜' 7Ð+¨ZÑ8Ô8Ð8Ð8Ð8r   c                ó  — t          ¦   «         }g d¢}|D ]k\  }}|                     |¦  «        }|€|                      |d|› d|› �¦  «         Œ9|                      |d|› d�¦  «         |                      ||d¬¦  «         ŒldS )	uQ   Kiá»ƒm chá»©ng trÃ­ch xuáº¥t zoom level tá»« cÃ¡c chuá»—i banner OCR thá»±c táº¿.))z&Visual Tool | Zoom 1.0x/8.0x | Fog OFFr%   )z[ZOOM] Delta +0.3x Zoom 8.0xç       @)zCamera Zoom 1.4X activegffffffö?)zMinimap Zoom x2.5 Enabledg      @)zMinimap Zoom InN)zNo zoom banner hereN)Ú NNu   Ká»³ vá»�ng None cho 'u   ' nhÆ°ng nháº­n u   KhÃ´ng tÃ¬m tháº¥y zoom trong 'ú'r,   rD   )r   Údetect_zoom_from_banner_textÚassertIsNoneÚassertIsNotNoner4   )r   r;   Ú
test_casesÚ
text_inputÚexpected_zoomÚdetecteds         r   Ú!test_detect_zoom_from_banner_textz=TestMinimapCameraCalibrator.test_detect_zoom_from_banner_textb   sÇ   € å,Ñ.Ô.ˆ
ð
ð 
ð 
ˆ
ð *4ð 	Jð 	JÑ%ˆJ˜Ø!×>Ò>¸zÑJÔJˆHØÐ$Ø×!Ò! (Ð,kÀZÐ,kÐ,kÐaiÐ,kÐ,kÑlÔlÐlÐlà×$Ò$ XÐ/^ÐQ[Ð/^Ð/^Ð/^Ñ_Ô_Ð_Ø×&Ò& x°ÀqÐ&ÑIÔIÐIÐIð	Jð 	Jr   c           
     óÖ  — d}t          ¦   «         }|                     d¬¦  «         |                     |¦  «        }|                      ||d¬¦  «         |                      |d¦  «         |                     d¬¦  «         |                     |¦  «        }|                      |dd¬¦  «         |                      |dd¦  «         d	D ]K}|                     |¬¦  «         |                     |¦  «        }|                      |dd
|› d|› d�¦  «         ŒL|                     d¬¦  «         |                     |¦  «        }|                      ||¦  «         |                      |d¦  «         dS )uO   Kiá»ƒm chá»©ng báº¥t biáº¿n INV-WASD-MIN-DWELL >= 0.30s trÃªn má»�i má»©c zoom.gš™™™™™Ù?r%   )Ú
zoom_levelé   rD   ç333333Ó?ç      @u*   Vi pháº¡m báº¥t biáº¿n INV-WASD-MIN-DWELL!)rT   g      0@g      @@zZoom u    x vi pháº¡m INV-WASD-MIN-DWELL: Úsç      à?ç      ø?N)r   Úset_calibrationÚadjust_dwell_timer4   ÚassertGreaterEqualÚassertGreaterÚassertLessEqual)r   Ú
base_dwellr;   Úd_10Úd_40ÚzoomÚd_highÚd_05s           r   Ú/test_dwell_time_scaling_and_min_dwell_invariantzKTestMinimapCameraCalibrator.test_dwell_time_scaling_and_min_dwell_invarianty   sš  € àˆ
å,Ñ.Ô.ˆ
ð 	×"Ò"¨cÐ"Ñ2Ô2Ð2Ø×+Ò+¨JÑ7Ô7ˆØ×Ò˜t Z¸ÐÑ:Ô:Ð:Ø×Ò  dÑ+Ô+Ð+ð 	×"Ò"¨cÐ"Ñ2Ô2Ð2Ø×+Ò+¨JÑ7Ô7ˆØ×Ò˜t T°!ÐÑ4Ô4Ð4Ø×Ò  dÐ,XÑYÔYÐYð &ð 	kð 	kˆDØ×&Ò&°$Ð&Ñ7Ô7Ð7Ø×1Ò1°*Ñ=Ô=ˆFØ×#Ò# F¨DÐ2i¸$Ð2iÐ2iÐ`fÐ2iÐ2iÐ2iÑjÔjÐjÐjð 	×"Ò"¨cÐ"Ñ2Ô2Ð2Ø×+Ò+¨JÑ7Ô7ˆØ×Ò˜4 Ñ,Ô,Ð,Ø×Ò˜T 4Ñ(Ô(Ð(Ð(Ð(r   c                óÖ  — t          ¦   «         }t          j        dt          j        ¬¦  «        }t	          dd¦  «        D ]!}d|||f<   d|t          d|dz   ¦  «        |f<   Œ"|                     |¦  «        }|                      t          |¦  «        d	¦  «         t          j        dt          j        ¬¦  «        }|                     |¦  «        }|  	                    ||j
        ¦  «         d
S )u_   Kiá»ƒm chá»©ng thuáº­t toÃ¡n Æ°á»›c lÆ°á»£ng gÃ³c nghiÃªng tá»« cáº¡nh báº£n Ä‘á»“ giáº£ láº­p.)éd   rt   ©Údtypeé
   éZ   éÿ   éÈ   éc   é   g      .@N)r   r1   ÚzerosÚuint8ÚrangeÚminÚ'estimate_orientation_from_minimap_edgesÚ
assertLessÚabsr4   Úorientation_deg)r   r;   Úsynthetic_imgÚiÚdelta_angleÚ	blank_imgÚdelta_blanks          r   Ú.test_estimate_orientation_from_edges_syntheticzJTestMinimapCameraCalibrator.test_estimate_orientation_from_edges_synthetic—   sá   € å,Ñ.Ô.ˆ
õ œ µ2´8Ð<Ñ<Ô<ˆÝ�r˜2‘”ð 	3ð 	3ˆAØ"%ˆM˜!˜Q˜$ÑØ/2ˆM�#˜b ! a¡%™.œ.¨!Ð+Ñ,Ð,à ×HÒHÈÑWÔWˆà�Š�˜KÑ(Ô(¨$Ñ/Ô/Ð/õ ”H˜Z­r¬xÐ8Ñ8Ô8ˆ	Ø ×HÒHÈÑSÔSˆØ×Ò˜{¨JÔ,FÑGÔGÐGÐGÐGr   c                óh  — t           t          t          t          g}|D ]”}t	          dd|¬¦  «        }|                     ¦   «         }|                      |j        d¦  «         |                      |j        d¦  «         |  	                    |j
        d¦  «         |  	                    |j        d¦  «         Œ•dS )uJ   Kiá»ƒm chá»©ng kháº£ nÄƒng tÆ°Æ¡ng thÃ­ch vá»›i Dynamic Resolution Scaler.rf   r"   )r'   r(   Útarget_resolutionr!   N)r   r   r   r   r   Úget_profiler4   r`   r„   rj   Úscale_factor_xÚscale_factor_y)r   ÚresolutionsÚresr;   Úprofiles        r   Ú,test_resolution_scaler_integration_all_modeszHTestMinimapCameraCalibrator.test_resolution_scaler_integration_all_modesª   sÉ   € õ ÝÝ Ýð	
ˆð ð 
	<ð 
	<ˆCÝ0ØØ%)Ø"%ðñ ô ˆJð
 !×,Ò,Ñ.Ô.ˆGØ×"Ò" 7Ô#5°sÑ;Ô;Ð;Ø×"Ò" 7Ô#:¸DÑAÔAÐAØ×Ò˜wÔ5°sÑ;Ô;Ð;Ø×Ò˜wÔ5°sÑ;Ô;Ð;Ð;ð
	<ð 
	<r   c                óø  — t          dd¬¦  «        }t          t          |d¬¦  «        }|                     d¦  «        }|                      |¦  «         |                      |j        j        d¦  «         |                     dd¬	¦  «         |                      |j        j        d¦  «         |                      |j        j	        d¦  «         t          j        d
t          j        ¬¦  «        }d|dd…dd…dd…f<   |                     |¦  «        }|                      |t          ¦  «         |j        t"          j        k    r=|                      |j        d¦  «         |                      |j        t"          ¦  «         dS dS )uR   Kiá»ƒm chá»©ng tÃ­ch há»£p calibrator trá»±c tiáº¿p vÃ o MinimapNavigationAdapter.g       @r#   r&   re   ©rŒ   r;   Údefault_dwell_seczCamera Zoom 4.0x Onlinerc   r%   )r`   r„   )éx   r—   ra   ru   é(   Né<   rb   )r   r   r   Úauto_calibrate_from_hudÚ
assertTruer4   r;   r`   Úset_camera_calibrationr„   r1   r}   r~   Úcompute_navigation_stepÚassertIsInstancer	   Ú	directionr
   ÚNONEri   Ú	dwell_sec)r   r;   ÚadapterÚsuccessÚdummy_minimapÚcmds         r   Ú(test_adapter_integration_with_calibratorzDTestMinimapCameraCalibrator.test_adapter_integration_with_calibrator¿   st  € å,°sÐQUÐVÑVÔVˆ
Ý*Ý'Ø!Ø"ð
ñ 
ô 
ˆð ×1Ò1Ð2KÑLÔLˆØ�Š˜Ñ Ô Ð Ø×Ò˜wÔ1Ô<¸cÑBÔBÐBð 	×&Ò&°#ÀtÐ&ÑLÔLÐLØ×Ò˜wÔ1Ô<¸cÑBÔBÐBØ×Ò˜wÔ1ÔAÀ4ÑHÔHÐHõ œ µb´hÐ?Ñ?Ô?ˆà#%ˆ�a�a�a˜˜˜˜a˜a˜a�iÑ à"×:Ò:¸=ÑIÔIˆØ×Ò˜c¥;Ñ/Ô/Ð/ØŒ=�MÔ.Ò.Ð.à×#Ò# C¤M°4Ñ8Ô8Ð8Ø×!Ò! #¤-µÑ?Ô?Ð?Ð?Ð?ð /Ð.r   c                ó  — g d¢}t          t          t          dd¬¦  «        d¬¦  «        }d}|D ]À}t          j                             | j        |¦  «        }t          j                             |¦  «        sŒGt          j	        |¦  «        }| 
                    |¦  «        }|                      |t          ¦  «         |j        t          j        k    r|                      |j        d¦  «         |d	z  }ŒÁ|                      |dd
¦  «         dS )uF   Kiá»ƒm thá»­ end-to-end vá»›i cÃ¡c file capture tháº­t tá»« captures/.)ztest_after_minimap_zoom.pngztest_minimap_scale_05.pngzminimap_zoom.pngr%   r!   r&   gffffffÖ?r•   r   rb   r|   u=   KhÃ´ng tÃ¬m tháº¥y áº£nh capture tháº­t nÃ o trong captures/!N)r   r   r   r   r   r   r   Úexistsr   Úopenr�   rž   r	   rŸ   r
   r    ri   r¡   rj   )r   Ú
real_filesr¢   Útested_countÚfnameÚfpathÚimgr¥   s           r   Útest_real_capture_artifactsz7TestMinimapCameraCalibrator.test_real_capture_artifactsß   s  € ð
ð 
ð 
ˆ
õ +Ý2Ý.¸ÐSVÐWÑWÔWØ"ð
ñ 
ô 
ˆð ˆØð 	ð 	ˆEÝ”G—L’L Ô!2°EÑ:Ô:ˆEÝ”7—>’> %Ñ(Ô(ð Øå”*˜UÑ#Ô#ˆCØ×1Ò1°#Ñ6Ô6ˆCà×!Ò! #¥{Ñ3Ô3Ð3ØŒ}¥Ô 2Ò2Ð2Ø×'Ò'¨¬°tÑ<Ô<Ð<Ø˜AÑˆLˆLà×Ò˜<¨Ð,kÑlÔlÐlÐlÐlr   N)r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rA   rR   r^   rr   rŠ   r“   r¦   r¯   © r   r   r   r   .   sé   € € € € € Ø:Ð:ðVð Vð Vð Vðmð mð mð mð(9ð 9ð 9ð 9ð4Jð Jð Jð Jð.)ð )ð )ð )ð<Hð Hð Hð Hð&<ð <ð <ð <ð*@ð @ð @ð @ð@mð mð mð mð mð mr   r   Ú__main__)"r³   Ú
__future__r   ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arÚmathr   ÚunittestÚnumpyr1   ÚPILr   Ú7src.assistant_tool.navigation.minimap_camera_calibratorr   r   Ú8src.assistant_tool.navigation.minimap_navigation_adapterr   r   r	   r
   Úsrc.common.coordinate_transformr   r   r   r   r   ÚTestCaser   r°   Úmainr´   r   r   ú<module>rÆ      s„  ððð ð$ #Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € €€€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ðMmð Mmð Mmð Mmð Mm (Ô"3ñ Mmô Mmð Mmð` ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   