§
    c|£jPH  ã            
       ó
  — d Z ddlZddlZ eej        d¦  «        rej                             d¬¦  «         ej                             dej                             ej         	                    ej         
                    e¦  «        d¦  «        ¦  «        ¦  «         ddlmZ ddlmZ dd	lmZ d
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z e!dk    r£ e¦   «           e¦   «           e¦   «           e¦   «           e¦   «           e¦   «           e¦   «           e¦   «           e¦   «           e¦   «           e¦   «           e¦   «           e¦   «           e¦   «           e ¦   «           e"d¦  «         dS dS )z<
Unit Tests cho POE2 Realtime Trading Advisor & Overlay HUD
é    NÚreconfigureúutf-8©Úencodingz..)ÚGoldTracker)Ú
LogWatcher)ÚMarketAdvisorc                  óŽ  — t          d¦  «        } | j        dk    sJ ‚|                      d¦  «        du sJ ‚|                      d¦  «        dk    sJ ‚|                      d¦  «        dk    sJ ‚|                      d¦  «        }|du sJ ‚| j        dk    sJ ‚|                      d¦  «         | j        dk    sJ ‚t          d	¦  «         d S )
NiPÃ  ÚPINNACLE_KEYTiÂ  éo   iŽÁ  i'  ižè  z [PASS] test_gold_tracker passed.)r   Úcurrent_goldÚcan_afford_taxÚget_tax_forÚmax_trades_affordableÚ
deduct_taxÚadd_goldÚprint)ÚgtÚoks     ú1C:\Projects\AutoPOE2\tests\test_assistant_tool.pyÚtest_gold_trackerr      sí   € Ý	�UÑ	Ô	€BØŒ?˜eÒ#Ð#Ð#Ð#Ø×Ò˜^Ñ,Ô,°Ð4Ð4Ð4Ð4Ø�>Š>˜.Ñ)Ô)¨SÒ0Ð0Ð0Ð0Ø×#Ò# NÑ3Ô3°|ÒCÐCÐCÐCð 
�Š�~Ñ	&Ô	&€BØ�ˆ:ˆ:ˆ:ˆ:ØŒ?˜kÒ)Ð)Ð)Ð)ð ‡K‚K�ÑÔÐØŒ?Ð1Ò1Ð1Ð1Ð1Ý	Ð
,Ñ-Ô-Ð-Ð-Ð-ó    c                  ó”  — t          d¦  «        } t          | ¦  «        }|                     ¦   «         }t          |¦  «        dk    sJ ‚t	          d„ |D ¦   «         ¦  «        }|j        du sJ ‚|                      d¦  «         |                     ¦   «         }t	          d„ |D ¦   «         ¦  «        }|j        du sJ ‚t          d¦  «         d S )	Néè  é   c              3   ó0   K  — | ]}|j         d k    ¯|V — ŒdS ©ÚTRADE_BULK_ORBSN©Úid©Ú.0Úts     r   ú	<genexpr>z&test_market_advisor.<locals>.<genexpr>-   s/   è è € ÐEÐE˜A¨1¬4Ð3DÒ+DÐ+D�aÐ+DÐ+DÐ+DÐ+DÐEÐEr   Fi † c              3   ó0   K  — | ]}|j         d k    ¯|V — ŒdS r   r   r!   s     r   r$   z&test_market_advisor.<locals>.<genexpr>3   s/   è è € ÐUÐU A¸1¼4ÐCTÒ;TÐ;T˜aÐ;TÐ;TÐ;TÐ;TÐUÐUr   Tz"[PASS] test_market_advisor passed.)r   r	   Úget_market_opportunitiesÚlenÚnextÚis_affordableÚset_goldr   )r   ÚmaÚtradesÚ
bulk_tradeÚtrades_updatedÚbulk_trade_updateds         r   Útest_market_advisorr0   $   sã   € Ý	�TÑ	Ô	€BÝ	�rÑ	Ô	€Bð ×(Ò(Ñ*Ô*€FÝˆv‰;Œ;˜!ÒÐÐÐõ ÐEÐE ÐEÑEÔEÑEÔE€JØÔ# uÐ,Ð,Ð,Ð,ð ‡K‚K�ÑÔÐØ×0Ò0Ñ2Ô2€NÝÐUÐU¨ÐUÑUÔUÑUÔUÐØÔ+¨tÐ3Ð3Ð3Ð3Ý	Ð
.Ñ/Ô/Ð/Ð/Ð/r   c                  óØ  — t          d¦  «        } d}|                      |¦  «        }|€J ‚|j        dk    sJ ‚d|j        v sJ ‚d|j        v sJ ‚d}|                      |¦  «        }|€J ‚|j        dk    sJ ‚|j        dk    sJ ‚d	}|                      |¦  «        }|€J ‚|j        d
k    sJ ‚d|j        v sJ ‚|j        dk    sJ ‚d}|                      |¦  «        }|€J ‚|j        dk    sJ ‚|j        dk    sJ ‚d}	|                      |	¦  «        }
|
€J ‚|
j        d
k    sJ ‚|
j        dk    sJ ‚dD ]+}d|› d�}|                      |¦  «        �J d|› d�¦   «         ‚Œ,t          d¦  «         d S )Nz	dummy.txtz�2026/09/05 20:00:00 120469812 91c6cc1 [INFO Client 25032] @From Exile_Master: Hi, I'd like to buy your Sekhema Key for 4.6 divine in StandardÚWHISPER_TRADEÚExile_Masterz
4.6 divinez~2026/09/05 19:56:52 120530718 3ef23348 [INFO Client 25032] $DeyyuS_Sekhema: WTS 4th Trial of the Sekhemas - AFK run - 2 DivineÚ
TRADE_CHATÚDeyyuS_Sekhemaz\2026/09/05 19:55:52 120470937 7fbd1225 [INFO Client 25032] [SCENE] Set Source [The Grelwood]ÚZONE_CHANGEzThe Grelwoodz2026/09/10 18:29:57 547320703 2caa229f [DEBUG Client 36104] Generating level 77 area "ChayulaLeague_Tower" with seed 3565528473ÚAREA_GENERATEDÚChayulaLeague_Towerz]2026/09/10 18:29:57 547321000 7fbd1225 [INFO Client 36104] [SCENE] Set Source [Hive Fortress]úHive Fortress)zAct 1zAct 2zAct 3zAct 4ÚAtlasz(null)z	(unknown)zO2026/09/05 19:55:52 120470937 7fbd1225 [INFO Client 25032] [SCENE] Set Source [ú]zScene u    pháº£i bá»‹ bá»� qua!z'[PASS] test_log_watcher_parsing passed.)r   Ú
parse_lineÚ
event_typeÚsenderÚmessageÚ	area_nameÚ	area_coder   )ÚlwÚline_whisperÚevent1Ú
line_tradeÚevent2Ú	line_zoneÚevent3Úline_genÚ	event_genÚ	line_hiveÚ
event_hiveÚignoredÚline_ignoreds                r   Útest_log_watcher_parsingrO   7   s  € Ý	�KÑ	 Ô	 €Bð c€LØ�]Š]˜<Ñ(Ô(€FØÐÐÐØÔ Ò/Ð/Ð/Ð/Ø˜Vœ]Ð*Ð*Ð*Ð*Ø˜6œ>Ð)Ð)Ð)Ð)ð R€JØ�]Š]˜:Ñ&Ô&€FØÐÐÐØÔ Ò,Ð,Ð,Ð,ØŒ=Ð,Ò,Ð,Ð,Ð,ð o€IØ�]Š]˜9Ñ%Ô%€FØÐÐÐØÔ Ò-Ð-Ð-Ð-Ø˜Vœ^Ð+Ð+Ð+Ð+ØÔ˜~Ò-Ð-Ð-Ð-ð Q€HØ—’˜hÑ'Ô'€IØÐ Ð Ð ØÔÐ#3Ò3Ð3Ð3Ð3ØÔÐ"7Ò7Ð7Ð7Ð7ào€IØ—’˜yÑ)Ô)€JØÐ!Ð!Ð!ØÔ  MÒ1Ð1Ð1Ð1ØÔ ?Ò2Ð2Ð2Ð2ð Xð ]ð ]ˆØsÐipÐsÐsÐsˆØ�}Š}˜\Ñ*Ô*Ð2Ð2Ð4\¸WÐ4\Ð4\Ð4\Ñ2Ô2Ð2Ð2å	Ð
3Ñ4Ô4Ð4Ð4Ð4r   c                  óì  — ddl } |                      ¦   «         5 }t          j                             |d¦  «        }t          |dd¬¦  «        5 }|                     d¦  «         |                     d¦  «         |                     d	¦  «         |                     d
¦  «         |                     d¦  «         |                     d¦  «         |                     d¦  «         |                     d¦  «         ddd¦  «         n# 1 swxY w Y   t          |¦  «        }|                     ¦   «         }|€J ‚|j	        dk    sJ ‚|j
        dk    sJ ‚	 ddd¦  «         n# 1 swxY w Y   t          d¦  «         dS )u\   Seed Ä‘uÃ´i Client.txt: overlay Act 2/(null) bá»‹ bá»�, Hive Fortress lÃ  zone hiá»‡n táº¡i.r   Nú
Client.txtÚwr   r   zV2026/09/10 18:20:23 546746515 7fbd1225 [INFO Client 36104] [SCENE] Set Source [Act 2]
zW2026/09/10 18:20:24 546747750 7fbd1225 [INFO Client 36104] [SCENE] Set Source [(null)]
zb2026/09/10 18:20:24 546747750 7fbd1225 [INFO Client 36104] [SCENE] Set Source [Shoreline Hideout]
z€2026/09/10 18:29:57 547320703 2caa229f [DEBUG Client 36104] Generating level 77 area "ChayulaLeague_Tower" with seed 3565528473
zW2026/09/10 18:29:57 547321000 7fbd1225 [INFO Client 36104] [SCENE] Set Source [(null)]
z^2026/09/10 18:29:57 547321000 7fbd1225 [INFO Client 36104] [SCENE] Set Source [Hive Fortress]
zw2026/09/10 18:29:59 547323234 4cba6a94 [INFO Client 36104] [LOADING SCREEN] (Hive Fortress) Duration = 2.65302 seconds
zV2026/09/10 18:45:00 338000000 7fbd1225 [INFO Client 36104] [SCENE] Set Source [Atlas]
r6   r9   z9[PASS] test_log_watcher_seed_latest_playable_zone passed.)ÚtempfileÚTemporaryDirectoryÚosÚpathÚjoinÚopenÚwriter   Úseed_latest_playable_zoner=   r@   r   )rS   ÚtmprV   ÚfrB   Úseededs         r   Ú*test_log_watcher_seed_latest_playable_zoner^   f   s  € à€O€O€Oà	×	$Ò	$Ñ	&Ô	&ð 3¨#ÝŒw�|Š|˜C Ñ.Ô.ˆÝ�$˜ gÐ.Ñ.Ô.ð 	o°!Ø�GŠGÐmÑnÔnÐnØ�GŠGÐnÑoÔoÐoØ�GŠGÐyÑzÔzÐzØ�GŠGð  Xñ  Yô  Yð  YØ�GŠGÐnÑoÔoÐoØ�GŠGÐuÑvÔvÐvØ�GŠGð  Oñ  Pô  Pð  PØ�GŠGÐmÑnÔnÐnð	oð 	oð 	oñ 	oô 	oð 	oð 	oð 	oð 	oð 	oð 	oøøøð 	oð 	oð 	oð 	oõ ˜ÑÔˆØ×-Ò-Ñ/Ô/ˆØÐ!Ð!Ð!ØÔ  MÒ1Ð1Ð1Ð1ØÔ ?Ò2Ð2Ð2Ð2Ð2ð!3ð 3ð 3ñ 3ô 3ð 3ð 3ð 3ð 3ð 3ð 3øøøð 3ð 3ð 3ð 3õ" 
Ð
EÑFÔFÐFÐFÐFs7   ™3EÁB)DÃ5EÄD	ÄEÄD	Ä	AEÅEÅ!Ec                  óÐ  — dd l } ddlm} t          |j        ¦  «        }	 |                      ¦   «         5 }t          j                             |d¦  «        }t          |dd¬¦  «        5 }| 
                    d¦  «         d d d ¦  «         n# 1 swxY w Y   |t          j                             |dd¦  «        g|_        |                     ¦   «         |k    sJ ‚t          j                             |d	¦  «        }t          j        |d
¬¦  «         t          j                             |d¦  «        }t          |dd¬¦  «        5 }| 
                    d¦  «         d d d ¦  «         n# 1 swxY w Y   t          j                             |d¦  «        g|_        |                     ¦   «         |k    sJ ‚	 d d d ¦  «         n# 1 swxY w Y   ||_        n# ||_        w xY wt          d¦  «         d S )Nr   )ÚConfigrQ   rR   r   r   ÚxÚmissingÚotherT)Úexist_okzLatestClient.txtÚyz([PASS] test_find_poe2_client_log passed.)rS   Úsrc.assistant_tool.configr`   ÚlistÚDEFAULT_LOG_PATHSrT   rU   rV   rW   rX   rY   Úfind_poe2_client_logÚmakedirsr   )rS   r`   Úoriginalr[   Úclientr\   Úmissing_dirÚlatests           r   Útest_find_poe2_client_logro   ~   s„  € Ø€O€O€OØ0Ð0Ð0Ð0Ð0Ð0å�FÔ,Ñ-Ô-€Hð,Ø×(Ò(Ñ*Ô*ð 	;¨cÝ”W—\’\ # |Ñ4Ô4ˆFÝ�f˜c¨GÐ4Ñ4Ô4ð ¸Ø—’˜‘”�ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð à(.µ´·²¸SÀ)È\Ñ0ZÔ0ZÐ'[ˆFÔ$Ø×.Ò.Ñ0Ô0°FÒ:Ð:Ð:Ð:åœ'Ÿ,š, s¨GÑ4Ô4ˆKÝŒK˜¨dÐ3Ñ3Ô3Ð3Ý”W—\’\ +Ð/AÑBÔBˆFÝ�f˜c¨GÐ4Ñ4Ô4ð ¸Ø—’˜‘”�ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð å(*¬¯ª°[À,Ñ(OÔ(OÐ'PˆFÔ$Ø×.Ò.Ñ0Ô0°FÒ:Ð:Ð:Ð:Ð:ð	;ð 	;ð 	;ñ 	;ô 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;øøøð 	;ð 	;ð 	;ð 	;ð $,ˆÔ Ð ø 8ˆÔ Ð+Ð+Ð+Ð+Ý	Ð
4Ñ5Ô5Ð5Ð5Ð5sx    G ´3F8Á'B	Á=F8Â	B	ÂF8ÂB	ÂB-F8Ä>E ÅF8Å E$	Å$F8Å'E$	Å(AF8Æ,G Æ8F<Æ<G Æ?F<Ç G Ç	Gc                  ó  — ddl m}  d}|                      |d¬¦  «        }|€J ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        d	k    sJ ‚d
|j        v sJ ‚|j        dk    sJ ‚t          d¦  «         d S )Nr   )ÚDiscordTradeParserz,WTS 5 Sekhema Keys 4.2 div each - fast tradezForbidden Rite)Úcurrent_leagueÚWTSzSekhema Keyr   gÍÌÌÌÌÌ@u	   KÃˆO Ráººz"[PASS] test_discord_parser passed.)
Ú"src.assistant_tool.discord_monitorrq   Úparse_messageÚactionÚ	item_nameÚquantityÚ
price_unitÚ
evaluationÚprofit_estimate_divr   )rq   ÚmsgÚoffers      r   Útest_discord_parserr~   –   sÊ   € ØEÐEÐEÐEÐEÐEð 9€CØ×,Ò,¨SÐAQÐ,ÑRÔR€EØÐÐÐØŒ<˜5Ò Ð Ð Ð ØŒ?˜mÒ+Ð+Ð+Ð+ØŒ>˜QÒÐÐÐØÔ˜sÒ"Ð"Ð"Ð"Ø˜%Ô*Ð*Ð*Ð*Ð*ØÔ$ qÒ(Ð(Ð(Ð(Ý	Ð
.Ñ/Ô/Ð/Ð/Ð/r   c                  óJ  ‡— ddl m}   | d¬¦  «        }g Š|                     ˆfd„¦  «         |                     ddd¦  «         t	          ‰¦  «        d	k    sJ ‚‰d         d
k    sJ ‚|                     ¦   «         du sJ ‚|                     ¦   «          t          d¦  «         d S )Nr   )ÚCoreShmBridgeg     €A@)Úlow_hp_thresholdc                 ó4   •— ‰                      | ||f¦  «        S ©N©Úappend)ÚcurÚmax_hpÚpctÚalertss      €r   ú<lambda>z&test_core_shm_bridge.<locals>.<lambda>ª   s   ø€ ¸&¿-º-ÈÈfÐVYÐHZÑ:[Ô:[€ r   é   éd   ç      4@é   )r‹   rŒ   r�   Tz#[PASS] test_core_shm_bridge passed.)Ú"src.assistant_tool.core_shm_bridger€   Úregister_low_hp_alertÚ_notify_low_hpr'   ÚstartÚstopr   )r€   Úbridger‰   s     @r   Útest_core_shm_bridger•   ¥   sÍ   ø€ Ø@Ð@Ð@Ð@Ð@Ð@àˆ]¨DÐ1Ñ1Ô1€FØ€FØ
× Ò Ð![Ð![Ð![Ð![Ñ\Ô\Ð\ð ×Ò˜"˜c 4Ñ(Ô(Ð(Ýˆv‰;Œ;˜!ÒÐÐÐØ�!Œ9˜Ò'Ð'Ð'Ð'ð �<Š<‰>Œ>˜TÐ!Ð!Ð!Ð!Ø
‡K‚K�M„M€MÝ	Ð
/Ñ0Ô0Ð0Ð0Ð0r   c                  ó€  — ddl m}   | d¦  «        }|                     dd¬¦  «        }|€J ‚|j        dk    sJ ‚|j        dk    sJ ‚|                     d¦  «         |                     d¦  «         d|j        v sJ ‚d|j        v sJ ‚|                     dd	¬¦  «        }|€J ‚|j        d
k    sJ ‚t          d¦  «         d S )Nr   )Ú
GemManagerÚWARRIOR_MELEErŽ   F)Úuncut_gem_levelÚ
is_supportÚCleaveÚMAIN_DPSTzBrutality Supportz[PASS] test_gem_manager passed.)
Úsrc.assistant_tool.gem_managerr—   Úrecommend_engravingÚgem_nameÚroleÚrecord_engravedÚrecord_socketedÚengraved_gemsÚsocketed_gemsr   )r—   ÚgmÚrecÚrec_sups       r   Útest_gem_managerr¨   ¶   s
  € Ø9Ð9Ð9Ð9Ð9Ð9à	ˆ�OÑ	$Ô	$€BØ
×
 Ò
 °¸uÐ
 Ñ
EÔ
E€CØˆ?ˆ?ˆ?ØŒ<˜8Ò#Ð#Ð#Ð#ØŒ8�zÒ!Ð!Ð!Ð!à×Ò�xÑ Ô Ð Ø×Ò�xÑ Ô Ð Ø�rÔ'Ð'Ð'Ð'Ð'Ø�rÔ'Ð'Ð'Ð'Ð'ð ×$Ò$°QÀ4Ð$ÑHÔH€GØÐÐÐØÔÐ2Ò2Ð2Ð2Ð2Ý	Ð
+Ñ,Ô,Ð,Ð,Ð,r   c                  ó   — ddl m}   | ¦   «         }|                     dd¦  «        }|€J ‚d|j        v sJ ‚|j        dk    sJ ‚|                     dd¬¦  «         |j        d	k    sJ ‚d
|                     ¦   «         v sJ ‚t          d¦  «         d S )Nr   )ÚAutoQuesterÚG1_1zThe RiverbankÚ
TRANSITIONÚUnaÚBOOK_OF_SKILL)ÚrewardrŽ   z	>> [QUESTz [PASS] test_auto_quester passed.)	Úsrc.assistant_tool.auto_questerrª   Úget_current_objectiver@   Úaction_typeÚrecord_objective_completedÚskill_books_consumedÚget_status_bannerr   )rª   ÚaqÚobj1s      r   Útest_auto_questerr¸   Ê   sÈ   € Ø;Ð;Ð;Ð;Ð;Ð;à	ˆ‰Œ€BØ×#Ò# F¨OÑ<Ô<€DØÐÐÐØ˜dœnÐ,Ð,Ð,Ð,ØÔ˜|Ò+Ð+Ð+Ð+ð ×!Ò! %°Ð!Ñ@Ô@Ð@ØÔ" aÒ'Ð'Ð'Ð'Ø˜"×.Ò.Ñ0Ô0Ð0Ð0Ð0Ð0Ý	Ð
,Ñ-Ô-Ð-Ð-Ð-r   c                  ó8  — dd l } dd l}dd l}ddlm}m}m} |                     ddddddddd¦	  «	        }t          |¦  «        dk    sJ dt          |¦  «        › �¦   «         ‚|                       d	d
¦  «        } |¦   «         }||_	        t          |                     ¦   «         dz  ¦  «        }	|                     d||dddd|	dd¦
  «
        |d d…<   |                     ¦   «         }
|
du s
J d¦   «         ‚|                     d|d d…         ¦  «        \	  }}}}}}}}}|dk    sJ ‚|dd…         }|                     d|¦  «        \  }}}}}}}}|dk    sJ ‚|dk    sJ ‚|                     dd¦  «        |dd…<   |                     dd¦  «        |dd…<   |                     ¦   «         du s
J d¦   «         ‚|                     ¦   «         du s
J d¦   «         ‚|                     ¦   «         du s
J d¦   «         ‚d |_	        |                     ¦   «          t!          d¦  «         d S )Nr   ©ÚPROTOCOL_VERSIONÚSHARED_MEM_MAGICr€   z	<QIfffIIIiç  éc   g        é$   z$CommandPacket must be 36 bytes, got éÿÿÿÿé  @ r   ú
<QIIQQQQQQrŽ   é@   Tz5send_panic_stop should succeed when queue is not fulli  0 i$ 0 z<Qé   é   é    é(   Fz4send_panic_stop must return False when queue is fullz9send_recalibrate_xyz must return False when queue is fullz<send_trigger_auto_login must return False when queue is fullz.[PASS] test_task_opt_02_command_packet passed.)ÚmmapÚstructÚtimer�   r»   r¼   r€   Úpackr'   Ú_shmÚintÚsend_panic_stopÚunpackÚsend_recalibrate_xyzÚsend_trigger_auto_loginÚcloser   )rÇ   rÈ   rÉ   r»   r¼   r€   Ú	cmd_dummyÚshmr”   Únow_msr   Ú_Úcmd_seqÚcmd_readÚpktÚcmd_idÚop_codera   re   ÚzÚ	entity_idÚprioÚtimeouts                          r   Útest_task_opt_02_command_packetrß   Ù   s…  € Ø€K€K€KØ€M€M€MØ€K€K€KàdÐdÐdÐdÐdÐdÐdÐdÐdÐdð —’˜K¨¨b°#°s¸CÀÀAÀqÑIÔI€IÝˆy‰>Œ>˜RÒÐÐÐ!XÍÈIÉÌÐ!XÐ!XÑÔÐð �)Š)�B˜Ñ
(Ô
(€CØˆ]‰_Œ_€FØ€F„Kõ �—’‘”˜tÑ#Ñ$Ô$€FØ�{Š{˜<Ð)9Ð;KÈQÐPQÐSTÐVWÐY_ÐabÐdeÑfÔf€Cˆˆˆ�Hð 
×	Ò	Ñ	!Ô	!€BØ�ˆ:ˆ:ˆ:ÐN‰:Œ:ˆ:à-3¯]ª]¸<ÈÈSÈbÈSÌÑ-RÔ-RÑ*€A€qˆ!ˆQ�˜ 1 a¨Ø�aŠ<ˆ<ˆ<ˆ<à
ˆh�}Ð$Ô
%€CØ9?¿ºÀ{ÐTWÑ9XÔ9XÑ6€FˆG�Q˜˜1˜i¨¨wØ�SŠ=ˆ=ˆ=ˆ=Ø�bŠ=ˆ=ˆ=ˆ=ð —’˜T 2Ñ&Ô&€Cˆˆ2ˆ�JØ—’˜T 1Ñ%Ô%€Cˆˆ2ˆ�JØ×!Ò!Ñ#Ô# uÐ,Ð,Ð,Ð.dÑ,Ô,Ð,Ø×&Ò&Ñ(Ô(¨EÐ1Ð1Ð1Ð3nÑ1Ô1Ð1Ø×)Ò)Ñ+Ô+¨uÐ4Ð4Ð4Ð6tÑ4Ô4Ð4à€F„KØ‡I‚I�K„K€KÝ	Ð
:Ñ;Ô;Ð;Ð;Ð;r   c                  óp  ‡— dd l } dd l}dd l}ddlm}m}m} |                       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¦  «        }	|	|||t          |	¦  «        z   …<   |                     dd¦  «        ||dz   |dz   …<   |                     dd¦  «        ||dz   dz   |dz   dz   …<   |                     dd¦  «        ||dz   dz   dz   |dz   dz   dz   …<   |                     d d!dd"d#d$¦  «        }
|
||d%z   |d%z   t          |
¦  «        z   …<   t          |                     ¦   «         d&z  ¦  «        }|                     d'||dddd|dd¦
  «
        |d d(…<   d|_        |j        j        d)u sJ ‚d|_        g Š|                     ˆfd*„¦  «         |                     ¦   «          |                     d+¦  «         |                     ¦   «          t          ‰¦  «        dk    s
J d,¦   «         ‚‰d         }|j        d-u sJ ‚|j        j        dk    sJ ‚|j        j        dk    sJ ‚|j        j        dk    sJ ‚|j        j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    s
J d.¦   «         ‚|                     ¦   «          t5          d/¦  «         d S )0Nr   rº   r¿   rÀ   g{®Gáz„?)Úpoll_intervali  z<QQQfffffIIIIIIIIIIIIQée   iŸ† l        g      (@g      A@g      L@g      ð?g       @é–   éÈ   éP   rŒ   é
   r   r‹   rŽ   z<Ié   éh   z<Hé   é   éX   z
<QII32s48si90  ix  s   The Riverbank s
   Riverbank éh˜  r   rÁ   rÂ   Fc                 ó.   •— ‰                      | ¦  «        S rƒ   r„   )ÚsnapÚreceiveds    €r   rŠ   z1test_task_opt_03_seqlock_reader.<locals>.<lambda>,  s   ø€ ¨(¯/ª/¸$Ñ*?Ô*?€ r   g{®Gáz´?z4Should have received at least 1 snapshot via SeqlockTzLast seq should be updated to 1z.[PASS] test_task_opt_03_seqlock_reader passed.)rÇ   rÈ   rÉ   r�   r»   r¼   r€   rË   rÊ   r'   rÌ   Ú	_last_seqÚlast_snapshotÚ	is_onlineÚregister_listenerr’   Úsleepr“   ÚplayerÚplayer_addrÚ
current_hpr‡   Úactive_weapon_setÚmonsters_countÚitems_countrÑ   r   )rÇ   rÈ   rÉ   r»   r¼   r€   rÓ   r”   Ú	slot1_offÚplayer_dataÚ	area_datarÔ   rî   rï   s                @r   Útest_task_opt_03_seqlock_readerrþ     s™  ø€ Ø€K€K€KØ€M€M€MØ€K€K€KàdÐdÐdÐdÐdÐdÐdÐdÐdÐdà
�)Š)�B˜Ñ
(Ô
(€CØˆ]¨Ð.Ñ.Ô.€FØ€F„Kð €Ið —+’+Ð6¸¸UÀKÐQUÐW[Ð]aÐcfÐhkÐmpÐruÐwyÐ{~ð  ACð  EGð  IJð  LMð  OPð  RTð  VWð  YZð  \]ñ  ^ô  ^€KØ2=€Cˆ	�)�c +Ñ.Ô.Ñ.Ð.Ñ/ð ,2¯;ª;°t¸QÑ+?Ô+?€Cˆ	�C‰˜	 C™Ð'Ñ(à39·;²;¸tÀQÑ3GÔ3G€Cˆ	�C‰˜!Ñ˜I¨™O¨aÑ/Ð/Ñ0à=C¿[º[ÈÈqÑ=QÔ=Q€Cˆ	�C‰˜"Ñ˜qÑ  ¨S¡°2Ñ!5¸Ñ!9Ð9Ñ:ð —’˜L¨%°°SÐ:NÐP`ÑaÔa€IØ@I€Cˆ	�EÑ˜) eÑ+­c°)©n¬nÑ<Ð<Ñ=å�—’‘”˜tÑ#Ñ$Ô$€Fà�{Š{˜<Ð)9Ð;KÈQÐPQÐSTÐVWÐY_ÐabÐdeÑfÔf€Cˆˆˆ�Hð €FÔØÔÔ)¨UÐ2Ð2Ð2Ð2ð €FÔØ€HØ
×ÒÐ?Ð?Ð?Ð?Ñ@Ô@Ð@à
‡L‚L�N„N€NØ‡J‚JˆtÑÔÐØ
‡K‚K�M„M€Måˆx‰=Œ=˜AÒÐÐÐUÑÔÐØ�BŒ<€DØŒ>˜TÐ!Ð!Ð!Ð!ØŒ;Ô" kÒ1Ð1Ð1Ð1ØŒ;Ô! SÒ(Ð(Ð(Ð(ØŒ;Ô Ò$Ð$Ð$Ð$ØŒ;Ô(¨AÒ-Ð-Ð-Ð-ØÔ !Ò#Ð#Ð#Ð#ØÔ˜qÒ Ð Ð Ð ØÔ˜qÒ Ð Ð Ð"CÑ Ô Ð à‡I‚I�K„K€KÝ	Ð
:Ñ;Ô;Ð;Ð;Ð;r   c                  ó¤   — dd l } ddlm} |                      |j        ¦  «        }d|v s
J d¦   «         ‚d|v s
J d¦   «         ‚t          d¦  «         d S )Nr   )Ú
OverlayHUDzdself.gold_tracker.register_listener(lambda new_gold: self.after(0, self._on_gold_changed, new_gold))z=gold_tracker listener must be wrapped with self.after(0, ...)zVself.log_watcher.register_listener(lambda evt: self.after(0, self._on_log_event, evt))z<log_watcher listener must be wrapped with self.after(0, ...)z5[PASS] test_task_opt_08_overlay_thread_safety passed.)ÚinspectÚsrc.assistant_tool.overlay_guir   Ú	getsourceÚ__init__r   )r  r   Úinit_srcs      r   Ú&test_task_opt_08_overlay_thread_safetyr  @  s†   € Ø€N€N€Nà9Ð9Ð9Ð9Ð9Ð9Ø× Ò  Ô!4Ñ5Ô5€HØqÐu}Ð}Ð}Ð}ð  @Ñ}Ô}Ð}ØcÐgoÐoÐoÐoð  rpÑoÔoÐoÝ	Ð
AÑBÔBÐBÐBÐBr   c                  óš  — ddl m}   | d¬¦  «        }t          |d¦  «        s
J d¦   «         ‚t          |d¦  «        s
J d¦   «         ‚t          |d	¦  «        rt          |d
¦  «        s
J d¦   «         ‚|                     ¦   «          |j        �J ‚ | d¬¦  «        5 }	 d d d ¦  «         n# 1 swxY w Y   |j        �J ‚t          d¦  «         d S )Nr   )ÚSyncMemorySnapshotManageriÿàõ)ÚpidrÑ   z2SyncMemorySnapshotManager must have close() methodÚ__del__z4SyncMemorySnapshotManager must have __del__() methodÚ	__enter__Ú__exit__z8SyncMemorySnapshotManager should support context managerz0[PASS] test_task_opt_10_snapshot_cleanup passed.)Ú'src.assistant_tool.sync_memory_snapshotr  ÚhasattrrÑ   Ú	h_processr   )r  ÚmgrÚms      r   Ú!test_task_opt_10_snapshot_cleanupr  I  s<  € ØQÐQÐQÐQÐQÐQØ
#Ð
#¨Ð
1Ñ
1Ô
1€CÝ�3˜Ñ Ô ÐVÐVÐ"VÑVÔVÐ Ý�3˜	Ñ"Ô"ÐZÐZÐ$ZÑZÔZÐ"Ý�3˜Ñ$Ô$Ð}­°°jÑ)AÔ)AÐ}Ð}ÐC}Ñ}Ô}ÐAØ‡I‚I�K„K€KØŒ=Ð Ð Ð ð 
#Ð	" xÐ	0Ñ	0Ô	0ð °AØðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð àŒ;ÐÐÐÝ	Ð
<Ñ=Ô=Ð=Ð=Ð=s   ÂB(Â(B,Â/B,c                  ód  — ddl } ddlm}m}m}m}m}m} |                      |¦  «        dk    s!J d|                      |¦  «        › d�¦   «         ‚|                      |¦  «        dk    s!J d|                      |¦  «        › d�¦   «         ‚|                      |¦  «        d	k    s!J d
|                      |¦  «        › d�¦   «         ‚|                      |¦  «        dk    s!J d|                      |¦  «        › d�¦   «         ‚|                      |¦  «        dk    s!J d|                      |¦  «        › d�¦   «         ‚|                      |¦  «        dk    s!J d|                      |¦  «        › d�¦   «         ‚|j	        j
        dk    sJ ‚|j        j
        dk    sJ ‚|j        j
        dk    sJ ‚|j        j
        dk    sJ ‚|j        j
        dk    sJ ‚|j        j
        dk    sJ ‚|j        j
        dk    sJ ‚|j        j
        dk    sJ ‚|j        j
        dk    sJ ‚|j        j
        dk    sJ ‚|j        j
        dk    sJ ‚|j        j
        dk    sJ ‚|j        j
        dk    sJ ‚|j        j
        dk    sJ ‚|j        j
        dk    sJ ‚|j        j
        dk    sJ ‚|j        j
        dk    sJ ‚|j        j
        dk    sJ ‚|j        j
        dk    sJ ‚|j        j
        dk    sJ ‚|j        j
        dk    sJ ‚|j        j
        dk    sJ ‚|j         j
        dk    sJ ‚|j!        j
        dk    sJ ‚tE          d¦  «         dS ) uK   Kiá»ƒm tra tÃ­nh nháº¥t quÃ¡n nhá»‹ phÃ¢n 100% cá»§a toÃ n bá»™ struct IPC.r   N)ÚAreaTelemetryDataÚCommandPacketÚEntityTelemetryDataÚPlayerTelemetryDataÚSharedMemoryHeaderÚTelemetryPacketrÂ   z SharedMemoryHeader != 64 bytes (ú)éT   z!PlayerTelemetryData != 84 bytes (rë   z!EntityTelemetryData != 88 bytes (é`   zAreaTelemetryData != 96 bytes (r¾   zCommandPacket != 36 bytes (iÈ˜  z TelemetryPacket != 39112 bytes (é   é   rÃ   rÄ   rÅ   rÆ   é0   é8   r‹   é   rŒ   rè   ihX  rì   z<[PASS] test_binary_ipc_contract_and_struct_alignment passed.)#ÚctypesÚscripts.test_ipc_bridger  r  r  r  r  r  ÚsizeofÚmagicÚoffsetÚprotocolVersionÚ	isRunningÚtelemetrySequenceÚcommandSequenceÚcommandReadIndexÚlastCoreHeartbeatÚlastAgentHeartbeatÚreservedÚ	commandIdÚopCodeÚtargetXÚtargetYÚtargetZÚtargetEntityIdÚpriorityÚ	timeoutMsÚ
snapshotIdÚ	timestamprõ   ÚentityCountÚentitiesÚterrainWalkabilityÚarear   )r"  r  r  r  r  r  r  s          r   Ú-test_binary_ipc_contract_and_struct_alignmentr=  X  s'  € à€M€M€Mðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð �=Š=Ð+Ñ,Ô,°Ò2Ð2Ð2Ð4{ÐW]×WdÒWdÐewÑWxÔWxÐ4{Ð4{Ð4{Ñ2Ô2Ð2Ø�=Š=Ð,Ñ-Ô-°Ò3Ð3Ð3Ð5~ÐY_×YfÒYfÐgzÑY{ÔY{Ð5~Ð5~Ð5~Ñ3Ô3Ð3Ø�=Š=Ð,Ñ-Ô-°Ò3Ð3Ð3Ð5~ÐY_×YfÒYfÐgzÑY{ÔY{Ð5~Ð5~Ð5~Ñ3Ô3Ð3Ø�=Š=Ð*Ñ+Ô+¨rÒ1Ð1Ð1Ð3xÐU[×UbÒUbÐctÑUuÔUuÐ3xÐ3xÐ3xÑ1Ô1Ð1Ø�=Š=˜Ñ'Ô'¨2Ò-Ð-Ð-Ð/lÈVÏ]Ê]Ð[hÑMiÔMiÐ/lÐ/lÐ/lÑ-Ô-Ð-Ø�=Š=˜Ñ)Ô)¨UÒ2Ð2Ð2Ð4xÐW]×WdÒWdÐetÑWuÔWuÐ4xÐ4xÐ4xÑ2Ô2Ð2ð Ô#Ô*¨aÒ/Ð/Ð/Ð/ØÔ-Ô4¸Ò9Ð9Ð9Ð9ØÔ'Ô.°"Ò4Ð4Ð4Ð4ØÔ/Ô6¸"Ò<Ð<Ð<Ð<ØÔ-Ô4¸Ò:Ð:Ð:Ð:ØÔ.Ô5¸Ò;Ð;Ð;Ð;ØÔ/Ô6¸"Ò<Ð<Ð<Ð<ØÔ0Ô7¸2Ò=Ð=Ð=Ð=ØÔ&Ô-°Ò3Ð3Ð3Ð3ð Ô"Ô)¨QÒ.Ð.Ð.Ð.ØÔÔ&¨!Ò+Ð+Ð+Ð+ØÔ Ô'¨2Ò-Ð-Ð-Ð-ØÔ Ô'¨2Ò-Ð-Ð-Ð-ØÔ Ô'¨2Ò-Ð-Ð-Ð-ØÔ'Ô.°"Ò4Ð4Ð4Ð4ØÔ!Ô(¨BÒ.Ð.Ð.Ð.ØÔ"Ô)¨RÒ/Ð/Ð/Ð/ð Ô%Ô,°Ò1Ð1Ð1Ð1ØÔ$Ô+¨qÒ0Ð0Ð0Ð0ØÔ!Ô(¨BÒ.Ð.Ð.Ð.ØÔ&Ô-°Ò4Ð4Ð4Ð4ØÔ#Ô*¨cÒ1Ð1Ð1Ð1ØÔ-Ô4¸Ò=Ð=Ð=Ð=ØÔÔ&¨%Ò/Ð/Ð/Ð/å	Ð
HÑIÔIÐIÐIÐIr   c                  ó¸   — ddl m} m}  | d |dd¬¦  «        ddd¬¦  «        }|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚t          d	¦  «         d
S )uf   Kiá»ƒm tra cÃ¡c trÆ°á»�ng monsters_alive_total vÃ  entities_monster_count trÃªn CoreTelemetrySnapshot.r   )ÚCoreTelemetrySnapshotÚPlayerTelemetryTrŒ   )r÷   r‡   r  é   )rò   rõ   rù   Úmonsters_alive_totalÚentities_monster_countz5[PASS] test_telemetry_snapshot_monster_fields passed.N)r�   r?  r@  rù   rB  rC  r   )r?  r@  rî   s      r   Ú&test_telemetry_snapshot_monster_fieldsrD  �  s¢   € àYÐYÐYÐYÐYÐYÐYÐYà Ð ØØˆ¨#°cÐ:Ñ:Ô:ØØØ ðñ ô €Dð Ô !Ò#Ð#Ð#Ð#ØÔ$¨Ò*Ð*Ð*Ð*ØÔ&¨!Ò+Ð+Ð+Ð+Ý	Ð
AÑBÔBÐBÐBÐBr   Ú__main__u3   
âœ… Táº¤T Cáº¢ UNIT TESTS Ä�á»€U VÆ¯á»¢T QUA 100%!)#Ú__doc__rU   Úsysr  Ústdoutr   rV   ÚinsertÚabspathrW   ÚdirnameÚ__file__Úsrc.assistant_tool.gold_trackerr   Úsrc.assistant_tool.log_watcherr   Ú!src.assistant_tool.market_advisorr	   r   r0   rO   r^   ro   r~   r•   r¨   r¸   rß   rþ   r  r  r=  rD  Ú__name__r   © r   r   ú<module>rR     sÊ  ððð ð 
€	€	€	Ø 
€
€
€
à
€7ˆ3Œ:�}Ñ%Ô%ð -Ø„J×Ò GÐÑ,Ô,Ð,ð „‡‚��2”7—?’? 2¤7§<¢<°´·²ÀÑ0IÔ0IÈ4Ñ#PÔ#PÑQÔQÑ RÔ RÐ Rà 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø ;Ð ;Ð ;Ð ;Ð ;Ð ;ð.ð .ð .ð"0ð 0ð 0ð&,5ð ,5ð ,5ð^Gð Gð Gð06ð 6ð 6ð00ð 0ð 0ð1ð 1ð 1ð"-ð -ð -ð(.ð .ð .ð)<ð )<ð )<ðV:<ð :<ð :<ðxCð Cð Cð>ð >ð >ð3Jð 3Jð 3JðjCð Cð Cð  ˆzÒÐØÐÑÔÐØÐÑÔÐØÐÑÔÐØ.Ð.Ñ0Ô0Ð0ØÐÑÔÐØÐÑÔÐØÐÑÔÐØ#Ð#Ñ%Ô%Ð%Ø#Ð#Ñ%Ô%Ð%Ø*Ð*Ñ,Ô,Ð,Ø%Ð%Ñ'Ô'Ð'Ø1Ð1Ñ3Ô3Ð3ØÐÑÔÐØÐÑÔÐØ*Ð*Ñ,Ô,Ð,Ø	€EÐ
@ÑAÔAÐAÐAÐAð! Ðr   