§
    ZÂj×7  ã            
      óâ  — 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ZddlZddlZddlZddlZddlmZmZmZ e
j                             de	j                             e	j                             e	j                             e¦  «        d¦  «        ¦  «        ¦  «         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¦  «        Z. G d„ dej/        ¦  «        Z0e1dk    r ej2        ¦   «          dS dS )aF  
Empirical Stress Test Suite: Formula Persistence & Server Engine Loop Integration.
Tests SQLite concurrency, multi-threaded stress, JSON AST round-trip fidelity,
data integrity, and ServerEngineLoop registration with high-tier gear and passives.
Conforms to FreeExile Elite Standards 2026 (<= 350 lines, method <= 50 lines).
é    )ÚannotationsN)ÚDictÚListÚAnyz../..z../../server)ÚModifierTypeÚStatModifierÚEvaluationContextÚAggregatedCharacterStats)ÚFormulaPersistenceService)ÚCharacterStatAggregator)ÚServerEngineLoopÚFiveElements)ÚMeridianStatBonus)ÚAffixÚ	AffixType)ÚItemTypec                  ó,   — e Zd ZdZddej        fdd„ZdS )ÚMockGearItemz1Mock item for high-tier equipment stress testing.FÚ	MAIN_HANDÚnameÚstrÚitem_idÚaffixesÚlistÚis_2hÚboolÚslotÚ	item_typer   ÚreturnÚNonec                óh   — || _         || _        || _        || _        || _        ||rdnddœ| _        d S )NÚ
TWO_HANDEDÚ
ONE_HANDED)Úis_two_handedÚgrip)r   r   r   r   r   Úmetadata)Úselfr   r   r   r   r   r   s          úJC:\Projects\FreeExile\tests\integration\test_formula_persistence_stress.pyÚ__init__zMockGearItem.__init__%   sD   € ð ˆŒ	ØˆŒØˆŒØ"ˆŒØˆŒ	Ø*/ÈÐ9`¸¸ÐT`ÐaÐaˆŒˆˆó    N)r   r   r   r   r   r   r   r   r   r   r   r   r   r    )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚWEAPONr)   © r*   r(   r   r   #   sG   € € € € € Ø;Ð;ð ØØ&œoðbð bð bð bð bð bð br*   r   c                  ó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 )ÚTestFormulaPersistenceStressz.Adversarial and empirical stress test harness.r   r    c                ó
  — t          d¦  «        }|                      |j        ¦  «         |                      |j        ¦  «         |                     ddddiddidg¦  «        }|                      |d	¦  «         |                      |                     d¦  «        ¦  «         |                     ¦   «          |  	                    |j        ¦  «         t          j        ¦   «         5 }t          j                             |d
¦  «        }t          |¦  «        }|                      |j        ¦  «         |                      t          j                             |¦  «        ¦  «         |                     ddddiddidg¦  «        }|                      |d	¦  «         |                     d¦  «        }|                      |¦  «         |                      |d         d¦  «         |                     ¦   «          ddd¦  «         dS # 1 swxY w Y   dS )zKVerifies clean creation, WAL pragma setup, and closing on disk vs :memory:.ú:memory:Úp1Úc1Úasté   Úatkç      I@Úmeleer   zstat_audit.dbÚp2Úc2é   g      Y@ÚfireÚ	player_idN)r   Ú
assertTrueÚ
_is_memoryÚassertIsNotNoneÚ_memory_connÚsave_calculationÚassertGreaterÚget_calculationÚcloseÚassertIsNoneÚtempfileÚTemporaryDirectoryÚosÚpathÚjoinÚassertFalseÚexistsÚassertEqual)r'   Úmem_svcÚrow_idÚtmp_dirÚ	disk_pathÚdisk_svcÚr_idÚrecs           r(   Ú-test_disk_and_memory_initialization_lifecyclezJTestFormulaPersistenceStress.test_disk_and_memory_initialization_lifecycle9   s  € å+¨JÑ7Ô7ˆØ�Š˜Ô*Ñ+Ô+Ð+Ø×Ò˜WÔ1Ñ2Ô2Ð2Ø×)Ò)¨$°°u¸a°jÀ5È$À-ÐRYÐQZÑ[Ô[ˆØ×Ò˜6 1Ñ%Ô%Ð%Ø×Ò˜W×4Ò4°TÑ:Ô:Ñ;Ô;Ð;Ø�Š‰ŒˆØ×Ò˜'Ô.Ñ/Ô/Ð/åÔ(Ñ*Ô*ð 
	¨gÝœŸš W¨oÑ>Ô>ˆIÝ0°Ñ;Ô;ˆHØ×Ò˜XÔ0Ñ1Ô1Ð1Ø�OŠO�BœGŸNšN¨9Ñ5Ô5Ñ6Ô6Ð6Ø×,Ò,¨T°4¸%À¸ÀeÈUÀ^ÐV\ÐU]Ñ^Ô^ˆDØ×Ò˜t QÑ'Ô'Ð'Ø×*Ò*¨4Ñ0Ô0ˆCØ× Ò  Ñ%Ô%Ð%Ø×Ò˜S Ô-¨tÑ4Ô4Ð4Ø�NŠNÑÔÐð
	ð 
	ð 
	ñ 
	ô 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	øøøð 
	ð 
	ð 
	ð 
	ð 
	ð 
	s   Ã!D
G8Ç8G<Ç?G<c                óê  ‡‡‡	‡
— t          j        ¦   «         5 }t          j                             |d¦  «        }t          |¦  «        Š
d}d„ t          |¦  «        D ¦   «         Š	dˆ	ˆ
fd„Št          j         	                    d	¬
¦  «        5 Šˆˆfd„t          |¦  «        D ¦   «         }d„ t          j         
                    |¦  «        D ¦   «         }ddd¦  «         n# 1 swxY w Y   |                      t          |¦  «        |¦  «         |D ]:}|                      d|d         ¦  «         |                      d|d         ¦  «         Œ;‰
                     ¦   «          ddd¦  «         dS # 1 swxY w Y   dS )zPStresses disk-backed SQLite under concurrent multi-threaded writers and readers.zconcurrent_stress.dbéP   c                ó   — g | ]
}d |dz  › �‘ŒS )Úplayer_é   r0   )Ú.0Úis     r(   ú
<listcomp>zcTestFormulaPersistenceStress.test_concurrent_writes_and_reads_threadpool_stress.<locals>.<listcomp>V   s%   € ÐFÐFÐF°Ð+ A¨¡EÐ+Ð+ÐFÐFÐFr*   ÚidxÚintr   úDict[str, Any]c                ó  •— d| › dt          j        ¦   «         › �}‰|          }d| ddœg d¢dœ}d| z   d	d
œ}dd| › �g}‰                     |||||¦  «         ‰                     |¦  «        }|€t	          d|› �¦  «        ‚|S )NÚ
calc_conc_Ú_Úattack_damagez50 + 100 * 1.5)rb   Úformula)r;   Úsavageu   viá»‡t_hÃ³a_kiáº¿m)Ú	stat_nameÚ	step_dataÚtagsg      l@g     p—@)rh   Úmax_hpr;   Útag_z Failed to read back calculation )ÚtimeÚtime_nsrE   rG   Ú
ValueError)	rb   ÚcidÚpidr7   Ústatsrm   Ú	read_backÚ
player_idsÚsvcs	          €€r(   Ú_worker_write_and_readzoTestFormulaPersistenceStress.test_concurrent_writes_and_reads_threadpool_stress.<locals>._worker_write_and_readX   sÀ   ø€ Ø9 3Ð9Ð9­¬©¬Ð9Ð9�Ø  ”o�à!0Ø),Ð9IÐ!JÐ!JØEÐEÐEðð �ð
 +0°#©+ÀÐHÐH�Ø ¨  Ð.�Ø×$Ò$ S¨#¨s°E¸4Ñ@Ô@Ð@Ø×/Ò/°Ñ4Ô4�	ØÐ$Ý$Ð%MÈÐ%MÐ%MÑNÔNÐNØ Ð r*   é
   )Úmax_workersc                ó<   •— g | ]}‰                      ‰|¦  «        ‘ŒS r0   )Úsubmit)r_   r`   ry   Úexecutors     €€r(   ra   zcTestFormulaPersistenceStress.test_concurrent_writes_and_reads_threadpool_stress.<locals>.<listcomp>i   s(   ø€ Ð`Ð`Ð`È!˜8Ÿ?š?Ð+AÀ1ÑEÔEÐ`Ð`Ð`r*   c                ó6   — g | ]}|                      ¦   «         ‘ŒS r0   )Úresult)r_   Úfs     r(   ra   zcTestFormulaPersistenceStress.test_concurrent_writes_and_reads_threadpool_stress.<locals>.<listcomp>j   s    € ÐXÐXÐX¨!˜1Ÿ8š8™:œ:ÐXÐXÐXr*   Nrh   Úfinal_statsrl   Úformula_ast)rb   rc   r   rd   )rJ   rK   rL   rM   rN   r   ÚrangeÚ
concurrentÚfuturesÚThreadPoolExecutorÚas_completedrQ   ÚlenÚassertInrH   )r'   rT   Údb_pathÚ	total_opsr†   ÚresultsÚresry   r~   rw   rx   s          @@@@r(   Ú2test_concurrent_writes_and_reads_threadpool_stresszOTestFormulaPersistenceStress.test_concurrent_writes_and_reads_threadpool_stressP   s  øøøø€ åÔ(Ñ*Ô*ð 	¨gÝ”g—l’l 7Ð,BÑCÔCˆGÝ+¨GÑ4Ô4ˆCØˆIØFÐFµU¸9Ñ5EÔ5EÐFÑFÔFˆJð!ð !ð !ð !ð !ð !ð !õ  Ô#×6Ò6À2Ð6ÑFÔFð YÈ(Ø`Ð`Ð`Ð`Ð`ÍuÐU^ÑO_ÔO_Ð`Ñ`Ô`�ØXÐX­zÔ/A×/NÒ/NÈwÑ/WÔ/WÐXÑXÔX�ðYð Yð Yñ Yô Yð Yð Yð Yð Yð Yð Yøøøð Yð Yð Yð Yð ×Ò�S ™\œ\¨9Ñ5Ô5Ð5Øð ?ð ?�Ø—’˜o¨s°=Ô/AÑBÔBÐBØ—’˜k¨3¨}Ô+=Ñ>Ô>Ð>Ð>Ø�IŠI‰KŒKˆKð=	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s8   ˜A2E(Â
ACÃE(ÃC 	Ã E(Ã#C 	Ã$A7E(Å(E,Å/E,c                óÎ  — t          d¦  «        }d}d}ddddddd	d
œdddddddœddddœgdœddddddœgdœdddddœgdœdœi}dd d!d"d#d$d%d&œ}g d'¢}|                     |||||¦  «         |                     |¦  «        }|                      |¦  «         |                      |d(         |¦  «         |                      |d)         |¦  «         |                      |d*         |¦  «         |                      |d(         d         d         d+         d	¦  «         |                      |d(         d         d,         d-         d.         d+         d¦  «         |                     ¦   «          d/S )0zJVerifies 100% data fidelity of deep AST structures and Unicode diacritics.r4   Úfidelity_check_calc_001Úplayer_hoang_gia_999rh   g     x@ÚConstantÚbaser:   u   Ä�áº·c TÃ­nh Khá»Ÿi NguyÃªn)Úast_typer   ÚvalueÚsourceÚSumÚflat_sumg     à`@u   VÅ© KhÃ­: Long UyÃªn Kiáº¿mg     @U@ÚFLAT)r—   r–   Útypeu&   Kinh Máº¡ch: Ä�á»‘c Máº¡ch Chi Huyáº¿t)r•   r   ÚtotalÚchildrenÚScaleFactorg     @P@gffffffú?u   TÃ  áº¤n: Huyáº¿t SÃ¡t)r—   r–   )r•   Úpercentage_sumÚ
multiplierr�   ÚProductg      ô?u   Tháº¿ Ä�ao: Song Binhç      9@)r•   r    r�   )rk   Úfinal_valuer”   ÚflatÚscaleÚmoreg     $£@g—�z6«Ö?g      @gÍÌÌÌÌÌ @ç     €F@g      >@)rh   rn   Úcrit_chanceÚcrit_multiplierÚ
move_speedÚres_hoaÚres_thuy)u   cá»•_vÃµu   huyáº¿t_sÃ¡tÚ	song_binhÚphysicalr;   rƒ   r‚   Úcontext_tagsr—   r¤   r�   r   N)r   rE   rG   rC   rQ   rH   )r'   rR   rs   rt   Úcomplex_astr‚   r¯   Ú	retrieveds           r(   Ú1test_json_ast_fidelity_deep_structure_and_unicodezNTestFormulaPersistenceStress.test_json_ast_fidelity_deep_structure_and_unicoder   s  € å+¨JÑ7Ô7ˆØ'ˆØ$ˆàØ,Ø%Ø%/¸È$ÐZwÐxÐxà %Ø&Ø"à#@È4ÐY_Ð`Ð`Ø#KÐVZÐdjÐkÐkð!ð	ð ð !.Ø&*Ø"&Ø,DÈtÐ!TÐ!TÐ Uð	ð ð !*Ø"&Ø,CÈdÐ!SÐ!SÐ Tðð ð'ð ð
ˆð8 $ØØ!Ø#ØØØð
ð 
ˆð VÐUÐUˆà× Ò   c¨;¸À\ÑRÔRÐRØ×+Ò+¨CÑ0Ô0ˆ	Ø×Ò˜YÑ'Ô'Ð'ð 	×Ò˜ =Ô1°;Ñ?Ô?Ð?Ø×Ò˜ =Ô1°;Ñ?Ô?Ð?Ø×Ò˜ >Ô2°LÑAÔAÐAØ×ÒØ�mÔ$ _Ô5°fÔ=¸hÔGØ)ñ	
ô 	
ð 	
ð 	×ÒØ�mÔ$ _Ô5°fÔ=¸jÔIÈ!ÔLÈXÔVØ)ñ	
ô 	
ð 	
ð 	�Š‰Œˆˆˆr*   c                ó@  — t          d¦  «        }d}t          d¦  «        D ]=}d|d›�}d|z   }|                     ||d|idt          d	|z   ¦  «        id
g|¬¦  «         Œ>|                     |d¬¦  «        }|                      t          |¦  «        d¦  «         |                      |d         d         d¦  «         |                      |d         d         d¦  «         |                     |d¬¦  «        }|                      t          |¦  «        d¦  «         |                      |d         d         d¦  «         |                      |                     d¦  «        ¦  «         |                      |                     d¦  «        g ¦  «         | 	                    ¦   «          dS )zKTests rapid sequential inserts and get_player_calculations limit and order.r4   Úbatch_player_01é   Úcalc_batch_Ú02dç     @�@Úseqrh   é2   Útag)Ú	timestampé   )Úlimitr   Úcalculation_idÚcalc_batch_24é   Úcalc_batch_20éd   éÿÿÿÿÚcalc_batch_00Únon_existent_idÚunknown_userN)
r   r„   rE   ÚfloatÚget_player_calculationsrQ   r‰   rI   rG   rH   )r'   rR   rt   r`   rs   ÚtÚ	history_5Úhistory_alls           r(   Ú)test_rapid_succession_and_ordering_limitszFTestFormulaPersistenceStress.test_rapid_succession_and_ordering_limits¯   s­  € å+¨JÑ7Ô7ˆØˆÝ�r‘”ð 	ð 	ˆAØ' Ð'Ð'Ð'ˆCØ˜‘
ˆAØ×$Ò$Ø�S˜5 !˜* ½¸bÀ1¹f¹¼Ð&FÈÈÐ[\ð %ñ ô ð ð ð ×3Ò3°C¸qÐ3ÑAÔAˆ	Ø×Ò�˜Y™œ¨Ñ+Ô+Ð+à×Ò˜ 1œÐ&6Ô7¸ÑIÔIÐIØ×Ò˜ 1œÐ&6Ô7¸ÑIÔIÐIà×5Ò5°cÀÐ5ÑEÔEˆØ×Ò�˜[Ñ)Ô)¨2Ñ.Ô.Ð.Ø×Ò˜ RœÐ)9Ô:¸OÑLÔLÐLð 	×Ò˜'×1Ò1Ð2CÑDÔDÑEÔEÐEØ×Ò˜×8Ò8¸ÑHÔHÈ"ÑMÔMÐMØ�Š‰Œˆˆˆr*   c                óP  — t          d¦  «        }d}|                     d|ddiddi¦  «         |                     |¦  «        }|                      |d         d         d¦  «         |                     d|dd	idd
i¦  «         |                     |¦  «        }|                      |d         d         d
¦  «         |                      |d         d         d	¦  «         |                     d¦  «        }|                      t          |¦  «        d¦  «         |                     ¦   «          dS )zFVerifies updating an existing calculation_id safely overwrites record.r4   Úsame_calculation_keyr5   Úversionr8   rh   ç      N@r‚   r>   g     ÀW@rƒ   N)r   rE   rG   rQ   rÉ   r‰   rH   )r'   rR   rs   Úrec1Úrec2Úhistorys         r(   Útest_insert_or_replace_behaviorz<TestFormulaPersistenceStress.test_insert_or_replace_behaviorÉ   s$  € å+¨JÑ7Ô7ˆØ$ˆØ× Ò   s¨Y¸¨N¸_ÈdÐ<SÑTÔTÐTØ×&Ò& sÑ+Ô+ˆØ×Ò˜˜mÔ,¨_Ô=¸tÑDÔDÐDð 	× Ò   s¨Y¸¨N¸_ÈdÐ<SÑTÔTÐTØ×&Ò& sÑ+Ô+ˆØ×Ò˜˜mÔ,¨_Ô=¸tÑDÔDÐDØ×Ò˜˜mÔ,¨YÔ7¸Ñ;Ô;Ð;ð ×1Ò1°$Ñ7Ô7ˆØ×Ò�˜W™œ qÑ)Ô)Ð)Ø�Š‰Œˆˆˆr*   c                óD  — t          dt          j        dddd¦  «        }t          dt          j        dddd¦  «        }t          dd|gd	¬
¦  «        }t          dd|gdd¬¦  «        }t	          dddddd¬¦  «        }t          t          h d£¦  «        ¬¦  «        }t          d¦  «        }t          |¬¦  «        }| 	                    ||g||d¬¦  «        }	|  
                    |	j        d¦  «         |                      |	j        dd¬ ¦  «         |  
                    |	j        d!¦  «         t          d"|¬#¦  «        }
|
                     d$d%d&t           j        d|	¬'¦  «        }|  
                    |j        d¦  «         |                      |j        |	j        ¦  «         |                      |j        |	j        ¦  «         |                      |j        |	j        ¦  «         |                      |j        |	j        ¦  «         |                      |j        |	j        ¦  «         |                      |j        t           j                 d¦  «         |                      |j        t           j                 d¦  «         |
j        j        d$         }|                      |j        |	j        ¦  «         d(S ))zLVerifies CombatActor.base_attack > 50.0 and move_speed properly initialized.u   Huyáº¿t LongÚphys_dmgéx   u   Kim CÆ°Æ¡ng Thá»ƒrn   i^  u   Huyáº¿t Ma Cá»± Ä�ao 2HÚ
wpn_2h_001T)r   u   Chiáº¿n GiÃ¡p Háº¯c Thiáº¿tÚarm_chest_001FÚCHEST)r   r   éÈ   r§   g      Ð?g333333Ã?g      à?r¢   )ÚhpÚdpsÚdps_multÚ	crit_rateÚcrit_dmgÚresist>   r;   Úattackr®   )Úactive_tagsr4   )Úpersistence_serviceÚtest_elite_hero)Ú	inventoryÚmeridian_bonusÚcontextr@   r:   g®Gáz6{@r8   )Úplacesr¸   ç      P@)Ú	cell_sizeÚstat_aggregatorée   g      )@g       À)Ú	entity_idÚ	initial_xÚ	initial_yÚelementr@   Úaggregated_statsN)r   r   ÚPREFIXr   r   r	   Ú	frozensetr   r   Úcalculate_statsrF   rh   ÚassertAlmostEqualrn   r   Úregister_playerr   ÚHOAÚbase_attackrQ   Ú
current_hpr¨   r©   ÚresistancesÚTHUYÚmovement_authorityÚplayersrª   )r'   Úaffix_phys_flatÚaffix_hp_flatÚ	weapon_2hÚchest_armorÚmeridian_dataré   ÚpersistenceÚ
aggregatorÚcomputed_statsÚengineÚactorÚregistered_chars                r(   Ú4test_server_engine_registration_with_high_gear_statszQTestFormulaPersistenceStress.test_server_engine_registration_with_high_gear_statsÜ   sª  € å µ	Ô0@À*ÈcÐSVÐX[Ñ\Ô\ˆÝÐ1µ9Ô3CÀXÈsÐTWÐY\Ñ]Ô]ˆÝ Ð!:¸LÈ?ÐJ[ÐcgÐhÑhÔhˆ	Ý"Ð#@À/ÐTaÐSbÐjoÐv}Ð~Ñ~Ô~ˆå)¨S°dÀTÐUYÐdhÐquÐvÑvÔvˆÝ#µ	Ð:YÐ:YÐ:YÑ0ZÔ0ZÐ[Ñ[Ô[ˆå/°
Ñ;Ô;ˆÝ,ÀÐMÑMÔMˆ
Ø#×3Ò3Ø  +Ð.Ø(ØØ'ð	 4ñ 
ô 
ˆð 	×Ò˜>Ô7¸Ñ>Ô>Ð>Ø×Ò˜~Ô;¸VÈAÐÑNÔNÐNØ×Ò˜>Ô0°&Ñ9Ô9Ð9õ "¨DÀ*ÐMÑMÔMˆØ×&Ò&ØØØÝ Ô$Ø'Ø+ð 'ñ 
ô 
ˆð 	×Ò˜5Ô,¨dÑ3Ô3Ð3Ø×Ò˜Ô*¨NÔ,HÑIÔIÐIØ×Ò˜œ ~Ô'<Ñ=Ô=Ð=Ø×Ò˜Ô)¨>Ô+@ÑAÔAÐAØ×Ò˜Ô*¨NÔ,FÑGÔGÐGØ×Ò˜Ô.°Ô0NÑOÔOÐOØ×Ò˜Ô*­<Ô+;Ô<¸dÑCÔCÐCØ×Ò˜Ô*­<Ô+<Ô=¸tÑDÔDÐDð !Ô3Ô;¸CÔ@ˆØ×Ò˜Ô3°^Ô5NÑOÔOÐOÐOÐOr*   c                óº  — t          d¬¦  «        }|                     ddd¬¦  «        }|                      |j        d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                      |j        d	¦  «         |                      |j        j	        d         j
        d
¦  «         dS )ziVerifies register_player without stats strictly preserves default 50.0 attack, 1000.0 HP, 6.0 move_speed.rë   ©rì   éÊ   g        )rï   rð   rñ   r:   r¸   çš™™™™™©?ç      ø?ç      @N)r   rø   rQ   rú   rn   rû   r¨   r©   rþ   rÿ   rª   )r'   r  r	  s      r(   Ú1test_server_engine_default_fallback_without_statszNTestFormulaPersistenceStress.test_server_engine_default_fallback_without_stats  sÒ   € å!¨DÐ1Ñ1Ô1ˆØ×&Ò&°ÀÈsÐ&ÑSÔSˆà×Ò˜Ô*¨DÑ1Ô1Ð1Ø×Ò˜œ vÑ.Ô.Ð.Ø×Ò˜Ô)¨6Ñ2Ô2Ð2Ø×Ò˜Ô*¨DÑ1Ô1Ð1Ø×Ò˜Ô.°Ñ5Ô5Ð5Ø×Ò˜Ô2Ô:¸3Ô?ÔJÈCÑPÔPÐPÐPÐPr*   c                óL  — t          d¬¦  «        }g }t          d¦  «        D ]“}t          d|dz  z   d|dz  z   d|d	z  z   d
|dz  z   d|dz  z   dt          |¦  «        i¬¦  «        }|                     d|z   t          |¦  «        t          |¦  «        d|› �|¬¦  «        }|                     |¦  «         Œ”t          |¦  «        D ]^\  }}d|dz  z   }d|dz  z   }|                      |j        |¦  «         |                      |j	        j
        d|z            j        |¦  «         Œ_dS )zTStress-tests multi-player registrations ensuring no cross-player stat contamination.rë   r  é   rÑ   g      $@r¸   r:   r  g{®Gáz„?r  r  gš™™™™™É?Úhoa)rh   rn   r¨   r©   rª   rü   iè  Úhero_)rï   rð   rñ   r@   ró   N)r   r„   r
   rÈ   rø   ÚappendÚ	enumeraterQ   rú   rþ   rÿ   rª   )r'   r  Úactorsr`   ru   ÚactÚexpected_atkÚexpected_spds           r(   Ú3test_multi_player_concurrent_registration_isolationzPTestFormulaPersistenceStress.test_multi_player_concurrent_registration_isolation  se  € å!¨DÐ1Ñ1Ô1ˆØˆÝ�r‘”ð 	ð 	ˆAÝ,Ø" Q¨¡X™oØ  D¡Ñ(Ø  1 t¡8™OØ # a¨$¡h¡Ø  S¡™=Ø"¥E¨!¡H¤HÐ-ðñ ô ˆEð ×(Ò(Ø ™(Ý ™(œ(Ý ™(œ(Ø% !˜+˜+Ø!&ð )ñ ô ˆCð �MŠM˜#ÑÔÐÐå Ñ'Ô'ð 	cð 	c‰FˆAˆsØ ! d¡(™?ˆLØ  S¡™=ˆLØ×Ò˜Sœ_¨lÑ;Ô;Ð;Ø×Ò˜VÔ6Ô>¸tÀa¹xÔHÔSÐUaÑbÔbÐbÐbð		cð 	cr*   N)r   r    )r+   r,   r-   r.   rY   r�   r²   rÍ   rÕ   r  r  r  r0   r*   r(   r2   r2   6   sË   € € € € € Ø8Ð8ðð ð ð ð. ð  ð  ð  ðD;ð ;ð ;ð ;ðzð ð ð ð4ð ð ð ð&5Pð 5Pð 5Pð 5Pðn
Qð 
Qð 
Qð 
Qðcð cð cð cð cð cr*   r2   Ú__main__)3r.   Ú
__future__r   ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arrL   ÚsysÚjsonrp   rJ   ÚunittestÚconcurrent.futuresr…   Útypingr   r   r   rM   ÚinsertÚabspathrN   Ú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   r   ÚTestCaser2   r+   Úmainr0   r*   r(   ú<module>r8     sl  ððð ð #Ð "Ð "Ð "Ð "Ð "Ø  € € € € € € € € € € € € €	€	€	€	Ø 
€
€
€
Ø €€€Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ø "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ð "à „‡‚��2”7—?’? 2¤7§<¢<°´·²ÀÑ0IÔ0IÈ7Ñ#SÔ#SÑTÔTÑ UÔ UÐ UØ „‡‚��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ðbð bð bð bð bñ bô bð bð&Ccð Ccð Ccð Ccð Cc 8Ô#4ñ Ccô Ccð CcðL ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr*   