§
    b´£jë  ã                   óh   — d Z ddlZddlmZmZmZmZmZ ddlm	Z	m
Z
 d„ Zd„ Zd„ Zd„ Zd	„ Zd
„ Zd„ ZdS )uŸ   
Unit tests for AutoPOE2 Pickit DSL Parser & Evaluator (Doc 29 Phase P2)
Ref: Doc 29 sections 8.3, 9.2, 9.4, 9.5 & Section 18.P2
Má»‘c thá»�i gian: 11/09/2026
é    N)Ú	parse_ipdÚ
PickitRuleÚClauseÚWeightedSumClauseÚBinaryOp)ÚPickitEvaluatorÚEvaluationResultc                  ó  — d} t          | ¦  «        }t          |¦  «        dk    sJ ‚|d         j        du sJ ‚d|d         j        v sJ ‚|d         j        du sJ ‚d|d         j        v sJ ‚|d	         j        du sJ ‚d
|d	         j        v sJ ‚d S )Nzâ
    // Single line comment
    [Type] == "Exalted Orb" # [StashItem] == "true"
    //[Rarity] == "Magic" # [Salvage] == "true"
    [Category] == "Waystone" && [WaystoneTier] >= "10" # [RunMap] == "true" // inline comment
    é   r   TÚ	StashItemé   FÚSalvageé   ÚRunMap)r   ÚlenÚenabledÚactions)Úipd_textÚruless     ú3C:\Projects\AutoPOE2\tests\test_pickit_evaluator.pyÚtest_parser_basic_and_commentsr      sÇ   € ð€Hõ �hÑÔ€EÝˆu‰:Œ:˜Š?ˆ?ˆ?ˆ?ð �Œ8Ô˜tÐ#Ð#Ð#Ð#Ø˜% œ(Ô*Ð*Ð*Ð*Ð*ð �Œ8Ô˜uÐ$Ð$Ð$Ð$Ø˜˜aœÔ(Ð(Ð(Ð(Ð(ð �Œ8Ô˜tÐ#Ð#Ð#Ð#Ø�u˜Q”xÔ'Ð'Ð'Ð'Ð'Ð'Ð'ó    c                  óŒ   — d} t          j        t          ¦  «        5  t          | ¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )Nz-[Type] == "Exalted Orb" [StashItem] == "true")ÚpytestÚraisesÚSyntaxErrorr   )Úinvalid_ipds    r   Ú%test_parser_syntax_error_missing_hashr   #   s‰   € àA€KÝ	Œ•{Ñ	#Ô	#ð ð Ý�+ÑÔÐðð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð s   œ9¹=Á =c                  ó   — d} t          | ¦  «        }t          |¦  «        }dddddœdœ}|                     |¦  «        }|j        du sJ ‚d|j        v sJ ‚dddddœdœ}|                     |¦  «        }d|j        vsJ ‚d S )	Nzd
    [Rarity] == "Rare" # [WeightedSum(stat_a:2.0,stat_b:3.0)] >= "30" && [StashItem] == "true"
    TÚRareé
   é   )Ústat_aÚstat_b©Ú
identifiedÚrarityÚmodsr   )r   r   ÚevaluateÚpickup_candidater   )r   r   Ú	evaluatorÚ	item_passÚres_passÚ	item_failÚres_fails          r   Útest_weighted_sum_evaluatorr0   *   sÏ   € ð€Hõ �hÑÔ€EÝ Ñ&Ô&€Ið ØØ¨Ð+Ð+ðð €Ið
 ×!Ò! )Ñ,Ô,€HØÔ$¨Ð,Ð,Ð,Ð,Ø˜(Ô*Ð*Ð*Ð*Ð*ð ØØ¨Ð*Ð*ðð €Ið
 ×!Ò! )Ñ,Ô,€HØ˜hÔ.Ð.Ð.Ð.Ð.Ð.Ð.r   c                  óÆ   — d} t          | ¦  «        }t          |¦  «        }ddddœ}|                     |¦  «        }|j        du sJ ‚t	          |j        ¦  «        dk    sJ ‚d S )Nz=
    [UniqueName] == "Mageblood" # [StashItem] == "true"
    Fz
Heavy BeltÚ	Mageblood)r&   ÚtypeÚunique_namer   )r   r   r)   r*   r   r   )r   r   r+   Úground_itemÚress        r   Ú%test_uniquename_rejected_in_pre_phaser7   E   s†   € ð€Hõ �hÑÔ€EÝ Ñ&Ô&€Ið ØØ"ðð €Kð
 ×
Ò
˜[Ñ
)Ô
)€CàÔ 5Ð(Ð(Ð(Ð(ÝˆsŒ{ÑÔ˜qÒ Ð Ð Ð Ð Ð r   c                  ó   — d} t          | ¦  «        }t          |¦  «        }ddddœ}|                     |¦  «        }|j        du sJ ‚d|j        vsJ ‚d|j        v sJ ‚ddddœ}|                     |¦  «        }|j        d	u sJ ‚d|j        v sJ ‚d S )
Nzi
    [Category] == "Waystone" # [RunMap] == "true"
    [WaystoneTier] <= "5" # [IgnoreMap] == "true"
    TÚWaystoner   )r&   ÚcategoryÚwaystone_tierr   Ú	IgnoreMapé   F)r   r   r)   Ú
ignore_mapr   )r   r   r+   Úlow_tier_mapr6   Úhigh_tier_mapÚres_highs          r   Útest_ignore_map_strips_run_maprB   Y   sä   € ð€Hõ �hÑÔ€EÝ Ñ&Ô&€Ið ØØðð €Lð
 ×
Ò
˜\Ñ
*Ô
*€CØŒ>˜TÐ!Ð!Ð!Ð!Ø˜3œ;Ð&Ð&Ð&Ð&Ø˜#œ+Ð%Ð%Ð%Ð%ð ØØðð €Mð
 ×!Ò! -Ñ0Ô0€HØÔ %Ð'Ð'Ð'Ð'Ø�xÔ'Ð'Ð'Ð'Ð'Ð'Ð'r   c                  ó–   — d} t          | ¦  «        }t          |¦  «        }ddddidœ}|                     |¦  «        }d|j        vsJ ‚d S )NzS
    [Rarity] == "Rare" # [base_maximum_life] >= "50" && [StashItem] == "true"
    Tr    Úfire_resistanceé   r%   r   )r   r   r)   r   )r   r   r+   Úitem_without_modr6   s        r   Ú test_fail_closed_on_missing_statrG   x   sq   € ð€Hõ �hÑÔ€EÝ Ñ&Ô&€Ið ØØ" BÐ'ðð Ðð
 ×
Ò
Ð-Ñ
.Ô
.€CØ˜cœkÐ)Ð)Ð)Ð)Ð)Ð)r   c                  óö  — ddl } | j                             ddd¦  «        }| j                             |¦  «        sJ ‚t	          |dd¬¦  «        5 }|                     ¦   «         }ddd¦  «         n# 1 swxY w Y   t          |¦  «        }t          |¦  «        d	k    sJ ‚t          |¦  «        }d
dddddœ}| 	                    |¦  «        }|j
        d
u sJ ‚d|j        vsJ ‚d
dddddœ}| 	                    |¦  «        }	|	j
        du sJ ‚d|	j        v sJ ‚d|	j        v sJ ‚d
dddddœ}
| 	                    |
¦  «        }|j
        du sJ ‚d|j        v sJ ‚d
ddddœ}| 	                    |¦  «        }d|j        v sJ ‚dS )uS   Kiá»ƒm tra file data/maps/default.ipd thá»±c táº¿ theo Ä‘áº·c táº£ Doc 29 Phase P5.r   NÚdataÚmapszdefault.ipdÚrzutf-8)Úencodingr"   Tr9   zReflect Elemental Damageé   r    )r&   r:   Únamer;   r'   r   zWaystone (Tier 14)r=   ÚNormalFÚUpgradeToRarezWaystone (Tier 16)é   ÚTabletzPrecursor TabletÚMagic)r&   r:   rN   r'   Ú	UseTablet)ÚosÚpathÚjoinÚexistsÚopenÚreadr   r   r   r)   r>   r   )rU   Úipd_pathÚfr   r   r+   Ú
lethal_mapÚ
res_lethalÚ
normal_t14Ú
res_normalÚrare_t16Úres_rareÚtabletÚ
res_tablets                 r   Útest_maps_default_ipd_policyre   ‰   sJ  € à€I€I€IØŒw�|Š|˜F F¨MÑ:Ô:€HØŒ7�>Š>˜(Ñ#Ô#Ð#Ð#Ð#å	ˆh˜ gÐ	.Ñ	.Ô	.ð °!Ø—6’6‘8”8ˆðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð õ �hÑÔ€EÝˆu‰:Œ:˜Š?ˆ?ˆ?ˆ?Ý Ñ&Ô&€Ið ØØ*ØØðð €Jð ×#Ò# JÑ/Ô/€JØÔ  DÐ(Ð(Ð(Ð(Ø˜:Ô-Ð-Ð-Ð-Ð-ð ØØ$ØØðð €Jð ×#Ò# JÑ/Ô/€JØÔ  EÐ)Ð)Ð)Ð)Ø˜jÔ0Ð0Ð0Ð0Ð0Ø�zÔ)Ð)Ð)Ð)Ð)ð ØØ$ØØðð €Hð ×!Ò! (Ñ+Ô+€HØÔ %Ð'Ð'Ð'Ð'Ø�xÔ'Ð'Ð'Ð'Ð'ð ØØ"Øð	ð €Fð ×#Ò# FÑ+Ô+€JØ˜*Ô,Ð,Ð,Ð,Ð,Ð,Ð,s   ÁA0Á0A4Á7A4)Ú__doc__r   Ú src.assistant_tool.pickit.parserr   r   r   r   r   Ú#src.assistant_tool.pickit.evaluatorr   r	   r   r   r0   r7   rB   rG   re   © r   r   ú<module>rj      sÏ   ððð ð €€€Ø gÐ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gØ QÐ QÐ QÐ QÐ QÐ QÐ QÐ Qð(ð (ð (ð.ð ð ð/ð /ð /ð6!ð !ð !ð((ð (ð (ð>*ð *ð *ð":-ð :-ð :-ð :-ð :-r   