§
    Y®jl  ã                  óæ   — 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 n# e$ r dZY nw xY wddl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 - Unit Tests for BossArenaDetector (Doc 69 Â§3.5).
============================================================
Kiá»ƒm thá»­ toÃ n diá»‡n:
1. Khá»Ÿi táº¡o vÃ  xá»­ lÃ½ an toÃ n khung hÃ¬nh rá»—ng / dá»‹ thÆ°á»�ng.
2. Nháº­n diá»‡n cá»•ng sÆ°Æ¡ng mÃ¹ Ä‘áº¥u trÆ°á»�ng Boss (Fog Door / Arena Gate) vÃ  Ä‘á»� xuáº¥t PRE_BUFF.
3. Nháº­n diá»‡n thanh mÃ¡u Boss khi Ä‘ang combat trá»±c tiáº¿p (ENGAGE_BOSS).
4. Nháº­n diá»‡n thanh mÃ¡u Boss á»Ÿ tráº¡ng thÃ¡i chuyá»ƒn pha / khiÃªn báº¥t tá»­ (PHASE_KITE).
5. KhÃ¡ng nháº­n diá»‡n sai (Zero False Positives) trÃªn cáº£nh chÆ¡i bÃ¬nh thÆ°á»�ng / artifact tháº­t.
6. Benchmark hiá»‡u nÄƒng thá»�i gian thá»±c: Tá»‘c Ä‘á»™ xá»­ lÃ½ < 5.0 ms.

TuÃ¢n thá»§ nghiÃªm ngáº·t:
- Rule 4: Module hÃ³a Ä‘á»™c láº­p.
- Rule 5: Empirical DoD.
é    )ÚannotationsN)ÚImage)ÚArenaGateDetectionÚBossArenaDetectorÚBossArenaStateÚBossHealthBarDetectionc                  óJ   — 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S )ÚTestBossArenaDetectoruX   Test suite kiá»ƒm thá»­ bá»™ nháº­n diá»‡n cá»•ng sÆ°Æ¡ng mÃ¹ vÃ  Ä‘áº¥u trÆ°á»�ng Boss.ÚreturnÚNonec                óÀ   — t          d¬¦  «        | _        t          j                             t          j                             t          ¦  «        dd¦  «        | _        d S )N)é 
  é   )Úref_resolutionz..Úcaptures)r   ÚdetectorÚosÚpathÚjoinÚdirnameÚ__file__Úcaptures_dir)Úselfs    ú6C:\Projects\AutoPOE2\tests\test_boss_arena_detector.pyÚsetUpzTestBossArenaDetector.setUp'   sB   € Ý)¸ÐFÑFÔFˆŒÝœGŸLšL­¬¯ª½Ñ)BÔ)BÀDÈ*ÑUÔUˆÔÐÐó    c                ó´  — | j                              d¦  «        }|                      |j        ¦  «         |                      |j        ¦  «         |                      |j        d¦  «         t          j        dt          j	        ¬¦  «        }| j                              |¦  «        }|                      |j        ¦  «         |                      |j        ¦  «         dS )u]   Kiá»ƒm chá»©ng tÃ­nh an toÃ n vá»›i Ä‘áº§u vÃ o None hoáº·c kÃ­ch thÆ°á»›c khÃ´ng há»£p lá»‡.NÚNORMAL_CLEAR)é
   r   é   ©Údtype)
r   Úprocess_frameÚassertFalseÚgate_detectedÚboss_bar_activeÚassertEqualÚrecommended_actionÚnpÚzerosÚuint8)r   ÚstateÚtinyÚ
state_tinys       r   Ú#test_empty_and_invalid_frame_safetyz9TestBossArenaDetector.test_empty_and_invalid_frame_safety+   s½   € à”×+Ò+¨DÑ1Ô1ˆØ×Ò˜Ô,Ñ-Ô-Ð-Ø×Ò˜Ô.Ñ/Ô/Ð/Ø×Ò˜Ô1°>ÑBÔBÐBåŒx˜­2¬8Ð4Ñ4Ô4ˆØ”]×0Ò0°Ñ6Ô6ˆ
Ø×Ò˜Ô1Ñ2Ô2Ð2Ø×Ò˜Ô3Ñ4Ô4Ð4Ð4Ð4r   c                ó8  — t          j        ddt           j        ¬¦  «        }t          j        dg d¢t           j        ¬¦  «        }t           j                             dddt           j        ¬¦  «        }t          j        |                     t           j        ¦  «        |z   dd	¦  «                             t           j        ¦  «        }||d
d…dd…f<   g d¢|dd…dd…f<   g d¢|dd…dd…f<   | j         	                    |¦  «        }|  
                    |j        d¦  «         |                      |j        j        d¦  «         |                      |j        j        d¦  «         |                      |j        j        ¦  «         |                      |j        dd¦  «         dS )uX   Kiá»ƒm chá»©ng nháº­n diá»‡n cá»•ng sÆ°Æ¡ng mÃ¹ vÃ  kÃ­ch hoáº¡t tráº¡ng thÃ¡i PRE_BUFF.©i8  i€  r    é   r!   )éF   é  r    ©é‡   éŒ   éŽ   éûÿÿÿé   r   éÿ   i¤  iê  i¼  iÄ  )é   é   r   i�  r4   iž  iâ  u0   Pháº£i nháº­n diá»‡n Ä‘Æ°á»£c cá»•ng sÆ°Æ¡ng mÃ¹Úfog_doorgÍÌÌÌÌÌÜ?ÚPRE_BUFFu,   TrÆ°á»›c cá»•ng pháº£i Ä‘á»� xuáº¥t PRE_BUFFN)r)   Úfullr+   ÚrandomÚrandintÚint16ÚclipÚastyper   r#   Ú
assertTruer%   r'   Ú	gate_infoÚ	gate_typeÚassertGreaterEqualÚ
confidenceÚassertIsNotNoneÚgate_screen_posr(   )r   ÚframeÚ	fog_patchÚnoiser,   s        r   Ú*test_fog_gate_detection_and_prebuff_actionz@TestBossArenaDetector.test_fog_gate_detection_and_prebuff_action7   s  € õ ”˜¨µ2´8Ð<Ñ<Ô<ˆõ ”G˜L¨/¨/¨/ÅÄÐJÑJÔJˆ	å”	×!Ò! " a¨½R¼XÐ!ÑFÔFˆÝ”G˜I×,Ò,­R¬XÑ6Ô6¸Ñ>ÀÀ3ÑGÔG×NÒNÍrÌxÑXÔXˆ	à#,ˆˆc�#ˆg�s˜4�xÐÑ ð #/ , ,ˆˆc�#ˆg�s˜3�wÐÑØ$0 L Lˆˆc�#ˆg�t˜D�yÐ Ñ!à”×+Ò+¨EÑ2Ô2ˆà�Š˜Ô+Ð-_Ñ`Ô`Ð`Ø×Ò˜œÔ2°JÑ?Ô?Ð?Ø×Ò ¤Ô :¸DÑAÔAÐAØ×Ò˜Uœ_Ô<Ñ=Ô=Ð=Ø×Ò˜Ô1°:Ð?mÑnÔnÐnÐnÐnr   c                ó:  — t          j        ddt           j        ¬¦  «        }g d¢|dd…dd…f<   g d¢|d	d
…dd…f<   g d¢|dd
…dd…f<   g d¢|dd
…dd…f<   g d¢|dd	…dd…f<   g d¢|dd	…dd…f<   | j                             |¦  «        }|                      |j        d¦  «         |                      |j        d¦  «         |                      |j	        j
        d¦  «         |                      |j	        j        d¦  «         |                      |j        d¦  «         dS )ub   Kiá»ƒm chá»©ng nháº­n diá»‡n thanh mÃ¡u Boss mÃ u Ä‘á»� viá»�n vÃ ng vÃ  kÃ­ch hoáº¡t ENGAGE_BOSS.r1   é   r!   ©é¹   é‚   r2   é#   é&   éŠ  éö  é>   éA   é�  éó  )é´   rR   rR   i[  )é   r<   r<   u#   Pháº£i phÃ¡t hiá»‡n thanh mÃ¡u Bossu;   CÃ³ thanh mÃ¡u Boss nghÄ©a lÃ  Ä‘ang trong Ä‘áº¥u trÆ°á»�ngu9   Boss Ä‘ang á»Ÿ tráº¡ng thÃ¡i thÆ°á»�ng, khÃ´ng báº¥t tá»­g      à?ÚENGAGE_BOSSN)r)   r@   r+   r   r#   rF   r&   Úin_arenar$   Úboss_bar_infoÚ	is_phasedÚassertGreaterÚhealth_ratior'   r(   ©r   rM   r,   s      r   Ú"test_boss_health_bar_active_combatz8TestBossArenaDetector.test_boss_health_bar_active_combatQ   sX  € å”˜¨µ2´8Ð<Ñ<Ô<ˆð "0  ˆˆb�ˆe�S˜�XˆoÑØ!/  ˆˆb�ˆe�S˜�XˆoÑØ .  ˆˆb�ˆe�S˜�WˆnÑØ"0 . .ˆˆb�ˆe�T˜$�YÐÑð "/  ˆˆb�ˆe�S˜�XˆoÑà". , ,ˆˆb�ˆe�T˜$�YÐÑà”×+Ò+¨EÑ2Ô2ˆà�Š˜Ô-Ð/TÑUÔUÐUØ�Š˜œÐ(eÑfÔfÐfØ×Ò˜Ô,Ô6Ð8sÑtÔtÐtØ×Ò˜5Ô.Ô;¸SÑAÔAÐAØ×Ò˜Ô1°=ÑAÔAÐAÐAÐAr   c                óª  — t          j        ddt           j        ¬¦  «        }g d¢|dd…dd…f<   g d¢|d	d
…dd…f<   g d¢|dd
…dd…f<   g d¢|dd
…dd…f<   g d¢|dd	…dd…f<   | j                             |¦  «        }|                      |j        ¦  «         |                      |j        j        d¦  «         |  	                    |j
        dd¦  «         dS )uY   Kiá»ƒm chá»©ng nháº­n diá»‡n thanh mÃ¡u Boss á»Ÿ tráº¡ng thÃ¡i chuyá»ƒn pha (PHASE_KITE).r1   rR   r!   rS   rV   rW   rX   rY   rZ   r[   r\   r]   )r^   rT   éÈ   u5   Pháº£i nháº­n diá»‡n Ä‘Æ°á»£c Boss Ä‘ang chuyá»ƒn phaÚ
PHASE_KITEu7   Boss chuyá»ƒn pha báº¥t tá»­ -> Ä�á»� xuáº¥t PHASE_KITEN)r)   r@   r+   r   r#   rF   r&   rb   rc   r'   r(   rf   s      r   Ú+test_boss_health_bar_phased_invulnerabilityzATestBossArenaDetector.test_boss_health_bar_phased_invulnerabilityi   s  € å”˜¨µ2´8Ð<Ñ<Ô<ˆð "0  ˆˆb�ˆe�S˜�XˆoÑØ!/  ˆˆb�ˆe�S˜�XˆoÑØ .  ˆˆb�ˆe�S˜�WˆnÑØ"0 . .ˆˆb�ˆe�T˜$�YÐÑð "1  ˆˆb�ˆe�S˜�XˆoÑà”×+Ò+¨EÑ2Ô2ˆà�Š˜Ô-Ñ.Ô.Ð.Ø�Š˜Ô+Ô5Ð7nÑoÔoÐoØ×Ò˜Ô1°<ÐAzÑ{Ô{Ð{Ð{Ð{r   c                óô  — t           j                             | j        d¦  «        }t           j                             |¦  «        s%t           j                             | j        d¦  «        }t           j                             |¦  «        rmt
          �ht          j        |¦  «        }| j                             |¦  «        }|  	                    |j
        d¦  «         |                      |j        d¦  «         dS dS dS )ue   Kiá»ƒm chá»©ng khÃ´ng nháº­n diá»‡n sai trÃªn áº£nh chá»¥p thá»±c táº¿ trong Hideout / Map thÆ°á»�ng.ztest_hideout_now.pngzgame_window_focused.pngNu/   KhÃ´ng Ä‘Æ°á»£c bÃ¡o Boss Bar sai trong Hideoutr   )r   r   r   r   Úexistsr   Úopenr   r#   r$   r&   r'   r(   )r   Ú
sample_imgÚimgr,   s       r   Ú#test_real_capture_no_false_positivez9TestBossArenaDetector.test_real_capture_no_false_positive|   sÖ   € å”W—\’\ $Ô"3Ð5KÑLÔLˆ
ÝŒw�~Š~˜jÑ)Ô)ð 	TÝœŸš dÔ&7Ð9RÑSÔSˆJåŒ7�>Š>˜*Ñ%Ô%ð 	G­%Ð*;Ý”*˜ZÑ(Ô(ˆCØ”M×/Ò/°Ñ4Ô4ˆEà×Ò˜UÔ2Ð4eÑfÔfÐfØ×Ò˜UÔ5°~ÑFÔFÐFÐFÐFð	Gð 	GÐ*;Ð*;r   c                óf  — t          j        ddt           j        ¬¦  «        }g d¢|dd…dd…f<   | j                             |¦  «        }d	}g }t          |¦  «        D ]]}t          j        ¦   «         }| j                             |¦  «        }t          j        ¦   «         }|                     ||z
  d
z  ¦  «         Œ^t          t          j
        |¦  «        ¦  «        }t          t          j        |d¦  «        ¦  «        }	t          d|d›d|	d›d�¦  «         |                      |dd|d›d�¦  «         dS )ud   Kiá»ƒm chá»©ng hiá»‡u nÄƒng thá»�i gian thá»±c: Tá»‘c Ä‘á»™ xá»­ lÃ½ pháº£i Ä‘áº¡t chuáº©n < 5.0 ms.)r   r   r    é(   r!   r5   iX  i¨  iè  i@  r<   g     @�@é_   z*
[Benchmark BossArenaDetector 1440p] Avg: z.2fz
ms | P95: Úmsg      @u   Ä�á»™ trá»… trung bÃ¬nh u   ms pháº£i < 5.0msN)r)   r@   r+   r   r#   ÚrangeÚtimeÚperf_counterÚappendÚfloatÚmeanÚ
percentileÚprintÚ
assertLess)
r   Úframe_1440pÚ_Ú
iterationsÚ	latenciesÚt0ÚstÚt1Úavg_latencyÚp95_latencys
             r   Ú"test_sub_5ms_performance_benchmarkz8TestBossArenaDetector.test_sub_5ms_performance_benchmark‰   sD  € õ ”g˜o¨r½¼ÐBÑBÔBˆà*9¨/¨/ˆ�C˜�G˜T $˜YÐ&Ñ'ð ŒM×'Ò'¨Ñ4Ô4ˆàˆ
Øˆ	Ý�zÑ"Ô"ð 	1ð 	1ˆAÝÔ"Ñ$Ô$ˆBØ”×,Ò,¨[Ñ9Ô9ˆBÝÔ"Ñ$Ô$ˆBØ×Ò˜b 2™g¨Ñ/Ñ0Ô0Ð0Ð0å�BœG IÑ.Ô.Ñ/Ô/ˆÝ�BœM¨)°RÑ8Ô8Ñ9Ô9ˆåÐj¸KÐjÐjÐjÐWbÐjÐjÐjÐjÑkÔkÐkØ�Š˜ SÐ*gÀ[Ð*gÐ*gÐ*gÐ*gÑhÔhÐhÐhÐhr   N)r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r/   rP   rg   rk   rq   rˆ   © r   r   r
   r
   $   sÀ   € € € € € ØbÐbðVð Vð Vð Vð
5ð 
5ð 
5ð 
5ðoð oð oð oð4Bð Bð Bð Bð0|ð |ð |ð |ð&Gð Gð Gð Gðið ið ið ið ið ir   r
   Ú__main__)rŒ   Ú
__future__r   ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arr   rw   ÚunittestÚnumpyr)   ÚPILr   ÚImportErrorÚ-src.assistant_tool.vision.boss_arena_detectorr   r   r   r   ÚTestCaser
   r‰   Úmainr�   r   r   ú<module>r�      sB  ððð ð #Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € €	€	€	€	Ø €€€Ø €€€Ø Ð Ð Ð ðØÐÐÐÐÐÐøØð ð ð Ø€E€E€Eðøøøðð ð ð ð ð ð ð ð ð ð ð ð{ið {ið {ið {ið {i˜HÔ-ñ {iô {ið {ið| ˆzÒÐØ€H„M�O„O€O€O€Oð Ðs   §. ®8·8