§
    I¾j,  ã                   ót   — d Z ddlmZ ddlZddlZddlmZ ddlmZ ddddd	d
ddddddœZ	 G d„ d¦  «        Z
dS )z´
Empirical Challenger Test Suite for Milestone 1 (R1: Wilderness Map Expansion).
Tests all 11 zones, SQLite database values, boundary physics, ambient tile math, and file hygiene.
é    )ÚPathN)Ú
ZoneEngine)ÚZoneType)Tç      ‰@r   )Fç     @Ÿ@r   )Fç     À¢@r   )Fç     p§@r	   )Fç      ©@r
   )Fç      ¬@r   )Fç     @¯@r   )Fç     0±@r   )Fç     À²@r   )Fç     ˆ³@r   )Úzone_boundless_sanctuaryÚzone_player_hideoutÚzone_tang_kiem_nhaiÚzone_ancient_sword_barrowÚzone_boundless_sandstormÚzone_blood_scale_ruinsÚzone_five_elements_altarÚzone_abyssal_ice_pondÚzone_infinite_blood_riftÚzone_purgatory_lava_cavernÚzone_boundless_celestial_palacec                   ót   — e Zd Z ej        d¬¦  «        dd„¦   «         Zdd„Zdd„Zdd„Zdd	„Z	dd
„Z
dd„ZdS )ÚTestChallengerMilestone1T)ÚautouseÚreturnNc                 ó,   — t          ¦   «         | _        d S )N)r   Úengine)Úselfs    ú@C:\Projects\FreeExile\tests\unit\test_challenger_m1_expansion.pyÚsetup_enginez%TestChallengerMilestone1.setup_engine   s   € å ‘l”lˆŒˆˆó    c                 óÆ  — t          | j        j                             ¦   «         ¦  «        }t	          |¦  «        dk    sJ dt	          |¦  «        › �¦   «         ‚d„ |D ¦   «         }d„ |D ¦   «         }t	          |¦  «        dk    sJ dt	          |¦  «        › �¦   «         ‚t	          |¦  «        dk    sJ dt	          |¦  «        › �¦   «         ‚d	„ |D ¦   «         }|d
dhk    sJ ‚dS )z8Verify exactly 11 zones: 2 sanctuaries and 9 wilderness.é   zExpected 11 zones, found c                 ó<   — g | ]}|j         t          j        k    ¯|‘ŒS © )Ú	zone_typer   Ú	SANCTUARY©Ú.0Úzs     r"   ú
<listcomp>zSTestChallengerMilestone1.test_zone_counts_and_type_distribution.<locals>.<listcomp>(   s'   € ÐMÐMÐM˜Q¨1¬;½(Ô:LÒ+LÐ+L�qÐ+LÐ+LÐ+Lr$   c                 ó<   — g | ]}|j         t          j        k    ¯|‘ŒS r(   )r)   r   Ú
OPEN_WORLDr+   s     r"   r.   zSTestChallengerMilestone1.test_zone_counts_and_type_distribution.<locals>.<listcomp>)   s'   € ÐMÐMÐM˜A¨!¬+½Ô9LÒ*LÐ*L�aÐ*LÐ*LÐ*Lr$   é   zExpected 2 sanctuaries, found é	   z#Expected 9 wilderness zones, found c                 ó   — h | ]	}|j         ’Œ
S r(   )Úzone_idr+   s     r"   ú	<setcomp>zRTestChallengerMilestone1.test_zone_counts_and_type_distribution.<locals>.<setcomp>.   s   € Ð8Ð8Ð8 q˜œÐ8Ð8Ð8r$   r   r   N)Úlistr    ÚzonesÚvaluesÚlen)r!   r7   ÚsanctuariesÚ
wildernessÚsanctuary_idss        r"   Ú&test_zone_counts_and_type_distributionz?TestChallengerMilestone1.test_zone_counts_and_type_distribution#   s  € å�T”[Ô&×-Ò-Ñ/Ô/Ñ0Ô0ˆÝ�5‰zŒz˜RÒÐÐÐ!I½SÀ¹Z¼ZÐ!IÐ!IÑÔÐàMÐM %ÐMÑMÔMˆØMÐM ÐMÑMÔMˆ
å�;ÑÔ 1Ò$Ð$Ð$Ð&YÅsÈ;ÑGWÔGWÐ&YÐ&YÑ$Ô$Ð$Ý�:‰Œ !Ò#Ð#Ð#Ð%\Í3ÈzÉ?Ì?Ð%\Ð%\Ñ#Ô#Ð#à8Ð8¨KÐ8Ñ8Ô8ˆØÐ!;Ð=RÐ SÒSÐSÐSÐSÐSÐSr$   c                 ó�  — t                                ¦   «         D ]«\  }\  }}}| j                             |¦  «        }|€J d|› �¦   «         ‚|r,|j        t
          j        k    sJ ‚|j        |j        fdk    sJ ‚Œ`|j        t
          j	        k    sJ ‚|j        |j        f||fk    sJ ‚|dk    r|j        dk    r|j        dk    sJ ‚Œ¬dS )z)Verify exact dimensions for all 11 zones.NzMissing zone )r   r   r   g      ™@)
ÚBASELINE_AND_EXPANDED_SPECSÚitemsr    Úget_zoner)   r   r*   Úbounds_widthÚbounds_heightr0   )r!   r4   Úis_sanctuaryÚexp_wÚexp_hÚzones         r"   Ú"test_all_11_zones_exact_dimensionsz;TestChallengerMilestone1.test_all_11_zones_exact_dimensions1   s  € å5P×5VÒ5VÑ5XÔ5Xð 
	Xð 
	XÑ1ˆGÑ1�l E¨5Ø”;×'Ò'¨Ñ0Ô0ˆDØÐ#Ð#Ð%>°WÐ%>Ð%>Ñ#Ô#Ð#Øð XØ”~­Ô);Ò;Ð;Ð;Ð;ØÔ)¨4Ô+=Ð>À.ÒPÐPÐPÐPÐPà”~­Ô)<Ò<Ð<Ð<Ð<ØÔ)¨4Ô+=Ð>À5È%À.ÒPÐPÐPÐPØÐ3Ò3Ð3ØÔ,°Ò6Ð6¸4Ô;MÐQWÒ;WÐ;WÐ;WÐWøð
	Xð 
	Xr$   c           	      óP  — | j         j                             ¦   «         D �]}|j        dz  }|j        dz  }|j                             ¦   «         D ]e\  }}t          |j        ¦  «        |k    sJ d|› d|j        › d|› �¦   «         ‚t          |j	        ¦  «        |k    sJ d|› d|j	        › d|› �¦   «         ‚Œf|j
                             ¦   «         D ]U\  }}t          |j        ¦  «        |k    sJ d|› d|› �¦   «         ‚t          |j        ¦  «        |k    sJ d|› d	|› �¦   «         ‚ŒV�Œd
S )zNAdversarial check: ensure no waypoints or portals are outside expanded bounds.ç       @z	Waypoint z x=z outside half-width z y=z outside half-height zPortal z src_x outside z src_y outside N)r    r7   r8   rB   rC   Ú	waypointsr@   ÚabsÚxÚyÚportalsÚsource_xÚsource_y)r!   rG   Úhalf_wÚhalf_hÚwp_idÚwpÚ	portal_idÚportals           r"   Ú(test_waypoints_and_portals_within_boundszATestChallengerMilestone1.test_waypoints_and_portals_within_bounds?   s�  € à”KÔ%×,Ò,Ñ.Ô.ð 
	dñ 
	dˆDØÔ&¨Ñ,ˆFØÔ'¨#Ñ-ˆFà!œ^×1Ò1Ñ3Ô3ð fð f‘	��rÝ˜2œ4‘y”y FÒ*Ð*Ð*Ð,d¸Ð,dÐ,dÀ"Ä$Ð,dÐ,dÐ\bÐ,dÐ,dÑ*Ô*Ð*Ý˜2œ4‘y”y FÒ*Ð*Ð*Ð,e¸Ð,eÐ,eÀ"Ä$Ð,eÐ,eÐ]cÐ,eÐ,eÑ*Ô*Ð*Ð*à%)¤\×%7Ò%7Ñ%9Ô%9ð dð dÑ!�	˜6Ý˜6œ?Ñ+Ô+¨vÒ5Ð5Ð5Ð7cÀÐ7cÐ7cÐ[aÐ7cÐ7cÑ5Ô5Ð5Ý˜6œ?Ñ+Ô+¨vÒ5Ð5Ð5Ð7cÀÐ7cÐ7cÐ[aÐ7cÐ7cÑ5Ô5Ð5Ð5ñdð
	dð 
	dr$   c                 óð  — t          d¦  «        }|                     ¦   «         s
J d¦   «         ‚t          j        t	          |¦  «        ¦  «        }	 |                     ¦   «         }|                     d¦  «                             ¦   «         }t          |¦  «        dk    sJ dt          |¦  «        › �¦   «         ‚d„ |D ¦   «         }t           
                    ¦   «         D ]j\  }\  }}}	||v sJ d|› d�¦   «         ‚||         \  }
}}|rd	nd
}|
|k    sJ d|› d|
› d|› �¦   «         ‚||f||	fk    sJ d|› d|› d|› d|› d|	› d�¦   «         ‚Œk	 |                     ¦   «          dS # |                     ¦   «          w xY w)zIEmpirically query data/game_design_matrix.db and assert exact dimensions.zdata/game_design_matrix.dbzgame_design_matrix.db missingzASELECT zone_id, zone_type, bounds_width, bounds_height FROM zonesr&   z%Expected 11 rows in zones table, got c           	      ó~   — i | ]:}|d          |d         t          |d         ¦  «        t          |d         ¦  «        f“Œ;S )r   é   r1   é   )Úfloat)r,   Úrs     r"   ú
<dictcomp>zMTestChallengerMilestone1.test_sqlite_matrix_db_invariants.<locals>.<dictcomp>Z   s=   € ÐKÐKÐKÀ�a˜”d˜Q˜qœT¥5¨¨1¬¡;¤;µ°a¸´d±´Ð<ÐKÐKÐKr$   zZone z missing from SQLite DBr*   r0   z type mismatch: z vs z DB bounds mismatch: (ú,z) vs (ú)N)r   ÚexistsÚsqlite3ÚconnectÚstrÚcursorÚexecuteÚfetchallr9   r?   r@   Úclose)r!   Údb_pathÚconnrf   ÚrowsÚdb_mapr4   rD   rE   rF   Úz_typeÚwÚhÚexpected_types                 r"   Ú test_sqlite_matrix_db_invariantsz9TestChallengerMilestone1.test_sqlite_matrix_db_invariantsM   sÔ  € åÐ3Ñ4Ô4ˆØ�~Š~ÑÔÐ@Ð@Ð!@Ñ@Ô@ÐåŒ�s 7™|œ|Ñ,Ô,ˆð	Ø—[’[‘]”]ˆFØ—>’>ØSñô çŠh‰jŒjð õ �t‘9”9 ’?�?�?Ð$WÍCÐPTÉIÌIÐ$WÐ$W‘?”?�?àKÐKÀdÐKÑKÔKˆFÝ9T×9ZÒ9ZÑ9\Ô9\ð vð vÑ5�Ñ5˜,¨¨uØ &Ð(Ð(Ð(Ð*R°'Ð*RÐ*RÐ*RÑ(Ô(Ð(Ø% gœ‘�˜˜1Ø/;Ð M  À�Ø Ò.Ð.Ð.Ð0l¸Ð0lÐ0lÐQWÐ0lÐ0lÐ]jÐ0lÐ0lÑ.Ô.Ð.Ø˜1�v %¨ Ò/Ð/Ð/Ð1u¸Ð1uÐ1uÐXYÐ1uÐ1uÐ\]Ð1uÐ1uÐejÐ1uÐ1uÐmrÐ1uÐ1uÐ1uÑ/Ô/Ð/Ð/ðvð �JŠJ‰LŒLˆLˆLˆLøˆD�JŠJ‰LŒLˆLˆLøøøs   ÁC8E ÅE5c           	      ó”  — t          d¦  «        dt          d¦  «        dt          d¦  «        dt          d¦  «        di}|                     ¦   «         D ]t\  }}|                     ¦   «         sJ d|› d�¦   «         ‚t          |                     d	¬
¦  «                             ¦   «         ¦  «        }||k    sJ |› d|› d|› �¦   «         ‚ŒudS )z0Verify strict line limits across affected files.zserver/world/zone_catalog.pyi¼  z+client/webapp/js/engine/collision_engine.jsiô  z)client/webapp/js/engine/world_renderer.jsz(tests/unit/test_zone_bounds_expansion.pyzFile z
 not foundzutf-8)Úencodingz has z lines, exceeding limit N)r   r@   rb   r9   Ú	read_textÚ
splitlines)r!   ÚlimitsÚ	file_pathÚ	max_linesÚliness        r"   Útest_hygiene_line_limitsz1TestChallengerMilestone1.test_hygiene_line_limitsd   sø   € õ Ð/Ñ0Ô0°#ÝÐ>Ñ?Ô?ÀÝÐ<Ñ=Ô=¸sÝÐ;Ñ<Ô<¸cð	
ˆð %+§L¢L¡N¤Nð 	eð 	eÑ ˆI�yØ×#Ò#Ñ%Ô%ÐDÐDÐ'D¨yÐ'DÐ'DÐ'DÑDÔDÐ%Ý˜	×+Ò+°WÐ+Ñ=Ô=×HÒHÑJÔJÑKÔKˆEØ˜IÒ%Ð%Ð%¨)Ð'dÐ'd¸%Ð'dÐ'dÐYbÐ'dÐ'dÑ%Ô%Ð%Ð%ð	eð 	er$   c                 ó”  ‡‡‡‡— dŠdŠd}d}|dz  Š|dz  Šdt           dt           dt           d	t           d
t          t           t           f         f
ˆˆˆˆfd„}g d¢}t          t          ||¦  «        ‰dz  z  dz   ¦  «        }|D ]Æ\  }}t	          |¦  «        }t	          |¦  «        }	d}
d}t          ||z
  ||z   dz   ¦  «        D ]Z}t          |	|z
  |	|z   dz   ¦  «        D ]>} |||||¦  «        \  }}|‰ k     s||‰z   k    s|‰ k     s	||‰z   k    r|dz  }Œ9|
dz  }
Œ?Œ[|
dk    sJ d|› d|› d�¦   «         ‚|
|z   d|z  dz   dz  k    sJ ‚ŒÇdS )zBStress-test ambient tile mathematics for extreme camera positions.é@   é    i€  i8  rJ   ÚwxÚwyÚcam_xÚcam_yr   c                 óP   •— | |z
  }||z
  }||z
  ‰	dz  z  ‰z   ||z   ‰dz  z  ‰z   fS )NrJ   r(   )
r   r€   r�   r‚   Úrel_wxÚrel_wyÚcxÚcyÚtile_hÚtile_ws
         €€€€r"   Úworld_to_isozLTestChallengerMilestone1.test_ambient_tile_math_stress.<locals>.world_to_isoz   sI   ø€ Ø˜%‘ZˆFØ˜%‘ZˆFà˜&‘ V¨c¡\Ñ2°RÑ7Ø˜&‘ V¨c¡\Ñ2°RÑ7ðð r$   ))ç        r‹   )g    €„.Ág    €„.A)g    ÐcAg    ÐcÁ)g      6Àg      1@)ç     ˆ£@rŒ   )ç     ˆ£Àr�   r1   r   r[   z"Expected visible tiles at camera (z, ra   N)r]   ÚtupleÚintÚmaxÚroundÚrange)r!   Ú
viewport_wÚ
viewport_hrŠ   Útest_camerasÚtile_radiusr�   r‚   Úcam_wxÚcam_wyÚdrawnÚculledrM   rN   Úpt_xÚpt_yr†   r‡   rˆ   r‰   s                   @@@@r"   Útest_ambient_tile_math_stressz6TestChallengerMilestone1.test_ambient_tile_math_stressq   s  øøøø€ àˆØˆØˆ
Øˆ
Ø˜#ÑˆØ˜#Ñˆð	�Uð 	­ð 	µeð 	ÅEð 	ÍeÕTYÕ[`ÐT`ÔNað 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð
ð 
ð 
ˆõ �3˜z¨:Ñ6Ô6¸&À1¹*ÑEÈÑJÑKÔKˆà(ð 	@ð 	@‰LˆE�5Ý˜5‘\”\ˆFÝ˜5‘\”\ˆFØˆEØˆFÝ˜6 KÑ/°¸+Ñ1EÈÑ1IÑJÔJð ð �Ý˜v¨Ñ3°V¸kÑ5IÈAÑ5MÑNÔNð 
ð 
�AØ!- ¨a°°E¸5Ñ!AÔ!A‘J�D˜$à ˜wš˜Ø *¨vÑ"5Ò5Ð5Ø 6 'š>˜>Ø *¨vÑ"5Ò5Ð5à !™˜Ø Ø˜Q‘J�E�Eð
ð ˜1’9�9�9ÐTÀ5ÐTÐTÈEÐTÐTÐT‘9”9�9Ø˜6‘> a¨+¡o¸Ñ&9¸aÑ%?Ò?Ð?Ð?Ð?Ð?ð'	@ð 	@r$   )r   N)Ú__name__Ú
__module__Ú__qualname__ÚpytestÚfixturer#   r=   rH   rX   rr   r{   r�   r(   r$   r"   r   r      sÐ   € € € € € Ø€V„^˜DÐ!Ñ!Ô!ð#ð #ð #ñ "Ô!ð#ðTð Tð Tð TðXð Xð Xð Xðdð dð dð dðð ð ð ð.eð eð eð eð/@ð /@ð /@ð /@ð /@ð /@r$   r   )Ú__doc__Úpathlibr   rc   r¡   Úserver.world.zone_enginer   Úserver.world.zone_typesr   r?   r   r(   r$   r"   ú<module>r§      sÏ   ððð ð
 Ð Ð Ð Ð Ð Ø €€€Ø €€€à /Ð /Ð /Ð /Ð /Ð /Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,ð
 !5Ø/Ø2Ø!8Ø 7Ø5Ø 7Ø4Ø 7Ø"9Ø'>ðð Ð ð B@ð B@ð B@ð B@ð B@ñ B@ô B@ð B@ð B@ð B@r$   