§
    ž±¥j>I  ã            
       ó¤  — d Z ddlZddlZddlmZ ddlZej                             dej                             ej         	                    ej         
                    e¦  «        d¦  «        ¦  «        ¦  «         ddlmZmZmZmZmZmZmZ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'd„ Z(d„ Z)d„ Z*d„ Z+d„ Z,d„ Z-dS )u  
AutoPOE2 Item Inspector & Hover Watcher Unit Tests
100% Authentic Real Data POE2 (Rule 14), Zero Mock Data, Rule 8, Rule 9, Rule 10.
Kiá»ƒm thá»­ bÃ³c tÃ¡ch, Ä‘Ã¡nh giÃ¡ vÃ  pháº£n há»“i cá»§a há»‡ thá»‘ng Item Inspector, Hover Watcher vÃ  Tooltip Overlay.
é    N)Úpatchz..)Ú	AffixTypeÚInspectionSeverityÚItemCategoryÚItemInspectionReportÚ
ItemRarityÚUniversalItemInspectorÚUniversalItemParserÚinspect_item)ÚItemHoverWatcher)ÚItemTooltipOverlaya  Item Class: Waystones
Rarity: Rare
Torment Pillar
Waystone (Tier 15)
--------
Waystone Tier: 15
Item Level: 82
--------
Monsters reflect 18% of Physical Damage
Players cannot Regenerate Life, Mana or Energy Shield
Monsters deal 45% extra Damage as Fire
--------
CorruptedzûItem Class: Waystones
Rarity: Rare
Bramble Shrine
Waystone (Tier 16)
--------
Waystone Tier: 16
Item Level: 83
--------
85% increased Quantity of Items found in this Area
50% increased Rarity of Items found in this Area
32% increased Monster Pack Sizea«  Item Class: Waystones
Rarity: Rare
Forgotten Course
Waystone (Tier 14)
--------
Revives Available: 2
Pack Size: +26%
Monster Rarity: +18%
Waystone Drop Chance: +70%
--------
Item Level: 80
--------
{ Prefix Modifier "Venomous" (Tier: 1) }
Monsters have 30(27-33)% chance to Poison on Hit
{ Prefix Modifier "Fleeting" (Tier: 1) }
Monsters have 15(10-15)% increased Attack, Cast and Movement Speed
{ Suffix Modifier "of Exposure" (Tier: 1) }
-7% maximum Player Resistances
{ Suffix Modifier "of Obstruction" (Tier: 1) }
Monsters take 28(26-30)% reduced Extra Damage from Critical Hits
--------
Can be used in a Map Device, allowing you to enter a Map. Waystones can only be used once.
a&  Item Class: Body Armours
Rarity: Rare
Morbid Carapace
Expert Iron Cuirass
--------
Armour: 540 (augmented)
--------
Requirements:
Level: 65
Str: 120
--------
Sockets: S S S
--------
Item Level: 82
--------
+115 to maximum Life
+350 to Armour
+44% to Fire Resistance
+42% to Lightning Resistancea  Item Class: Boots
Rarity: Rare
Storm Stride
Expert Wrapped Boots
--------
Evasion Rating: 280
--------
Requirements:
Level: 65
Dex: 110
--------
Item Level: 80
--------
+35% increased Movement Speed
+14% chance to Suppress Spell Damage
+38% to Cold ResistancezÐItem Class: Rings
Rarity: Rare
Doom Spiral
Diamond Ring
--------
Requirements:
Level: 60
--------
Item Level: 78
--------
+24% to Global Critical Strike Multiplier
+22% to Chaos Resistance
+75 to maximum Lifea  Item Class: Life Flasks
Rarity: Magic
Surgeon's Ultimate Life Flask of Staunching
--------
Recovers 1800 Life over 4.00 Seconds
--------
Requirements:
Level: 60
--------
Item Level: 75
--------
Grants Immunity to Bleeding for 4 seconds
Grants Immunity to Shock during Effectuõ  Item Class: Body Armours
Rarity: Rare
Morbid Carapace
Expert Iron Cuirass
--------
Armour: 540
--------
Requirements:
Level: 65
Str: 120
--------
Item Level: 82
--------
{ Prefix Modifier "Vigorous" (Tier: 1) â€” Life }
+115 to maximum Life
{ Prefix Modifier "Reinforced" (Tier: 2) â€” Defences }
+350 to Armour
{ Suffix Modifier "of the Drake" (Tier: 1) â€” Fire Resistance }
+44% to Fire Resistance
{ Suffix Modifier "of the Tempest" (Tier: 2) â€” Lightning Resistance }
+42% to Lightning Resistancec                  óÌ  — t          t          ¦  «        } | €J ‚| j        t          j        k    sJ ‚| j        t          j        k    sJ ‚| j        du sJ ‚| j	        dk    sJ ‚t          | j        ¦  «        dk    sJ ‚t          d„ | j        D ¦   «         ¦  «        sJ ‚t          d„ | j        D ¦   «         ¦  «        sJ ‚d| j        v sJ ‚t          | j        ¦  «        dk    sJ ‚| j        d	         j        t           j        k    sJ ‚| j        d
         j        t           j        k    sJ ‚| j        d         j        t           j        k    sJ ‚t          d„ | j        D ¦   «         ¦  «        rJ ‚dS )u[   Test 1: Waystone vá»›i Reflect Physical + No Regen (bÃ¡o Brick Ä�á»�, safety score tháº¥p).NTé2   é   c              3   óB   K  — | ]}d |                      ¦   «         v V — ŒdS )ÚreflectN)Úlower©Ú.0Úms     ú1C:\Projects\AutoPOE2\tests\test_item_inspector.pyú	<genexpr>z=test_1_waystone_brick_reflect_and_no_regen.<locals>.<genexpr>·   s/   è è € Ð?Ð?¨!ˆy˜AŸGšG™IœIÐ%Ð?Ð?Ð?Ð?Ð?Ð?ó    c              3   ó&   K  — | ]}d |v pd|v V — ŒdS )zcannot RegeneratezNo RegenN© r   s     r   r   z=test_1_waystone_brick_reflect_and_no_regen.<locals>.<genexpr>¸   s1   è è € ÐTÐT¸qÐ" aÐ'Ð:¨:¸¨?ÐTÐTÐTÐTÐTÐTr   ÚBRICKé   r   é   c              3   óJ   K  — | ]}|j                              d ¦  «        V — ŒdS ©ú[N©ÚtextÚ
startswithr   s     r   r   z=test_1_waystone_brick_reflect_and_no_regen.<locals>.<genexpr>À   ó2   è è € ÐLÐL¨a�1”6×$Ò$ SÑ)Ô)ÐLÐLÐLÐLÐLÐLr   )r   ÚREAL_POE2_WAYSTONE_BRICKÚcategoryr   ÚWAYSTONEÚrarityr   ÚRAREÚis_brickÚsafety_scoreÚlenÚred_modsÚanyÚsummaryÚordered_modifiersÚseverityr   r   Ú	DANGEROUS©Úreports    r   Ú*test_1_waystone_brick_reflect_and_no_regenr6   ®   s�  € åÕ2Ñ3Ô3€FØÐÐÐØŒ?�lÔ3Ò3Ð3Ð3Ð3ØŒ=�JœOÒ+Ð+Ð+Ð+ØŒ?˜dÐ"Ð"Ð"Ð"ØÔ "Ò$Ð$Ð$Ð$ÝˆvŒÑÔ 1Ò$Ð$Ð$Ð$ÝÐ?Ð?¨v¬Ð?Ñ?Ô?Ñ?Ô?Ð?Ð?Ð?ÝÐTÐTÀFÄOÐTÑTÔTÑTÔTÐTÐTÐTØ�f”nÐ$Ð$Ð$Ð$õ ˆvÔ'Ñ(Ô(¨AÒ-Ð-Ð-Ð-ØÔ# AÔ&Ô/Õ3EÔ3KÒKÐKÐKÐKØÔ# AÔ&Ô/Õ3EÔ3KÒKÐKÐKÐKØÔ# AÔ&Ô/Õ3EÔ3OÒOÐOÐOÐOÝÐLÐL°6Ô3KÐLÑLÔLÑLÔLÐLÐLÐLÐLÐLr   c                  óö  — t          t          ¦  «        } | €J ‚| j        t          j        k    sJ ‚| j        t          j        k    sJ ‚g d¢}d„ | j        D ¦   «         }||k    sJ ‚d„ | j        D ¦   «         t          t          t          |¦  «        ¦  «        ¦  «        k    sJ ‚d„ | j        D ¦   «         }t          |¦  «        dk    sJ ‚|d         }|j        t          j        k    sJ ‚|j        dk    sJ ‚|j                             d	¦  «        rJ ‚d
|j        vsJ ‚d|j        vsJ ‚|j        dk    sJ ‚d„ | j        D ¦   «         }t          |¦  «        dk    sJ ‚|d         }|j        t          j        k    sJ ‚|j        dk    sJ ‚|j                             d	¦  «        rJ ‚d|j        vsJ ‚|j        dk    sJ ‚t'          d„ | j        D ¦   «         ¦  «        rJ ‚t'          d„ | j        D ¦   «         ¦  «        sJ ‚dS )u™  
    Test kiá»ƒm tra Waystone T14 (thá»±c táº¿ tá»« client PoE2):
    1. Kiá»ƒm tra report.ordered_modifiers chá»©a Ä‘Ãºng thá»© tá»± cÃ¡c dÃ²ng cá»§a Waystone T14.
    2. Kiá»ƒm tra dÃ²ng -7% maximum Player Resistances Ä‘Æ°á»£c Ä‘Ã¡nh dáº¥u DANGEROUS (Ä�á»�) vÃ  giá»¯ nguyÃªn text sáº¡ch sáº½ khÃ´ng cÃ³ tag [Ailment on Hit].
    3. Kiá»ƒm tra dÃ²ng Pack Size: +26% Ä‘Æ°á»£c Ä‘Ã¡nh dáº¥u REWARD (Xanh).
    N)zRevives Available: 2úPack Size: +26%zMonster Rarity: +18%zWaystone Drop Chance: +70%ú0Monsters have 30(27-33)% chance to Poison on HitzBMonsters have 15(10-15)% increased Attack, Cast and Movement Speedú-7% maximum Player Resistancesz@Monsters take 28(26-30)% reduced Extra Damage from Critical Hitsc                 ó   — g | ]	}|j         ‘Œ
S r   ©r#   r   s     r   ú
<listcomp>zRtest_waystone_t14_ordered_modifiers_and_in_place_clean_styling.<locals>.<listcomp>Ú   s   € Ð=Ð=Ð=˜q�A”FÐ=Ð=Ð=r   c                 ó   — g | ]	}|j         ‘Œ
S r   )Úoriginal_orderr   s     r   r=   zRtest_waystone_t14_ordered_modifiers_and_in_place_clean_styling.<locals>.<listcomp>Þ   s   € Ð?Ð?Ð? ˆAÔÐ?Ð?Ð?r   c                 ó$   — g | ]}d |j         v ¯|‘ŒS )zmaximum Player Resistancesr<   r   s     r   r=   zRtest_waystone_t14_ordered_modifiers_and_in_place_clean_styling.<locals>.<listcomp>á   s'   € Ð^Ð^Ð^�aÐ7SÐWXÔW]Ð7]Ð7]�Ð7]Ð7]Ð7]r   r   r   r:   r!   z[Ailment on Hit]z
[-Max Res]z#FF4D4Dc                 ó$   — g | ]}d |j         v ¯|‘ŒS )r8   r<   r   s     r   r=   zRtest_waystone_t14_ordered_modifiers_and_in_place_clean_styling.<locals>.<listcomp>ì   s%   € ÐTÐTÐT�qÐ8IÈQÌVÐ8SÐ8S�Ð8SÐ8SÐ8Sr   r8   z[Pack Size]z#2ECC71c              3   óJ   K  — | ]}|j                              d ¦  «        V — ŒdS r    r"   r   s     r   r   zQtest_waystone_t14_ordered_modifiers_and_in_place_clean_styling.<locals>.<genexpr>ö   r%   r   c              3   óV   K  — | ]$}d |j         k    o|j        t          j        k    V — Œ%dS )r9   N)r#   r2   r   r3   r   s     r   r   zQtest_waystone_t14_ordered_modifiers_and_in_place_clean_styling.<locals>.<genexpr>÷   sY   è è € ð  ^ð  ^ð  @AÐAÀQÄVÒKÐzÐPQÔPZÕ^pÔ^zÒPzð  ^ð  ^ð  ^ð  ^ð  ^ð  ^r   )r   ÚREAL_POE2_WAYSTONE_T14r'   r   r(   r)   r   r*   r1   ÚlistÚranger-   r2   r   r3   r#   r$   Ú
color_codeÚREWARDr/   )r5   Úexpected_linesÚactual_linesÚres_modsÚres_modÚ	pack_modsÚpack_mods          r   Ú>test_waystone_t14_ordered_modifiers_and_in_place_clean_stylingrO   Ã   s¥  € õ Õ0Ñ1Ô1€FØÐÐÐØŒ?�lÔ3Ò3Ð3Ð3Ð3ØŒ=�JœOÒ+Ð+Ð+Ð+ð	ð 	ð 	€Nð >Ð= FÔ$<Ð=Ñ=Ô=€LØ˜>Ò)Ð)Ð)Ð)ð @Ð? fÔ&>Ð?Ñ?Ô?Å4ÍÍcÐR`ÑNaÔNaÑHbÔHbÑCcÔCcÒcÐcÐcÐcð _Ð^˜6Ô3Ð^Ñ^Ô^€HÝˆx‰=Œ=˜AÒÐÐÐØ�qŒk€GØÔÕ1Ô;Ò;Ð;Ð;Ð;ØŒ<Ð;Ò;Ð;Ð;Ð;ØŒ|×&Ò& sÑ+Ô+Ð+Ð+Ð+Ø W¤\Ð1Ð1Ð1Ð1Ø˜wœ|Ð+Ð+Ð+Ð+ØÔ Ò*Ð*Ð*Ð*ð UÐT˜FÔ4ÐTÑTÔT€IÝˆy‰>Œ>˜QÒÐÐÐØ˜Œ|€HØÔÕ 2Ô 9Ò9Ð9Ð9Ð9ØŒ=Ð-Ò-Ð-Ð-Ð-ØŒ}×'Ò'¨Ñ,Ô,Ð,Ð,Ð,Ø ¤Ð-Ð-Ð-Ð-ØÔ )Ò+Ð+Ð+Ð+õ ÐLÐL°6Ô3KÐLÑLÔLÑLÔLÐLÐLÐLÝð  ^ð  ^ð  EKô  E]ð  ^ñ  ^ô  ^ñ  ^ô  ^ð  ^ð  ^ð  ^ð  ^ð  ^r   c                  ó^  — t          t          ¦  «        } | €J ‚| j        t          j        k    sJ ‚| j        du sJ ‚| j        dk    sJ ‚t          | j        ¦  «        dk    sJ ‚t          d„ | j        D ¦   «         ¦  «        sJ ‚t          d„ | j        D ¦   «         ¦  «        sJ ‚d| j
        v sJ ‚dS )u[   Test 2: Waystone vá»›i High Quantity (85%) + Pack Size (32%) (bÃ¡o Xanh LÃ¡, an toÃ n 100).NFéd   r   c              3   ó   K  — | ]}d |v V — Œ	dS )ÚQuantityNr   r   s     r   r   z>test_2_waystone_high_quantity_and_pack_size.<locals>.<genexpr>  ó&   è è € Ð:Ð: 1ˆz˜QˆÐ:Ð:Ð:Ð:Ð:Ð:r   c              3   ó   K  — | ]}d |v V — Œ	dS )z	Pack SizeNr   r   s     r   r   z>test_2_waystone_high_quantity_and_pack_size.<locals>.<genexpr>  s'   è è € Ð;Ð; Aˆ{˜aÐÐ;Ð;Ð;Ð;Ð;Ð;r   u   AN TOÃ€N)r   ÚREAL_POE2_WAYSTONE_REWARDr'   r   r(   r+   r,   r-   Ú
green_modsr/   r0   r4   s    r   Ú+test_2_waystone_high_quantity_and_pack_sizerX   ú   sÚ   € åÕ3Ñ4Ô4€FØÐÐÐØŒ?�lÔ3Ò3Ð3Ð3Ð3ØŒ?˜eÐ#Ð#Ð#Ð#ØÔ #Ò%Ð%Ð%Ð%ÝˆvÔ Ñ!Ô! QÒ&Ð&Ð&Ð&ÝÐ:Ð:¨Ô(9Ð:Ñ:Ô:Ñ:Ô:Ð:Ð:Ð:ÝÐ;Ð;¨Ô):Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;Ø˜œÐ'Ð'Ð'Ð'Ð'Ð'r   c                  ó   — t          t          ¦  «        } | €J ‚| j        t          j        k    sJ ‚| j        t          j        k    sJ ‚| j        dk    sJ ‚| j	        dk    sJ ‚| j
        dk    sJ ‚t          d„ | j        D ¦   «         ¦  «        sJ ‚t          d„ | j        D ¦   «         ¦  «        sJ ‚t          d„ | j        D ¦   «         ¦  «        sJ ‚t          d„ | j        D ¦   «         ¦  «        sJ ‚t          d„ | j        D ¦   «         ¦  «        sJ ‚dS )	u¾   
    Test 3: Body Armour vá»›i T1 MÃ¡u (+115) + KhÃ¡ng Lá»­a (+44%) + KhÃ¡ng SÃ©t (+42%)
    + 1 Open Suffix + 1 Open Prefix (bÃ¡o Xanh LÃ¡ cho MÃ¡u/KhÃ¡ng vÃ  VÃ ng cho 1 Open Suffix).
    NéR   r   c              3   ó   K  — | ]}d |v V — Œ	dS )z115 to maximum LifeNr   r   s     r   r   zBtest_3_body_armour_t1_life_res_and_open_affixes.<locals>.<genexpr>  s(   è è € ÐEÐE¨aÐ$¨Ð)ÐEÐEÐEÐEÐEÐEr   c              3   ó   K  — | ]}d |v V — Œ	dS )z44% to Fire ResistanceNr   r   s     r   r   zBtest_3_body_armour_t1_life_res_and_open_affixes.<locals>.<genexpr>  s(   è è € ÐHÐH°Ð'¨1Ð,ÐHÐHÐHÐHÐHÐHr   c              3   ó   K  — | ]}d |v V — Œ	dS )z42% to Lightning ResistanceNr   r   s     r   r   zBtest_3_body_armour_t1_life_res_and_open_affixes.<locals>.<genexpr>  s(   è è € ÐMÐM°aÐ,°Ð1ÐMÐMÐMÐMÐMÐMr   c              3   ó   K  — | ]}d |v V — Œ	dS )z1 Open SuffixNr   r   s     r   r   zBtest_3_body_armour_t1_life_res_and_open_affixes.<locals>.<genexpr>  ó'   è è € Ð@Ð@¨ˆ !Ð#Ð@Ð@Ð@Ð@Ð@Ð@r   c              3   ó   K  — | ]}d |v V — Œ	dS )z1 Open PrefixNr   r   s     r   r   zBtest_3_body_armour_t1_life_res_and_open_affixes.<locals>.<genexpr>  r_   r   )r   ÚREAL_POE2_BODY_ARMOURr'   r   ÚBODY_ARMOURr)   r   r*   Ú
item_levelÚopen_prefixesÚopen_suffixesr/   rW   Úyellow_modsr4   s    r   Ú/test_3_body_armour_t1_life_res_and_open_affixesrg     sM  € õ
 Õ/Ñ0Ô0€FØÐÐÐØŒ?�lÔ6Ò6Ð6Ð6Ð6ØŒ=�JœOÒ+Ð+Ð+Ð+ØÔ Ò"Ð"Ð"Ð"ØÔ 1Ò$Ð$Ð$Ð$ØÔ 1Ò$Ð$Ð$Ð$õ ÐEÐE°6Ô3DÐEÑEÔEÑEÔEÐEÐEÐEÝÐHÐH°fÔ6GÐHÑHÔHÑHÔHÐHÐHÐHÝÐMÐM¸6Ô;LÐMÑMÔMÑMÔMÐMÐMÐMõ Ð@Ð@¨VÔ-?Ð@Ñ@Ô@Ñ@Ô@Ð@Ð@Ð@ÝÐ@Ð@¨VÔ-?Ð@Ñ@Ô@Ñ@Ô@Ð@Ð@Ð@Ð@Ð@r   c                  ó‚  — t          t          ¦  «        } | €J ‚| j        t          j        k    sJ ‚| j        t          j        k    sJ ‚t          d„ | j	        D ¦   «         ¦  «        sJ ‚t          d„ | j	        D ¦   «         ¦  «        sJ ‚t          d„ | j	        D ¦   «         ¦  «        sJ ‚| j
        dk    sJ ‚d| j        v sJ ‚dS )uP   Test 4: GiÃ y vá»›i 35% Movement Speed + Spell Suppression (bÃ¡o God Roll Xanh).Nc              3   ó   K  — | ]}d |v V — Œ	dS )z35% increased Movement SpeedNr   r   s     r   r   zDtest_4_boots_movement_speed_and_spell_suppression.<locals>.<genexpr>%  s(   è è € ÐNÐN°qÐ-°Ð2ÐNÐNÐNÐNÐNÐNr   c              3   ó   K  — | ]}d |v V — Œ	dS )zSuppress Spell DamageNr   r   s     r   r   zDtest_4_boots_movement_speed_and_spell_suppression.<locals>.<genexpr>&  s(   è è € ÐGÐG°Ð&¨!Ð+ÐGÐGÐGÐGÐGÐGr   c              3   ó   K  — | ]}d |v V — Œ	dS )zCold ResistanceNr   r   s     r   r   zDtest_4_boots_movement_speed_and_spell_suppression.<locals>.<genexpr>'  s(   è è € ÐAÐA¨!Ð  AÐ%ÐAÐAÐAÐAÐAÐAr   éP   zGOD ROLL)r   ÚREAL_POE2_BOOTSr'   r   ÚBOOTSr)   r   r*   r/   rW   Úquality_scorer0   r4   s    r   Ú1test_4_boots_movement_speed_and_spell_suppressionrp     så   € å�/Ñ*Ô*€FØÐÐÐØŒ?�lÔ0Ò0Ð0Ð0Ð0ØŒ=�JœOÒ+Ð+Ð+Ð+åÐNÐN¸FÔ<MÐNÑNÔNÑNÔNÐNÐNÐNÝÐGÐG°VÔ5FÐGÑGÔGÑGÔGÐGÐGÐGÝÐAÐA¨vÔ/@ÐAÑAÔAÑAÔAÐAÐAÐAØÔ 2Ò%Ð%Ð%Ð%Ø˜œÐ'Ð'Ð'Ð'Ð'Ð'r   c                  ó†  — t          t          ¦  «        } | €J ‚| j        t          j        k    sJ ‚| j        t          j        k    sJ ‚t          d„ | j	        D ¦   «         ¦  «        sJ ‚t          d„ | j	        D ¦   «         ¦  «        sJ ‚t          d„ | j	        D ¦   «         ¦  «        sJ ‚t          | j	        ¦  «        dk    sJ ‚dS )u?   Test 5: Nháº«n vá»›i Crit Multiplier + Chaos Resistance + Life.Nc              3   ó   K  — | ]}d |v V — Œ	dS )zCritical Strike MultiplierNr   r   s     r   r   z<test_5_ring_crit_multi_chaos_res_and_life.<locals>.<genexpr>2  s(   è è € ÐLÐL°QÐ+¨qÐ0ÐLÐLÐLÐLÐLÐLr   c              3   ó   K  — | ]}d |v V — Œ	dS )zChaos ResistanceNr   r   s     r   r   z<test_5_ring_crit_multi_chaos_res_and_life.<locals>.<genexpr>3  s(   è è € ÐBÐB¨1Ð! QÐ&ÐBÐBÐBÐBÐBÐBr   c              3   ó   K  — | ]}d |v V — Œ	dS )z75 to maximum LifeNr   r   s     r   r   z<test_5_ring_crit_multi_chaos_res_and_life.<locals>.<genexpr>4  s(   è è € ÐDÐD¨QÐ# qÐ(ÐDÐDÐDÐDÐDÐDr   r   )r   ÚREAL_POE2_RINGr'   r   ÚRINGr)   r   r*   r/   rW   r-   r4   s    r   Ú)test_5_ring_crit_multi_chaos_res_and_liferw   ,  sÚ   € å�.Ñ)Ô)€FØÐÐÐØŒ?�lÔ/Ò/Ð/Ð/Ð/ØŒ=�JœOÒ+Ð+Ð+Ð+ÝÐLÐL¸&Ô:KÐLÑLÔLÑLÔLÐLÐLÐLÝÐBÐB°Ô0AÐBÑBÔBÑBÔBÐBÐBÐBÝÐDÐD°&Ô2CÐDÑDÔDÑDÔDÐDÐDÐDÝˆvÔ Ñ!Ô! QÒ&Ð&Ð&Ð&Ð&Ð&r   c                  ó  — t          t          ¦  «        } | €J ‚| j        t          j        k    sJ ‚| j        t          j        k    sJ ‚t          d„ | j	        D ¦   «         ¦  «        sJ ‚t          d„ | j	        D ¦   «         ¦  «        sJ ‚dS )u1   Test 6: BÃ¬nh Flask vá»›i Shock & Bleed Immunity.Nc              3   ó   K  — | ]}d |v V — Œ	dS )ÚBleedingNr   r   s     r   r   z8test_6_flask_shock_and_bleed_immunity.<locals>.<genexpr>>  rT   r   c              3   ó   K  — | ]}d |v V — Œ	dS )ÚShockNr   r   s     r   r   z8test_6_flask_shock_and_bleed_immunity.<locals>.<genexpr>?  s&   è è € Ð7Ð7 ˆw˜!ˆ|Ð7Ð7Ð7Ð7Ð7Ð7r   )
r   ÚREAL_POE2_FLASKr'   r   ÚFLASKr)   r   ÚMAGICr/   rW   r4   s    r   Ú%test_6_flask_shock_and_bleed_immunityr€   8  s™   € å�/Ñ*Ô*€FØÐÐÐØŒ?�lÔ0Ò0Ð0Ð0Ð0ØŒ=�JÔ,Ò,Ð,Ð,Ð,ÝÐ:Ð:¨Ô(9Ð:Ñ:Ô:Ñ:Ô:Ð:Ð:Ð:ÝÐ7Ð7 VÔ%6Ð7Ñ7Ô7Ñ7Ô7Ð7Ð7Ð7Ð7Ð7r   c                  óD  — d} t          | ¦  «        }|€J ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚d}t          |¦  «        }|€J ‚|j        dk    sJ ‚|j        dk    sJ ‚d}t          |¦  «        }|€J ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚d	}t          |¦  «        }|€J ‚|j        dk    sJ ‚|j        dk    sJ ‚d
}t          |¦  «        }	|	€J ‚|	j        dk    sJ ‚|	j        dk    sJ ‚dS )u[   Test 7: Kiá»ƒm tra tÃ­nh toÃ¡n Open Affixes cho Ä‘á»“ Rare (3P/3S) vÃ  Ä‘á»“ Magic (1P/1S).z—Item Class: Helmets
Rarity: Rare
Gloom Crown
Soldier Helmet
--------
Item Level: 75
--------
+80 to maximum Life
+100 to Armour
+36% to Fire ResistanceNr   r   r   zàItem Class: Helmets
Rarity: Rare
Gloom Crown
Soldier Helmet
--------
Item Level: 80
--------
+90 to maximum Life
+150 to Armour
+50 to maximum Mana
+40% to Fire Resistance
+40% to Cold Resistance
+40% to Lightning Resistancer   zqItem Class: Body Armours
Rarity: Magic
Vigorous Iron Cuirass
--------
Item Level: 50
--------
+85 to maximum LifezyItem Class: Body Armours
Rarity: Magic
Iron Cuirass of the Drake
--------
Item Level: 50
--------
+38% to Fire Resistancez–Item Class: Body Armours
Rarity: Magic
Vigorous Iron Cuirass of the Drake
--------
Item Level: 50
--------
+85 to maximum Life
+38% to Fire Resistance)r   Úmax_prefixesÚmax_suffixesrd   re   )
Ú	rare_2p1sÚr1Ú	rare_3p3sÚr2Ú
magic_1p0sÚr3Ú
magic_0p1sÚr4Ú
magic_1p1sÚr5s
             r   Ú.test_7_open_affixes_calculation_rare_and_magicrŽ   B  s·  € ð	€Iõ 
�iÑ	 Ô	 €BØˆ>ˆ>ˆ>ØŒ?˜aÒÐÐÐØŒ?˜aÒÐÐÐØÔ˜qÒ Ð Ð Ð ØÔ˜qÒ Ð Ð Ð ð €Iõ 
�iÑ	 Ô	 €BØˆ>ˆ>ˆ>ØÔ˜qÒ Ð Ð Ð ØÔ˜qÒ Ð Ð Ð ð€Jõ 
�jÑ	!Ô	!€BØˆ>ˆ>ˆ>ØŒ?˜aÒÐÐÐØŒ?˜aÒÐÐÐØÔ˜qÒ Ð Ð Ð ØÔ˜qÒ Ð Ð Ð ð€Jõ 
�jÑ	!Ô	!€BØˆ>ˆ>ˆ>ØÔ˜qÒ Ð Ð Ð ØÔ˜qÒ Ð Ð Ð ð€Jõ 
�jÑ	!Ô	!€BØˆ>ˆ>ˆ>ØÔ˜qÒ Ð Ð Ð ØÔ˜qÒ Ð Ð Ð Ð Ð r   c                  ó¸  — t          t          ¦  «        } | €J ‚| j        dk    sJ ‚| j        dk    sJ ‚t	          | j        ¦  «        dk    sJ ‚d„ | j        D ¦   «         d         }|j        t          j        k    sJ ‚|j	        dk    sJ ‚|j
        t          j        k    sJ ‚d„ | j        D ¦   «         d         }|j        t          j        k    sJ ‚|j	        dk    sJ ‚dS )uf   Kiá»ƒm tra nháº­n diá»‡n chÃ­nh xÃ¡c cÃ¡c tháº» Advanced Mod tag { Prefix/Suffix Modifier (Tier: X) }.Nr   é   c                 ó(   — g | ]}|j         d k    ¯|‘ŒS )ÚLife)r'   r   s     r   r=   z2test_advanced_mod_tags_parsing.<locals>.<listcomp>�  s$   € ÐCÐCÐC�a¨a¬j¸FÒ.BÐ.B�Ð.BÐ.BÐ.Br   r   c                 ó$   — g | ]}d |j         v ¯|‘ŒS )ÚFirer<   r   s     r   r=   z2test_advanced_mod_tags_parsing.<locals>.<listcomp>£  s$   € Ð?Ð?Ð?�a¨f¸¼Ð.>Ð.>�Ð.>Ð.>Ð.>r   )r   ÚREAL_POE2_ADVANCED_TAGSrd   re   r-   Úraw_modsÚ
affix_typer   ÚPREFIXÚtierr2   r   ÚGOD_ROLLÚSUFFIX)r5   Úlife_modÚfire_mods      r   Útest_advanced_mod_tags_parsingrž   ”  s  € åÕ1Ñ2Ô2€FØÐÐÐØÔ 1Ò$Ð$Ð$Ð$ØÔ 1Ò$Ð$Ð$Ð$ÝˆvŒÑÔ 1Ò$Ð$Ð$Ð$ð DÐC˜6œ?ÐCÑCÔCÀAÔF€HØÔ¥)Ô"2Ò2Ð2Ð2Ð2ØŒ=˜AÒÐÐÐØÔÕ 2Ô ;Ò;Ð;Ð;Ð;ð @Ð?˜6œ?Ð?Ñ?Ô?ÀÔB€HØÔ¥)Ô"2Ò2Ð2Ð2Ð2ØŒ=˜AÒÐÐÐÐÐr   c                  óv  ‡‡— g Šg Št          ˆfd„ˆfd„dddd¬¦  «        } d| _        t          | _        ddd	dd
œ}t	          d¦  «        D ]}|                      dd|¦  «         Œt          ‰¦  «        dk    sJ ‚d| _        ddd	dd
œ}t	          d¦  «        D ]}|                      dd|¦  «         Œt          ‰¦  «        dk    sJ ‚‰d         \  }}}|j        t          j	        k    sJ ‚|dk    r|dk    sJ ‚| j
        du sJ ‚|                      dd|¦  «         t          ‰¦  «        dk    sJ ‚| j
        du sJ ‚dS )u]   Kiá»ƒm tra Hover Dwell Tracker, Focus Interlock vÃ  Callback dispatch cá»§a ItemHoverWatcher.c                 ó4   •— ‰                      | ||f¦  «        S )N©Úappend)ÚrÚxÚyÚinspected_eventss      €r   ú<lambda>z/test_item_hover_watcher_logic.<locals>.<lambda>®  s   ø€ Ð*:×*AÒ*AÀ1ÀaÈÀ)Ñ*LÔ*L€ r   c                  ó.   •— ‰                       d¦  «        S )NTr¡   )Úcursor_moved_eventss   €r   r§   z/test_item_hover_watcher_logic.<locals>.<lambda>¯  s   ø€ Ð 3× :Ò :¸4Ñ @Ô @€ r   g      Y@gš™™™™™™?T)Úon_item_inspectedÚon_cursor_movedÚdwell_time_msÚpoll_interval_sÚenable_focus_interlockÚsimulate_keysFNg        )Úlast_posÚ
anchor_posÚdwell_accum_msÚhas_triggeredé   iô  r   r   i  )r   Ú_mock_is_focusedra   Ú_mock_clipboard_textrF   Úprocess_tickr-   r'   r   rb   Útooltip_active)ÚwatcherÚstateÚ_ÚrepÚcxÚcyr©   r¦   s         @@r   Útest_item_hover_watcher_logicr¿   ¨  s¼  øø€ àÐØÐåØLÐLÐLÐLØ@Ð@Ð@Ð@ØØØ#Øðñ ô €Gð  %€GÔÝ#8€GÔ à¨TÀSÐ[`ÐaÐa€Eõ �1‰XŒXð .ð .ˆØ×Ò˜S # uÑ-Ô-Ð-Ð-åÐÑ Ô  AÒ%Ð%Ð%Ð%ð  $€GÔØ¨TÀSÐ[`ÐaÐa€Eå�1‰XŒXð .ð .ˆØ×Ò˜S # uÑ-Ô-Ð-Ð-åÐÑ Ô  AÒ%Ð%Ð%Ð%Ø" 1Ô%�K€CˆˆRØŒ<�<Ô3Ò3Ð3Ð3Ð3Ø�Š9ˆ9˜˜sš˜˜Ð"ØÔ! TÐ)Ð)Ð)Ð)ð ×Ò˜˜c 5Ñ)Ô)Ð)ÝÐ"Ñ#Ô# qÒ(Ð(Ð(Ð(ØÔ! UÐ*Ð*Ð*Ð*Ð*Ð*r   c                  ó
  — t          ¦   «         } | j        €t          j        d¦  «         t	          t
          ¦  «        }|€J ‚|                      |dd¦  «         | j        du sJ ‚|                      ¦   «          | j        du sJ ‚dS )uU   Kiá»ƒm tra khá»Ÿi táº¡o vÃ  chu ká»³ hiá»ƒn thá»‹ show/hide cá»§a ItemTooltipOverlay.Nu9   Bá»� qua test GUI trong mÃ´i trÆ°á»�ng khÃ´ng cÃ³ DISPLAYéÈ   TF)	r   ÚwindowÚpytestÚskipr   ra   ÚshowÚ
is_visibleÚhide)Úoverlayr5   s     r   Ú#test_item_tooltip_overlay_lifecyclerÉ   Õ  s‘   € å Ñ"Ô"€GØ„~ÐÝŒÐOÑPÔPÐPåÕ/Ñ0Ô0€FØÐÐÐà‡L‚L�˜˜cÑ"Ô"Ð"ØÔ Ð%Ð%Ð%Ð%à‡L‚L�N„N€NØÔ Ð&Ð&Ð&Ð&Ð&Ð&r   c            
      óÀ  — t          d¬¦  «        } d| _        t          dd¬¦  «        5  t          dd¬¦  «        5  t          d	d
¬¦  «        5  t          ddt          j        ¦   «         f¬¦  «        5  |                      ¦   «         du sJ ‚	 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   t          dd¬¦  «        5  t          dd¬¦  «        5  t          d	d¬¦  «        5  t          dd¬¦  «        5  t          d¦  «        5 }d|j        j        _        |                      ¦   «         du sJ ‚	 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 )uv   Test xÃ¡c nháº­n is_game_window_focused() tráº£ vá»� True khi pid == os.getpid() (Focus Interlock khÃ´ng tá»± cháº·n).T)r®   Nzwin32gui.GetForegroundWindowi8[ )Úreturn_valuezwin32gui.GetWindowTextzItem Inspector Tkinter Overlayzwin32gui.GetClassNameÚ
TkTopLevelz%win32process.GetWindowThreadProcessIdr   iŸ† zGoogle ChromeÚChrome_WidgetWin_1)r   i?B zpsutil.Processz
chrome.exeF)r   rµ   r   ÚosÚgetpidÚis_game_window_focusedrË   Úname)r¹   Ú	mock_procs     r   Ú'test_focus_interlock_allows_own_processrÓ   å  s<  € å°dÐ;Ñ;Ô;€GØ#€GÔõ 
Ð-¸EÐ	BÑ	BÔ	Bð 8ð 8Ý	Ð'Ð6VÐ	WÑ	WÔ	Wð8ð 8å	Ð&°\Ð	BÑ	BÔ	Bð8ð 8õ 
Ð6ÀaÍÌÉÌÐEUÐ	VÑ	VÔ	Vð8ð 8ð ×-Ò-Ñ/Ô/°4Ð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ñ 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õ 
Ð-¸EÐ	BÑ	BÔ	Bð 9ð 9Ý	Ð'°oÐ	FÑ	FÔ	Fð9ð 9å	Ð&Ð5IÐ	JÑ	JÔ	Jð9ð 9õ 
Ð6À[Ð	QÑ	QÔ	Qð9ð 9õ 
ÐÑ	 Ô	 ð	9ð %.Ø3?ˆ	ÔÔ#Ô0Ø×-Ò-Ñ/Ô/°5Ð8Ð8Ð8Ð8Ð8ð9ð 9ð 9ñ 9ô 9ð 9ð 9ð 9ð 9ð 9ð 9øøøð 9ð 9ð 9ð 9ð 9ð 9ð 9ñ 9ô 9ð 9ð 9ð 9ð 9ð 9ð 9øøøð 9ð 9ð 9ð 9ð 9ð 9ð 9ñ 9ô 9ð 9ð 9ð 9ð 9ð 9ð 9øøøð 9ð 9ð 9ð 9ð 9ð 9ð 9ñ 9ô 9ð 9ð 9ð 9ð 9ð 9ð 9øøøð 9ð 9ð 9ð 9ð 9ð 9ð 9ñ 9ô 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9øøøð 9ð 9ð 9ð 9ð 9ð 9s  ©C»CÁ%B/Á2B	ÂB/ÂBÂB/ÂBÂ B/Â#CÂ/B3Â3CÂ6B3Â7CÂ:CÃC
	Ã
CÃC
	ÃCÃC!Ã$C!Ã9GÄF;ÄF$Ä/F	Ä?*E6Å*F	Å6E:Å:F	Å=E:Å>F	ÆF$ÆFÆF$ÆFÆF$ÆF;Æ$F(Æ(F;Æ+F(Æ,F;Æ/GÆ;F?	Æ?GÇF?	ÇGÇGÇGc                  ó’  — t          ¦   «         } | j        �| j        €t          j        d¦  «         ddl}ddl}|                     | j        |j        ¦  «        }d}d}d}||z  |z  }||z  |k    sJ ‚t          t          ¦  «        }|                      |dd¦  «         | j        du sJ ‚|                      ¦   «          | j        d	u sJ ‚dS )
ut   Kiá»ƒm tra ItemTooltipOverlay Ã¡p dá»¥ng cá»� WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_NOACTIVATE vÃ  SetWindowPos.Nu?   Bá»� qua test Win32 GUI trong mÃ´i trÆ°á»�ng khÃ´ng cÃ³ DISPLAYr   i   é    i   rÁ   TF)r   rÂ   Útarget_hwndrÃ   rÄ   Úwin32conÚwin32guiÚGetWindowLongÚGWL_EXSTYLEr   ra   rÅ   rÆ   rÇ   )	rÈ   r×   rØ   ÚstyleÚWS_EX_LAYEREDÚWS_EX_TRANSPARENTÚWS_EX_NOACTIVATEÚexpected_maskr5   s	            r   Ú6test_item_tooltip_overlay_noactivate_and_click_throughrà   ü  sò   € å Ñ"Ô"€GØ„~Ð Ô!4Ð!<ÝŒÐUÑVÔVÐVà€O€O€OØ€O€O€Oà×"Ò" 7Ô#6¸Ô8LÑMÔM€EØ€MØ"ÐØ!ÐØ!Ð$5Ñ5Ð8HÑH€MØ�MÑ! mÒ3Ð3Ð3Ð3åÕ/Ñ0Ô0€FØ‡L‚L�˜˜cÑ"Ô"Ð"ØÔ Ð%Ð%Ð%Ð%à‡L‚L�N„N€NØÔ Ð&Ð&Ð&Ð&Ð&Ð&r   ).Ú__doc__rÎ   ÚsysÚunittest.mockr   rÃ   ÚpathÚinsertÚabspathÚjoinÚdirnameÚ__file__Ú!src.assistant_tool.item_inspectorr   r   r   r   r   r	   r
   r   Ú%src.assistant_tool.item_hover_watcherr   Ú'src.assistant_tool.item_tooltip_overlayr   r&   rV   rD   ra   rm   ru   r}   r•   r6   rO   rX   rg   rp   rw   r€   rŽ   rž   r¿   rÉ   rÓ   rà   r   r   r   ú<module>rí      s$  ððð ð 
€	€	€	Ø 
€
€
€
Ø Ð Ð Ð Ð Ð Ø €€€à „‡‚��2”7—?’? 2¤7§<¢<°´·²ÀÑ0IÔ0IÈ4Ñ#PÔ#PÑQÔQÑ RÔ RÐ Rð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð CÐ BÐ BÐ BÐ BÐ BØ FÐ FÐ FÐ FÐ FÐ FðÐ ð
#Ð ðÐ ð0 Ð ð(€ð"€ð*€ð Ð ð6Mð Mð Mð*4^ð 4^ð 4^ðn
(ð 
(ð 
(ðAð Að Að.(ð (ð (ð	'ð 	'ð 	'ð8ð 8ð 8ðO!ð O!ð O!ðdð ð ð(*+ð *+ð *+ðZ'ð 'ð 'ð 9ð 9ð 9ð.'ð 'ð 'ð 'ð 'r   