§
    ´Z¿j{9  ã                  óÞ   — 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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¦  «        }d}||u}|s—t	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dœz  }dd	|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}}|j        }d}||k    }	|	sªt	          j        d
|	fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        dœz  }dd|iz  }
t          t	          j        |
¦  «        ¦  «        ‚dx}x}	}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Ú ©úis not©z%(py0)s is not %(py3)sÚrow©Úpy0Úpy3úassert %(py5)sÚpy5©ú==)z/%(py2)s
{%(py2)s = %(py0)s.mode_id
} == %(py5)s©r.   Úpy2r1   úassert %(py7)sÚpy7)r   r   r   Úget_loot_allocation_modeÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚmode_id)r   r   r   r,   Ú@py_assert2Ú@py_assert1Ú@py_format4Ú@py_format6Ú@py_assert4Ú@py_assert3Ú@py_format8s              r   Ú4test_loot_allocation_empty_mode_id_allowed_by_schemarI   z   sO  € à	×	'Ò	'Ñ	)Ô	)ð 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ØÐˆ3�dˆ?ÐÐÐÕÔÐÐÐÐˆ3�dÐÑÔÐÕÔÑÔÐÐÕÔˆ3ÑÔÐÕÔˆ3ÑÔÐÐÕÔ�dÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØŒ;Ð˜"Ðˆ;˜"ÒÐÐÐÕÔÐÐÐÐˆ;˜"ÐÑÔÐÕÔÑÔÐÐÕÔˆ3ÑÔÐÕÔˆ3ÑÔÐÐÕÔˆ;ÑÔÕÔ˜"ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐÐÐó   •*AÁAÁAc                ó¢  — |                       ¦   «         5 }|                     ¦   «         }|                     d¦  «         ddd¦  «         n# 1 swxY w Y   |                      d¦  «        }d}||u}|s—t	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dœz  }dd	|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}}|j        }d}||k    }	|	sªt	          j        d
|	fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        dœz  }dd|iz  }
t          t	          j        |
¦  «        ¦  «        ‚dx}x}	}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_TELEPORTr)   r+   Úcfgr-   r0   r1   r2   )z3%(py2)s
{%(py2)s = %(py0)s.action_type
} == %(py5)sr4   r6   r7   )r   r   r   Úget_teleport_configr9   r:   r;   r<   r=   r>   r?   r@   Úaction_type)r   r   r   rM   rB   rC   rD   rE   rF   rG   rH   s              r   Ú=test_teleport_configs_arbitrary_action_type_allowed_by_schemarP   „   sT  € à	×	'Ò	'Ñ	)Ô	)ð 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ØÐˆ3�dˆ?ÐÐÐÕÔÐÐÐÐˆ3�dÐÑÔÐÕÔÑÔÐÐÕÔˆ3ÑÔÐÕÔˆ3ÑÔÐÐÕÔ�dÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØŒ?Ð0Ð0Ð0ˆ?Ð0Ò0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0ˆ?Ð0Ð0Ñ0Ô0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0ˆ3Ñ0Ô0Ð0Õ0Ô0ˆ3Ñ0Ô0Ð0Ð0Õ0Ô0ˆ?Ñ0Ô0Õ0Ô0Ð0Ñ0Ô0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0rJ   c                ó¶  — t          | d¦  «        }t          | d¦  «        }d}||u }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}}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_integrityT©Úis©z%(py0)s is %(py3)sÚhas_validater-   r0   r1   Nzhas verify_matrix_integrity: z&, has validate_game_design_integrity: )
Úhasattrr9   r:   r;   r<   r=   r>   r?   r@   Úprint)r   Ú
has_verifyrW   rB   rC   rD   rE   s          r   Ú,test_verify_matrix_integrity_method_presencer[   ’   s  € õ
 ˜Ð)BÑCÔC€JÝ˜>Ð+KÑLÔL€LØÐˆ<˜4ÐÐÐÐÕÔÐÐÐÐˆ<˜4ÐÑÔÐÕÔÑÔÐÐÕÔˆ<ÑÔÐÕÔˆ<ÑÔÐÐÕÔ˜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|› �¦  «         g }|}|r|}d}||u }	|	�s;dd	d
t          j        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd
iz  }
|                     |
¦  «         |rYdddt          j        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndiz  }|                     |¦  «         t          j        |d¦  «        i z  }t          j        d|	fd||f¦  «        |t          j        |¦  «        dœz  }t          j        d¦  «        dz   d|iz  }t!          t          j        |¦  «        ¦  «        ‚dx}x}x}	}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: Tz%(py2)sr5   Úcurrency_caughtz%(py4)sÚpy4Úrarity_caughtr   rT   )z(%(py7)s) is %(py10)s)r7   Úpy10z9Service properly checks currency and rarity monotonicity!z
>assert %(py12)sÚpy12)r   r   r   rS   ÚanyÚ
violationsrY   r;   r<   r9   r=   r>   ÚappendÚ_format_boolopr:   Ú_format_assertmsgr?   r@   )r   r   r   Úreportrg   ri   rC   Ú@py_assert0Ú@py_assert9Ú@py_assert8Ú@py_format3Ú@py_format5rE   Ú@py_format11Ú@py_format13s                  r   Ú4test_currency_and_rarity_non_monotonic_detection_gapry   ¢   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àsÐsˆOÐsˆOÐs Ðs°$ÐsÐs°$Ð6ÐsÐsÑsÐsÐsÐsÕsÔsÑsÔsÐsÐsÕsÔsˆOÑsÔsÐsÕsÔsˆOÑsÔsÐsÐsÐsÑsÐsÐs×sÒsÐsÑsÔsÐsˆOÐsÐsÐsÐsÕsÔsÑsÔsÐsÐsÕsÔs ÑsÔsÐsÕsÔs ÑsÔsÐsÐsÐsÑsÐsÐs×sÒsÐsÑsÔsÐsÕsÔsÐsÐsÑsÔsÐsÑsÐsÕsÔsÐsÐsÐsÐsÐs°$ÐsÑsÔsÐsÕsÔs°$ÑsÔsÐsÐsÑsÐsÕsÔsÐ8sÑsÔsÐsÑsÐsÐsÐsÑsÐsÕsÕsÔsÐsÑsÔsÑsÔsÐsÐsÐsÐsÐsÐsÐsÐsÐsÐsÐsrJ   c                ó¨  — |                       ¦   «         5 }|                     ¦   «         }|                     d¦  «         ddd¦  «         n# 1 swxY w Y   |                      ¦   «         }t	          d„ |j        D ¦   «         ¦  «        }t          d|› �¦  «         d}||u }|s¬t          j        d|fd||f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d	œz  }t          j        d
¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}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: FrT   rV   Úsecret_caughtr-   zURevealed gap: Service query only checks WHERE zone_type IN ('WILDERNESS', 'DUNGEON')!z
>assert %(py5)sr1   )r   r   r   rS   rl   rm   rY   r9   r:   r;   r<   r=   r>   rp   r?   r@   )	r   r   r   rq   r~   rB   rC   rD   rE   s	            r   Ú3test_secret_chamber_quarantine_bypass_detection_gapr   ½   s³  € ð 
×	'Ò	'Ñ	)Ô	)ð ¨TØ�kŠk‰mŒmˆØ�Šð ñ 	ô 	ð 	ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ×:Ò:Ñ<Ô<€FÝÐIÐI°vÔ7HÐIÑIÔIÑIÔI€MÝ	Ð
;¨MÐ
;Ð
;Ñ<Ô<Ð<à!Ðzˆ=˜EÐ!ÐzÐzÐzÕzÔzÐzÐzÐzÐzˆ=˜EÐzÑzÔzÐzÕzÔzÑzÔzÐzÐzÕzÔzˆ=ÑzÔzÐzÕzÔzˆ=ÑzÔzÐzÐzÕzÔz˜EÑzÔzÐzÐzÑzÐzÕzÔzÐ#zÑzÔzÐzÑzÐzÐzÐzÑzÐzÕzÕzÔzÐzÑzÔzÑzÔzÐzÐzÐzÐzÐzÐzÐzrJ   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t          j
        d|fd||f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        ‰
¦  «        rt          j        ‰
¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          j        d¦  «        dz   d|iz  }t!          t          j        |¦  «        ¦  «        ‚d	x}x}}d„ ‰
D ¦   «         }t%          |¦  «        }|s•ddt          j        ¦   «         v st          j        t$          ¦  «        rt          j        t$          ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }	t!          t          j        |	¦  «        ¦  «        ‚d	x}}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Ú	Exceptionrn   )Ú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 r}   ©Ú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   ©ú>)z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)sÚlenr†   ©r.   Úpy1r/   Úpy6zNExpected ProgrammingError due to check_same_thread=True on :memory: connectionú
>assert %(py8)sÚpy8c              3  óJ   K  — | ]}t          |t          j        ¦  «        V — Œd S )N)Ú
isinstancer   ÚProgrammingError)rb   r…   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   ú,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}rl   ©r.   r5   rh   )r   r   Ú
concurrentÚfuturesÚThreadPoolExecutorÚrangeÚresultr   r”   r9   r:   r;   r<   r=   r>   rp   r?   r@   rl   )r    ÚfrB   Ú@py_assert5rF   Ú@py_format7Ú@py_format9rC   rG   rv   r†   r�   r‡   rˆ   s             @@@@r   Ú,test_in_memory_service_thread_safety_failurer¨   Ö   sü  øøøø€ õ "¨*Ð
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˜Ðlˆ;˜Š?ÐlÐlÑlÕlÔlÐlÐlÐlÐlˆ;˜ÐlÑlÔlÐlÕlÔlÑlÔlÐlÐlÕlÔl�3ÑlÔlÐlÕlÔl�3ÑlÔlÐlÐlÐlÕlÔlÑlÔlÐlÐlÕlÔlˆvÑlÔlÐlÕlÔlˆvÑlÔlÐlÐlÕlÔlˆ;ÑlÔlÕlÔl˜ÑlÔlÐlÐlÑlÐlÕlÔlÐlÑlÔlÐlÑlÐlÐlÐlÑlÐlÕlÕlÔlÐlÑlÔlÑlÔlÐlÐlÐlÐlÐlÐlÐlØGÐGÀÐGÑGÔGÐG�3ÐGÑGÔGÐGÐGÐGÐGÐGÕGÔGÑGÔGÐGÐGÕGÔG�3ÑGÔGÐGÕGÔG�3ÑGÔGÐGÐGÕGÔGÐGÑGÔGÕGÔGÐGÑGÔGÐGÐGÑGÐGÕGÕGÔGÐGÑGÔGÑGÔGÐGÐGÐGÐGÐGÐGÐGs   Á6BÂBÂBc                ó¦  ‡‡‡‡— 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
t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        ‰¦  «        rt          j        ‰¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }	t          j        d‰› �¦  «        dz   d|	iz  }
t%          t          j        |
¦  «        ¦  «        ‚d
x}x}}t          |¦  «        }d	}||k    }|sòt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t%          t          j        |
¦  «        ¦  «        ‚d
x}x}}d„ |D ¦   «         }t)          |¦  «        }|s•ddt          j        ¦   «         v st          j        t(          ¦  «        rt          j        t(          ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t%          t          j        |¦  «        ¦  «        ‚d
x}}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   rƒ   r   Ú
party_sizer„   rn   )Ú	worker_idÚ
reader_svcr,   r…   Ú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 r}   r�   )rb   Úir�   r°   s     €€r   r‘   z9test_file_database_concurrent_readers.<locals>.<listcomp>  s'   ø€ ÐAÐAÐA°!�8—?’? 6¨1Ñ-Ô-ÐAÐAÐAr   é   Nr   r2   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr”   r†   r•   zConcurrent reads had errors: r˜   r™   Úresultszassert %(py8)sc              3  ó"   K  — | ]
}|d k    V — ŒdS )r«   Nr}   )rb   Úrs     r   rd   z8test_file_database_concurrent_readers.<locals>.<genexpr>  s&   è è € Ð'Ð'˜!ˆq�AŠvÐ'Ð'Ð'Ð'Ð'Ð'r   r�   Úallrž   )Ústrr   r   rŸ   r    r¡   r¢   r£   rn   r   r”   r9   r:   r;   r<   r=   r>   rp   r?   r@   r¸   )Útmp_pathr‡   rµ   r    r¤   ÚresrB   r¥   rF   r¦   r§   rC   rG   rv   r¯   r†   r�   r°   s                 @@@@r   Ú%test_file_database_concurrent_readersr¼   ò   sN  øøøø€ õ �(Ð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˜!ÐEˆ;˜!ÒÐEÐEÑEÕEÔEÐEÐEÐEÐEˆ;˜!ÐEÑEÔEÐEÕEÔEÑEÔEÐEÐEÕEÔE�3ÑEÔEÐEÕEÔE�3ÑEÔEÐEÐEÐEÕEÔEÑEÔEÐEÐEÕEÔEˆvÑEÔEÐEÕEÔEˆvÑEÔEÐEÐEÕEÔEˆ;ÑEÔEÕEÔE˜!ÑEÔEÐEÐEÑEÐEÕEÔEÐE¸VÐEÐEÑEÔEÐEÑEÐEÐEÐEÑEÐEÕEÕEÔEÐEÑEÔEÑEÔEÐEÐEÐEÐEÐEÐEÐEÝˆw‰<Œ<Ð˜2Ðˆ<˜2ÒÐÐÐÕÔÐÐÐÐˆ<˜2ÐÑÔÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÐÕÔÑÔÐÐÕÔˆwÑÔÐÕÔˆwÑÔÐÐÕÔˆ<ÑÔÕÔ˜2ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐØ'Ð'˜wÐ'Ñ'Ô'Ð'�3Ð'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'�3Ñ'Ô'Ð'Õ'Ô'�3Ñ'Ô'Ð'Ð'Õ'Ô'Ð'Ñ'Ô'Õ'Ô'Ð'Ñ'Ô'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'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—t          j        d|	fd‰|f¦  «        dt          j        ¦   «         v st          j        ‰¦  «        rt          j        ‰¦  «        ndt          j        |¦  «        dœz  }
dd|
iz  }t'          t          j        |¦  «        ¦  «        ‚dx}	}d}‰|k    }	|	s—t          j        d|	fd‰|f¦  «        dt          j        ¦   «         v st          j        ‰¦  «        rt          j        ‰¦  «        ndt          j        |¦  «        dœz  }
dd|
iz  }t'          t          j        |¦  «        ¦  «        ‚dx}	}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 r‚   Úwrite)r   r   r   r   r   r„   rn   )r­   Úw_svcr   r…   r¯   Ú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   r‚   Úread)r   rƒ   r   r„   rn   )r­   Úr_svcr,   r…   r¯   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’   )z%(py0)s > %(py3)srÇ   r-   r0   r1   rÂ   )r¹   r   r   rŸ   r    r¡   r¢   rn   rŽ   r£   r   rY   r”   r9   r:   r;   r<   r=   r>   r?   r@   )rº   r‡   rÃ   rÈ   r�   r    r³   r¤   rB   rC   rD   rE   r¯   rÁ   rÇ   rÂ   s               @@@@r   Ú(test_file_database_concurrent_read_writerË     sM  øøøø€ õ
 �(Ð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   Úbuiltinsr;   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter9   Úconcurrent.futuresrŸ   Úosr   r   Ú'server.world.game_design_matrix_servicer   Úfixturer   r   r    r"   r$   r&   rI   rP   r[   ry   r   r¨   r¼   rË   r}   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   