§
    ´Z¿j{9  ã                  óÄ   — d Z ddlm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„ ¦   «         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d„Zd„ Zd„ Zd„ ZdS )zŠ
Adversarial Stress Harness for Milestone 1: Game Design Matrix & Core Contracts.
Author: Empirical Challenger 1
Role: critic, specialist
é    )ÚannotationsN)ÚGameDesignMatrixServicec               #  ó†   K  — t          d¬¦  «        } |                      d¬¦  «         | V — |                      ¦   «          dS )zCProvides an in-memory matrix service populated with canonical data.ú:memory:©Údb_pathT©ÚforceN)r   Úseed_canonical_dataÚclose)Úservices    úBC:\Projects\FreeExile\tests\unit\test_challenger_m1_adversarial.pyÚmatrix_servicer      sI   è è € õ &¨jÐ9Ñ9Ô9€GØ×Ò dÐÑ+Ô+Ð+Ø
€M€M€MØ‡M‚M�O„O€O€O€Oó    r   r   c                óJ  — |                       ¦   «         5 }|                     ¦   «         }t          j        t          j        ¦  «        5  |                     d¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          j        ¦  «        5  |                     d¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          j        ¦  «        5  |                     d¦  «         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 )zJVerifies party_size outside [1, 6] is rejected by SQLite CHECK constraint.zJINSERT INTO party_scaling_matrix VALUES (0, 1.0, 0, 0, 0, 0, 15.0, 'zero')NzSINSERT INTO party_scaling_matrix VALUES (7, 4.0, 180, 300, 300, 180, 15.0, 'seven')zJINSERT INTO party_scaling_matrix VALUES (-1, 1.0, 0, 0, 0, 0, 15.0, 'neg')©Ú_get_connectionÚcursorÚpytestÚraisesÚsqlite3ÚIntegrityErrorÚexecute©r   ÚconnÚcurs      r   Ú*test_party_scaling_size_boundary_rejectionr      s=  € à	×	'Ò	'Ñ	)Ô	)ð 
f¨TØ�kŠk‰mŒmˆåŒ]�7Ô1Ñ2Ô2ð 	fð 	fØ�KŠKÐdÑeÔeÐeð	fð 	fð 	fñ 	fô 	fð 	fð 	fð 	fð 	fð 	fð 	føøøð 	fð 	fð 	fð 	fõ Œ]�7Ô1Ñ2Ô2ð 	oð 	oØ�KŠKÐmÑnÔnÐnð	oð 	oð 	oñ 	oô 	oð 	oð 	oð 	oð 	oð 	oð 	oøøøð 	oð 	oð 	oð 	oõ Œ]�7Ô1Ñ2Ô2ð 	fð 	fØ�KŠKÐdÑeÔeÐeð	fð 	fð 	fñ 	fô 	fð 	fð 	fð 	fð 	fð 	fð 	føøøð 	fð 	fð 	fð 	fð
fð 
fð 
fñ 
fô 
fð 
fð 
fð 
fð 
fð 
fð 
fð 
føøøð 
fð 
fð 
fð 
fð 
fð 
fó}   •3DÁA*ÁDÁ*A.	Á.DÁ1A.	Á2!DÂB5Â)DÂ5B9	Â9DÂ<B9	Â=!DÃD Ã4DÄ D	ÄDÄD	ÄDÄDÄDc                ó8  — |                       ¦   «         5 }|                     ¦   «         }t          j        t          j        ¦  «        5  |                     d¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          j        ¦  «        5  |                     d¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          j        ¦  «        5  |                     d¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          j        ¦  «        5  |                     d¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          j        ¦  «        5  |                     d¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          j        ¦  «        5  |                     d¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          j        ¦  «        5  |                     d¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          j        ¦  «        5  |                     d	¦  «         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 )
zTVerifies hp_multiplier < 1.0 and negative bonuses are rejected by CHECK constraints.zHUPDATE party_scaling_matrix SET hp_multiplier = 0.5 WHERE party_size = 1NzIUPDATE party_scaling_matrix SET hp_multiplier = -1.0 WHERE party_size = 1zJUPDATE party_scaling_matrix SET exp_bonus_pct = -10.0 WHERE party_size = 2zSUPDATE party_scaling_matrix SET item_quantity_bonus_pct = -5.0 WHERE party_size = 2zWUPDATE party_scaling_matrix SET currency_quantity_bonus_pct = -5.0 WHERE party_size = 2zLUPDATE party_scaling_matrix SET rarity_bonus_pct = -5.0 WHERE party_size = 2zHUPDATE party_scaling_matrix SET nearby_radius = 0.0 WHERE party_size = 1zJUPDATE party_scaling_matrix SET nearby_radius = -15.0 WHERE party_size = 1r   r   s      r   Ú1test_party_scaling_negative_multipliers_rejectionr    ,   s  € à	×	'Ò	'Ñ	)Ô	)ð f¨TØ�kŠk‰mŒmˆåŒ]�7Ô1Ñ2Ô2ð 	dð 	dØ�KŠKÐbÑcÔcÐcð	dð 	dð 	dñ 	dô 	dð 	dð 	dð 	dð 	dð 	dð 	døøøð 	dð 	dð 	dð 	dõ Œ]�7Ô1Ñ2Ô2ð 	eð 	eØ�KŠKÐcÑdÔdÐdð	eð 	eð 	eñ 	eô 	eð 	eð 	eð 	eð 	eð 	eð 	eøøøð 	eð 	eð 	eð 	eõ Œ]�7Ô1Ñ2Ô2ð 	fð 	fØ�KŠKÐdÑeÔeÐeð	fð 	fð 	fñ 	fô 	fð 	fð 	fð 	fð 	fð 	fð 	føøøð 	fð 	fð 	fð 	fõ Œ]�7Ô1Ñ2Ô2ð 	oð 	oØ�KŠKÐmÑnÔnÐnð	oð 	oð 	oñ 	oô 	oð 	oð 	oð 	oð 	oð 	oð 	oøøøð 	oð 	oð 	oð 	oõ Œ]�7Ô1Ñ2Ô2ð 	sð 	sØ�KŠKÐqÑrÔrÐrð	sð 	sð 	sñ 	sô 	sð 	sð 	sð 	sð 	sð 	sð 	søøøð 	sð 	sð 	sð 	sõ Œ]�7Ô1Ñ2Ô2ð 	hð 	hØ�KŠKÐfÑgÔgÐgð	hð 	hð 	hñ 	hô 	hð 	hð 	hð 	hð 	hð 	hð 	høøøð 	hð 	hð 	hð 	hõ Œ]�7Ô1Ñ2Ô2ð 	dð 	dØ�KŠKÐbÑcÔcÐcð	dð 	dð 	dñ 	dô 	dð 	dð 	dð 	dð 	dð 	dð 	døøøð 	dð 	dð 	dð 	dåŒ]�7Ô1Ñ2Ô2ð 	fð 	fØ�KŠKÐdÑeÔeÐeð	fð 	fð 	fñ 	fô 	fð 	fð 	fð 	fð 	fð 	fð 	føøøð 	fð 	fð 	fð 	fð/fð fð fñ fô fð fð fð fð fð fð fð føøøð fð fð fð fð fð fs1  •3JÁA*ÁJÁ*A.	Á.JÁ1A.	Á2!JÂB5Â)JÂ5B9	Â9JÂ<B9	Â=!JÃD Ã4JÄ D	ÄJÄD	Ä!JÄ)EÄ?JÅE	ÅJÅE	Å!JÅ4FÆ
JÆF	ÆJÆF	Æ!JÆ?G!ÇJÇ!G%	Ç%JÇ(G%	Ç)!JÈ
H,È JÈ,H0	È0JÈ3H0	È4!JÉI7É+JÉ7I;	É;JÉ>I;	É?JÊJÊJc                ó´  — |                       ¦   «         5 }|                     ¦   «         }t          j        t          j        ¦  «        5  |                     d¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          j        ¦  «        5  |                     d¦  «         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 )z5Verifies invalid loot allocation values are rejected.zMINSERT INTO loot_allocation_modes VALUES ('NEG_TIME', 'Neg', -1.0, 0, 'desc')NzLINSERT INTO loot_allocation_modes VALUES ('BAD_PERM', 'Bad', 0.0, 2, 'desc')r   r   s      r   Ú%test_loot_allocation_modes_rejectionsr"   I   s¯  € à	×	'Ò	'Ñ	)Ô	)ð h¨TØ�kŠk‰mŒmˆåŒ]�7Ô1Ñ2Ô2ð 	ið 	iØ�KŠKÐgÑhÔhÐhð	ið 	ið 	iñ 	iô 	ið 	ið 	ið 	ið 	ið 	ið 	iøøøð 	ið 	ið 	ið 	iõ Œ]�7Ô1Ñ2Ô2ð 	hð 	hØ�KŠKÐfÑgÔgÐgð	hð 	hð 	hñ 	hô 	hð 	hð 	hð 	hð 	hð 	hð 	høøøð 	hð 	hð 	hð 	hðhð hð hñ hô hð hð hð hð hð hð hð høøøð hð hð hð hð hð hsY   •3CÁA*ÁCÁ*A.	Á.CÁ1A.	Á2!CÂB5Â)CÂ5B9	Â9CÂ<B9	Â=CÃCÃCc                óà  — |                       ¦   «         5 }|                     ¦   «         }t          j        t          j        ¦  «        5  |                     d¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          j        ¦  «        5  |                     d¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          j        ¦  «        5  |                     d¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          j        ¦  «        5  |                     d¦  «         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 )zDVerifies invalid teleport configs are rejected by CHECK constraints.zJINSERT INTO teleport_configs VALUES ('NEG_CAST', -3.5, 10.0, 1, 1, 'desc')NzHINSERT INTO teleport_configs VALUES ('NEG_CD', 3.5, -10.0, 1, 1, 'desc')zIINSERT INTO teleport_configs VALUES ('BAD_MOVE', 3.5, 10.0, 2, 1, 'desc')zHINSERT INTO teleport_configs VALUES ('BAD_DMG', 3.5, 10.0, 1, 2, 'desc')r   r   s      r   Ú test_teleport_configs_rejectionsr$   U   sË  € à	×	'Ò	'Ñ	)Ô	)ð d¨TØ�kŠk‰mŒmˆåŒ]�7Ô1Ñ2Ô2ð 	fð 	fØ�KŠKÐdÑeÔeÐeð	fð 	fð 	fñ 	fô 	fð 	fð 	fð 	fð 	fð 	fð 	føøøð 	fð 	fð 	fð 	fõ Œ]�7Ô1Ñ2Ô2ð 	dð 	dØ�KŠKÐbÑcÔcÐcð	dð 	dð 	dñ 	dô 	dð 	dð 	dð 	dð 	dð 	dð 	døøøð 	dð 	dð 	dð 	dõ Œ]�7Ô1Ñ2Ô2ð 	eð 	eØ�KŠKÐcÑdÔdÐdð	eð 	eð 	eñ 	eô 	eð 	eð 	eð 	eð 	eð 	eð 	eøøøð 	eð 	eð 	eð 	eõ Œ]�7Ô1Ñ2Ô2ð 	dð 	dØ�KŠKÐbÑcÔcÐcð	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ð dð døøøð dð dð dð dð dð ds¡   •3E#ÁA*ÁE#Á*A.	Á.E#Á1A.	Á2!E#ÂB5Â)E#Â5B9	Â9E#Â<B9	Â=!E#ÃD Ã4E#Ä D	ÄE#ÄD	Ä!E#Ä)EÄ?E#ÅE	ÅE#ÅE	ÅE#Å#E'Å*E'c                óJ  — |                       ¦   «         5 }|                     ¦   «         }t          j        t          j        ¦  «        5  |                     d¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          j        ¦  «        5  |                     d¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          j        ¦  «        5  |                     d¦  «         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 )zDVerifies invalid quarantine rules are rejected by CHECK constraints.zQINSERT INTO portal_quarantine_rules VALUES ('NEG_PORT', 'ZONE', 1, 1, -1, 'desc')NzPINSERT INTO portal_quarantine_rules VALUES ('BAD_BOSS', 'ZONE', 2, 1, 6, 'desc')zRINSERT INTO portal_quarantine_rules VALUES ('BAD_SECRET', 'ZONE', 1, 2, 6, 'desc')r   r   s      r   Ú'test_portal_quarantine_rules_rejectionsr&   g   s=  € à	×	'Ò	'Ñ	)Ô	)ð 
n¨TØ�kŠk‰mŒmˆåŒ]�7Ô1Ñ2Ô2ð 	mð 	mØ�KŠKÐkÑlÔlÐlð	mð 	mð 	mñ 	mô 	mð 	mð 	mð 	mð 	mð 	mð 	møøøð 	mð 	mð 	mð 	mõ Œ]�7Ô1Ñ2Ô2ð 	lð 	lØ�KŠKÐjÑkÔkÐkð	lð 	lð 	lñ 	lô 	lð 	lð 	lð 	lð 	lð 	lð 	løøøð 	lð 	lð 	lð 	lõ Œ]�7Ô1Ñ2Ô2ð 	nð 	nØ�KŠKÐlÑmÔmÐmð	nð 	nð 	nñ 	nô 	nð 	nð 	nð 	nð 	nð 	nð 	nøøøð 	nð 	nð 	nð 	nð
nð 
nð 
nñ 
nô 
nð 
nð 
nð 
nð 
nð 
nð 
nð 
nøøøð 
nð 
nð 
nð 
nð 
nð 
nr   c                óü   — |                       ¦   «         5 }|                     ¦   «         }|                     d¦  «         ddd¦  «         n# 1 swxY w Y   |                      d¦  «        }|€J ‚|j        dk    sJ ‚dS )z^Adversarial Finding: SQLite schema allows empty mode_id string because no length check exists.zWINSERT INTO loot_allocation_modes VALUES ('', 'Empty Mode', 0.0, 0, 'Empty string key')NÚ )r   r   r   Úget_loot_allocation_modeÚmode_id)r   r   r   Úrows       r   Ú4test_loot_allocation_empty_mode_id_allowed_by_schemar,   z   sÍ   € à	×	'Ò	'Ñ	)Ô	)ð o¨TØ�kŠk‰mŒmˆØ�ŠÐmÑnÔnÐnðoð oð oñ oô oð oð oð oð oð oð oøøøð oð oð oð oð ×
1Ò
1°"Ñ
5Ô
5€CØˆ?ˆ?ˆ?ØŒ;˜"ÒÐÐÐÐÐó   •*AÁAÁAc                óü   — |                       ¦   «         5 }|                     ¦   «         }|                     d¦  «         ddd¦  «         n# 1 swxY w Y   |                      d¦  «        }|€J ‚|j        dk    sJ ‚dS )zYAdversarial Finding: action_type has no enum check, allowing arbitrary fake action types.zXINSERT INTO teleport_configs VALUES ('EXPLOIT_TELEPORT', 3.5, 10.0, 1, 1, 'Fake target')NÚEXPLOIT_TELEPORT)r   r   r   Úget_teleport_configÚaction_type)r   r   r   Úcfgs       r   Ú=test_teleport_configs_arbitrary_action_type_allowed_by_schemar3   „   sÏ   € à	×	'Ò	'Ñ	)Ô	)ð p¨TØ�kŠk‰mŒmˆØ�ŠÐnÑoÔoÐoðpð pð pñ pô pð pð pð pð pð pð pøøøð pð pð pð pð ×
,Ò
,Ð-?Ñ
@Ô
@€CØˆ?ˆ?ˆ?ØŒ?Ð0Ò0Ð0Ð0Ð0Ð0Ð0r-   c                ó|   — t          | d¦  «        }t          | d¦  «        }|du sJ ‚t          d|› d|› �¦  «         dS )z£
    Checks whether verify_matrix_integrity() exists on GameDesignMatrixService.
    Worker's handoff and prompt specifically cited verify_matrix_integrity().
    Úverify_matrix_integrityÚvalidate_game_design_integrityTzhas verify_matrix_integrity: z&, has validate_game_design_integrity: N)ÚhasattrÚprint)r   Ú
has_verifyÚhas_validates      r   Ú,test_verify_matrix_integrity_method_presencer;   ’   s[   € õ
 ˜Ð)BÑCÔC€JÝ˜>Ð+KÑLÔL€LØ˜4ÐÐÐÐå	Ð
j¨*Ð
jÐ
jÐ\hÐ
jÐ
jÑkÔkÐkÐkÐkr   c                óš  — |                       ¦   «         5 }|                     ¦   «         }|                     d¦  «         ddd¦  «         n# 1 swxY w Y   |                      ¦   «         }t	          d„ |j        D ¦   «         ¦  «        }t	          d„ |j        D ¦   «         ¦  «        }t          d|› d|› �¦  «         |o|du s
J d¦   «         ‚dS )	z©
    Adversarial Attack: Corrupt currency_quantity_bonus_pct and rarity_bonus_pct
    at party_size=6 to 0.0%.
    Does validate_game_design_integrity() catch this?
    zž
            UPDATE party_scaling_matrix 
            SET currency_quantity_bonus_pct = 0.0, rarity_bonus_pct = 0.0 
            WHERE party_size = 6
        Nc              3  óB   K  — | ]}d |                      ¦   «         v V — ŒdS )ÚcurrencyN©Úlower©Ú.0Úvs     r   ú	<genexpr>zGtest_currency_and_rarity_non_monotonic_detection_gap.<locals>.<genexpr>²   s/   è è € ÐMÐM°a˜*¨¯ª©	¬	Ð1ÐMÐMÐMÐMÐMÐMr   c              3  óB   K  — | ]}d |                      ¦   «         v V — ŒdS )ÚrarityNr?   rA   s     r   rD   zGtest_currency_and_rarity_non_monotonic_detection_gap.<locals>.<genexpr>³   s/   è è € ÐIÐI°!˜ A§G¢G¡I¤IÐ-ÐIÐIÐIÐIÐIÐIr   zCurrency violation caught: z, Rarity violation caught: Tz9Service properly checks currency and rarity monotonicity!©r   r   r   r6   ÚanyÚ
violationsr8   )r   r   r   ÚreportÚcurrency_caughtÚrarity_caughts         r   Ú4test_currency_and_rarity_non_monotonic_detection_gaprM   ¢   s&  € ð 
×	'Ò	'Ñ	)Ô	)ð ¨TØ�kŠk‰mŒmˆà�Šð ñ 	ô 	ð 	ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ×:Ò:Ñ<Ô<€FåÐMÐM¸6Ô;LÐMÑMÔMÑMÔM€OÝÐIÐI°vÔ7HÐIÑIÔIÑIÔI€MÝ	Ð
c¨Ð
cÐ
cÐTaÐ
cÐ
cÑdÔdÐdàÐ- °$Ð6Ð6Ð6Ð8sÑ6Ô6Ð6Ð6Ð6r-   c                óT  — |                       ¦   «         5 }|                     ¦   «         }|                     d¦  «         ddd¦  «         n# 1 swxY w Y   |                      ¦   «         }t	          d„ |j        D ¦   «         ¦  «        }t          d|› �¦  «         |du s
J d¦   «         ‚dS )a/  
    Adversarial Attack: Alter SECRET_CHAMBER quarantine rule to allow infinite portals
    and remove secret_chamber_lockout.
    Worker handoff claimed: 'SECRET_CHAMBER has secret_chamber_lockout=True and max_portals == 0'.
    Does validate_game_design_integrity() actually check SECRET_CHAMBER?
    z£
            UPDATE portal_quarantine_rules 
            SET secret_chamber_lockout = 0, max_portals = 999 
            WHERE zone_type = 'SECRET_CHAMBER'
        Nc              3  ó   K  — | ]}d |v V — Œ	dS )ÚSECRET_CHAMBERN© rA   s     r   rD   zFtest_secret_chamber_quarantine_bypass_detection_gap.<locals>.<genexpr>Ì   s(   è è € ÐIÐI°!Ð(¨AÐ-ÐIÐIÐIÐIÐIÐIr   zSecret chamber exploit caught: FzURevealed gap: Service query only checks WHERE zone_type IN ('WILDERNESS', 'DUNGEON')!rG   )r   r   r   rJ   Úsecret_caughts        r   Ú3test_secret_chamber_quarantine_bypass_detection_gaprS   ½   sù   € ð 
×	'Ò	'Ñ	)Ô	)ð ¨TØ�kŠk‰mŒmˆØ�Šð ñ 	ô 	ð 	ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ×:Ò:Ñ<Ô<€FÝÐIÐI°vÔ7HÐIÑIÔIÑIÔI€MÝ	Ð
;¨MÐ
;Ð
;Ñ<Ô<Ð<à˜EÐ!Ð!Ð!Ð#zÑ!Ô!Ð!Ð!Ð!r-   c                 óÞ  ‡‡‡‡— t          d¬¦  «        Š‰                     d¬¦  «         g Šˆˆfd„Št          j                             d¬¦  «        5 Šˆˆfd„t          d¦  «        D ¦   «         } | D ]}|                     ¦   «          Œ	 d	d	d	¦  «         n# 1 swxY w Y   ‰                     ¦   «          t          ‰¦  «        d
k    s
J d¦   «         ‚t          d„ ‰D ¦   «         ¦  «        sJ ‚d	S )zÞ
    Tests thread safety of GameDesignMatrixService(db_path=':memory:').
    Because sqlite3.connect default has check_same_thread=True,
    calling get_party_scaling across worker threads will raise ProgrammingError.
    r   r   Tr	   c                 óŠ   •— 	 ‰                      d¦  «        S # t          $ r } ‰                     | ¦  «         Y d } ~ d S d } ~ ww xY w)Né   )Úget_party_scalingÚ	ExceptionÚappend)ÚeÚerrorsÚsvcs    €€r   Úworker_readzAtest_in_memory_service_thread_safety_failure.<locals>.worker_readá   sZ   ø€ ð	Ø×(Ò(¨Ñ+Ô+Ð+øÝð 	ð 	ð 	Ø�MŠM˜!ÑÔÐØ�4�4�4�4�4øøøøð	øøøs   ƒ ˜
A¢=½Aé   ©Úmax_workersc                ó:   •— g | ]}‰                      ‰¦  «        ‘ŒS rQ   ©Úsubmit)rB   Ú_Úexecutorr]   s     €€r   ú
<listcomp>z@test_in_memory_service_thread_safety_failure.<locals>.<listcomp>é   s%   ø€ ÐBÐBÐB°A�8—?’? ;Ñ/Ô/ÐBÐBÐBr   Nr   zNExpected ProgrammingError due to check_same_thread=True on :memory: connectionc              3  óJ   K  — | ]}t          |t          j        ¦  «        V — Œd S )N)Ú
isinstancer   ÚProgrammingError)rB   rZ   s     r   rD   z?test_in_memory_service_thread_safety_failure.<locals>.<genexpr>ï   s/   è è € ÐGÐG¸1�z˜!�WÔ5Ñ6Ô6ÐGÐGÐGÐGÐGÐGr   )
r   r   Ú
concurrentÚfuturesÚThreadPoolExecutorÚrangeÚresultr   ÚlenrH   )rk   Úfr[   re   r\   r]   s     @@@@r   Ú,test_in_memory_service_thread_safety_failurerq   Ö   sW  øøøø€ õ "¨*Ð
5Ñ
5Ô
5€CØ×Ò $ÐÑ'Ô'Ð'à€Fðð ð ð ð ð õ 
Ô	×	.Ò	.¸1Ð	.Ñ	=Ô	=ð ÀØBÐBÐBÐBÐB½¸q¹¼ÐBÑBÔBˆØð 	ð 	ˆAØ�HŠH‰JŒJˆJˆJð	ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð
 ‡I‚I�K„K€KÝˆv‰;Œ;˜Š?ˆ?ˆ?Ðl‰?Œ?ˆ?ÝÐGÐGÀÐGÑGÔGÑGÔGÐGÐGÐGÐGÐGs   Á6BÂBÂBc                ód  ‡‡‡‡	— t          | dz  ¦  «        Št          ‰¬¦  «        }|                     d¬¦  «         g }g Šˆˆfd„Š	t          j                             d¬¦  «        5 Šˆˆ	fd„t          d	¦  «        D ¦   «         }|D ]-}|                     ¦   «         }|�|                     |¦  «         Œ.	 d
d
d
¦  «         n# 1 swxY w Y   | 	                    ¦   «          t          ‰¦  «        dk    sJ d‰› �¦   «         ‚t          |¦  «        d	k    sJ ‚t          d„ |D ¦   «         ¦  «        sJ ‚d
S )zQ
    Tests concurrent readers on a file-based SQLite database with WAL mode.
    ztest_concurrent.dbr   Tr	   c                óì   •— 	 t          ‰¬¦  «        }|                     d¦  «        }|                     ¦   «          |r|j        nd S # t          $ r"}‰                     | |f¦  «         Y d }~d S d }~ww xY w)Nr   é   )r   rW   r   Ú
party_sizerX   rY   )Ú	worker_idÚ
reader_svcr+   rZ   Údb_filer[   s       €€r   Úreaderz5test_file_database_concurrent_readers.<locals>.readerý   s�   ø€ ð	Ý0¸ÐAÑAÔAˆJØ×.Ò.¨qÑ1Ô1ˆCØ×ÒÑÔÐØ%(Ð2�3”>�>¨dÐ2øÝð 	ð 	ð 	Ø�MŠM˜9 a˜.Ñ)Ô)Ð)Ø�4�4�4�4�4øøøøð	øøøs   ƒAA Á
A3ÁA.Á.A3é
   r_   c                ó<   •— g | ]}‰                      ‰|¦  «        ‘ŒS rQ   rb   )rB   Úire   ry   s     €€r   rf   z9test_file_database_concurrent_readers.<locals>.<listcomp>  s'   ø€ ÐAÐAÐA°!�8—?’? 6¨1Ñ-Ô-ÐAÐAÐAr   é   Nr   zConcurrent reads had errors: c              3  ó"   K  — | ]
}|d k    V — ŒdS )rt   NrQ   )rB   Úrs     r   rD   z8test_file_database_concurrent_readers.<locals>.<genexpr>  s&   è è € Ð'Ð'˜!ˆq�AŠvÐ'Ð'Ð'Ð'Ð'Ð'r   )Ústrr   r   rj   rk   rl   rm   rn   rY   r   ro   Úall)
Útmp_pathr\   Úresultsrk   rp   Úresrx   r[   re   ry   s
         @@@@r   Ú%test_file_database_concurrent_readersr…   ò   sª  øøøø€ õ �(Ð1Ñ1Ñ2Ô2€GÝ
!¨'Ð
2Ñ
2Ô
2€CØ×Ò $ÐÑ'Ô'Ð'à€GØ€Fðð ð ð ð ð õ 
Ô	×	.Ò	.¸2Ð	.Ñ	>Ô	>ð $À(ØAÐAÐAÐAÐAµu¸R±y´yÐAÑAÔAˆØð 	$ð 	$ˆAØ—(’(‘*”*ˆCØˆØ—’˜sÑ#Ô#Ð#øð	$ð$ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $øøøð $ð $ð $ð $ð ‡I‚I�K„K€KÝˆv‰;Œ;˜!ÒÐÐÐE¸VÐEÐEÑÔÐÝˆw‰<Œ<˜2ÒÐÐÐÝÐ'Ð'˜wÐ'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð's   Á'ACÃCÃCc           
     ó¨  ‡‡	‡
‡— t          | dz  ¦  «        Št          ‰¬¦  «        }|                     d¬¦  «         dŠ
dŠg Š	ˆˆ	ˆfd„}ˆˆ	ˆ
fd„}t          j                             d¬	¦  «        5 }g }t          d
¦  «        D ]T}|                     |                     ||¦  «        ¦  «         |                     |                     ||¦  «        ¦  «         ŒU|D ]}| 	                    ¦   «          Œ	 ddd¦  «         n# 1 swxY w Y   | 
                    ¦   «          t          d‰
› d‰› dt          ‰	¦  «        › �¦  «         ‰
dk    sJ ‚‰dk    sJ ‚dS )zŒ
    Tests concurrent read and write operations under WAL mode on file database.
    Verifies database locking and contention behavior.
    ztest_read_write.dbr   Tr	   r   c                ól  •— 	 t          ‰¬¦  «        }|                     ¦   «         5 }|                     ¦   «                              dd| › �f¦  «         d d d ¦  «         n# 1 swxY w Y   |                     ¦   «          ‰dz  Šd S # t
          $ r#}‰                     d| |f¦  «         Y d }~d S d }~ww xY w)Nr   zDUPDATE party_scaling_matrix SET description = ? WHERE party_size = 1zWorker rV   Úwrite)r   r   r   r   r   rX   rY   )rv   Úw_svcr   rZ   rx   Úlock_errorsÚwrite_counts       €€€r   Úwriter_taskz=test_file_database_concurrent_read_write.<locals>.writer_task!  s<  ø€ ð	8Ý+°GÐ<Ñ<Ô<ˆEØ×&Ò&Ñ(Ô(ð H¨DØ—’‘”×%Ò%Ð&lð  pEð  zCð  pEð  pEð  oGñ  Hô  Hð  HðHð Hð Hñ Hô Hð Hð Hð Hð Hð Hð Høøøð Hð Hð Hð Hà�KŠK‰MŒMˆMØ˜1ÑˆKˆKˆKøÝð 	8ð 	8ð 	8Ø×Ò ¨°AÐ6Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7øøøøð	8øøøs:   ƒ$B §-A ÁB Á A$Á$B Á'A$Á(B Â
B3ÂB.Â.B3c                óî   •— 	 t          ‰¬¦  «        }|                     d¦  «        }|                     ¦   «          |r‰dz  Šd S d S # t          $ r#}‰                     d| |f¦  «         Y d }~d S d }~ww xY w)Nr   rV   Úread)r   rW   r   rX   rY   )rv   Úr_svcr+   rZ   rx   rŠ   Ú
read_counts       €€€r   Úreader_taskz=test_file_database_concurrent_read_write.<locals>.reader_task,  s£   ø€ ð	7Ý+°GÐ<Ñ<Ô<ˆEØ×)Ò)¨!Ñ,Ô,ˆCØ�KŠK‰MŒMˆMØð  Ø˜a‘�
�
�
ð ð  øåð 	7ð 	7ð 	7Ø×Ò ¨	°1Ð5Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6Ð6øøøøð	7øøøs   ƒA A Á
A4ÁA/Á/A4é   r_   é   NzConcurrent RW: reads=z	, writes=z, lock_errors=)r€   r   r   rj   rk   rl   rm   rY   rc   rn   r   r8   ro   )r‚   r\   rŒ   r‘   re   rk   r|   rp   rx   rŠ   r�   r‹   s           @@@@r   Ú(test_file_database_concurrent_read_writer”     sã  øøøø€ õ
 �(Ð1Ñ1Ñ2Ô2€GÝ
!¨'Ð
2Ñ
2Ô
2€CØ×Ò $ÐÑ'Ô'Ð'à€JØ€KØ€Kð	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7õ 
Ô	×	.Ò	.¸1Ð	.Ñ	=Ô	=ð ÀØˆÝ�r‘”ð 	<ð 	<ˆAØ�NŠN˜8Ÿ?š?¨;¸Ñ:Ô:Ñ;Ô;Ð;Ø�NŠN˜8Ÿ?š?¨;¸Ñ:Ô:Ñ;Ô;Ð;Ð;Øð 	ð 	ˆAØ�HŠH‰JŒJˆJˆJð	ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ‡I‚I�K„K€KÝ	Ð
d *Ð
dÐ
d°{Ð
dÐ
dÕRUÐVaÑRbÔRbÐ
dÐ
dÑeÔeÐeà˜Š>ˆ>ˆ>ˆ>Ø˜Š?ˆ?ˆ?ˆ?ˆ?ˆ?s   Á1B C>Ã>DÄD)r   r   )Ú__doc__Ú
__future__r   Úconcurrent.futuresrj   Úosr   r   Ú'server.world.game_design_matrix_servicer   Úfixturer   r   r    r"   r$   r&   r,   r3   r;   rM   rS   rq   r…   r”   rQ   r   r   ú<module>r›      sœ  ððð ð #Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ø 	€	€	€	Ø €€€Ø €€€à KÐ KÐ KÐ KÐ KÐ Kð „ðð ñ „ððfð fð fð fðfð fð fð fð:	hð 	hð 	hð 	hðdð dð dð dð$nð nð nð nð&ð ð ð ð1ð 1ð 1ð 1ð	lð 	lð 	lð 	lð tð tð tð tð6{ð {ð {ð {ð2Hð Hð Hð8(ð (ð (ðD/ð /ð /ð /ð /r   