§
    _ÂjÂ7  ã            
       óÜ  — d Z ddlZddlmc mZ ddlZddlZddl	Z	ddl
Z
ddlZddlmZ ej                             dej                             ej                             ej                             e¦  «        d¦  «        ¦  «        ¦  «         ddlmZmZmZmZ ddlmZ ddlmZ ddlmZmZ dd	l m!Z! dd
l"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 )zÿ
Empirical Stress Test Oracle for CharacterStatAggregator, AST, Persistence & Engine Loop.
Adversarial Challenger Suite: Exhaustive combinatorial testing of PoE math formulas,
tag-filtering matrix, conditional thresholds, weapon grips, and SQLite audits.
é    N)ÚSimpleNamespacez../../server)ÚModifierTypeÚStatModifierÚEvaluationContextÚAggregatedCharacterStats)ÚFormulaPersistenceService)ÚCharacterStatAggregator)ÚServerEngineLoopÚFiveElements)ÚMeridianStatBonus)ÚAffixÚ	AffixType)ÚItemTypec                   óR   — 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S )Ú"TestChallengerStatAggregatorStresszPAdversarial stress testing for CharacterStatAggregator mathematical correctness.ÚreturnNc                 ó,   — t          ¦   «         | _        d S )N)r	   Ú
aggregator)Úselfs    úJC:\Projects\FreeExile\tests\unit\test_challenger_stat_aggregator_stress.pyÚsetUpz(TestChallengerStatAggregatorStress.setUp!   s   € Ý1Ñ3Ô3ˆŒˆˆó    c           	      óî  — t          dt          j        d¦  «        t          dt          j        d¦  «        t          dt          j        d¦  «        t          dt          j        d¦  «        t          dt          j        d¦  «        g}| j                             |¬¦  «        }|  	                    |j
        d¦  «         t          dt          j        d¦  «        t          dt          j        d¦  «        g}| j                             |¬¦  «        }|  	                    |j
        d	¦  «         t          dt          j        dd
¬¦  «        t          dt          j        dd¬¦  «        t          dt          j        dd¬¦  «        g}| j                             |¬¦  «        }|  	                    |j
        d¦  «         t          dt          j        dd¬¦  «        t          dt          j        dd¬¦  «        g}| j                             |¬¦  «        }|  	                    |j
        d¦  «         t          dt          j        d¦  «        g}	| j                             |	¬¦  «        }
|  	                    |
j
        d	¦  «         dS )zJAdversarial validation of the canonical PoE formula across multiple pools.Úattack_damageç      I@g      Y@ç      4@ç      9@©Úcustom_modifiersg     Pi@g     €a@ç        Úgem1©Úsourceç      >@Úgem2Úgem3ç     @]@Úcurse1Úcurse2g      <@N)r   r   ÚFLATÚ	INCREASEDÚREDUCEDÚMOREÚLESSr   Úcalculate_statsÚassertEqualr   )r   Úmods_1Ústats_1Úmods_2Ústats_2Úmods_3Ústats_3Úmods_4Ústats_4Úmods_5Ústats_5s              r   Ú,test_stress_combinatorial_poe_formula_oraclezOTestChallengerStatAggregatorStress.test_stress_combinatorial_poe_formula_oracle$   s3  € õ ˜­,Ô*;¸TÑBÔBÝ˜­,Ô*@À%ÑHÔHÝ˜­,Ô*>ÀÑEÔEÝ˜­,Ô*;¸TÑBÔBÝ˜­,Ô*;¸TÑBÔBð
ˆð ”/×1Ò1À6Ð1ÑJÔJˆØ×Ò˜Ô.°Ñ7Ô7Ð7õ
 ˜­,Ô*@À$ÑGÔGÝ˜­,Ô*>ÀÑFÔFð
ˆð ”/×1Ò1À6Ð1ÑJÔJˆØ×Ò˜Ô.°Ñ4Ô4Ð4õ
 ˜­,Ô*;¸TÈ&ÐQÑQÔQÝ˜­,Ô*;¸TÈ&ÐQÑQÔQÝ˜­,Ô*;¸TÈ&ÐQÑQÔQð
ˆð
 ”/×1Ò1À6Ð1ÑJÔJˆØ×Ò˜Ô.°Ñ6Ô6Ð6õ
 ˜­,Ô*;¸TÈ(ÐSÑSÔSÝ˜­,Ô*;¸TÈ(ÐSÑSÔSð
ˆð ”/×1Ò1À6Ð1ÑJÔJˆØ×Ò˜Ô.°Ñ5Ô5Ð5õ ˜µÔ0AÀ5ÑIÔIÐJˆØ”/×1Ò1À6Ð1ÑJÔJˆØ×Ò˜Ô.°Ñ4Ô4Ð4Ð4Ð4r   c                 óâ  — t          dt          j        dt          ddh¦  «        ¬¦  «        t          dt          j        dt          dh¦  «        ¬¦  «        t          dt          j        dt          ¦   «         ¬¦  «        t          dt          j        d	t          d
h¦  «        ¬¦  «        g}t          t          dh¦  «        ¬¦  «        }| j                             ||¬¦  «        }|                      |j	        d¦  «         t          t          h d£¦  «        ¬¦  «        }| j                             ||¬¦  «        }|                      |j	        d¦  «         t          t          d
h¦  «        ¬¦  «        }| j                             ||¬¦  «        }|                      |j	        d¦  «         t          ¦   «         }| j                             ||¬¦  «        }	|                      |	j	        d¦  «         dS )zPAdversarial validation of tag matching (subsets, supersets, case-insensitivity).r   r$   ÚFIREÚSPELL)Útagsr   Úfireg      $@r   Úcold)Úactive_tags©r   Úcontextg      T@>   Úarear@   Úspellg     €[@g     €V@g      N@N)
r   r   r*   Ú	frozensetr+   r   r   r/   r0   r   )
r   ÚmodsÚctx_aÚstats_aÚctx_bÚstats_bÚctx_cÚstats_cÚctx_dÚstats_ds
             r   Ú test_stress_tag_matrix_filteringzCTestChallengerStatAggregatorStress.test_stress_tag_matrix_filteringT   sÎ  € õ ˜­,Ô*;¸TÍ	ÐSYÐ[bÐRcÑHdÔHdÐeÑeÔeÝ˜­,Ô*;¸TÍ	ÐSYÐRZÑH[ÔH[Ð\Ñ\Ô\Ý˜­,Ô*;¸TÍ	ÉÌÐTÑTÔTÝ˜­,Ô*@À$ÍYÐX^ÐW_ÑM`ÔM`ÐaÑaÔað	
ˆõ "­i¸¸Ñ.AÔ.AÐBÑBÔBˆØ”/×1Ò1À4ÐQVÐ1ÑWÔWˆØ×Ò˜Ô.°Ñ5Ô5Ð5õ "­iÐ8QÐ8QÐ8QÑ.RÔ.RÐSÑSÔSˆØ”/×1Ò1À4ÐQVÐ1ÑWÔWˆØ×Ò˜Ô.°Ñ6Ô6Ð6õ "­i¸¸Ñ.AÔ.AÐBÑBÔBˆØ”/×1Ò1À4ÐQVÐ1ÑWÔWˆØ×Ò˜Ô.°Ñ5Ô5Ð5õ "Ñ#Ô#ˆØ”/×1Ò1À4ÐQVÐ1ÑWÔWˆØ×Ò˜Ô.°Ñ5Ô5Ð5Ð5Ð5r   c                 ó”  — t          dt          j        dd¬¦  «        t          dt          j        dd¬¦  «        t          dt          j        dd	¬¦  «        g}t          d
¬¦  «        }| j                             ||¬¦  «        }|                      |j	        d¦  «         t          d¬¦  «        }| j                             ||¬¦  «        }|                      |j	        d¦  «         t          d¬¦  «        }| j                             ||¬¦  «        }|                      |j
        d¦  «         t          d¬¦  «        }| j                             ||¬¦  «        }	|                      |	j
        d¦  «         t          t          dh¦  «        ¬¦  «        }
| j                             ||
¬¦  «        }|                      |j	        d¦  «         dS )zMAdversarial probing of conditional triggers at exact mathematical thresholds.r   g      D@Úon_low_health)Ú	conditionÚmax_hpr   Úon_full_healthr   Úwielding_swordgffffffÖ?)Úcurrent_hp_ratiorC   g     €Q@g+•Ô	hÖ?r   ç      ð?g     °“@g+‡ÙÎ÷ï?g     h�@ÚWIELDING_SWORD)Ú
conditionsç     ÀR@N)r   r   r-   r+   r*   r   r   r/   r0   r   rU   rG   )r   rH   Úctx_exact_lowÚ	stats_lowÚctx_above_lowÚstats_aboveÚctx_fullÚ
stats_fullÚctx_not_fullÚstats_not_fullÚ	ctx_swordÚstats_swords               r   Ú,test_stress_conditional_modifiers_edge_caseszOTestChallengerStatAggregatorStress.test_stress_conditional_modifiers_edge_casest   sÀ  € õ ˜­,Ô*;¸TÈ_Ð]Ñ]Ô]Ý˜¥<Ô#9¸4ÐK[Ð\Ñ\Ô\Ý˜­,Ô*;¸TÐM]Ð^Ñ^Ô^ð
ˆõ *¸4Ð@Ñ@Ô@ˆØ”O×3Ò3ÀTÐS`Ð3ÑaÔaˆ	Ø×Ò˜Ô0°$Ñ7Ô7Ð7õ *¸6ÐBÑBÔBˆØ”o×5Ò5ÀtÐUbÐ5ÑcÔcˆØ×Ò˜Ô2°DÑ9Ô9Ð9õ %°cÐ:Ñ:Ô:ˆØ”_×4Ò4ÀdÐT\Ð4Ñ]Ô]ˆ
Ø×Ò˜Ô*¨FÑ3Ô3Ð3å(¸%Ð@Ñ@Ô@ˆØœ×8Ò8È$ÐXdÐ8ÑeÔeˆØ×Ò˜Ô.°Ñ7Ô7Ð7õ &µÐ<LÐ;MÑ1NÔ1NÐOÑOÔOˆ	Ø”o×5Ò5ÀtÐU^Ð5Ñ_Ô_ˆØ×Ò˜Ô2°DÑ9Ô9Ð9Ð9Ð9r   c           
      ó¤  — t          dddt          j        g dddœ¬¦  «        }| j                             |g¬¦  «        }|                      |j        d	¦  «         t          d
ddt          j        g i ¬¦  «        }t          dddt          j        g i ¬¦  «        }| j                             ||g¬¦  «        }|                      |j        d         dd¬¦  «         |                      |j        d         d¦  «         t          dddt          j	        g i ¬¦  «        }| j                             ||g¬¦  «        }|  
                    d|j        ¦  «         dS )z<Adversarial validation of 2H and Dual Wield detection logic.u   Huyáº¿t Tráº£m Cá»• Ä�ao 2HÚwpn_greatswordÚ	MAIN_HANDÚ
TWO_HANDEDT)ÚgripÚis_two_handed©ÚnameÚitem_idÚslotÚ	item_typeÚaffixesÚmetadata)Ú	inventoryr\   u   TÃ n SÃ¡t Ä�aoÚwpn_1h_au   Phong Ma Kiáº¿mÚwpn_1h_bÚOFF_HANDÚattack_speedgáz®Gáò?é   )ÚplacesÚblock_chanceç      .@u   Háº¯c Thiáº¿t Thuáº«nÚshield_ironN)r   r   ÚWEAPONr   r/   r0   r   ÚassertAlmostEqualÚ	all_statsÚARMORÚassertNotIn)r   Úitem_2hÚstats_2hÚitem_mhÚitem_ohÚstats_dwÚitem_shieldÚstats_sword_shields           r   Útest_stress_weapon_grip_matrixzATestChallengerStatAggregatorStress.test_stress_weapon_grip_matrix”   s{  € õ "Ø.Ð8HÈ{Ý”o¨rÀ\ÐdhÐ<iÐ<ið
ñ 
ô 
ˆð ”?×2Ò2¸g¸YÐ2ÑGÔGˆØ×Ò˜Ô/°Ñ6Ô6Ð6õ "Ø!¨:¸KÝ”o¨r¸Bð
ñ 
ô 
ˆõ "Ø"¨J¸ZÝ”o¨r¸Bð
ñ 
ô 
ˆð ”?×2Ò2¸gÀwÐ=OÐ2ÑPÔPˆà×Ò˜xÔ1°.ÔAÀ4ÐPQÐÑRÔRÐRØ×Ò˜Ô+¨NÔ;¸TÑBÔBÐBõ &Ø(°-ÀjÝ”n¨b¸2ð
ñ 
ô 
ˆð "œ_×<Ò<ÈÐQ\ÐG]Ð<Ñ^Ô^ÐØ×Ò˜Ð);Ô)EÑFÔFÐFÐFÐFr   c           	      óB  — t          j        ¦   «         5 }t          j                             |d¦  «        }t          |¬¦  «        }t          |¬¦  «        }t          dt          j	        dd¬¦  «        t          dt          j
        dd	¬¦  «        t          dt          j        d
d¬¦  «        g}|                     |d¬¦  «        }|                      |j        d¦  «         |                     dd¬¦  «        }|                      t!          |¦  «        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 S # 1 swxY w Y   d S )!zJAdversarial validation of AST node composition and SQLite WAL persistence.zchallenger_audit.db)Údb_path©Úpersistence_servicer   r   Úflat_gemr"   r$   Úpassive_treer   Úsupport_gemÚplayer_stress_01)r   Ú	player_idr'   é   )Úlimité   r   r”   Úfinal_statsÚformula_astÚbaseÚvaluer   ÚflatÚtotalÚscaleÚ
multipliergÍÌÌÌÌÌô?Úmoreg333333ó?N)ÚtempfileÚTemporaryDirectoryÚosÚpathÚjoinr   r	   r   r   r*   r+   r-   r/   r0   r   Úget_player_calculationsÚlenÚclose)
r   Útmp_dirr�   Úpersist_svcÚaggrH   r˜   ÚrecordsÚrecÚasts
             r   Ú&test_stress_ast_and_sqlite_persistencezITestChallengerStatAggregatorStress.test_stress_ast_and_sqlite_persistence´   sP  € åÔ(Ñ*Ô*ð 	 ¨gÝ”g—l’l 7Ð,AÑBÔBˆGÝ3¸GÐDÑDÔDˆKÝ)¸kÐJÑJÔJˆCõ ˜_­lÔ.?ÀÈjÐYÑYÔYÝ˜_­lÔ.DÀdÐSaÐbÑbÔbÝ˜_­lÔ.?ÀÈmÐ\Ñ\Ô\ðˆDð
 ×-Ò-Ø!%Ð1Cð .ñ ô ˆKð ×Ò˜[Ô6¸Ñ>Ô>Ð>ð "×9Ò9Ð:LÐTUÐ9ÑVÔVˆGØ×Ò�S ™\œ\¨1Ñ-Ô-Ð-Ø˜!”*ˆCà×Ò˜S Ô-Ð/AÑBÔBÐBØ×Ò˜S Ô/°Ô@À%ÑHÔHÐHð �mÔ$ _Ô5ˆCØ×Ò˜S œ[¨Ô1°4Ñ8Ô8Ð8Ø×Ò˜S œ[¨Ô1°4Ñ8Ô8Ð8Ø×Ò˜S œ\¨,Ô7¸Ñ>Ô>Ð>Ø×Ò˜S œ[¨Ô6¸Ñ=Ô=Ð=Ø×ÒÑÔÐð=	 ð 	 ð 	 ñ 	 ô 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 øøøð 	 ð 	 ð 	 ð 	 ð 	 ð 	 s   ”G3HÈHÈHc           
      óð  — t          d¦  «        }t          |¬¦  «        }t          d|¬¦  «        }t          dt          j        dddd¬¦  «        }t          d	t          j        d
ddd¬¦  «        }t          dddt          j        ||gdddœ¬¦  «        }t          ddddd¬¦  «        }| 
                    |g|d¬¦  «        }|                      |j        d¦  «         |                      |j        d¦  «         |                     dddt          j        |¬¦  «        }	|                      |	j        d¦  «         |                      |	j        d¦  «         |                      |	j        d¦  «         |                      |	j        d¦  «         |                      |	j        ¦  «         |                      |	j        t          j                 d¦  «         |                      |j        j        d         j        d ¦  «         d!S )"zOAdversarial validation of ServerEngineLoop player registration with full stats.z:memory:rŽ   g      P@)Ú	cell_sizeÚstat_aggregatoru   Tháº§n Thá»ƒrU   éd   )ro   Ú
affix_typeÚstat_keyÚmin_valÚmax_valÚcurrent_valu   ToÃ¡i Cá»‘tÚphys_dmgé(   u   Cá»± Kiáº¿m 2HÚwpn_2hrj   Trk   )rm   rl   rn   éÈ   r$   gš™™™™™É?gš™™™™™©?r   )ÚhpÚdpsÚdps_multÚ	crit_rateÚresistÚhero_999)ru   Úmeridian_bonusr”   g     •@g      k@é*   r}   )Ú	entity_idÚ	initial_xÚ	initial_yÚelementÚaggregated_statsg      @N)r   r	   r
   r   r   ÚPREFIXr   r   r   r   r/   r0   rU   r   Úregister_playerr   ÚHOAÚactor_idÚ
current_hpÚbase_attackÚ
assertTrueÚ	is_playerÚresistancesÚmovement_authorityÚplayersÚ
move_speed)
r   rª   r«   ÚloopÚaffix_hpÚ	affix_atkÚitemÚmeridianÚ
calculatedÚactors
             r   Ú/test_stress_server_engine_loop_live_integrationzRTestChallengerStatAggregatorStress.test_stress_server_engine_loop_live_integrationÖ   s$  € å/°
Ñ;Ô;ˆÝ%¸+ÐFÑFÔFˆÝ¨$ÀÐDÑDÔDˆõ ˜n½Ô9IÐT\ÐfiÐsvð  EHð  Iñ  Iô  IˆÝ˜}½Ô9IÐT^ÐhjÐtvð  EGð  Hñ  Hô  Hˆ	ÝØ!¨8¸+Ý”o°¸)Ð/DØ'+°\ÐBÐBð
ñ 
ô 
ˆõ
 %¨°ÀÐPTÐ]aÐbÑbÔbˆð ×(Ò(Ø�f¨XÀð )ñ 
ô 
ˆ
ð 	×Ò˜Ô*¨FÑ3Ô3Ð3à×Ò˜Ô1°5Ñ9Ô9Ð9ð ×$Ò$Ø D°DÝ Ô$°zð %ñ 
ô 
ˆð
 	×Ò˜œ¨Ñ,Ô,Ð,Ø×Ò˜œ vÑ.Ô.Ð.Ø×Ò˜Ô)¨6Ñ2Ô2Ð2Ø×Ò˜Ô*¨EÑ2Ô2Ð2Ø�Š˜œÑ(Ô(Ð(Ø×Ò˜Ô*­<Ô+;Ô<¸dÑCÔCÐCØ×Ò˜Ô0Ô8¸Ô<ÔGÈÑMÔMÐMÐMÐMr   c                 óò  — t          dt          j        d¦  «        g}| j                             |¬¦  «        }|                      |j        d¦  «         t          dt          j        d¦  «        g}| j                             |¬¦  «        }|                      |j        d¦  «         t          dt          j        d¦  «        g}| j                             |¬¦  «        }|                      |j        d¦  «         d	S )
zRAdversarial stress of float rounding, crit clamps [0, 1], and speed clamps >= 1.0.Úcrit_chanceg      @r   rY   g      ð¿r    rÕ   g      i@N)	r   r   r*   r   r/   r0   rß   r,   rÕ   )r   Úmods_high_critÚ
stats_highÚmods_neg_critÚ	stats_negÚ	mods_slowÚ
stats_slows          r   Ú0test_stress_extreme_float_precision_and_clampingzSTestChallengerStatAggregatorStress.test_stress_extreme_float_precision_and_clampingý   sä   € õ ' }µlÔ6GÈÑMÔMÐNˆØ”_×4Ò4ÀnÐ4ÑUÔUˆ
Ø×Ò˜Ô/°Ñ5Ô5Ð5å% mµ\Ô5FÈÑMÔMÐNˆØ”O×3Ò3À]Ð3ÑSÔSˆ	Ø×Ò˜Ô.°Ñ4Ô4Ð4õ " ,µÔ0DÀeÑLÔLÐMˆ	Ø”_×4Ò4ÀiÐ4ÑPÔPˆ
Ø×Ò˜Ô.°Ñ4Ô4Ð4Ð4Ð4r   )r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r;   rQ   rg   r‹   r¯   rÝ   ræ   © r   r   r   r      sÈ   € € € € € ØZÐZð4ð 4ð 4ð 4ð.5ð .5ð .5ð .5ð`6ð 6ð 6ð 6ð@:ð :ð :ð :ð@Gð Gð Gð Gð@  ð   ð   ð   ðD%Nð %Nð %Nð %NðN5ð 5ð 5ð 5ð 5ð 5r   r   Ú__main__)+rê   ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arr£   ÚsysÚjsonr¡   ÚunittestÚtypesr   r¤   ÚinsertÚabspathr¥   ÚdirnameÚ__file__Úserver.stats.stat_typesr   r   r   r   Ú server.stats.formula_persistencer   Úserver.stats.stat_aggregatorr	   Úserver.world.server_engine_loopr
   r   Úserver.world.meridian_typesr   Ú#server.world.primal_stones_craftingr   r   Ú server.inventory.inventory_typesr   ÚTestCaser   rç   Úmainrë   r   r   ú<module>r     s¿  ððð ð € € € € € € € € € € € € €	€	€	€	Ø 
€
€
€
Ø €€€Ø €€€Ø €€€Ø !Ð !Ð !Ð !Ð !Ð !à „‡‚��2”7—?’? 2¤7§<¢<°´·²ÀÑ0IÔ0IÈ>Ñ#ZÔ#ZÑ[Ô[Ñ \Ô \Ð \ðð ð ð ð ð ð ð ð ð ð ð ð GÐ FÐ FÐ FÐ FÐ FØ @Ð @Ð @Ð @Ð @Ð @Ø JÐ JÐ JÐ JÐ JÐ JÐ JÐ JØ 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5ðm5ð m5ð m5ð m5ð m5¨Ô):ñ m5ô m5ð m5ð` ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   