§
    ‘¿jç,  ã                  ób  — 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Zddl	m
Z
mZmZ ddlZddlmZmZ ddlmZmZmZ ddlmZmZ ddlmZmZ dd	lmZ  ej        d
¬¦  «        dd„¦   «         Z G d„ d¦  «        Z G d„ d¦  «        Z  G d„ d¦  «        Z! G d„ d¦  «        Z" G d„ d¦  «        Z#dS )aú  
E2E Test Suite for FreeExile 30 Biomes Procedural Generation & Server Pipeline.
Validates:
1. Procedural generation across all 30 biomes (seeds 1..30).
2. Compact binary serialization across all 30 biomes with header byte 3 mapping to 1..30.
3. Zone canonical biome resolution and override logic.
4. WebApp /api/map query parameter integration with tools/serve_webapp.py.
5. Adversarial buffer corruption and edge case handling.

Rules: Strict typing, functions <= 50 lines, file <= 350 lines (soft cap).
é    )ÚannotationsN)Ú	GeneratorÚListÚTuple)ÚTileTypeÚMapGridData)Úlist_stylesÚget_map_styleÚget_style_by_code)ÚWildernessMapGeneratorÚZONE_DEFAULT_SIZES)Úserialize_map_gridÚdeserialize_map_grid)ÚFreeExileHTTPRequestHandlerÚmodule)ÚscopeÚreturnúGenerator[str, None, None]c               #  ó  K  — t          j        dt          ¦  «        } | j        d         }t	          j        | j        d¬¦  «        }|                     ¦   «          d|› �V — |                      ¦   «          |  	                    ¦   «          dS )zSSpins up a lightweight local test server on an ephemeral port for E2E HTTP testing.)z	127.0.0.1r   é   T)ÚtargetÚdaemonzhttp://127.0.0.1:N)
ÚsocketserverÚ	TCPServerr   Úserver_addressÚ	threadingÚThreadÚserve_foreverÚstartÚshutdownÚserver_close)ÚserverÚportÚthreads      ú@C:\Projects\FreeExile\tests\e2e\test_30_biomes_generation_e2e.pyÚwebapp_serverr&      sŠ   è è € õ Ô#Ð$4Õ6QÑRÔR€FØÔ  Ô#€DÝÔ VÔ%9À$ÐGÑGÔG€FØ
‡L‚L�N„N€NØ
$˜dÐ
$Ð
$Ð$Ð$Ð$Ø
‡O‚OÑÔÐØ
×ÒÑÔÐÐÐó    c                  ó2   — e Zd ZdZd	d„Zd	d„Zd	d„Zd	d„ZdS )
Ú TestProceduralGeneration30BiomeszHVerifies procedural map generation for all 30 biomes across seeds 1..30.r   ÚNonec                óì   — g d¢}|D ]l\  }}t          dd|¬¦  «        }|                     |¬¦  «        }|j        dk    r|j        dk    sJ ‚|j        |k    sJ ‚|                     ¦   «         dk    sJ ‚ŒmdS )zJBaseline verification that legacy biomes (codes 1-5) generate valid grids.©)ÚBLEACHED_BONE_CANYONr   )ÚSAVAGE_MANGROVE_SWAMPé   )ÚCRIMSON_BLOOD_FORESTé   )ÚOUTCAST_MINE_SHAFTSé   )ÚCORRUPTED_FIEND_RUINSé   é<   é-   ©ÚwidthÚheightÚbiome_id©Úseedr   N)r   Úgenerater9   r:   ÚbiomeÚget_walkables_count)ÚselfÚlegacy_biomesÚb_nameÚb_codeÚgenÚgrids         r%   Ú&test_generation_legacy_biomes_baselinezGTestProceduralGeneration30Biomes.test_generation_legacy_biomes_baseline,   s«   € ð
ð 
ð 
ˆð ,ð 	2ð 	2‰NˆF�FÝ(¨r¸"ÀvÐNÑNÔNˆCØ—<’< V�<Ñ,Ô,ˆDØ”: Ò#Ð#¨¬°rÒ(9Ð(9Ð(9Ð9Ø”: Ò'Ð'Ð'Ð'Ø×+Ò+Ñ-Ô-°Ò1Ð1Ð1Ð1Ð1ð	2ð 	2r'   c                ó†  — t          ¦   «         }t          |¦  «        dk    sJ dt          |¦  «        › �¦   «         ‚|D �]}|j        }t          dd|j        ¬¦  «        }|                     |¬¦  «        }t          |t          ¦  «        sJ ‚|j        dk    r|j	        dk    sJ ‚d|j
        d         cxk    r|j        k     r"n nd|j
        d         cxk    r|j	        k     sn J ‚|j        €J ‚t          |j        ¦  «        d	k    sJ ‚|                     ¦   «         t          |j        |j	        z  d
z  ¦  «        k    sJ ‚�Œd S )Né   z$Expected 30 canonical styles, found r6   r7   r8   r<   r   r   r/   g333333Ã?)r	   ÚlenÚ
biome_coder   Ústyle_idr>   Ú
isinstancer   r9   r:   Úspawn_pointÚ	boss_gateÚencounter_zonesr@   Úint)rA   Ú
all_stylesÚstyler=   rE   rF   s         r%   Útest_generation_all_30_biomesz>TestProceduralGeneration30Biomes.test_generation_all_30_biomes<   s{  € Ý ‘]”]ˆ
Ý�:‰Œ "Ò$Ð$Ð$Ð&^ÍSÐQ[É_Ì_Ð&^Ð&^Ñ$Ô$Ð$àð 
	Vñ 
	VˆEØÔ#ˆDÝ(¨r¸"ÀuÄ~ÐVÑVÔVˆCØ—<’< T�<Ñ*Ô*ˆDå˜d¥KÑ0Ô0Ð0Ð0Ð0Ø”: Ò#Ð#¨¬°rÒ(9Ð(9Ð(9Ð9Ø˜Ô(¨Ô+Ð8Ð8Ò8Ð8¨d¬jÒ8Ð8Ð8Ð8Ð8¸QÀ$ÔBRÐSTÔBUÐ=cÐ=cÒ=cÐ=cÐX\ÔXcÒ=cÐ=cÐ=cÐ=cÐ=cÐcØ”>Ð-Ð-Ð-Ý�tÔ+Ñ,Ô,°Ò1Ð1Ð1Ð1Ø×+Ò+Ñ-Ô-µ°T´ZÀ$Ä+Ñ5MÐPTÑ5TÑ1UÔ1UÒUÐUÐUÐUÑUð
	Vð 
	Vr'   c                ó„  — t          d¦  «        }|€J ‚t          dd|j        ¬¦  «        }|                     d¬¦  «        }|                     d¬¦  «        }|                     d¬¦  «        }d„ |j        D ¦   «         }d	„ |j        D ¦   «         }d
„ |j        D ¦   «         }||k    s
J d¦   «         ‚||k    s
J d¦   «         ‚d S )Nr   r6   r7   r8   ée   r<   éÊ   c                ó&   — g | ]}|D ]	}|j         ‘Œ
ŒS © ©Ú	tile_type©Ú.0ÚrowÚcs      r%   ú
<listcomp>zYTestProceduralGeneration30Biomes.test_seed_determinism_and_divergence.<locals>.<listcomp>U   ó'   € ÐBÐBÐB C¸cÐBÐB¸�A”KÐBÐBÐBÐBr'   c                ó&   — g | ]}|D ]	}|j         ‘Œ
ŒS rY   rZ   r\   s      r%   r`   zYTestProceduralGeneration30Biomes.test_seed_determinism_and_divergence.<locals>.<listcomp>V   ra   r'   c                ó&   — g | ]}|D ]	}|j         ‘Œ
ŒS rY   rZ   r\   s      r%   r`   zYTestProceduralGeneration30Biomes.test_seed_determinism_and_divergence.<locals>.<listcomp>W   s'   € Ð@Ð@Ð@ 3¸CÐ@Ð@°q�1”;Ð@Ð@Ð@Ð@r'   z+Identical seeds must produce identical mapsz.Different seeds must produce divergent terrain)r   r   rL   r>   Útiles)	rA   rS   rE   Úm1aÚm1bÚm2Útiles_1aÚtiles_1bÚtiles_2s	            r%   Ú$test_seed_determinism_and_divergencezETestProceduralGeneration30Biomes.test_seed_determinism_and_divergenceL   sã   € Ý! !Ñ$Ô$ˆØÐ Ð Ð Ý$¨2°bÀ5Ä>ÐRÑRÔRˆà�lŠl ˆlÑ$Ô$ˆØ�lŠl ˆlÑ$Ô$ˆØ�\Š\˜sˆ\Ñ#Ô#ˆàBÐB¨3¬9ÐBÑBÔBˆØBÐB¨3¬9ÐBÑBÔBˆØ@Ð@¨"¬(Ð@Ñ@Ô@ˆà˜8Ò#Ð#Ð#Ð%RÑ#Ô#Ð#Ø˜7Ò"Ð"Ð"Ð$TÑ"Ô"Ð"Ð"Ð"r'   c                ó  — t          dd¦  «        D �]n}t          |¦  «        }|€J ‚t          dd|j        ¬¦  «                             |¬¦  «        }|j        \  }}d}t          t          dt          |dz
  ¦  «        ¦  «        t          |j	        dz
  t          |d	z   ¦  «        ¦  «        ¦  «        D ]Ì}t          t          dt          |dz
  ¦  «        ¦  «        t          |j
        dz
  t          |d	z   ¦  «        ¦  «        ¦  «        D ]u}||z
  d
z  ||z
  d
z  z   |k    r^|j        |         |         }	|	j        sJ d|› d|› d|› d�¦   «         ‚|	j        t          j        t          j        fv sJ d|› d|› d�¦   «         ‚ŒvŒÍ�Œpd S )Nr   é   r6   r7   r8   r<   g      P@é   é	   r/   zCell (ú,z) in biome z spawn radius must be walkablez) must be FLOOR/PATH)Úranger   r   rL   r>   rN   ÚmaxrQ   Úminr:   r9   rd   Úwalkabler[   r   ÚFLOORÚPATH)
rA   ÚcoderS   ÚmÚsxÚsyÚr_sqÚyÚxÚcells
             r%   Ú,test_spawn_clearing_invariance_all_30_biomeszMTestProceduralGeneration30Biomes.test_spawn_clearing_invariance_all_30_biomes\   s±  € Ý˜!˜R‘L”Lð 	wñ 	wˆDÝ% dÑ+Ô+ˆEØÐ$Ð$Ð$Ý&¨R¸ÀUÄ^ÐTÑTÔT×]Ò]ÐcgÐ]ÑhÔhˆAØ”]‰FˆB�ØˆDå�3˜q¥# b¨1¡f¡+¤+Ñ.Ô.µ°A´H¸q±LÅ#ÀbÈ1ÁfÁ+Ä+Ñ0NÔ0NÑOÔOð wð w�Ý�s 1¥c¨"¨q©&¡k¤kÑ2Ô2µC¸¼À!¹ÅSÈÈaÉÁ[Ä[Ñ4QÔ4QÑRÔRð wð w�AØ˜B™ 1‘}¨¨B©°1¡}Ñ4¸Ò<Ð<Ø œw qœz¨!œ}˜Ø#œ}ÐmÐmÐ.m°qÐ.mÐ.m¸1Ð.mÐ.mÈÐ.mÐ.mÐ.mÑmÔm˜}Ø#œ~µ(´.Å(Ä-Ð1PÐPÐPÐPÐRvÐ[\ÐRvÐRvÐ_`ÐRvÐRvÐRvÑPÔPÐPøð	wñwð	wð 	wr'   N©r   r*   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rG   rT   rk   r   rY   r'   r%   r)   r)   )   sx   € € € € € ØRÐRð2ð 2ð 2ð 2ð Vð Vð Vð Vð Uð Uð Uð Uð wð wð wð wð wð wr'   r)   c                  ó2   — e Zd ZdZd	d„Zd	d„Zd	d„Zd	d„ZdS )
ÚTestBinarySerialization30BiomeszEVerifies binary serializer matches byte offset 3 to biome_code 1..30.r   r*   c                ó  — g d¢}|D ]z\  }}t          dd|¬¦  «                             |¬¦  «        }t          |¦  «        }|dd…         dk    sJ ‚|d         d	k    sJ ‚|d
         |k    sJ d|› d|d
         › �¦   «         ‚Œ{dS )zTBaseline verification that legacy biomes (1-5) serialize with correct byte offset 3.r,   r6   r7   r8   r<   Nr/   ó   FEr   r1   zExpected offset 3 to be ú, got )r   r>   r   )rA   rB   rC   rD   rF   Úpayloads         r%   Ú)test_binary_header_legacy_biomes_baselinezITestBinarySerialization30Biomes.test_binary_header_legacy_biomes_baselineo   sË   € ð
ð 
ð 
ˆð ,ð 	_ð 	_‰NˆF�FÝ)°¸2ÈÐOÑOÔO×XÒXÐ^dÐXÑeÔeˆDÝ(¨Ñ.Ô.ˆGØ˜2˜A˜2”; %Ò'Ð'Ð'Ð'Ø˜1”: ’?�?�?�?Ø˜1”: Ò'Ð'Ð'Ð)^ÀFÐ)^Ð)^ÐRYÐZ[ÔR\Ð)^Ð)^Ñ'Ô'Ð'Ð'ð	_ð 	_r'   c                ór  — t          dd¦  «        D ]¥}t          |¦  «        }|€J ‚t          dd|j        ¬¦  «                             |¬¦  «        }t          |¦  «        }|d d…         dk    sJ d	|› �¦   «         ‚|d         dk    sJ d
|› �¦   «         ‚|d         |k    sJ d|› d|d         › �¦   «         ‚Œ¦d S )Nr   rm   r6   r7   r8   r<   r/   rˆ   z%Header magic must be b'FE' for biome z#Header version must be 1 for biome r1   z&Header offset 3 must match biome_code r‰   )rq   r   r   rL   r>   r   )rA   rw   rS   rF   rŠ   s        r%   Ú3test_binary_header_byte3_matches_all_30_biome_codeszSTestBinarySerialization30Biomes.test_binary_header_byte3_matches_all_30_biome_codes   sù   € Ý˜!˜R‘L”Lð 	ið 	iˆDÝ% dÑ+Ô+ˆEØÐ$Ð$Ð$Ý)°¸2ÈÌÐWÑWÔW×`Ò`ÐfjÐ`ÑkÔkˆDÝ(¨Ñ.Ô.ˆGà˜2˜A˜2”; %Ò'Ð'Ð'Ð)WÐQUÐ)WÐ)WÑ'Ô'Ð'Ø˜1”: ’?�?�?Ð$PÈ$Ð$PÐ$P‘?”?�?Ø˜1”: Ò%Ð%Ð%Ð'hÐPTÐ'hÐ'hÐ\cÐdeÔ\fÐ'hÐ'hÑ%Ô%Ð%Ð%ð	ið 	ir'   c                ón  — dD ]±}t          |¦  «        }|€J ‚t          dd|j        ¬¦  «                             |¬¦  «        }t	          |¦  «        }dt          |j        ¦  «        dz  z   t          |j        ¦  «        dz  z   |j        |j	        z  z   }t          |¦  «        |k    sJ d	|› �¦   «         ‚Œ²d S )
N)r   r5   é
   é   rI   r6   r7   r8   r<   é   r1   r5   z"Payload length mismatch for biome )
r   r   rL   r>   r   rJ   Ú
poi_pointsrP   r9   r:   )rA   rw   rS   rF   rŠ   Úexpected_lens         r%   Ú"test_binary_payload_length_formulazBTestBinarySerialization30Biomes.test_binary_payload_length_formulaŠ   sÚ   € Ø&ð 	]ð 	]ˆDÝ% dÑ+Ô+ˆEØÐ$Ð$Ð$Ý)°¸2ÈÌÐWÑWÔW×`Ò`ÐfjÐ`ÑkÔkˆDÝ(¨Ñ.Ô.ˆGà¥ D¤OÑ 4Ô 4°qÑ 8Ñ8½3¸tÔ?SÑ;TÔ;TÐWXÑ;XÑXÐ[_Ô[eÐhlÔhsÑ[sÑsˆLÝ�w‘<”< <Ò/Ð/Ð/Ð1\ÐVZÐ1\Ð1\Ñ/Ô/Ð/Ð/ð	]ð 	]r'   c                ó  — dD �]}t          |¦  «        }|€J ‚t          dd|j        ¬¦  «                             |¬¦  «        }t	          |¦  «        }t          |¦  «        }|j        |j        k    r|j        |j        k    sJ ‚|j        |j        k    sJ ‚|j	        |j	        k    sJ ‚t          |j        ¦  «        D ]M}t          |j        ¦  «        D ]6}|j        |         |         j        |j        |         |         j        k    sJ ‚Œ7ŒN�Œ	d S )N)r   é   é   é   é   r6   r7   r8   r<   )r   r   rL   r>   r   r   r9   r:   rN   rO   rq   rd   r[   )rA   rw   rS   rF   rŠ   Údr|   r}   s           r%   Ú1test_roundtrip_deserialization_fidelity_30_biomeszQTestBinarySerialization30Biomes.test_roundtrip_deserialization_fidelity_30_biomes”   s9  € Ø&ð 	Qñ 	QˆDÝ% dÑ+Ô+ˆEØÐ$Ð$Ð$Ý)°¸2ÈÌÐWÑWÔW×`Ò`ÐfjÐ`ÑkÔkˆDÝ(¨Ñ.Ô.ˆGÝ$ WÑ-Ô-ˆAà”7˜dœjÒ(Ð(¨Q¬X¸¼Ò-DÐ-DÐ-DÐDØ”= DÔ$4Ò4Ð4Ð4Ð4Ø”; $¤.Ò0Ð0Ð0Ð0Ý˜4œ;Ñ'Ô'ð Qð Q�Ý˜tœzÑ*Ô*ð Qð Q�AØœ7 1œ: aœ=Ô2°d´jÀ´mÀAÔ6FÔ6PÒPÐPÐPÐPÐPðQñQð	Qð 	Qr'   Nr€   )r�   r‚   rƒ   r„   r‹   r�   r”   r›   rY   r'   r%   r†   r†   l   s|   € € € € € ØOÐOð_ð _ð _ð _ð 	ið 	ið 	ið 	ið]ð ]ð ]ð ]ðQð Qð Qð Qð Qð Qr'   r†   c                  ó"   — e Zd ZdZdd„Zdd„ZdS )Ú TestZoneCanonicalBiomeResolutionz7Verifies zone-to-biome mapping and parameter overrides.r   r*   c                ó  — g d¢}|D ]�}t          j        |¦  «        }t          |         }|j        |d         k    r|j        |d         k    sJ ‚|                     d¬¦  «        }|j        |d         k    r|j        |d         k    sJ ‚Œ‚d S )N)Úzone_tang_kiem_nhaiÚzone_ancient_sword_barrowÚzone_boundless_sandstormÚzone_boundless_celestial_palacer   r   é*   r<   )r   Úfor_zoner   r9   r:   r>   )rA   Úcanonical_zonesÚzidrE   Úexpected_dimsrF   s         r%   Ú.test_canonical_zones_dimensions_and_resolutionzOTestZoneCanonicalBiomeResolution.test_canonical_zones_dimensions_and_resolution§   s¶   € ð
ð 
ð 
ˆð #ð 	Vð 	VˆCÝ(Ô1°#Ñ6Ô6ˆCÝ.¨sÔ3ˆMØ”9 ¨aÔ 0Ò0Ð0°S´ZÀ=ÐQRÔCSÒ5SÐ5SÐ5SÐSØ—<’< R�<Ñ(Ô(ˆDØ”: ¨qÔ!1Ò1Ð1°d´kÀ]ÐSTÔEUÒ6UÐ6UÐ6UÐUÐ6Uð	Vð 	Vr'   c                ó2  — t          d¦  «        }|€J ‚t          j        d|j        ¬¦  «        }|j        |j        k    sJ ‚|                     d¬¦  «        }|j        |j        k    sJ ‚t          |¦  «        }|d         dk    sJ d|d         › �¦   «         ‚d S )Nr1   rŸ   )r;   é   r<   z.Overridden biome header byte 3 must be 3, got )r   r   r¤   rL   r;   r>   r?   r   )rA   Útarget_stylerE   rF   rŠ   s        r%   Ú$test_explicit_biome_override_on_zonezETestZoneCanonicalBiomeResolution.test_explicit_biome_override_on_zoneµ   s«   € Ý(¨Ñ+Ô+ˆØÐ'Ð'Ð'Ý$Ô-Ð.CÈlÔNcÐdÑdÔdˆØŒ|˜|Ô4Ò4Ð4Ð4Ð4Ø�|Š| ˆ|Ñ$Ô$ˆØŒz˜\Ô2Ò2Ð2Ð2Ð2Ý$ TÑ*Ô*ˆØ�qŒz˜QŠˆˆÐ ]ÐQXÐYZÔQ[Ð ]Ð ]‰Œˆˆˆr'   Nr€   )r�   r‚   rƒ   r„   r¨   r¬   rY   r'   r%   r�   r�   ¤   sL   € € € € € ØAÐAðVð Vð Vð Vð^ð ^ð ^ð ^ð ^ð ^r'   r�   c                  ó*   — e Zd ZdZd
d„Zd
d„Zd
d„Zd	S )Ú TestWebAppApiMapQueryIntegrationzCVerifies /api/map query parameter integration with serve_webapp.py.r&   Ústrr   r*   c                ó¤  — |› d�}t           j                             |¦  «        }t           j                             |d¬¦  «        5 }|j        dk    sJ ‚|j                             d¦  «        dk    sJ ‚|                     ¦   «         }|d d…         dk    sJ ‚|d	         dk    sJ d
|d	         › �¦   «         ‚	 d d d ¦  «         d S # 1 swxY w Y   d S )NzM/api/map?zone_id=zone_tang_kiem_nhai&seed=77&biome=STY_06_BAI_THA_MA_NGAP_MANr5   ©ÚtimeoutéÈ   zContent-Typezapplication/octet-streamr/   rˆ   r1   z(Expected byte 3 to be 2 for STY_06, got )ÚurllibÚrequestÚRequestÚurlopenÚstatusÚheadersÚgetÚread©rA   r&   ÚurlÚreqÚrespÚbodys         r%   Ú,test_api_map_with_zone_and_biome_query_paramzMTestWebAppApiMapQueryIntegration.test_api_map_with_zone_and_biome_query_paramÃ   s6  € ØÐmÐmÐmˆÝŒn×$Ò$ SÑ)Ô)ˆÝŒ^×#Ò# C°Ð#Ñ3Ô3ð 	V°tØ”; #Ò%Ð%Ð%Ð%Ø”<×#Ò# NÑ3Ô3Ð7QÒQÐQÐQÐQØ—9’9‘;”;ˆDØ˜˜˜”8˜uÒ$Ð$Ð$Ð$à˜”7˜a’<�<�<Ð!UÈDÐQRÌGÐ!UÐ!U‘<”<�<�<ð	Vð 	Vð 	Vñ 	Vô 	Vð 	Vð 	Vð 	Vð 	Vð 	Vð 	Vð 	Vøøøð 	Vð 	Vð 	Vð 	Vð 	Vð 	Vs   ÁA1CÃC	ÃC	c                ód  — |› d�}t           j                             |¦  «        }t           j                             |d¬¦  «        5 }|j        dk    sJ ‚|                     ¦   «         }|d d…         dk    sJ ‚|d         dk    sJ d	|d         › �¦   «         ‚	 d d d ¦  «         d S # 1 swxY w Y   d S )
Nz5/api/map?zone_id=zone_tang_kiem_nhai&seed=88&biome=18r5   r±   r³   r/   rˆ   r1   é   z+Expected byte 3 to be 18 for biome=18, got )r´   rµ   r¶   r·   r¸   r»   r¼   s         r%   Ú+test_api_map_with_integer_biome_query_paramzLTestWebAppApiMapQueryIntegration.test_api_map_with_integer_biome_query_paramÎ   s  € ØÐUÐUÐUˆÝŒn×$Ò$ SÑ)Ô)ˆÝŒ^×#Ò# C°Ð#Ñ3Ô3ð 	Z°tØ”; #Ò%Ð%Ð%Ð%Ø—9’9‘;”;ˆDØ˜˜˜”8˜uÒ$Ð$Ð$Ð$Ø˜”7˜b’=�=�=Ð"YÐPTÐUVÔPWÐ"YÐ"Y‘=”=�=�=ð		Zð 	Zð 	Zñ 	Zô 	Zð 	Zð 	Zð 	Zð 	Zð 	Zð 	Zð 	Zøøøð 	Zð 	Zð 	Zð 	Zð 	Zð 	Zs   ÁAB%Â%B)Â,B)c                ó~  — |› d�}t           j                             |¦  «        }t           j                             |d¬¦  «        5 }|j        dk    sJ ‚|                     ¦   «         }|d d…         dk    sJ ‚|d         t          dd	¦  «        v sJ d
|d         › d�¦   «         ‚	 d d d ¦  «         d S # 1 swxY w Y   d S )Nz,/api/map?zone_id=zone_tang_kiem_nhai&seed=99r5   r±   r³   r/   rˆ   r1   r   rm   zDefault biome code z must be in 1..30)r´   rµ   r¶   r·   r¸   r»   rq   r¼   s         r%   Ú'test_api_map_default_when_biome_omittedzHTestWebAppApiMapQueryIntegration.test_api_map_default_when_biome_omitted×   s%  € ØÐLÐLÐLˆÝŒn×$Ò$ SÑ)Ô)ˆÝŒ^×#Ò# C°Ð#Ñ3Ô3ð 	]°tØ”; #Ò%Ð%Ð%Ð%Ø—9’9‘;”;ˆDØ˜˜˜”8˜uÒ$Ð$Ð$Ð$Ø˜”7�e A r™lœlÐ*Ð*Ð*Ð,\À$ÀqÄ'Ð,\Ð,\Ð,\Ñ*Ô*Ð*Ð*ð		]ð 	]ð 	]ñ 	]ô 	]ð 	]ð 	]ð 	]ð 	]ð 	]ð 	]ð 	]øøøð 	]ð 	]ð 	]ð 	]ð 	]ð 	]s   ÁAB2Â2B6Â9B6N)r&   r¯   r   r*   )r�   r‚   rƒ   r„   rÁ   rÄ   rÆ   rY   r'   r%   r®   r®   À   sd   € € € € € ØMÐMð	Vð 	Vð 	Vð 	VðZð Zð Zð Zð]ð ]ð ]ð ]ð ]ð ]r'   r®   c                  ó*   — e Zd ZdZdd„Zdd„Zdd„ZdS )	ÚTestAdversarialAndEdgeCaseszIVerifies failure cascading, corrupted buffer handling, and extreme seeds.r   r*   c                óŒ   — t          j        t          d¬¦  «        5  t          d¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )NzBuffer too short©Úmatchs   FE)ÚpytestÚraisesÚ
ValueErrorr   )rA   s    r%   Ú(test_adversarial_truncated_buffer_raiseszDTestAdversarialAndEdgeCases.test_adversarial_truncated_buffer_raisesä   sŠ   € ÝŒ]�:Ð-?Ð@Ñ@Ô@ð 	0ð 	0Ý  Ñ/Ô/Ð/ð	0ð 	0ð 	0ñ 	0ô 	0ð 	0ð 	0ð 	0ð 	0ð 	0ð 	0ð 	0øøøð 	0ð 	0ð 	0ð 	0ð 	0ð 	0s   œ9¹=Á =c                óÌ   — t          j        ddddddddddddd¦  «        }t          j        t          d	¬
¦  «        5  t          |¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )Nz<2sBBHHBBBBBBHs   XXr   r6   r7   r�   é2   r   zInvalid map magic headerrÊ   )ÚstructÚpackrÌ   rÍ   rÎ   r   )rA   Údummy_headers     r%   Ú.test_adversarial_corrupted_magic_header_raiseszJTestAdversarialAndEdgeCases.test_adversarial_corrupted_magic_header_raisesè   s·   € Ý”{Ð#3°U¸A¸qÀ"ÀbÈ"ÈbÐRTÐVXÐZ[Ð]^Ð`aÑbÔbˆÝŒ]�:Ð-GÐHÑHÔHð 	/ð 	/Ý  Ñ.Ô.Ð.ð	/ð 	/ð 	/ñ 	/ô 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/øøøð 	/ð 	/ð 	/ð 	/ð 	/ð 	/s   ¼AÁAÁ Ac                óô   — t          d¦  «        }|€J ‚t          dd|j        ¬¦  «        }dD ]J}|                     |¬¦  «        }|j        dk    r|j        dk    sJ ‚|                     ¦   «         dk    sJ ‚ŒKd S )Nr   r6   r7   r8   )r   iñØÿÿiÿÿÿr<   r   )r   r   rL   r>   r9   r:   r@   )rA   rS   rE   Úextreme_seedrF   s        r%   Útest_extreme_seeds_generationz9TestAdversarialAndEdgeCases.test_extreme_seeds_generationí   sœ   € Ý! !Ñ$Ô$ˆØÐ Ð Ð Ý$¨2°bÀ5Ä>ÐRÑRÔRˆØ2ð 	2ð 	2ˆLØ—<’< \�<Ñ2Ô2ˆDØ”: Ò#Ð#¨¬°rÒ(9Ð(9Ð(9Ð9Ø×+Ò+Ñ-Ô-°Ò1Ð1Ð1Ð1Ð1ð	2ð 	2r'   Nr€   )r�   r‚   rƒ   r„   rÏ   rÕ   rØ   rY   r'   r%   rÈ   rÈ   á   sV   € € € € € ØSÐSð0ð 0ð 0ð 0ð/ð /ð /ð /ð
2ð 2ð 2ð 2ð 2ð 2r'   rÈ   )r   r   )$r„   Ú
__future__r   r   rÒ   r   Úurllib.parser´   Úurllib.requestÚtypingr   r   r   rÌ   Úserver.world.map_data_typesr   r   Úserver.world.map_style_catalogr	   r
   r   Ú%server.world.wilderness_map_generatorr   r   Ú"server.world.map_binary_serializerr   r   Útools.serve_webappr   Úfixturer&   r)   r†   r�   r®   rÈ   rY   r'   r%   ú<module>rã      s(  ðð
ð 
ð #Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ø )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ø €€€à =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XØ \Ð \Ð \Ð \Ð \Ð \Ð \Ð \Ø WÐ WÐ WÐ WÐ WÐ WÐ WÐ WØ :Ð :Ð :Ð :Ð :Ð :ð €„�hÐÑÔðð ð ñ  Ôðð@wð @wð @wð @wð @wñ @wô @wð @wðF5Qð 5Qð 5Qð 5Qð 5Qñ 5Qô 5Qð 5Qðp^ð ^ð ^ð ^ð ^ñ ^ô ^ð ^ð8]ð ]ð ]ð ]ð ]ñ ]ô ]ð ]ðB2ð 2ð 2ð 2ð 2ñ 2ô 2ð 2ð 2ð 2r'   