§
    Qj¬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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�  AutoPOE2 - Unit Tests Kiá»ƒm Chá»©ng KhÃ¡ng Bug Chá»¯ 'ENTER' & Nháº­n Diá»‡n Player Avatar (Chu Ká»³ 9).
=================================================================================================
Kiá»ƒm thá»­ toÃ n diá»‡n:
1. KhÃ¡ng triá»‡t Ä‘á»ƒ bug chá»¯ 'ENTER' trong tooltip Waystone ("allowing you to enter a map").
2. Ä�áº£m báº£o hÃ m OCR TRAVERSE vÃ  Dual-Pass Locator luÃ´n loáº¡i trá»« vÃ¹ng tÃºi Ä‘á»“ / tooltip (x > 0.55 * w).
3. Nháº­n diá»‡n chÃ­nh xÃ¡c Player Avatar hÃ¬nh trÃ²n vÃ ng trÃªn cÃ¢y Atlas (find_player_avatar_on_atlas)
   trÃªn cÃ¡c artifact tháº­t tá»« captures/ (20260914_003608_364_CLICKED_PIN_1280_560.png, test_player_node.png, pin_1280_560.png).
4. Kiá»ƒm chá»©ng tÃ­nh nÄƒng fallback an toÃ n vÃ  tÆ°Æ¡ng thÃ­ch Ä‘a Ä‘á»™ phÃ¢n giáº£i.

TuÃ¢n thá»§ nghiÃªm ngáº·t:
- Rule 5: 100% artifact tháº­t tá»« captures/.
- Rule 14: Quality Gate, 100% tests PASS.
é    )ÚannotationsN)ÚImage)Úfind_traverse_button_dual_pass)Úfind_button_by_textÚfind_player_avatar_on_atlasc                  ó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 )ÚTestTraverseAndPlayerAvataru_   Test suite kiá»ƒm chá»©ng loáº¡i trá»« vÃ¹ng tooltip x > 0.55*w vÃ  Ä‘á»‹nh vá»‹ Player Avatar.Ú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_traverse_and_player_avatar.pyÚsetUpz!TestTraverseAndPlayerAvatar.setUp    s0   € ÝœGŸLšL­¬¯ª½Ñ)BÔ)BÀDÈ*ÑUÔUˆÔÐÐó    c                ó&  — t          j        ddd¬¦  «        }t          |¦  «        }|�*|                      |d         t	          d¦  «        d¦  «         t          |d	¦  «        }|�,|                      |d         t	          d¦  «        d
¦  «         dS dS )u`   Kiá»ƒm chá»©ng OCR TRAVERSE vÃ  Dual-Pass Locator tuyá»‡t Ä‘á»‘i khÃ´ng click vÃ o x > 0.55 * w.ÚRGB©i 
  i   )é   r   r   ©ÚcolorNr   ç      –@u=   Dual-Pass Ä‘Ã£ click nháº§m vÃ o vÃ¹ng tÃºi Ä‘á»“ x > 0.55*w!ÚTRAVERSEu<   find_button_by_text Ä‘Ã£ click nháº§m vÃ o vÃ¹ng x > 0.55*w!)r   Únewr   ÚassertLessEqualÚintr   )r   ÚimgÚposÚbtn_poss       r   Ú:test_traverse_button_excludes_right_half_inventory_tooltipzVTestTraverseAndPlayerAvatar.test_traverse_button_excludes_right_half_inventory_tooltip#   s�   € õ Œi˜˜|°<Ð@Ñ@Ô@ˆõ -¨SÑ1Ô1ˆàˆ?Ø× Ò   Q¤­¨[Ñ)9Ô)9Ð;zÑ{Ô{Ð{õ & c¨:Ñ6Ô6ˆØÐØ× Ò  ¨¤­S°Ñ-=Ô-=Ð?}Ñ~Ô~Ð~Ð~Ð~ð Ðr   c                ó°   — t          j        ddd¬¦  «        }t          |d¦  «        }|�,|                      |d         t	          d¦  «        d	¦  «         dS dS )
ux   Kiá»ƒm chá»©ng khi tÃ¬m token 'ENTER', há»‡ thá»‘ng tá»± Ä‘á»™ng loáº¡i trá»« vÃ¹ng tÃºi Ä‘á»“ / tooltip (x > 0.55 * w).r   r   )é   r(   r(   r   ÚENTERNr   r   u9   Ä�Ã£ match chá»¯ ENTER trong vÃ¹ng tÃºi Ä‘á»“ x > 0.55*w!)r   r    r   r!   r"   )r   r#   r$   s      r   Ú'test_find_button_by_text_anti_enter_bugzCTestTraverseAndPlayerAvatar.test_find_button_by_text_anti_enter_bug4   s^   € åŒi˜˜|°<Ð@Ñ@Ô@ˆå! # wÑ/Ô/ˆØˆ?Ø× Ò   Q¤­¨[Ñ)9Ô)9Ð;vÑwÔwÐwÐwÐwð ˆ?r   c                ó†  — t           j                             | j        d¦  «        }t           j                             |¦  «        s|                      d|› �¦  «         t          |¦  «        }|                      |d¦  «         |\  }}|                      |ddd|› d�¬¦  «         |                      |d	dd
|› d�¬¦  «         dS )un   Kiá»ƒm chá»©ng nháº­n diá»‡n Player Avatar trÃªn capture tháº­t: 20260914_003608_364_CLICKED_PIN_1280_560.png.z,20260914_003608_364_CLICKED_PIN_1280_560.pngõ   KhÃ´ng tÃ¬m tháº¥y u[   KhÃ´ng tÃ¬m tháº¥y Player Avatar trÃªn capture 20260914_003608_364_CLICKED_PIN_1280_560.pngi   é   u   Lá»‡ch tá»�a Ä‘á»™ X: z != 1280)ÚdeltaÚmsgi0  u   Lá»‡ch tá»�a Ä‘á»™ Y: z != 560N)	r   r   r   r   ÚexistsÚskipTestr   ÚassertIsNotNoneÚassertAlmostEqual©r   Úcapture_pathÚ
avatar_posÚaxÚays        r   Ú3test_find_player_avatar_on_real_clicked_pin_capturezOTestTraverseAndPlayerAvatar.test_find_player_avatar_on_real_clicked_pin_capture<   sá   € å”w—|’| DÔ$5Ð7eÑfÔfˆÝŒw�~Š~˜lÑ+Ô+ð 	@Ø�MŠMÐ>°Ð>Ð>Ñ?Ô?Ð?å0°Ñ>Ô>ˆ
Ø×Ò˜Zð  *Gñ  	Hô  	Hð  	Hð ‰ˆˆBØ×Ò˜r 4¨rÐ7\ÐPRÐ7\Ð7\Ð7\ÐÑ]Ô]Ð]Ø×Ò˜r 3¨bÐ6ZÈrÐ6ZÐ6ZÐ6ZÐÑ[Ô[Ð[Ð[Ð[r   c                ó²  — t           j                             | j        d¦  «        }t           j                             |¦  «        s|                      d|› �¦  «         t          |¦  «        }|                      |d¦  «         |\  }}|                      d|cxk    odk    nc d|› d�¦  «         |                      d|cxk    od	k    nc d
|› d�¦  «         dS )uV   Kiá»ƒm chá»©ng nháº­n diá»‡n Player Avatar trÃªn capture tháº­t: test_player_node.png.ztest_player_node.pngr,   u;   KhÃ´ng tÃ¬m tháº¥y Player Avatar trÃªn test_player_node.pngi~  iF  u   Tá»�a Ä‘á»™ X avatar u*    náº±m ngoÃ i dáº£i dá»± kiáº¿n 1150..1350iÂ  iŠ  u   Tá»�a Ä‘á»™ Y avatar u(    náº±m ngoÃ i dáº£i dá»± kiáº¿n 450..650N)	r   r   r   r   r0   r1   r   r2   Ú
assertTruer4   s        r   Ú3test_find_player_avatar_on_test_player_node_capturezOTestTraverseAndPlayerAvatar.test_find_player_avatar_on_test_player_node_captureJ   sø   € å”w—|’| DÔ$5Ð7MÑNÔNˆÝŒw�~Š~˜lÑ+Ô+ð 	@Ø�MŠMÐ>°Ð>Ð>Ñ?Ô?Ð?å0°Ñ>Ô>ˆ
Ø×Ò˜ZÐ)fÑgÔgÐgØ‰ˆˆBà�Š˜ Ð*Ð*Ò*Ð* dÒ*Ð*Ð*Ð*Ð,rÀBÐ,rÐ,rÐ,rÑsÔsÐsØ�Š˜˜rÐ(Ð(Ò(Ð( SÒ(Ð(Ð(Ð(Ð*nÀ"Ð*nÐ*nÐ*nÑoÔoÐoÐoÐor   c                ó
  — t           j                             | j        d¦  «        }t           j                             |¦  «        s|                      d|› �¦  «         t          |d¬¦  «        }|                      |¦  «         dS )u[   Kiá»ƒm chá»©ng nháº­n diá»‡n Player Avatar trá»±c tiáº¿p trÃªn áº£nh crop pin_1280_560.png.zpin_1280_560.pngr,   F©Úreturn_none_if_missingN)r   r   r   r   r0   r1   r   r2   )r   Úpin_pathr6   s      r   Ú'test_find_player_avatar_pin_crop_directzCTestTraverseAndPlayerAvatar.test_find_player_avatar_pin_crop_directW   s{   € å”7—<’< Ô 1Ð3EÑFÔFˆÝŒw�~Š~˜hÑ'Ô'ð 	<Ø�MŠMÐ:°Ð:Ð:Ñ;Ô;Ð;õ 1°ÐRWÐXÑXÔXˆ
Ø×Ò˜ZÑ(Ô(Ð(Ð(Ð(r   c                óø   — t          j        ddd¬¦  «        }t          |d¬¦  «        }|                      |¦  «         t          |d¬¦  «        }|                      |¦  «         |                      |d¦  «         d	S )
uh   Kiá»ƒm chá»©ng fallback vá»� vá»‹ trÃ­ Ä‘á»‰nh Great Wall chuáº©n hÃ³a khi return_none_if_missing=False.r   )i€  i8  )r   r   r   r   Tr>   F)iÀ  i¤  N)r   r    r   ÚassertIsNoner2   ÚassertEqual)r   Ú	blank_imgÚnone_resÚfallback_ress       r   Ú(test_player_avatar_fallback_when_missingzDTestTraverseAndPlayerAvatar.test_player_avatar_fallback_when_missinga   s†   € å”I˜e \¸ÐCÑCÔCˆ	õ /¨yÐQUÐVÑVÔVˆØ×Ò˜(Ñ#Ô#Ð#õ 3°9ÐUZÐ[Ñ[Ô[ˆØ×Ò˜\Ñ*Ô*Ð*Ø×Ò˜ zÑ2Ô2Ð2Ð2Ð2r   N)r
   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r&   r*   r9   r<   rA   rH   © r   r   r	   r	      sº   € € € € € ØiÐiðVð Vð Vð Vðð ð ð ð"xð xð xð xð\ð \ð \ð \ðpð pð pð pð)ð )ð )ð )ð3ð 3ð 3ð 3ð 3ð 3r   r	   Ú__main__)rL   Ú
__future__r   ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arr   ÚunittestÚnumpyÚnpÚPILr   Úsrc.common.vision_filtersr   Úsrc.common.vision_ocrr   r   ÚTestCaser	   rI   ÚmainrM   r   r   ú<module>r^      s  ððð ð #Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € €	€	€	€	Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð à DÐ DÐ DÐ DÐ DÐ Dðð ð ð ð ð ð ð ðO3ð O3ð O3ð O3ð O3 (Ô"3ñ O3ô O3ð O3ðd ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   