§
    È9¬j¨   ã                  óÀ   — 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
Z
ddlmZ ddlmZmZmZ ddlmZ  G d„ de
j        ¦  «        Zed	k    r e
j        ¦   «          dS dS )
uŒ  AutoPOE2 - Test Suite Tháº©m Ä�á»‹nh Tooltip Váº­t Pháº©m & PhÃ¢n Loáº¡i Tier (Doc 29 / Doc 68).
=====================================================================================
Kiá»ƒm thá»­ toÃ n diá»‡n:
1. Tháº©m Ä‘á»‹nh Ã�o GiÃ¡p Hiáº¿m Tháº§n Pháº©m (T1 Life + Dual T1 Res) -> PhÃ¢n loáº¡i KEEP.
2. Tháº©m Ä‘á»‹nh DÃ¢y Chuyá»�n +Skill Gems (+2 Spell Skill Gems, Crit Multi) -> PhÃ¢n loáº¡i KEEP.
3. Tháº©m Ä‘á»‹nh GiÃ y Tá»‘c Ä�á»™ Cháº¡y T1 (35% MS, 14% Spell Suppress) -> PhÃ¢n loáº¡i KEEP/STASH.
4. Tháº©m Ä‘á»‹nh Nháº«n ChÃ­ Máº¡ng & KhÃ¡ng Há»—n Loáº¡n (Crit Multi, Chaos Res) -> PhÃ¢n loáº¡i STASH.
5. Tháº©m Ä‘á»‹nh VÅ© KhÃ­ SÃ¡t ThÆ°Æ¡ng Váº­t LÃ½ Cao (%Phys, Flat Phys, Attack Speed) -> PhÃ¢n loáº¡i KEEP.
6. Tháº©m Ä‘á»‹nh Trang Bá»‹ RÃ¡c / Thuá»™c TÃ­nh KÃ©m (Light Radius, Thorns, Mana) -> PhÃ¢n loáº¡i VENDOR.
7. Tháº©m Ä‘á»‹nh trá»±c tiáº¿p tá»« Artifact áº¢nh Chá»¥p Tháº­t (captures/test_auto_hover_success.png).
8. KhÃ¡ng lá»—i vÃ  an toÃ n tuyá»‡t Ä‘á»‘i khi gáº·p dá»¯ liá»‡u trá»‘ng hoáº·c sai Ä‘á»‹nh dáº¡ng.

TuÃ¢n thá»§ nghiÃªm ngáº·t:
- Rule 5: Sá»­ dá»¥ng artifact tháº­t tá»« captures/.
- Rule 14: Quality Gate, 100% tests PASS.
é    )ÚannotationsN)ÚImage)ÚItemEvaluationActionÚItemEvaluationReportÚItemTooltipEvaluator)ÚModCategoryc                  óZ   — e Zd ZdZdd„Zdd„Zdd„Zdd„Zdd„Zdd	„Z	dd
„Z
dd„Zdd„ZdS )ÚTestItemTooltipEvaluatoru-   Test suite kiá»ƒm thá»­ ItemTooltipEvaluator.ÚreturnÚNonec                ó¼   — t          ¦   «         | _        t          j                             t          j                             t          ¦  «        dd¦  «        | _        d S )Nz..Úcaptures)r   Ú	evaluatorÚosÚpathÚjoinÚdirnameÚ__file__Úcaptures_dir)Úselfs    ú9C:\Projects\AutoPOE2\tests\test_item_tooltip_evaluator.pyÚsetUpzTestItemTooltipEvaluator.setUp#   s=   € Ý-Ñ/Ô/ˆŒÝœGŸLšL­¬¯ª½Ñ)BÔ)BÀDÈ*ÑUÔUˆÔÐÐó    c                ó  — d}| j                              |¦  «        }|                      |j        t          j        ¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |  	                    |j
        d¦  «         |  	                    |j        d¦  «         |                      |j                             dd¦  «        d	¦  «         |                      |j                             d
d¦  «        d¦  «         |  	                    |j                             dd¦  «        d¦  «         |                      t!          d„ |j        D ¦   «         ¦  «        ¦  «         dS )ug   Kiá»ƒm chá»©ng Ã¡o giÃ¡p hiáº¿m T1 Life + Dual T1 Resists Ä‘áº¡t KEEP vá»›i Ä‘iá»ƒm hiá»‡p Ä‘á»“ng cao.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 ResistancezBody ArmoursÚRAREéR   é   ç     €Q@Úfireç        g      F@Ú	lightningg      E@Ú	total_eleg     €U@c              3  ó   K  — | ]}d |v V — Œ	dS )zLife + Multi ResistanceN© )Ú.0Úss     r   ú	<genexpr>zbTestItemTooltipEvaluator.test_tier_1_life_and_high_resistances_body_armour_keep.<locals>.<genexpr>L   s(   è è € Ð[Ð[¸qÐ5¸Ð:Ð[Ð[Ð[Ð[Ð[Ð[r   N)r   Úevaluate_textÚassertEqualÚactionr   ÚKEEPÚ
item_classÚrarityÚ
item_levelÚassertGreaterEqualÚtier_1_countÚtotal_scoreÚassertAlmostEqualÚpseudo_resistsÚgetÚ
assertTrueÚanyÚsynergy_bonuses)r   Úbody_armour_textÚreports      r   Ú6test_tier_1_life_and_high_resistances_body_armour_keepzOTestItemTooltipEvaluator.test_tier_1_life_and_high_resistances_body_armour_keep'   sk  € ð Ðð( ”×-Ò-Ð.>Ñ?Ô?ˆà×Ò˜œÕ(<Ô(AÑBÔBÐBØ×Ò˜Ô*¨NÑ;Ô;Ð;Ø×Ò˜œ¨Ñ/Ô/Ð/Ø×Ò˜Ô*¨BÑ/Ô/Ð/Ø×Ò Ô 3°QÑ7Ô7Ð7Ø×Ò Ô 2°DÑ9Ô9Ð9ð 	×Ò˜vÔ4×8Ò8¸ÀÑEÔEÀtÑLÔLÐLØ×Ò˜vÔ4×8Ò8¸ÀcÑJÔJÈDÑQÔQÐQØ×Ò Ô 5× 9Ò 9¸+ÀsÑ KÔ KÈTÑRÔRÐRð 	�Š�Ð[Ð[ÀFÔDZÐ[Ñ[Ô[Ñ[Ô[Ñ\Ô\Ð\Ð\Ð\r   c                óê  — d}| j                              |¦  «        }|                      |j        t          j        ¦  «         |                      |j        d¦  «         d„ |j        D ¦   «         }|                      t          |¦  «        d¦  «         |                      |d         j
        d¦  «         |                      |d         j        ¦  «         |                      |d         j        d¦  «         dS )	u^   Kiá»ƒm chá»©ng dÃ¢y chuyá»�n cÃ³ +Skill Gems phÃ¢n loáº¡i KEEP vÃ  ghi Ä‘iá»ƒm vÆ°á»£t trá»™i.zôItem Class: Amulets
Rarity: Rare
Sol Rosary
Amber Amulet
--------
Requirements:
Level: 68
--------
Item Level: 84
--------
+2 to Level of all Spell Skill Gems
+24% to Global Critical Strike Multiplier
+38% to Cold Resistance
+75 to maximum Lifer   c                ó<   — g | ]}|j         t          j        k    ¯|‘ŒS r$   )Úcategoryr   Ú
SKILL_GEMS©r%   Úms     r   ú
<listcomp>zMTestItemTooltipEvaluator.test_plus_skill_gems_amulet_keep.<locals>.<listcomp>e   s'   € Ð_Ð_Ð_˜1¸!¼*ÍÔH^Ò:^Ð:^�QÐ:^Ð:^Ð:^r   é   r   g       @g      N@N)r   r(   r)   r*   r   r+   r/   r1   Úhigh_value_modsÚlenÚvaluer5   Ú	is_tier_1Úscore)r   Úamulet_textr9   Ú	gems_modss       r   Ú test_plus_skill_gems_amulet_keepz9TestItemTooltipEvaluator.test_plus_skill_gems_amulet_keepN   sã   € ðˆð ”×-Ò-¨kÑ:Ô:ˆà×Ò˜œÕ(<Ô(AÑBÔBÐBØ×Ò Ô 2°DÑ9Ô9Ð9ð `Ð_ Ô 6Ð_Ñ_Ô_ˆ	Ø×Ò�˜Y™œ¨Ñ+Ô+Ð+Ø×Ò˜ 1œÔ+¨SÑ1Ô1Ð1Ø�Š˜	 !œÔ.Ñ/Ô/Ð/Ø×Ò 	¨!¤Ô 2°DÑ9Ô9Ð9Ð9Ð9r   c                óx  — d}| j                              |¦  «        }|                      |j        t          j        t          j        f¦  «         |                      |j        d¦  «         d„ |j	        D ¦   «         }|                      t          j        |¦  «         |                      t          j        |¦  «         dS )uZ   Kiá»ƒm chá»©ng giÃ y cÃ³ T1 Movement Speed (35%) vÃ  Spell Suppression Ä‘áº¡t chuáº©n cao.a  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 Resistanceé   c                ó   — h | ]	}|j         ’Œ
S r$   )r=   r?   s     r   ú	<setcomp>zXTestItemTooltipEvaluator.test_boots_movement_speed_and_spell_suppress.<locals>.<setcomp>„   s   € ÐAÐAÐA Q�a”jÐAÐAÐAr   N)r   r(   ÚassertInr*   r   r+   ÚSTASHr/   r0   rC   r   Ú
MOVE_SPEEDÚSPELL_SUPPRESSION)r   Ú
boots_textr9   Ú
categoriess       r   Ú,test_boots_movement_speed_and_spell_suppresszETestItemTooltipEvaluator.test_boots_movement_speed_and_spell_suppressk   s©   € ðˆ
ð" ”×-Ò-¨jÑ9Ô9ˆà�Š�f”mÕ&:Ô&?ÕAUÔA[Ð%\Ñ]Ô]Ð]Ø×Ò Ô 3°QÑ7Ô7Ð7ð BÐA¨&Ô*@ÐAÑAÔAˆ
Ø�Š•kÔ,¨jÑ9Ô9Ð9Ø�Š•kÔ3°ZÑ@Ô@Ð@Ð@Ð@r   c                ó4  — d}| j                              |¦  «        }|                      |j        t          j        t          j        f¦  «         |                      |j        d¦  «         |  	                    |j
                             dd¦  «        d¦  «         dS )uW   Kiá»ƒm chá»©ng nháº«n cÃ³ Crit Multi vÃ  Chaos Res giÃ¡ trá»‹ cao Ä‘áº¡t chuáº©n STASH.zÐ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 Lifeç      D@Úchaosr    g      6@N)r   r(   rO   r*   r   r+   rP   r/   r1   r2   r3   r4   )r   Ú	ring_textr9   s      r   Ú(test_ring_crit_multi_and_chaos_res_stashzATestItemTooltipEvaluator.test_ring_crit_multi_and_chaos_res_stashˆ   s‹   € ðˆ	ð ”×-Ò-¨iÑ8Ô8ˆà�Š�f”mÕ&:Ô&?ÕAUÔA[Ð%\Ñ]Ô]Ð]Ø×Ò Ô 2°DÑ9Ô9Ð9Ø×Ò˜vÔ4×8Ò8¸À#ÑFÔFÈÑMÔMÐMÐMÐMr   c                óô   — d}| j                              |¦  «        }|                      |j        t          j        ¦  «         |                      |j        d¦  «         |                      |j        d¦  «         dS )uM   Kiá»ƒm chá»©ng vÅ© khÃ­ váº­t lÃ½ ba dÃ²ng sÃ¡t thÆ°Æ¡ng Ä‘áº¡t chuáº©n KEEP.z¾Item Class: Two Hand Swords
Rarity: Rare
Beast Cleaver
Colossus Sword
--------
Item Level: 83
--------
145% increased Physical Damage
Adds 18 to 36 Physical Damage
18% increased Attack Speedr   r   N)	r   r(   r)   r*   r   r+   r/   r0   r1   )r   Úweapon_textr9   s      r   Ú#test_weapon_physical_dps_evaluationz<TestItemTooltipEvaluator.test_weapon_physical_dps_evaluationž   st   € ð	ˆð ”×-Ò-¨kÑ:Ô:ˆà×Ò˜œÕ(<Ô(AÑBÔBÐBØ×Ò Ô 3°QÑ7Ô7Ð7Ø×Ò Ô 2°DÑ9Ô9Ð9Ð9Ð9r   c                óV  — d}| j                              |¦  «        }|                      |j        t          j        ¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |  	                    t          d„ |j        D ¦   «         ¦  «        ¦  «         dS )ub   Kiá»ƒm chá»©ng trang bá»‹ rÃ¡c chá»‰ sá»‘ tháº¥p / khÃ´ng hiá»‡p Ä‘á»“ng bá»‹ phÃ¢n loáº¡i VENDOR.zÒItem Class: Body Armours
Rarity: Rare
Trash Mail
Rusty Chest
--------
Item Level: 45
--------
12% increased Light Radius
Reflects 4 Physical Damage to Melee Attackers
+18 to maximum Mana
+12% to Fire ResistancerW   r   c              3  ón   K  — | ]0}d |                      ¦   «         v pd|                      ¦   «         v V — Œ1dS )ÚvendorÚlowN)Úlower)r%   Úrs     r   r'   zJTestItemTooltipEvaluator.test_junk_item_vendor_decision.<locals>.<genexpr>Ä   sA   è è € Ð`Ð`ÈA˜H¨¯ª©	¬	Ð1ÐG°U¸a¿gºg¹i¼iÐ5GÐ`Ð`Ð`Ð`Ð`Ð`r   N)r   r(   r)   r*   r   ÚVENDORÚ
assertLessr1   r0   r5   r6   Úreasons)r   Ú	junk_textr9   s      r   Útest_junk_item_vendor_decisionz7TestItemTooltipEvaluator.test_junk_item_vendor_decision±   sŸ   € ð
ˆ	ð ”×-Ò-¨iÑ8Ô8ˆà×Ò˜œÕ(<Ô(CÑDÔDÐDØ�Š˜Ô*¨DÑ1Ô1Ð1Ø×Ò˜Ô,¨aÑ0Ô0Ð0Ø�Š�Ð`Ð`ÐQWÔQ_Ð`Ñ`Ô`Ñ`Ô`ÑaÔaÐaÐaÐar   c                óê  — t           j                             | j        d¦  «        }t           j                             |¦  «        s|                      d¦  «         | j                             |¦  «        }|                      |t          ¦  «         |  
                    |j        t          j        t          j        t          j        f¦  «         |                      t#          |j        ¦  «        d¦  «         dS )up   Kiá»ƒm thá»­ tháº©m Ä‘á»‹nh trá»±c tiáº¿p tá»« áº£nh capture thá»±c táº¿ (captures/test_auto_hover_success.png).ztest_auto_hover_success.pngu7   KhÃ´ng tÃ¬m tháº¥y captures/test_auto_hover_success.pngr   N)r   r   r   r   ÚexistsÚskipTestr   Úevaluate_imageÚassertIsInstancer   rO   r*   r   r+   rP   rd   ÚassertGreaterrD   Úraw_text)r   Úreal_img_pathr9   s      r   Ú"test_real_capture_image_evaluationz;TestItemTooltipEvaluator.test_real_capture_image_evaluationÆ   sÀ   € åœŸš TÔ%6Ð8UÑVÔVˆÝŒw�~Š~˜mÑ,Ô,ð 	UØ�MŠMÐSÑTÔTÐTà”×.Ò.¨}Ñ=Ô=ˆà×Ò˜fÕ&:Ñ;Ô;Ð;Ø�Š�f”mÕ&:Ô&?ÕAUÔA[Õ]qÔ]xÐ%yÑzÔzÐzà×Ò�3˜vœÑ/Ô/°Ñ3Ô3Ð3Ð3Ð3r   c                ó  — | j                              d¦  «        }|                      |j        t          j        ¦  «         | j                              d¦  «        }|                      |j        t          j        ¦  «         dS )uZ   Kiá»ƒm chá»©ng an toÃ n tuyá»‡t Ä‘á»‘i, khÃ´ng crash khi gáº·p chuá»—i rá»—ng hoáº·c rÃ¡c.Ú z   
-----
???
N)r   r(   r)   r*   r   rd   )r   Úempty_reportÚgarbage_reports      r   Ú'test_empty_or_malformed_input_fail_safez@TestItemTooltipEvaluator.test_empty_or_malformed_input_fail_safeÓ   sm   € à”~×3Ò3°BÑ7Ô7ˆØ×Ò˜Ô,Õ.BÔ.IÑJÔJÐJàœ×5Ò5Ð6IÑJÔJˆØ×Ò˜Ô.Õ0DÔ0KÑLÔLÐLÐLÐLr   N)r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r:   rJ   rU   rZ   r]   rh   rq   rv   r$   r   r   r
   r
       sé   € € € € € Ø7Ð7ðVð Vð Vð Vð%]ð %]ð %]ð %]ðN:ð :ð :ð :ð:Að Að Að Að:Nð Nð Nð Nð,:ð :ð :ð :ð&bð bð bð bð*4ð 4ð 4ð 4ðMð Mð Mð Mð Mð Mr   r
   Ú__main__)rz   Ú
__future__r   ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arr   ÚunittestÚPILr   Ú0src.assistant_tool.pickit.item_tooltip_evaluatorr   r   r   Ú+src.assistant_tool.pickit.mod_tier_patternsr   ÚTestCaser
   rw   Úmainr$   r   r   ú<module>r‰      s  ððð ð" #Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € €	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð
 DÐ CÐ CÐ CÐ CÐ CðyMð yMð yMð yMð yM˜xÔ0ñ yMô yMð yMðx ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   