§
    yžªjx)  ã            
       ó   — d Z ddlZddlZddlZddlZddlZddlZddlZej         	                    dej         
                    ej                             ej                             e¦  «        d¦  «        ¦  «        ¦  «         ddlmZ ddlmZmZ  G d„ dej        ¦  «        Z G d„ dej        ¦  «        Zed	k    r ej        ¦   «          dS dS )
uó  Bá»™ kiá»ƒm thá»­ Ä‘Æ¡n vá»‹ cho thÆ° viá»‡n dÃ¹ng chung src/common/ vÃ  cÃ¡c báº£n vÃ¡ P0 Python.

Kiá»ƒm tra:
1. src/common/win32_window: attach_to_default_desktop, find_poe2_window, get_client_rect, get_dpi_scale.
2. src/common/win32_process: is_poe2_running, get_poe2_pid, find_process_by_name.
3. src/common/screen_capture: capture_rect_bitblt, capture_window_bitblt, capture_window_print.
4. src/common/audio_feedback: beep_bot_toggle, beep_panic, beep_notification.
5. src/common/item_types: ItemData, ItemRarity, AffixData, AffixType.
6. src/common/logging_util: get_logger, log_exception.
7. CoreShmBridge Telemetry: npcs_count, area_code, area_seed, read_limit 256.
8. CÃ¡c trÆ°á»�ng há»£p biÃªn win32_window vÃ  win32_process trong src/common.
é    Nz..)ÚCoreTelemetrySnapshotÚPlayerTelemetryc                   ó6   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	dS )	ÚTestCommonLibraryuM   Kiá»ƒm chá»©ng hoáº¡t Ä‘á»™ng cá»§a toÃ n bá»™ cÃ¡c module trong src/common/.c                 óú  — t          j        ¦   «         }|                      |d up|d u ¦  «         t          j        dg¦  «        }|                      |t
          ¦  «         t          j        |¦  «        }|                      t          |¦  «        d¦  «         |D ]}|                      |t
          ¦  «         Œt          j	        d¦  «        }|                      |t          ¦  «         |                      |d¦  «         d S )NÚNonExistentWindowTitle12345é   r   ç      à?)ÚcommonÚattach_to_default_desktopÚ
assertTrueÚfind_poe2_windowÚassertIsInstanceÚintÚget_client_rectÚassertEqualÚlenÚget_dpi_scaleÚfloatÚassertGreaterEqual)ÚselfÚdeskÚhwndÚrectÚvalÚscales         ú)C:\Projects\AutoPOE2\tests\test_common.pyÚtest_win32_window_functionsz-TestCommonLibrary.test_win32_window_functions"   sö   € åÔ/Ñ1Ô1ˆØ�Š˜ DÐ(Ð8¨D°D¨LÑ9Ô9Ð9õ Ô&Ð(EÐ'FÑGÔGˆØ×Ò˜d¥CÑ(Ô(Ð(õ Ô% dÑ+Ô+ˆØ×Ò�˜T™œ AÑ&Ô&Ð&Øð 	,ð 	,ˆCØ×!Ò! #¥sÑ+Ô+Ð+Ð+õ Ô$ QÑ'Ô'ˆØ×Ò˜e¥UÑ+Ô+Ð+Ø×Ò  sÑ+Ô+Ð+Ð+Ð+ó    c                 ó�  — t          j        ¦   «         }t          j        d¦  «        }|st          j        d¦  «        }|                      |t
          ¦  «         t          j        ¦   «         }|                      |t          ¦  «         t          j        ¦   «         }|  	                    |d u pt          |t          ¦  «        ¦  «         d S )Nz
python.exeÚpython)ÚosÚgetpidr   Úfind_process_by_namer   ÚlistÚis_poe2_runningÚboolÚget_poe2_pidr   Ú
isinstancer   )r   Úcurrent_pidÚpidsÚrunningÚpoe_pids        r   Útest_win32_process_functionsz.TestCommonLibrary.test_win32_process_functions6   s¬   € å”i‘k”kˆåÔ*¨<Ñ8Ô8ˆØð 	9ÝÔ.¨xÑ8Ô8ˆDØ×Ò˜d¥DÑ)Ô)Ð)õ Ô(Ñ*Ô*ˆØ×Ò˜g¥tÑ,Ô,Ð,õ Ô%Ñ'Ô'ˆØ�Š˜ 4˜ÐC­:°g½sÑ+CÔ+CÑDÔDÐDÐDÐDr   c                 ó  — t          j        dddd¦  «        }|                      |¦  «         t          j        d¦  «        }|                      |¦  «         t          j        d¦  «        }|                      |¦  «         d S )Nr   iöÿÿÿ)r   Úcapture_rect_bitbltÚassertIsNoneÚcapture_window_bitbltÚcapture_window_print)r   Úimg_invalidÚ	img_hwnd0Ú
img_print0s       r   Ú test_screen_capture_safe_cleanupz2TestCommonLibrary.test_screen_capture_safe_cleanupG   s~   € åÔ0°°A°s¸CÑ@Ô@ˆØ×Ò˜+Ñ&Ô&Ð&õ Ô0°Ñ3Ô3ˆ	Ø×Ò˜)Ñ$Ô$Ð$õ Ô0°Ñ3Ô3ˆ
Ø×Ò˜*Ñ%Ô%Ð%Ð%Ð%r   c                 ó¢   — t          j        d¦  «         t          j        d¦  «         t          j        ¦   «          t          j        ¦   «          d S )NTF)r   Úbeep_bot_toggleÚ
beep_panicÚbeep_notification)r   s    r   Ú test_audio_feedback_non_blockingz2TestCommonLibrary.test_audio_feedback_non_blockingT   sH   € åÔ˜tÑ$Ô$Ð$ÝÔ˜uÑ%Ô%Ð%ÝÔÑÔÐÝÔ Ñ"Ô"Ð"Ð"Ð"r   c                 ó  — t          j        dt           j        j        ddddg¬¦  «        }|                      |j        d¦  «         |                      |j        t           j        j        ¦  «         t          j        ddd	t           j        j	        d
ddd|g¬¦	  «	        }|  
                    |j        ¦  «         |                      |j        ¦  «         |                      |j        ¦  «         |                      |j        d¦  «         d S )Nz+75 to maximum Lifeé   ÚVigorousÚlifeg     ÀR@)ÚtextÚ
affix_typeÚtierÚnameÚcategoryÚvaluesz	Doom StarzExpert Vaal CuirasszBody ArmourséT   é   Té   )	rD   Ú	base_typeÚ
item_classÚrarityÚ
item_levelÚqualityÚ
identifiedÚsocketsÚ	explicits)r   Ú	AffixDataÚ	AffixTypeÚPREFIXr   rC   rB   ÚItemDataÚ
ItemRarityÚRAREr   Úis_rareÚassertFalseÚ	is_normalÚ	is_uniqueÚtotal_affixes_count)r   Úaffix1Úitems      r   Útest_item_typesz!TestCommonLibrary.test_item_types[   s  € åÔ!Ø&ÝÔ'Ô.ØØØØ�6ð
ñ 
ô 
ˆð 	×Ò˜œ aÑ(Ô(Ð(Ø×Ò˜Ô*­FÔ,<Ô,CÑDÔDÐDõ ŒØØ+Ø%ÝÔ$Ô)ØØØØØ�hð

ñ 

ô 

ˆð 	�Š˜œÑ%Ô%Ð%Ø×Ò˜œÑ(Ô(Ð(Ø×Ò˜œÑ(Ô(Ð(Ø×Ò˜Ô1°1Ñ5Ô5Ð5Ð5Ð5r   c                 ó  — t          j        dt          j        ¬¦  «        }|                      |j        t          j        ¦  «         	 t          d¦  «        ‚# t          $ r!}t          j        |d|¦  «         Y d }~d S d }~ww xY w)NÚ
TestLogger)ÚlevelzTest error for loggingu#   Ngá»¯ cáº£nh kiá»ƒm thá»­ unit test)r   Ú
get_loggerÚloggingÚDEBUGr   rb   Ú
ValueErrorÚlog_exception)r   ÚloggerÚerrs      r   Útest_logging_utilz#TestCommonLibrary.test_logging_utily   s”   € ÝÔ" <µw´}ÐEÑEÔEˆØ×Ò˜œ¥w¤}Ñ5Ô5Ð5ð	UÝÐ5Ñ6Ô6Ð6øÝð 	Uð 	Uð 	UÝÔ  Ð)NÐPSÑTÔTÐTÐTÐTÐTÐTÐTÐTøøøøð	Uøøøs   ÁA Á
BÁ A<Á<BN)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r.   r7   r<   r_   rj   © r   r   r   r      s|   € € € € € ØWÐWð,ð ,ð ,ð(Eð Eð Eð"&ð &ð &ð#ð #ð #ð6ð 6ð 6ð<Uð Uð Uð Uð Ur   r   c                   ó6   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	dS )	ÚTestP0PythonFixesu6   Kiá»ƒm chá»©ng cÃ¡c báº£n sá»­a lá»—i P0 phÃ­a Python.c                 óþ   — t          dddt          dd¬¦  «        dddd	d
dddd¬¦  «        }|                      |j        d
¦  «         |                      |j        d¦  «         |                      |j        d¦  «         dS )ua   Kiá»ƒm chá»©ng CoreTelemetrySnapshot lÆ°u trá»¯ Ä‘áº§y Ä‘á»§ area_code, area_seed vÃ  npcs_count.Té*   iè  iô  )Ú
current_hpÚmax_hpéd   é(   rH   é   é   z
Omen RidgeéH   ÚAct3_Town_01i±hÞ:)Ú	is_onlineÚsnapshot_idÚtimestamp_msÚplayerÚentity_countÚmonsters_countÚitems_countÚportals_countÚ
npcs_countÚ	area_nameÚ
area_levelÚ	area_codeÚ	area_seedN)r   r   r   r„   r‡   rˆ   )r   Úsnaps     r   Ú1test_core_telemetry_snapshot_area_and_npcs_fieldszCTestP0PythonFixes.test_core_telemetry_snapshot_area_and_npcs_fields‡   sš   € å$ØØØÝ"¨c¸#Ð>Ñ>Ô>ØØØØØØ"ØØ$Øð
ñ 
ô 
ˆð 	×Ò˜œ¨"Ñ-Ô-Ð-Ø×Ò˜œ¨Ñ8Ô8Ð8Ø×Ò˜œ¨Ñ3Ô3Ð3Ð3Ð3r   c                 ó  — t          j        d¦  «        }|                      |d¦  «         t          j        d¦  «        }|                      |d¦  «         t          j        g ¦  «        }|                      |t          ¦  «         dS )uN   Kiá»ƒm chá»©ng cÃ¡c trÆ°á»�ng há»£p biÃªn cá»§a win32_window trong src/common.r   )r   r   r   r   r
   N)r   r   r   r   r   r   r   r   )r   r   r   r   s       r   Ú#test_common_win32_window_edge_casesz5TestP0PythonFixes.test_common_win32_window_edge_casesœ   s€   € õ Ô% aÑ(Ô(ˆØ×Ò˜˜|Ñ,Ô,Ð,õ Ô$ QÑ'Ô'ˆØ×Ò  sÑ+Ô+Ð+õ Ô& rÑ*Ô*ˆØ×Ò˜d¥CÑ(Ô(Ð(Ð(Ð(r   c                 ó  — t          j        d¦  «        }|                      |g ¦  «         t          j        ¦   «         }t          j        ¦   «         }|r|                      |¦  «         dS |                      |¦  «         dS )uO   Kiá»ƒm chá»©ng cÃ¡c trÆ°á»�ng há»£p biÃªn cá»§a win32_process trong src/common.z"non_existent_fake_process_9999.exeN)r   r$   r   r&   r(   ÚassertIsNotNoner1   )r   r+   r,   Úpids       r   Ú$test_common_win32_process_edge_casesz6TestP0PythonFixes.test_common_win32_process_edge_casesª   s…   € õ Ô*Ð+OÑPÔPˆØ×Ò˜˜rÑ"Ô"Ð"õ Ô(Ñ*Ô*ˆÝÔ!Ñ#Ô#ˆØð 	#Ø× Ò  Ñ%Ô%Ð%Ð%Ð%à×Ò˜cÑ"Ô"Ð"Ð"Ð"r   c                 ó”  — t          j        ¦   «         }|                      |t          ¦  «         |                      t          |¦  «        d¦  «         |                      |d         t          ¦  «         |                      |d         t          ¦  «         |                      t           j        d¦  «         |                      t           j        d¦  «         |                      t           j	        d¦  «         |                      t           j
        d¦  «         |                      t           j        d¦  «         |                      t           j        d	¦  «         |                      t           j        d
¦  «         |                      t           j        d¦  «         |                      t!          t           j        ¦  «        ¦  «         |                      t!          t           j        ¦  «        ¦  «         |                      t!          t           j        ¦  «        ¦  «         |                      t!          t           j        ¦  «        ¦  «         |                      t!          t           j        ¦  «        ¦  «         |                      t!          t           j        ¦  «        ¦  «         |                      t!          t           j        ¦  «        ¦  «         dS )uF   Kiá»ƒm chá»©ng cÃ¡c hÃ m vÃ  háº±ng sá»‘ Win32 Input trong src/common.rx   r   r>   éW   éA   éS   éD   é    éI   éU   é¾   N)r   Úget_cursor_posr   Útupler   r   r   ÚVK_WÚVK_AÚVK_SÚVK_DÚVK_SPACEÚVK_IÚVK_UÚVK_OEM_PERIODr   ÚcallableÚclickÚhoverÚ
ctrl_clickÚ	press_keyÚdismiss_modalsÚsend_wasd_directionÚmouse_wheel)r   Úposs     r   Útest_common_win32_inputz)TestP0PythonFixes.test_common_win32_input¸   s  € õ Ô#Ñ%Ô%ˆØ×Ò˜c¥5Ñ)Ô)Ð)Ø×Ò�˜S™œ 1Ñ%Ô%Ð%Ø×Ò˜c !œf¥cÑ*Ô*Ð*Ø×Ò˜c !œf¥cÑ*Ô*Ð*ð 	×Ò�œ dÑ+Ô+Ð+Ø×Ò�œ dÑ+Ô+Ð+Ø×Ò�œ dÑ+Ô+Ð+Ø×Ò�œ dÑ+Ô+Ð+Ø×Ò�œ¨$Ñ/Ô/Ð/Ø×Ò�œ dÑ+Ô+Ð+Ø×Ò�œ dÑ+Ô+Ð+Ø×Ò�Ô-¨tÑ4Ô4Ð4ð 	�Š�¥¤Ñ.Ô.Ñ/Ô/Ð/Ø�Š�¥¤Ñ.Ô.Ñ/Ô/Ð/Ø�Š�¥Ô!2Ñ3Ô3Ñ4Ô4Ð4Ø�Š�¥Ô!1Ñ2Ô2Ñ3Ô3Ð3Ø�Š�¥Ô!6Ñ7Ô7Ñ8Ô8Ð8Ø�Š�¥Ô!;Ñ<Ô<Ñ=Ô=Ð=Ø�Š�¥Ô!3Ñ4Ô4Ñ5Ô5Ð5Ð5Ð5r   c                 óz  — ddl m} |                      t          j        d¦  «        ¦  «         |                      t          j        d¦  «        ¦  «         |                      t          j        dd¦  «        ¦  «         |                      t          j	        dd„ ¦  «        g ¦  «         t          j
        dd¬¦  «        }|                      |d¦  «         |                     dd	d
¬¦  «        }t          dd¦  «        D ]3}t          dd¦  «        D ] }|                     d|z   d|z   fd¦  «         Œ!Œ4t          j	        |d„ dddd¬¦  «        }|                      t          |¦  «        d¦  «         |d         \  }}}	|                      |d¦  «         |                      |d¦  «         |                      |	d¦  «         dS )uL   Kiá»ƒm chá»©ng cÃ¡c hÃ m thá»‹ giÃ¡c mÃ¡y tÃ­nh vÃ  WinOCR trong src/common.r   )ÚImageNÚTRAVERSEc                 ó   — dS )NTro   ©ÚrÚgÚbs      r   ú<lambda>z:TestP0PythonFixes.test_common_vision_ocr.<locals>.<lambda>Ü   s   € È$€ r   )i—  i…  )Úfallback_posÚRGB)éÈ   r¹   )r   r   r   )Úcoloréþÿÿÿé   rv   )r   éÿ   r   c                 ó&   — |dk    o| dk     o|dk     S )Nr¹   é2   ro   r²   s      r   r¶   z:TestP0PythonFixes.test_common_vision_ocr.<locals>.<lambda>ë   s   € ¨A°ªGÐ,I¸¸BºÐ,IÀ1ÀrÂ6€ r   r>   é
   ry   )Úcolor_predicateÚstepÚcluster_radius_xÚcluster_radius_yÚmin_cluster_sizeé   )ÚPILr¯   rY   r   Úis_atlas_ui_openÚis_inventory_openr1   Úfind_button_by_textr   Úfind_color_clustersÚfind_map_device_screen_posÚnewÚrangeÚputpixelr   )
r   r¯   r¬   Útest_imgÚdyÚdxÚclustersÚcxÚcyÚcounts
             r   Útest_common_vision_ocrz(TestP0PythonFixes.test_common_vision_ocrÔ   sä  € àÐÐÐÐÐð 	×Ò�Ô0°Ñ6Ô6Ñ7Ô7Ð7Ø×Ò�Ô1°$Ñ7Ô7Ñ8Ô8Ð8Ø×Ò�&Ô4°T¸:ÑFÔFÑGÔGÐGØ×Ò�Ô3°DÐ:NÐ:NÑOÔOÐQSÑTÔTÐTõ Ô/°À;ÐOÑOÔOˆØ×Ò˜˜kÑ*Ô*Ð*ð —9’9˜U J°i�9Ñ@Ô@ˆå˜˜A‘,”,ð 	Eð 	EˆBÝ˜B ‘l”lð Eð E�Ø×!Ò! 3¨¡8¨S°2©XÐ"6¸ÑDÔDÐDÐDðEõ Ô-ØØIÐIØØØØð
ñ 
ô 
ˆð 	×Ò�˜X™œ¨Ñ*Ô*Ð*Ø  œ‰ˆˆB�Ø×Ò˜˜SÑ!Ô!Ð!Ø×Ò˜˜SÑ!Ô!Ð!Ø×Ò˜ Ñ#Ô#Ð#Ð#Ð#r   c                 ó8  — t          j        ddd¦  «        \  }}|                      |d¦  «         |                      |d¦  «         t          j        ddd¦  «        }|                      |¦  «         t          j        ddd¦  «        }|                      |¦  «         t          j        ddd¦  «        }|                      |¦  «         t          j        dd¦  «        }|                      |¦  «         t          j        d¦  «        }|                      |¦  «         d S )Nr   é–   éú   rv   r–   )	r   Úclient_to_screen_posr   Úpost_message_clickrY   Úpost_message_ctrl_clickÚpost_message_hoverÚpost_message_keyÚsnap_window_to_half)r   ÚxÚyÚress       r   Útest_background_input_functionsz1TestP0PythonFixes.test_background_input_functions÷   s  € åÔ*¨1¨c°3Ñ7Ô7‰ˆˆ1Ø×Ò˜˜CÑ Ô Ð Ø×Ò˜˜CÑ Ô Ð õ Ô'¨¨3°Ñ4Ô4ˆØ×Ò˜ÑÔÐõ Ô,¨Q°°SÑ9Ô9ˆØ×Ò˜ÑÔÐõ Ô'¨¨3°Ñ4Ô4ˆØ×Ò˜ÑÔÐõ Ô% a¨Ñ.Ô.ˆØ×Ò˜ÑÔÐõ Ô(¨Ñ+Ô+ˆØ×Ò˜ÑÔÐÐÐr   N)
rk   rl   rm   rn   rŠ   rŒ   r�   r­   r×   rä   ro   r   r   rq   rq   „   su   € € € € € Ø@Ð@ð4ð 4ð 4ð*)ð )ð )ð#ð #ð #ð6ð 6ð 6ð8!$ð !$ð !$ðFð ð ð ð r   rq   Ú__main__)rn   Úiord   Úmmapr"   ÚstructÚsysÚunittestÚpathÚinsertÚabspathÚjoinÚdirnameÚ__file__Ú
src.commonr   Ú"src.assistant_tool.core_shm_bridger   r   ÚTestCaser   rq   rk   Úmainro   r   r   ú<module>rõ      sf  ððð ð 
€	€	€	Ø €€€Ø €€€Ø 	€	€	€	Ø €€€Ø 
€
€
€
Ø €€€à „‡‚��2”7—?’? 2¤7§<¢<°´·²ÀÑ0IÔ0IÈ4Ñ#PÔ#PÑQÔQÑ RÔ RÐ Rà Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ðbUð bUð bUð bUð bU˜Ô)ñ bUô bUð bUðJKð Kð Kð Kð K˜Ô)ñ Kô Kð Kð\ ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   