§
    0 ®j÷  ã                   ób   — d Z ddlZddlmc mZ ddlmZm	Z	 ddl
Z
ddlmZ  G d„ d¦  «        ZdS )u³  
AutoPOE2 - Unit Tests for WaystoneLoaderGuard (Doc 48 / Doc 56)
=============================================================
Kiá»ƒm thá»­ chuyÃªn biá»‡t cho module WaystoneLoaderGuard:
- crisp_ctrl_click (Zero Mouse Drag, phÃ­m Ctrl + LMB)
- is_item_stuck_on_cursor (quÃ©t quang há»�c cáº£nh bÃ¡o "You cannot drop that item here")
- recover_cursor_item_to_inventory (giáº£i cá»©u con trá»� dÃ­nh item vÃ  phá»¥c há»“i tráº¡ng thÃ¡i)
é    N)Ú	MagicMockÚpatch)ÚWaystoneLoaderGuardc                   óœ  — e Zd ZdZd„ Z ed¦  «         ed¦  «         ed¦  «        d„ ¦   «         ¦   «         ¦   «         Z edd¬	¦  «        d
„ ¦   «         Zd„ Z edd¬	¦  «         ed¦  «         ed¦  «        d„ ¦   «         ¦   «         ¦   «         Z	 edd¬	¦  «         ed¦  «         ed¦  «        d„ ¦   «         ¦   «         ¦   «         Z
d„ ZdS )ÚTestWaystoneLoaderGuardSuiteu7   Bá»™ kiá»ƒm thá»­ Ä‘á»™c láº­p cho WaystoneLoaderGuard.c                 óz  — t          j        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 )u<   Kiá»ƒm tra cháº¿ Ä‘á»™ mÃ´ phá»�ng tráº£ vá»� True an toÃ n.éd   éÈ   T)Úis_simulated©Úis©z%(py0)s is %(py3)sÚres©Úpy0Úpy3úassert %(py5)sÚpy5N)
r   Úcrisp_ctrl_clickÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanation)Úselfr   Ú@py_assert2Ú@py_assert1Ú@py_format4Ú@py_format6s         ú8C:\Projects\AutoPOE2\tests\test_waystone_loader_guard.pyÚ test_crisp_ctrl_click_simulationz=TestWaystoneLoaderGuardSuite.test_crisp_ctrl_click_simulation   sà   € å!Ô2°3¸È$ÐOÑOÔOˆØÐˆs�dˆ{ÐÐÐÕÔÐÐÐÐˆs�dÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔ�dÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐó    z!ctypes.windll.user32.SetCursorPosz ctypes.windll.user32.keybd_eventz ctypes.windll.user32.mouse_eventc                 óÊ  — d|_         t          j        d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}}|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¦  «         |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}
}	|                     t          j        dddd¦  «         |                     t          j        dddd¦  «         dS )uF   XÃ¡c thá»±c chuá»—i gá»�i Win32 API dá»©t khoÃ¡t, khÃ´ng drag chuá»™t.é   éÃ  é6  ç{®Gáz„?F)Úscreen_xÚscreen_yÚhold_msÚdelay_afterr   Tr   r   r   r   r   r   Né   )ú>=)z2%(py2)s
{%(py2)s = %(py0)s.call_count
} >= %(py5)sÚmock_set_cursor)r   Úpy2r   zassert %(py7)sÚpy7Úmock_keybd_eventÚmock_mouse_eventr   )Úreturn_valuer   r   r   r   r   r   r   r   r   r   Ú
call_countÚassert_any_callÚMOUSEEVENTF_LEFTDOWNÚMOUSEEVENTF_LEFTUP)r   r5   r4   r1   r   r   r    r!   r"   Ú@py_assert4Ú@py_assert3Ú@py_format8s               r#   Ú%test_crisp_ctrl_click_mocked_sequencezBTestWaystoneLoaderGuardSuite.test_crisp_ctrl_click_mocked_sequence   s  € ð
 ()ˆÔ$Ý!Ô2ØØØØØð
ñ 
ô 
ˆð Ðˆs�dˆ{ÐÐÐÕÔÐÐÐÐˆs�dÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔ�dÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐàÔ)Ð.¨QÐ.Ð)¨QÒ.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð)¨QÐ.Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô.ˆÑ.Ô.Ð.Õ.Ô.ˆÑ.Ô.Ð.Ð.Õ.Ô.Ð)Ñ.Ô.Õ.Ô.¨QÑ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ø×'Ò'¨¨cÑ2Ô2Ð2ð  Ô*Ð/¨aÐ/Ð*¨aÒ/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð*¨aÐ/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/ÐÑ/Ô/Ð/Õ/Ô/ÐÑ/Ô/Ð/Ð/Õ/Ô/Ð*Ñ/Ô/Õ/Ô/¨aÑ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/àÔ*Ð/¨aÐ/Ð*¨aÒ/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð*¨aÐ/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/ÐÑ/Ô/Ð/Õ/Ô/ÐÑ/Ô/Ð/Ð/Õ/Ô/Ð*Ñ/Ô/Õ/Ô/¨aÑ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ø×(Ò(Õ)<Ô)QÐSTÐVWÐYZÐ\]Ñ^Ô^Ð^Ø×(Ò(Õ)<Ô)OÐQRÐTUÐWXÐZ[Ñ\Ô\Ð\Ð\Ð\r%   z.src.common.win32_input.post_message_ctrl_clickT)r6   c           	      ó¶  — t          j        ddd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dddd¬¦  «         dS )uU   XÃ¡c thá»±c cháº¿ Ä‘á»™ gá»­i qua PostMessageW ngáº§m khÃ´ng dá»‹ch chuyá»ƒn chuá»™t.r(   r)   g{®Gáz¤?r*   Fi@â T)r+   r,   r-   r.   r   ÚhwndÚuse_post_messager   r   r   r   r   r   N)r-   r.   )r   r   r   r   r   r   r   r   r   r   Úassert_called_once_with)r   Úmock_pm_ctrlr   r   r    r!   r"   s          r#   Ú'test_crisp_ctrl_click_post_message_modezDTestWaystoneLoaderGuardSuite.test_crisp_ctrl_click_post_message_mode1   s  € õ "Ô2ØØØØØØØ!ð
ñ 
ô 
ˆð Ðˆs�dˆ{ÐÐÐÕÔÐÐÐÐˆs�dÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔ�dÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØ×,Ò,¨V°T¸3ÈÐZ^Ð,Ñ_Ô_Ð_Ð_Ð_r%   c                 ó$  — t           j        }d} ||¦  «        }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        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}}t           j        }d	} ||¦  «        }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        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}}t           j        }d
} ||¦  «        }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        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}}dS )uJ   Kiá»ƒm tra xá»­ lÃ½ file khÃ´ng tá»“n táº¡i hoáº·c None -> False an toÃ n.NFr   )z]%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.is_item_stuck_on_cursor
}(%(py4)s)
} is %(py9)sr   )r   r2   Úpy4Úpy6Úpy9zassert %(py11)sÚpy11Ú znon_existent_image_12345.png)
r   Úis_item_stuck_on_cursorr   r   r   r   r   r   r   r   )r   r    r<   Ú@py_assert5Ú@py_assert8Ú@py_assert7Ú@py_format10Ú@py_format12s           r#   Ú1test_is_item_stuck_on_cursor_none_or_missing_filezNTestWaystoneLoaderGuardSuite.test_is_item_stuck_on_cursor_none_or_missing_file@   su  € å"Ô:ÐI¸4ÐIÐ:Ð:¸4Ñ@Ô@ÐIÀEÐIÐ@ÀEÐIÐIÐIÐIÕIÔIÐIÐIÐIÐIÐ@ÀEÐIÑIÔIÐIÕIÔIÑIÔIÐIÐIÕIÔIÕ"ÑIÔIÐIÕIÔIÕ"ÑIÔIÐIÐIÕIÔIÐ:ÑIÔIÕIÔI¸4ÑIÔIÕIÔIÐ@ÑIÔIÕIÔIÀEÑIÔIÐIÐIÑIÐIÐIÐIÐIÐIÑIÐIÕIÕIÔIÐIÑIÔIÑIÔIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIÝ"Ô:ÐG¸2ÐGÐ:Ð:¸2Ñ>Ô>ÐGÀ%ÐGÐ>À%ÐGÐGÐGÐGÕGÔGÐGÐGÐGÐGÐ>À%ÐGÑGÔGÐGÕGÔGÑGÔGÐGÐGÕGÔGÕ"ÑGÔGÐGÕGÔGÕ"ÑGÔGÐGÐGÕGÔGÐ:ÑGÔGÕGÔG¸2ÑGÔGÕGÔGÐ>ÑGÔGÕGÔGÀ%ÑGÔGÐGÐGÑGÐGÐGÐGÐGÐGÑGÐGÕGÕGÔGÐGÑGÔGÑGÔGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÝ"Ô:ÐcÐ;YÐcÐ:Ð:Ð;YÑZÔZÐcÐ^cÐcÐZÐ^cÐcÐcÐcÐcÕcÔcÐcÐcÐcÐcÐZÐ^cÐcÑcÔcÐcÕcÔcÑcÔcÐcÐcÕcÔcÕ"ÑcÔcÐcÕcÔcÕ"ÑcÔcÐcÐcÕcÔcÐ:ÑcÔcÕcÔcÐ;YÑcÔcÕcÔcÐZÑcÔcÕcÔcÐ^cÑcÔcÐcÐcÑcÐcÐcÐcÐcÐcÑcÐcÕcÕcÔcÐcÑcÔcÑcÔcÐcÐcÐcÐcÐcÐcÐcÐcÐcÐcÐcÐcÐcr%   zos.path.existszPIL.Image.openz"src.common.safe_recognize_pil_syncc                 ó’  — dddiddigi|_         t          j        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 )uF   PhÃ¡t hiá»‡n chÃ­nh xÃ¡c popup cáº£nh bÃ¡o váº­t pháº©m dÃ­nh chuá»™t.ÚlinesÚtextzYou cannot drop that item here.z
Map Devicezmock_screenshot.pngTr   r   r   r   r   r   N©r6   r   rK   r   r   r   r   r   r   r   r   ©	r   Úmock_ocrÚmock_img_openÚmock_existsr   r   r    r!   r"   s	            r#   Ú%test_is_item_stuck_on_cursor_detectedzBTestWaystoneLoaderGuardSuite.test_is_item_stuck_on_cursor_detectedF   s  € ð ØÐ:Ð;Ø˜Ð&ðð!
ˆÔõ "Ô9Ð:OÑPÔPˆØÐˆs�dˆ{ÐÐÐÕÔÐÐÐÐˆs�dÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔ�dÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐr%   c                 ó’  — dddiddigi|_         t          j        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   MÃ n hÃ¬nh bÃ¬nh thÆ°á»�ng khÃ´ng cÃ³ popup cáº£nh bÃ¡o.rS   rT   ÚTraversezTier 15 Deserted Waystonezmock_normal_screen.pngFr   r   r   r   r   r   NrU   rV   s	            r#   Ú)test_is_item_stuck_on_cursor_not_detectedzFTestWaystoneLoaderGuardSuite.test_is_item_stuck_on_cursor_not_detectedT   s  € ð Ø˜Ð$ØÐ4Ð5ðð!
ˆÔõ "Ô9Ð:RÑSÔSˆØÐˆs�eˆ|ÐÐÐÕÔÐÐÐÐˆs�eÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔ�eÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐr%   c                 ó*  ‡	‡
— g Š	g Š
ˆ	fd„}ˆ
fd„}t          j        |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}|‰	v }|s—t          j        d|fd|‰	f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        ‰	¦  «        rt          j        ‰	¦  «        nddœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}d}|‰
v }|s—t          j        d|fd|‰
f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        ‰
¦  «        rt          j        ‰
¦  «        nddœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}dS )uW   XÃ¡c thá»±c quy trÃ¬nh hoÃ n tráº£ váº­t pháº©m vá»� Ã´ tÃºi Ä‘á»“ vÃ  phÃ¡t phÃ­m ESC.c                 ó6   •— ‰                      | |f¦  «         d S ©N©Úappend)ÚxÚyÚclicked_coordss     €r#   Ú
mock_clickz`TestWaystoneLoaderGuardSuite.test_recover_cursor_item_to_inventory_execution.<locals>.mock_clickg   s!   ø€ Ø×!Ò! 1 a &Ñ)Ô)Ð)Ð)Ð)r%   c                 ó6   •— ‰                      | |f¦  «         d S r`   ra   )ÚvkÚscÚpressed_keyss     €r#   Úmock_press_keyzdTestWaystoneLoaderGuardSuite.test_recover_cursor_item_to_inventory_execution.<locals>.mock_press_keyj   s!   ø€ Ø×Ò  R Ñ)Ô)Ð)Ð)Ð)r%   r(   r)   r*   )Ú
click_funcÚslot_xÚslot_yÚpress_key_funcr.   Tr   r   Ú	recoveredr   r   r   N)r(   r)   )Úin)z%(py1)s in %(py3)sre   )Úpy1r   )é   r'   rj   )
r   Ú recover_cursor_item_to_inventoryr   r   r   r   r   r   r   r   )r   rf   rk   rp   r   r    r!   r"   Ú@py_assert0re   rj   s            @@r#   Ú/test_recover_cursor_item_to_inventory_executionzLTestWaystoneLoaderGuardSuite.test_recover_cursor_item_to_inventory_executionb   s¶  øø€ àˆØˆð	*ð 	*ð 	*ð 	*ð 	*ð	*ð 	*ð 	*ð 	*ð 	*õ (ÔHØ!ØØØ)Øð
ñ 
ô 
ˆ	ð !Ð ˆy˜DÐ Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆy˜DÐ Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˆyÑ Ô Ð Õ Ô ˆyÑ Ô Ð Ð Õ Ô ˜DÑ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð ØÐ,ˆ{˜nÐ,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,ˆ{˜nÐ,Ñ,Ô,Õ,Ô,ˆ{Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,˜nÑ,Ô,Ð,Õ,Ô,˜nÑ,Ô,Ð,Ð,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,ØÐ+ˆ|˜|Ð+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+ˆ|˜|Ð+Ñ+Ô+Õ+Ô+ˆ|Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+˜|Ñ+Ô+Ð+Õ+Ô+˜|Ñ+Ô+Ð+Ð+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+r%   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r$   r   r>   rD   rQ   rZ   r]   rv   © r%   r#   r   r      s€  € € € € € ØAÐAðð ð ð
 €UÐ.Ñ/Ô/Ø
€UÐ-Ñ.Ô.Ø
€UÐ-Ñ.Ô.ð]ð ]ñ /Ô.ñ /Ô.ñ 0Ô/ð]ð, €UÐ;È$ÐOÑOÔOð`ð `ñ PÔOð`ðdð dð dð €UÐ¨$Ð/Ñ/Ô/Ø
€UÐÑÔØ
€UÐ/Ñ0Ô0ð	ð 	ñ 1Ô0ñ Ôñ 0Ô/ð	ð €UÐ¨$Ð/Ñ/Ô/Ø
€UÐÑÔØ
€UÐ/Ñ0Ô0ð	ð 	ñ 1Ô0ñ Ôñ 0Ô/ð	ð,ð ,ð ,ð ,ð ,r%   r   )rz   Úbuiltinsr   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter   Úunittest.mockr   r   ÚpytestÚ(src.assistant_tool.waystone_loader_guardr   r   r{   r%   r#   ú<module>rƒ      s›   ððð ð € € € € € € € € € € € € Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ø €€€à HÐ HÐ HÐ HÐ HÐ Hðf,ð f,ð f,ð f,ð f,ñ f,ô f,ð f,ð f,ð f,r%   