§
    g6®j]0  ã                  ó  — 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
mZmZmZ ddlZddlmZmZmZmZmZmZmZmZmZmZmZ ddlmZ  ej        d¬¦  «        d	„ ¦   «         Z G d
„ d¦  «        Z G d„ d¦  «        Z  G d„ d¦  «        Z!dS )u“  AutoPOE2 - Unit & Integration Tests cho Focus Interlock Guard.
===================================================================
Domain: QA & Governance Sentinel (SÆ° Ä‘oÃ n 4) & Common Foundation
Má»¥c tiÃªu:
- Báº£o vá»‡ Desktop ngÆ°á»�i dÃ¹ng: Cáº¥m tuyá»‡t Ä‘á»‘i rÃ² rá»‰ phÃ­m WASD / click chuá»™t khi game POE2 bá»‹ unfocused.
- TuÃ¢n thá»§ nghiÃªm ngáº·t Focus Interlock vÃ  Rule 4C & Rule 5.
é    )ÚannotationsN)Ú	MagicMockÚcallÚpatch)ÚVK_AÚVK_DÚVK_SÚVK_WÚclickÚ
ctrl_clickÚdragÚemergency_release_wasd_keysÚ	press_keyÚsend_wasd_directionÚset_input_simulation_mode)Úis_poe2_window_focusedT)Úautousec               #  óN   K  — t          d¦  «         dV — t          d¦  «         dS )u>   Tá»± Ä‘á»™ng Ä‘áº·t láº¡i simulation mode sau má»—i bÃ i test.N)r   © ó    ú2C:\Projects\AutoPOE2\tests\test_focus_interlock.pyÚreset_simulation_moder       s3   è è € õ ˜dÑ#Ô#Ð#Ø	€E€E€EÝ˜dÑ#Ô#Ð#Ð#Ð#r   c                  ó0   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestPoe2WindowFocusDetectionu<   Kiá»ƒm thá»­ hÃ m dÃ² tÃ¬m Focus cá»§a cá»­a sá»• game POE2.c           	     óR  — t          dd¬¦  «        5  d„ }t          d|¬¦  «        5  t          ¦   «         }d}||u }|s´t          j        d|fd	||f¦  «        d
t	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nd
t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}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 )uZ   Khi Foreground Window cÃ³ ClassName lÃ  'POEWindowClass' -> is_poe2_window_focused = True.ú(ctypes.windll.user32.GetForegroundWindowé90  ©Úreturn_valuec                ó8   — d|_         t          |j         ¦  «        S )NÚPOEWindowClass©ÚvalueÚlen©ÚhwndÚbufÚmax_lens      r   Úmock_get_classziTestPoe2WindowFocusDetection.test_focus_returns_true_when_foreground_is_poe_class.<locals>.mock_get_class.   s   € Ø,�”	Ý˜3œ9‘~”~Ð%r   ú"ctypes.windll.user32.GetClassNameW©Úside_effectT©Úis©z)%(py2)s
{%(py2)s = %(py0)s()
} is %(py5)sr   ©Úpy0Úpy2Úpy5úassert %(py7)sÚpy7N©
r   r   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanation©Úselfr)   Ú@py_assert1Ú@py_assert4Ú@py_assert3Ú@py_format6Ú@py_format8s          r   Ú4test_focus_returns_true_when_foreground_is_poe_classzQTestPoe2WindowFocusDetection.test_focus_returns_true_when_foreground_is_poe_class+   óÚ  € åÐ=ÈEÐRÑRÔRð 	8ð 	8ð&ð &ð &õ Ð;ÈÐXÑXÔXð 8ð 8Ý-Ñ/Ô/Ð7°4Ð7Ð/°4Ð7Ð7Ð7Ð7Õ7Ô7Ð7Ð7Ð7Ð7Ð/°4Ð7Ñ7Ô7Ð7Õ7Ô7Ñ7Ô7Ð7Ð7Õ7Ô7Õ-Ñ7Ô7Ð7Õ7Ô7Õ-Ñ7Ô7Ð7Ð7Õ7Ô7Ð/Ñ7Ô7Õ7Ô7°4Ñ7Ô7Ð7Ð7Ñ7Ð7Ð7Ð7Ð7Ð7Ñ7Ð7Õ7Õ7Ô7Ð7Ñ7Ô7Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7ð8ð 8ð 8ñ 8ô 8ð 8ð 8ð 8ð 8ð 8ð 8øøøð 8ð 8ð 8ð 8ð	8ð 	8ð 	8ñ 	8ô 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8øøøð 	8ð 	8ð 	8ð 	8ð 	8ð 	8ó5   ’D§CDÃ8DÄD	ÄDÄD	ÄDÄD Ä#D c           	     óR  — t          dd¬¦  «        5  d„ }t          d|¬¦  «        5  t          ¦   «         }d}||u }|s´t          j        d|fd	||f¦  «        d
t	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nd
t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}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 )u\   Khi Foreground Window cÃ³ ClassName lÃ  'POEC2_MainWindow' -> is_poe2_window_focused = True.r   r   r   c                ó8   — d|_         t          |j         ¦  «        S )NÚPOEC2_MainWindowr"   r%   s      r   r)   zkTestPoe2WindowFocusDetection.test_focus_returns_true_when_foreground_is_poec2_class.<locals>.mock_get_class8   s   € Ø.�”	Ý˜3œ9‘~”~Ð%r   r*   r+   Tr-   r/   r   r0   r4   r5   Nr6   r?   s          r   Ú6test_focus_returns_true_when_foreground_is_poec2_classzSTestPoe2WindowFocusDetection.test_focus_returns_true_when_foreground_is_poec2_class5   rG   rH   c                óü  — t          dd¬¦  «        5  d„ }d„ }t          d|¬¦  «        5  t          d|¬¦  «        5  t          d	d
¬¦  «        5  t          ¦   «         }d}||u }|s´t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}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¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )uj   Khi Foreground Window lÃ  á»©ng dá»¥ng khÃ¡c (Chrome, Notepad, Desktop) -> is_poe2_window_focused = False.r   iŸ† r   c                ó8   — d|_         t          |j         ¦  «        S ©NÚChrome_WidgetWin_1r"   r%   s      r   r)   zuTestPoe2WindowFocusDetection.test_focus_returns_false_when_foreground_is_desktop_or_other_app.<locals>.mock_get_classB   ó   € Ø0�”	Ý˜3œ9‘~”~Ð%r   c                ó8   — d|_         t          |j         ¦  «        S )NzGoogle Chrome - Work Tabr"   r%   s      r   Úmock_get_textztTestPoe2WindowFocusDetection.test_focus_returns_false_when_foreground_is_desktop_or_other_app.<locals>.mock_get_textF   s   € Ø6�”	Ý˜3œ9‘~”~Ð%r   r*   r+   ú#ctypes.windll.user32.GetWindowTextWú(src.common.win32_window.find_poe2_windowr   Fr-   r/   r   r0   r4   r5   Nr6   ©r@   r)   rS   rA   rB   rC   rD   rE   s           r   Ú@test_focus_returns_false_when_foreground_is_desktop_or_other_appz]TestPoe2WindowFocusDetection.test_focus_returns_false_when_foreground_is_desktop_or_other_app?   s  € åÐ=ÈEÐRÑRÔRð 	Að 	Að&ð &ð &ð&ð &ð &õ Ð;ÈÐXÑXÔXð Að AÝÐ@ÈmÐ\Ñ\Ô\ð Að AÝÐIÐX]Ð^Ñ^Ô^ð Að AÝ5Ñ7Ô7Ð@¸5Ð@Ð7¸5Ð@Ð@Ð@Ð@Õ@Ô@Ð@Ð@Ð@Ð@Ð7¸5Ð@Ñ@Ô@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@Õ5Ñ@Ô@Ð@Õ@Ô@Õ5Ñ@Ô@Ð@Ð@Õ@Ô@Ð7Ñ@Ô@Õ@Ô@¸5Ñ@Ô@Ð@Ð@Ñ@Ð@Ð@Ð@Ð@Ð@Ñ@Ð@Õ@Õ@Ô@Ð@Ñ@Ô@Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@ðAð Að Añ Aô Að Að Að Að Að Að Aøøøð Að Að Að AðAð Að Añ Aô Að Að Að Að Að Að Aøøøð Að Að Að AðAð Að Añ Aô Að Að Að Að Að Að Aøøøð Að Að Að Að	Að 	Að 	Añ 	Aô 	Að 	Að 	Að 	Að 	Að 	Að 	Að 	Aøøøð 	Að 	Að 	Að 	Að 	Að 	As|   ’E1ªE¼EÁCD+	ÄEÄ+D/Ä/EÄ2D/Ä3EÄ6EÅEÅEÅ	EÅ
EÅE1ÅE	ÅE1Å E	Å!E1Å1E5Å8E5c                óN  — t          dd¬¦  «        5  d„ }d„ }t          d|¬¦  «        5  t          d|¬¦  «        5  t          d	d
¬¦  «        5  t          dd¬¦  «        5  t          ¦   «         }d}||u }|s´t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}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¦  «         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 )ut   Báº£o vá»‡ báº¥t biáº¿n INV-FOCUS-INTERLOCK: TrÃ¬nh duyá»‡t má»Ÿ tab 'Path of Exile 2' pháº£i bá»‹ tá»« chá»‘i 100%.r   i8[ r   c                ó8   — d|_         t          |j         ¦  «        S rO   r"   r%   s      r   r)   zlTestPoe2WindowFocusDetection.test_focus_returns_false_when_chrome_has_poe2_tab_title.<locals>.mock_get_classR   rQ   r   c                ó8   — d|_         t          |j         ¦  «        S )Nz2Path of Exile 2 - Atlas Tree Guide - Google Chromer"   r%   s      r   rS   zkTestPoe2WindowFocusDetection.test_focus_returns_false_when_chrome_has_poe2_tab_title.<locals>.mock_get_textV   s   € ØP�”	Ý˜3œ9‘~”~Ð%r   r*   r+   rT   rU   r   z#src.common.win32_window.is_poe2_pidFr-   r/   r   r0   r4   r5   Nr6   rV   s           r   Ú7test_focus_returns_false_when_chrome_has_poe2_tab_titlezTTestPoe2WindowFocusDetection.test_focus_returns_false_when_chrome_has_poe2_tab_titleO   s~  € åÐ=ÈEÐRÑRÔRð 	Eð 	Eð&ð &ð &ð&ð &ð &õ Ð;ÈÐXÑXÔXð Eð EÝÐ@ÈmÐ\Ñ\Ô\ð Eð EÝÐIÐXYÐZÑZÔZð Eð EÝ"Ð#HÐW\Ð]Ñ]Ô]ð Eð EÝ#9Ñ#;Ô#;ÐD¸uÐDÐ#;¸uÐ#DÐDÐDÐDÕDÔDÐDÐDÐDÐDÐ#;¸uÐDÑDÔDÐDÕDÔDÑDÔDÐDÐDÕDÔDÕ#9ÑDÔDÐDÕDÔDÕ#9ÑDÔDÐDÐDÕDÔDÐ#;ÑDÔDÕDÔD¸uÑDÔDÐDÐDÑDÐDÐDÐDÐDÐDÑDÐDÕDÕDÔDÐDÑDÔDÑDÔDÐDÐDÐDÐDÐDÐDÐDðEð Eð Eñ Eô Eð Eð Eð Eð Eð Eð Eøøøð Eð Eð Eð EðEð Eð Eñ Eô Eð Eð Eð Eð Eð Eð Eøøøð Eð Eð Eð EðEð Eð Eñ Eô Eð Eð Eð Eð Eð Eð Eøøøð Eð Eð Eð EðEð Eð Eñ Eô Eð Eð Eð Eð Eð Eð Eøøøð Eð Eð Eð Eð	Eð 	Eð 	Eñ 	Eô 	Eð 	Eð 	Eð 	Eð 	Eð 	Eð 	Eð 	Eøøøð 	Eð 	Eð 	Eð 	Eð 	Eð 	Es    ’FªF¼E+ÁE	Á CD=Ä1E	Ä=EÅE	ÅEÅE	ÅE+ÅEÅE+ÅEÅE+ÅFÅ+E/Å/FÅ2E/Å3FÅ6FÆF	ÆFÆ	F	Æ
FÆFÆ!Fc                óþ  — t          dd¬¦  «        5  d}t          |¬¦  «        }d}||u }|sÇt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d	œz  }d
d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}}d}t          |¬¦  «        }d}||u }|sÇt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d	œz  }d
d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}}ddd¦  «         dS # 1 swxY w Y   dS )u\   Khi chá»‰ Ä‘á»‹nh HWND cá»¥ thá»ƒ, chá»‰ True náº¿u Foreground khá»›p chÃ­nh xÃ¡c HWND Ä‘Ã³.r   r   r   )r&   Tr-   )z5%(py4)s
{%(py4)s = %(py0)s(hwnd=%(py2)s)
} is %(py7)sr   )r1   r2   Úpy4r5   zassert %(py9)sÚpy9Ni1Ô  Fr6   )r@   rA   rC   Ú@py_assert6Ú@py_assert5rE   Ú@py_format10s          r   Útest_focus_with_explicit_hwndz:TestPoe2WindowFocusDetection.test_focus_with_explicit_hwnd`   s„  € åÐ=ÈEÐRÑRÔRð 	?ð 	?Ø/4Ð=Õ)¨uÐ5Ñ5Ô5Ð=¸Ð=Ð5¸Ð=Ð=Ð=Ð=Õ=Ô=Ð=Ð=Ð=Ð=Ð5¸Ð=Ñ=Ô=Ð=Õ=Ô=Ñ=Ô=Ð=Ð=Õ=Ô=Õ)Ñ=Ô=Ð=Õ=Ô=Õ)Ñ=Ô=Ð=Ð=Õ=Ô=¨uÑ=Ô=Õ=Ô=Ð5Ñ=Ô=Õ=Ô=¸Ñ=Ô=Ð=Ð=Ñ=Ð=Ð=Ð=Ð=Ð=Ñ=Ð=Õ=Õ=Ô=Ð=Ñ=Ô=Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ø/4Ð>Õ)¨uÐ5Ñ5Ô5Ð>¸Ð>Ð5¸Ð>Ð>Ð>Ð>Õ>Ô>Ð>Ð>Ð>Ð>Ð5¸Ð>Ñ>Ô>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>Õ)Ñ>Ô>Ð>Õ>Ô>Õ)Ñ>Ô>Ð>Ð>Õ>Ô>¨uÑ>Ô>Õ>Ô>Ð5Ñ>Ô>Õ>Ô>¸Ñ>Ô>Ð>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Õ>Õ>Ô>Ð>Ñ>Ô>Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>ð	?ð 	?ð 	?ñ 	?ô 	?ð 	?ð 	?ð 	?ð 	?ð 	?ð 	?ð 	?øøøð 	?ð 	?ð 	?ð 	?ð 	?ð 	?s   ’GG2Ç2G6Ç9G6N)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__rF   rL   rW   r[   rb   r   r   r   r   r   (   sk   € € € € € ØFÐFð8ð 8ð 8ð8ð 8ð 8ðAð Að Að Eð Eð Eð"?ð ?ð ?ð ?ð ?r   r   c                  óþ  — e Zd ZdZ edd¬¦  «         ed¦  «        d„ ¦   «         ¦   «         Z edd¬¦  «         ed¦  «         ed¦  «        d	„ ¦   «         ¦   «         ¦   «         Z edd¬¦  «         ed¦  «        d
„ ¦   «         ¦   «         Z edd¬¦  «         ed¦  «         ed¦  «        d„ ¦   «         ¦   «         ¦   «         Z edd¬¦  «         ed¦  «        d„ ¦   «         ¦   «         Z	 edd¬¦  «         edd¬¦  «         ed¦  «        d„ ¦   «         ¦   «         ¦   «         Z
 edd¬¦  «         ed¦  «        d„ ¦   «         ¦   «         Z edd¬¦  «         ed¦  «        d„ ¦   «         ¦   «         Zd„ Zd„ Zd„ ZdS )ÚTestInputFocusInterlockGuardsuG   Kiá»ƒm thá»­ chá»‘t cháº·n Focus Interlock trong cÃ¡c hÃ m win32_input.ú-src.common.win32_input.is_poe2_window_focusedFr   ú*src.common.win32_input._user32.keybd_eventc                óæ  — t          ddd¬¦  «        }d}||u }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }d	d
|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}d„ |j	        D ¦   «         }t          |¦  «        }d}	||	k    }
|
�s
t          j        d|
fd||	f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |	¦  «        dœz  }t          j        d|› �¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}
}	dS )u_   Khi game unfocused, send_wasd_direction Tá»ª CHá»�I gá»­i phÃ­m vÃ  cÆ°á»¡ng cháº¿ nháº£ phÃ­m.ç      ð?çffffffÖ?©Údwell_msFr-   ©z%(py0)s is %(py3)sÚres©r1   Úpy3úassert %(py5)sr3   Nc                óh   — g | ]/}t          |d          ¦  «        dk    ¯|d          d         d k    ¯-|‘Œ0S ©r   é   é   ©r$   ©Ú.0Úcs     r   ú
<listcomp>zaTestInputFocusInterlockGuards.test_send_wasd_direction_blocked_when_unfocused.<locals>.<listcomp>r   sB   € Ð^Ð^Ð^˜A½cÀ!ÀAÄ$¹i¼iÈ1ºn¸nÐQRÐSTÔQUÐVWÔQXÐ\]ÒQ]ÐQ]�aÐQ]ÐQ]ÐQ]r   r   ©ú==)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr$   Ú
down_calls©r1   Úpy1rs   Úpy6u=   PhÃ¡t hiá»‡n gá»�i keybd_event nháº¥n xuá»‘ng khi unfocused: z
>assert %(py8)sÚpy8)r   r7   r8   r9   r:   r;   r<   r=   r>   Úcall_args_listr$   Ú_format_assertmsg)r@   Ú
mock_keybdÚ
mock_focusrq   Ú@py_assert2rA   Ú@py_format4rD   r€   r`   rB   Ú@py_format7Ú@py_format9s                r   Ú/test_send_wasd_direction_blocked_when_unfocusedzMTestInputFocusInterlockGuards.test_send_wasd_direction_blocked_when_unfocusedj   s.  € õ " # s°TÐ:Ñ:Ô:ˆØÐˆs�eˆ|ÐÐÐÕÔÐÐÐÐˆs�eÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔ�eÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐð _Ð^ Ô!:Ð^Ñ^Ô^ˆ
Ý�:‰ŒÐq !Ðqˆ !Ò#ÐqÐqÑqÕqÔqÐqÐqÐqÐqˆ !ÐqÑqÔqÐqÕqÔqÑqÔqÐqÐqÕqÔq�sÑqÔqÐqÕqÔq�sÑqÔqÐqÐqÐqÕqÔqÑqÔqÐqÐqÕqÔq�:ÑqÔqÐqÕqÔq�:ÑqÔqÐqÐqÕqÔqˆÑqÔqÕqÔq !ÑqÔqÐqÐqÑqÐqÕqÔqÐ%qÐeoÐ%qÐ%qÑqÔqÐqÑqÐqÐqÐqÑqÐqÕqÕqÔqÐqÑqÔqÑqÔqÐqÐqÐqÐqÐqÐqÐqÐqÐqr   Tú(src.common.win32_input._user32.SendInputc                ó  — t          d¦  «        5  t          ddd¬¦  «        }d}||u }|s—t          j        d|fd||f¦  «        d	t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        d
œz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}d„ |j
        D ¦   «         }	t          |	¦  «        }d}
||
k    }|sòt          j        d|fd||
f¦  «        dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt	          j        ¦   «         v st          j        |	¦  «        rt          j        |	¦  «        ndt          j        |¦  «        t          j        |
¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}
ddd¦  «         dS # 1 swxY w Y   dS )uE   Khi game focused, send_wasd_direction hoáº¡t Ä‘á»™ng bÃ¬nh thÆ°á»�ng.ú
time.sleepç        rl   rm   rn   Tr-   rp   rq   rr   rt   r3   Nc                óh   — g | ]/}t          |d          ¦  «        dk    ¯|d          d         d k    ¯-|‘Œ0S rv   ry   rz   s     r   r}   z_TestInputFocusInterlockGuards.test_send_wasd_direction_allowed_when_focused.<locals>.<listcomp>~   sB   € ÐbÐbÐb Å#ÀaÈÄdÁ)Ä)ÈqÂ.À.ÐUVÐWXÔUYÐZ[ÔU\Ð`aÒUaÐUa˜!ÐUaÐUaÐUar   r   )ú>)z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)sr$   r€   r�   zassert %(py8)sr„   )r   r   r7   r8   r9   r:   r;   r<   r=   r>   r…   r$   )r@   Úmock_send_inputr‡   rˆ   rq   r‰   rA   rŠ   rD   r€   r`   rB   r‹   rŒ   s                 r   Ú-test_send_wasd_direction_allowed_when_focusedzKTestInputFocusInterlockGuards.test_send_wasd_direction_allowed_when_focusedu   s|  € õ
 �<Ñ Ô ð 	'ð 	'Ý% c¨3¸Ð>Ñ>Ô>ˆCØÐ�3˜$�;ÐÐÐÕÔÐÐÐÐ�3˜$ÐÑÔÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÕÔ˜$ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐàbÐb ZÔ%>ÐbÑbÔbˆJÝ�z‘?”?Ð& QÐ&�? QÒ&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&�? QÐ&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&•3Ñ&Ô&Ð&Õ&Ô&•3Ñ&Ô&Ð&Ð&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&�zÑ&Ô&Ð&Õ&Ô&�zÑ&Ô&Ð&Ð&Õ&Ô&�?Ñ&Ô&Õ&Ô& QÑ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ð	'ð 	'ð 	'ñ 	'ô 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'øøøð 	'ð 	'ð 	'ð 	'ð 	'ð 	's   �GG5Ç5G9Ç<G9c                ó’  — t          d¦  «        }d}||u }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}}| 	                    ¦   «          d	S )
u<   Khi game unfocused, press_key tá»« chá»‘i gá»�i keybd_event.é    Fr-   rp   rq   rr   rt   r3   N)
r   r7   r8   r9   r:   r;   r<   r=   r>   Úassert_not_called©r@   r‡   rˆ   rq   r‰   rA   rŠ   rD   s           r   Ú%test_press_key_blocked_when_unfocusedzCTestInputFocusInterlockGuards.test_press_key_blocked_when_unfocused�   sè   € õ ˜‰oŒoˆØÐˆs�eˆ|ÐÐÐÕÔÐÐÐÐˆs�eÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔ�eÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØ×$Ò$Ñ&Ô&Ð&Ð&Ð&r   c                ó<  — t          d¦  «        5  t          d¦  «        }d}||u }|s—t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd	|iz  }t          t          j	        |¦  «        ¦  «        ‚d
x}}|j
        }d}	||	k    }
|
sªt          j        d|
fd||	f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |	¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d
x}x}
}	d
d
d
¦  «         d
S # 1 swxY w Y   d
S )u>   Khi game focused, press_key gá»�i keybd_event bÃ¬nh thÆ°á»�ng.r�   r—   Tr-   rp   rq   rr   rt   r3   Nrx   r~   ©z2%(py2)s
{%(py2)s = %(py0)s.call_count
} == %(py5)sr‡   r0   r4   r5   )r   r   r7   r8   r9   r:   r;   r<   r=   r>   Ú
call_count)r@   r”   r‡   rˆ   rq   r‰   rA   rŠ   rD   rB   rC   rE   s               r   Ú#test_press_key_allowed_when_focusedzATestInputFocusInterlockGuards.test_press_key_allowed_when_focused‰   s#  € õ
 �<Ñ Ô ð 	.ð 	.Ý˜D‘/”/ˆCØÐ�3˜$�;ÐÐÐÕÔÐÐÐÐ�3˜$ÐÑÔÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÕÔ˜$ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÔ(Ð-¨AÐ-Ð(¨AÒ-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð(¨AÐ-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-�:Ñ-Ô-Ð-Õ-Ô-�:Ñ-Ô-Ð-Ð-Õ-Ô-Ð(Ñ-Ô-Õ-Ô-¨AÑ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-ð	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.ð 	.ð 	.s   �E4FÆFÆFz*src.common.win32_input._user32.mouse_eventc                ó”  — t          dd¦  «        }d}||u }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}}| 	                    ¦   «          d	S )
u8   Khi game unfocused, click tá»« chá»‘i gá»�i mouse_event.éô  Fr-   rp   rq   rr   rt   r3   N)
r   r7   r8   r9   r:   r;   r<   r=   r>   r˜   ©r@   Ú
mock_mouserˆ   rq   r‰   rA   rŠ   rD   s           r   Ú!test_click_blocked_when_unfocusedz?TestInputFocusInterlockGuards.test_click_blocked_when_unfocused“   sê   € õ �C˜‰oŒoˆØÐˆs�eˆ|ÐÐÐÕÔÐÐÐÐˆs�eÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔ�eÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØ×$Ò$Ñ&Ô&Ð&Ð&Ð&r   z%src.common.win32_input.set_cursor_posc                ó>  — t          d¦  «        5  t          dd¦  «        }d}||u }|s—t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd	|iz  }t          t          j	        |¦  «        ¦  «        ‚d
x}}|j
        }d}	||	k    }
|
sªt          j        d|
fd||	f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |	¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d
x}x}
}	d
d
d
¦  «         d
S # 1 swxY w Y   d
S )u7   Khi game focused, click hoáº¡t Ä‘á»™ng bÃ¬nh thÆ°á»�ng.r�   r    Tr-   rp   rq   rr   rt   r3   Nrx   r~   rœ   r¢   r0   r4   r5   )r   r   r7   r8   r9   r:   r;   r<   r=   r>   r�   )r@   r¢   Úmock_cursorrˆ   rq   r‰   rA   rŠ   rD   rB   rC   rE   s               r   Útest_click_allowed_when_focusedz=TestInputFocusInterlockGuards.test_click_allowed_when_focused›   s%  € õ
 �<Ñ Ô ð 	.ð 	.Ý˜˜S‘/”/ˆCØÐ�3˜$�;ÐÐÐÕÔÐÐÐÐ�3˜$ÐÑÔÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÕÔ˜$ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÔ(Ð-¨AÐ-Ð(¨AÒ-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð(¨AÐ-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-�:Ñ-Ô-Ð-Õ-Ô-�:Ñ-Ô-Ð-Ð-Õ-Ô-Ð(Ñ-Ô-Õ-Ô-¨AÑ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-ð	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.ð 	.ð 	.s   �E5FÆFÆFc                ó˜  — t          dddd¦  «        }d}||u }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}}| 	                    ¦   «          d
S )u3   Khi game unfocused, drag tá»« chá»‘i thá»±c hiá»‡n.éd   éÈ   Fr-   rp   rq   rr   rt   r3   N)
r   r7   r8   r9   r:   r;   r<   r=   r>   r˜   r¡   s           r   Ú test_drag_blocked_when_unfocusedz>TestInputFocusInterlockGuards.test_drag_blocked_when_unfocused¥   sð   € õ �3˜˜S #Ñ&Ô&ˆØÐˆs�eˆ|ÐÐÐÕÔÐÐÐÐˆs�eÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔ�eÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØ×$Ò$Ñ&Ô&Ð&Ð&Ð&r   c                ó”  — t          dd¦  «        }d}||u }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}}| 	                    ¦   «          d	S )
uI   Khi game unfocused, ctrl_click khÃ´ng nháº¥n phÃ­m Ctrl vÃ  khÃ´ng click.r¨   Fr-   rp   rq   rr   rt   r3   N)
r   r7   r8   r9   r:   r;   r<   r=   r>   r˜   r™   s           r   Ú&test_ctrl_click_blocked_when_unfocusedzDTestInputFocusInterlockGuards.test_ctrl_click_blocked_when_unfocused­   sì   € õ ˜˜cÑ"Ô"ˆØÐˆs�eˆ|ÐÐÐÕÔÐÐÐÐˆs�eÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔ�eÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØ×$Ò$Ñ&Ô&Ð&Ð&Ð&r   c           
     óš
  — t          d¦  «         t          d¦  «        5 }t          d¦  «        5 }t          d¦  «        5  t          d¦  «        }d}||u }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d	œz  }d
d|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}}|j        }d}||k    }	|	sªt          j        d|	fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}	}|j        }d}||k    }	|	sªt          j        d|	fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}	}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¦  «         n# 1 swxY w Y   t          d¦  «         t          d¦  «        5 }t          d¦  «        5 }t          d¦  «        }d}||u }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d	œz  }d
d|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}}|j        }d}||k    }	|	sªt          j        d|	fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}	}|j        }d}||k    }	|	sªt          j        d|	fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}	}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 )u³   Kiá»ƒm tra set_input_simulation_mode cho phÃ©p override focus trong headless tests,
        nhÆ°ng TUYá»†T Ä�á»�I KHÃ”NG Gá»¬I PHÃ�M Váº¬T LÃ� RA OS (INV-FOCUS-SAFETY-SEPARATION).Trj   rŽ   r�   r—   r-   rp   rq   rr   rt   r3   Nr   r~   rœ   r‡   r0   r4   r5   r”   F)r   r   r   r7   r8   r9   r:   r;   r<   r=   r>   r�   ©r@   r‡   r”   rq   r‰   rA   rŠ   rD   rB   rC   rE   s              r   Útest_simulation_mode_overridez;TestInputFocusInterlockGuards.test_simulation_mode_overrideµ   s4  € õ 	" $Ñ'Ô'Ð'ÝÐ?Ñ@Ô@ð 	;ÀJÝÐAÑBÔBð ;ÀoÝ˜<Ñ(Ô(ð ;ð ;Ý# D™/œ/�CØ"&Ð&˜3 $˜;Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&˜3 $Ð&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&˜3Ñ&Ô&Ð&Õ&Ô&˜3Ñ&Ô&Ð&Ð&Õ&Ô& $Ñ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&à%Ô0Ð5°AÐ5Ð0°AÒ5Ð5Ð5Ð5Õ5Ô5Ð5Ð5Ð5Ð5Ð0°AÐ5Ñ5Ô5Ð5Õ5Ô5Ñ5Ô5Ð5Ð5Õ5Ô5˜:Ñ5Ô5Ð5Õ5Ô5˜:Ñ5Ô5Ð5Ð5Õ5Ô5Ð0Ñ5Ô5Õ5Ô5°AÑ5Ô5Ð5Ð5Ñ5Ð5Ð5Ð5Ð5Ð5Ñ5Ð5Õ5Õ5Ô5Ð5Ñ5Ô5Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ø*Ô5Ð:¸Ð:Ð5¸Ò:Ð:Ð:Ð:Õ:Ô:Ð:Ð:Ð:Ð:Ð5¸Ð:Ñ:Ô:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô:˜?Ñ:Ô:Ð:Õ:Ô:˜?Ñ:Ô:Ð:Ð:Õ:Ô:Ð5Ñ:Ô:Õ:Ô:¸Ñ:Ô:Ð:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Õ:Õ:Ô:Ð:Ñ:Ô:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:ð;ð ;ð ;ñ ;ô ;ð ;ð ;ð ;ð ;ð ;ð ;øøøð ;ð ;ð ;ð ;ð;ð ;ð ;ñ ;ô ;ð ;ð ;ð ;ð ;ð ;ð ;øøøð ;ð ;ð ;ð ;ð	;ð 	;ð 	;ñ 	;ô 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;øøøð 	;ð 	;ð 	;ð 	;õ 	" %Ñ(Ô(Ð(ÝÐ?Ñ@Ô@ð 	7ÀJÝÐAÑBÔBð 7ÀoÝ ‘o”o�Ø#Ð#�s˜e�|Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#�s˜eÐ#Ñ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#�sÑ#Ô#Ð#Õ#Ô#�sÑ#Ô#Ð#Ð#Õ#Ô#˜eÑ#Ô#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ø!Ô,Ð1°Ð1Ð,°Ò1Ð1Ð1Ð1Õ1Ô1Ð1Ð1Ð1Ð1Ð,°Ð1Ñ1Ô1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1�zÑ1Ô1Ð1Õ1Ô1�zÑ1Ô1Ð1Ð1Õ1Ô1Ð,Ñ1Ô1Õ1Ô1°Ñ1Ô1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ø&Ô1Ð6°QÐ6Ð1°QÒ6Ð6Ð6Ð6Õ6Ô6Ð6Ð6Ð6Ð6Ð1°QÐ6Ñ6Ô6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6�Ñ6Ô6Ð6Õ6Ô6�Ñ6Ô6Ð6Ð6Õ6Ô6Ð1Ñ6Ô6Õ6Ô6°QÑ6Ô6Ð6Ð6Ñ6Ð6Ð6Ð6Ð6Ð6Ñ6Ð6Õ6Õ6Ô6Ð6Ñ6Ô6Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6Ð6ð	7ð 7ð 7ñ 7ô 7ð 7ð 7ð 7ð 7ð 7ð 7øøøð 7ð 7ð 7ð 7ð	7ð 	7ð 	7ñ 	7ô 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7øøøð 	7ð 	7ð 	7ð 	7ð 	7ð 	7s�   ŸJ.¯J¿H5J É4JÊ JÊJÊJÊJÊJ.ÊJ	ÊJ.ÊJ	ÊJ.Ê.J2Ê5J2ËU Ë'H5T(ÔU Ô(T,	Ô,U Ô/T,	Ô0U Õ UÕUc           
     ó~  — t          d¦  «         t          d¦  «        5 }t          d¦  «        5 }t          d¦  «        5  t          ddd¬¦  «        }d}||u }|s—t          j        d	|fd
||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}}|j        }d}||k    }	|	sªt          j        d|	fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}	}|j        }d}||k    }	|	sªt          j        d|	fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}	}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 )us   Khi á»Ÿ cháº¿ Ä‘á»™ mÃ´ phá»�ng, send_wasd_direction tráº£ vá»� True nhÆ°ng khÃ´ng gá»�i SendInput hay keybd_event.Trj   rŽ   r�   r‘   rl   rm   rn   r-   rp   rq   rr   rt   r3   Nr   r~   rœ   r‡   r0   r4   r5   r”   )r   r   r   r7   r8   r9   r:   r;   r<   r=   r>   r�   r®   s              r   Ú>test_send_wasd_direction_in_simulation_mode_zero_hardware_leakz\TestInputFocusInterlockGuards.test_send_wasd_direction_in_simulation_mode_zero_hardware_leakÊ   sÛ  € å! $Ñ'Ô'Ð'ÝÐ?Ñ@Ô@ð 	;ÀJÝÐAÑBÔBð ;ÀoÝ˜<Ñ(Ô(ð ;ð ;Ý-¨c°3ÀÐFÑFÔF�CØ"&Ð&˜3 $˜;Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&˜3 $Ð&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&˜3Ñ&Ô&Ð&Õ&Ô&˜3Ñ&Ô&Ð&Ð&Õ&Ô& $Ñ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ø%Ô0Ð5°AÐ5Ð0°AÒ5Ð5Ð5Ð5Õ5Ô5Ð5Ð5Ð5Ð5Ð0°AÐ5Ñ5Ô5Ð5Õ5Ô5Ñ5Ô5Ð5Ð5Õ5Ô5˜:Ñ5Ô5Ð5Õ5Ô5˜:Ñ5Ô5Ð5Ð5Õ5Ô5Ð0Ñ5Ô5Õ5Ô5°AÑ5Ô5Ð5Ð5Ñ5Ð5Ð5Ð5Ð5Ð5Ñ5Ð5Õ5Õ5Ô5Ð5Ñ5Ô5Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ø*Ô5Ð:¸Ð:Ð5¸Ò:Ð:Ð:Ð:Õ:Ô:Ð:Ð:Ð:Ð:Ð5¸Ð:Ñ:Ô:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô:˜?Ñ:Ô:Ð:Õ:Ô:˜?Ñ:Ô:Ð:Ð:Õ:Ô:Ð5Ñ:Ô:Õ:Ô:¸Ñ:Ô:Ð:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Õ:Õ:Ô:Ð:Ñ:Ô:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:ð	;ð ;ð ;ñ ;ô ;ð ;ð ;ð ;ð ;ð ;ð ;øøøð ;ð ;ð ;ð ;ð;ð ;ð ;ñ ;ô ;ð ;ð ;ð ;ð ;ð ;ð ;øøøð ;ð ;ð ;ð ;ð	;ð 	;ð 	;ñ 	;ô 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;øøøð 	;ð 	;ð 	;ð 	;ð 	;ð 	;sX   ŸJ2¯J¿H8JÉ7JÊJÊJÊ
JÊJÊJ2ÊJ	ÊJ2Ê!J	Ê"J2Ê2J6Ê9J6c                ó’  ‡— g d¢Šˆfd„}t          d|¬¦  «        5  t          d¦  «        5  t          d¦  «        5  t          d¦  «        5 }t          d¦  «        5  t          d	d	d
¬¦  «        }d}||u }|s—t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}|j
        }d}||k    }	|	sªt          j        d|	fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }
t          t          j	        |
¦  «        ¦  «        ‚dx}x}	}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¦  «         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 )ue   Náº¿u game máº¥t focus giá»¯a chá»«ng (user alt-tab), send_wasd_direction ngáº¯t ngay vÃ  xáº£ phÃ­m.)TTFc                 ó6   •— ‰r‰                      d¦  «        S dS )Nr   F)Úpop)ÚargsÚkwargsÚfocus_statess     €r   Úmock_focus_generatorzsTestInputFocusInterlockGuards.test_send_wasd_direction_aborts_mid_dwell_on_focus_loss.<locals>.mock_focus_generatorØ   s$   ø€ Øð +Ø#×'Ò'¨Ñ*Ô*Ð*Ø�5r   ri   r+   rj   rŽ   z2src.common.win32_input.emergency_release_wasd_keysr�   rl   g      à?rn   Tr-   rp   rq   rr   rt   r3   Né   )ú>=)z2%(py2)s
{%(py2)s = %(py0)s.call_count
} >= %(py5)sÚmock_releaser0   r4   r5   )r   r   r7   r8   r9   r:   r;   r<   r=   r>   r�   )r@   r¸   r»   rq   r‰   rA   rŠ   rD   rB   rC   rE   r·   s              @r   Ú7test_send_wasd_direction_aborts_mid_dwell_on_focus_losszUTestInputFocusInterlockGuards.test_send_wasd_direction_aborts_mid_dwell_on_focus_lossÕ   s<  ø€ à*Ð*Ð*ˆð	ð 	ð 	ð 	ð 	õ
 ÐBÐPdÐeÑeÔeð 	@ð 	@ÝÐCÑDÔDð @ð @ÝÐEÑFÔFð @ð @ÝÐSÑTÔTð @ÐXdÝ" <Ñ0Ô0ð @ð @Ý"5°c¸3ÈÐ"MÑ"MÔ"M˜CØ*.Ð. 3¨$ ;Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð. 3¨$Ð.Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô. 3Ñ.Ô.Ð.Õ.Ô. 3Ñ.Ô.Ð.Ð.Õ.Ô.¨$Ñ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ø#/Ô#:Ð?¸aÐ?Ð#:¸aÒ#?Ð?Ð?Ð?Õ?Ô?Ð?Ð?Ð?Ð?Ð#:¸aÐ?Ñ?Ô?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô? <Ñ?Ô?Ð?Õ?Ô? <Ñ?Ô?Ð?Ð?Õ?Ô?Ð#:Ñ?Ô?Õ?Ô?¸aÑ?Ô?Ð?Ð?Ñ?Ð?Ð?Ð?Ð?Ð?Ñ?Ð?Õ?Õ?Ô?Ð?Ñ?Ô?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?ð@ð @ð @ñ @ô @ð @ð @ð @ð @ð @ð @øøøð @ð @ð @ð @ð@ð @ð @ñ @ô @ð @ð @ð @ð @ð @ð @øøøð @ð @ð @ð @ð@ð @ð @ñ @ô @ð @ð @ð @ð @ð @ð @øøøð @ð @ð @ð @ð@ð @ð @ñ @ô @ð @ð @ð @ð @ð @ð @øøøð @ð @ð @ð @ð	@ð 	@ð 	@ñ 	@ô 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@øøøð 	@ð 	@ð 	@ð 	@ð 	@ð 	@s    œH<¬H$¼HÁG6	ÁE7GÇG6	ÇG#Ç#G6	Ç&G#Ç'G6	Ç*HÇ6G:Ç:HÇ=G:Ç>HÈH$ÈHÈH$ÈHÈH$ÈH<È$H(	È(H<È+H(	È,H<È<I ÉI N)rc   rd   re   rf   r   r�   r•   rš   rž   r£   r¦   rª   r¬   r¯   r±   r¼   r   r   r   rh   rh   g   s­  € € € € € ØQÐQà
€UÐ:ÈÐOÑOÔOØ
€UÐ7Ñ8Ô8ðrð rñ 9Ô8ñ PÔOðrð €UÐ:ÈÐNÑNÔNØ
€UÐ7Ñ8Ô8Ø
€UÐ5Ñ6Ô6ð'ð 'ñ 7Ô6ñ 9Ô8ñ OÔNð'ð €UÐ:ÈÐOÑOÔOØ
€UÐ7Ñ8Ô8ð'ð 'ñ 9Ô8ñ PÔOð'ð €UÐ:ÈÐNÑNÔNØ
€UÐ7Ñ8Ô8Ø
€UÐ5Ñ6Ô6ð.ð .ñ 7Ô6ñ 9Ô8ñ OÔNð.ð €UÐ:ÈÐOÑOÔOØ
€UÐ7Ñ8Ô8ð'ð 'ñ 9Ô8ñ PÔOð'ð €UÐ:ÈÐNÑNÔNØ
€UÐ2ÀÐFÑFÔFØ
€UÐ7Ñ8Ô8ð.ð .ñ 9Ô8ñ GÔFñ OÔNð.ð €UÐ:ÈÐOÑOÔOØ
€UÐ7Ñ8Ô8ð'ð 'ñ 9Ô8ñ PÔOð'ð €UÐ:ÈÐOÑOÔOØ
€UÐ7Ñ8Ô8ð'ð 'ñ 9Ô8ñ PÔOð'ð7ð 7ð 7ð*	;ð 	;ð 	;ð@ð @ð @ð @ð @r   rh   c                  ó‚   — e Zd ZdZ edd¬¦  «         ed¦  «         ed¦  «        d„ ¦   «         ¦   «         ¦   «         ZdS )	ÚTestCoordinatorFocusInterlocku@   Kiá»ƒm thá»­ Focus Interlock trÃªn AutonomousMappingCoordinator.z!src.common.is_poe2_window_focusedFr   z&src.common.emergency_release_wasd_keyszsrc.common.send_wasd_directionc                óè  — ddl m}  |¦   «         }|                     dd¦  «        }d}||u }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d	œz  }	d
d|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}}|                     ¦   «          |                     ¦   «          dS )u3   Coordinator tá»« chá»‘i gá»­i WASD khi máº¥t focus.r   )ÚAutonomousMappingCoordinatorrl   r‘   Fr-   rp   rq   rr   rt   r3   N)Ú$tools.autonomous_mapping_coordinatorrÀ   r   r7   r8   r9   r:   r;   r<   r=   r>   r˜   Úassert_called_once)r@   Ú	mock_wasdr»   rˆ   rÀ   Úcoordinatorrq   r‰   rA   rŠ   rD   s              r   Ú1test_coordinator_send_wasd_blocked_when_unfocusedzOTestCoordinatorFocusInterlock.test_coordinator_send_wasd_blocked_when_unfocusedê   s%  € ð
 	VÐUÐUÐUÐUÐUà2Ð2Ñ4Ô4ˆØ×-Ò-¨c°3Ñ7Ô7ˆàÐˆs�eˆ|ÐÐÐÕÔÐÐÐÐˆs�eÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔ�eÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØ×#Ò#Ñ%Ô%Ð%Ø×'Ò'Ñ)Ô)Ð)Ð)Ð)r   N)rc   rd   re   rf   r   rÅ   r   r   r   r¾   r¾   ç   sq   € € € € € ØJÐJà
€UÐ.¸UÐCÑCÔCØ
€UÐ3Ñ4Ô4Ø
€UÐ+Ñ,Ô,ð	*ð 	*ñ -Ô,ñ 5Ô4ñ DÔCð	*ð 	*ð 	*r   r¾   )"rf   Ú
__future__r   Úbuiltinsr9   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter7   ÚosÚunittest.mockr   r   r   ÚpytestÚsrc.common.win32_inputr   r   r	   r
   r   r   r   r   r   r   r   Úsrc.common.win32_windowr   Úfixturer   r   rh   r¾   r   r   r   ú<module>rÑ      sÂ  ððð ð #Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € €	€	€	€	Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0à €€€ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ;Ð :Ð :Ð :Ð :Ð :ð €„˜ÐÑÔð$ð $ñ Ôð$ð<?ð <?ð <?ð <?ð <?ñ <?ô <?ð <?ð~}@ð }@ð }@ð }@ð }@ñ }@ô }@ð }@ð@*ð *ð *ð *ð *ñ *ô *ð *ð *ð *r   