§
    ¿j*4  ã                  óæ  — d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	 ddl
Z
ddlmZ ddlmZ ddlmZmZmZ  ej        d	¦  «        Zh d
£ZddddddœZ e
j        d¬¦  «        d/d„¦   «         Z e
j        d¬¦  «        d0d„¦   «         Ze
j        d1d„¦   «         Z e
j        d¬¦  «        d2d„¦   «         Zd3d„Zd4d „Zd4d!„Zd4d"„Zd4d#„Z d4d$„Z!d4d%„Z"d4d&„Z#d4d'„Z$d5d)„Z%d5d*„Z&d5d+„Z'd6d-„Z(d7d.„Z)dS )8zð
Unit Tests for FreeExile 30 Map Styles SQLite Database and Relational Service.
Verifies schema, pragmas, indices, foreign keys, CHECK constraints, 30 records,
contiguous biome codes, color hex integrity, and MapStyleService query methods.
é    )ÚannotationsN)ÚPath)Ú	Generator)Úinit_db©ÚMapStyleService)ÚMapStyleDefinitionÚMapStyleTileMappingÚMapStylePropDefinitionz^#[0-9a-fA-F]{6}$>   ÚHAM_MO_TA_QUAIÚHEM_NUI_COT_MACÚHU_KHONG_DI_BIENÚHOANG_DA_DA_NGOAIÚDAM_LAY_DOC_CHUONGÚTHAN_DIEN_PHE_TICHÚBLEACHED_BONE_CANYONÚSAVAGE_MANGROVE_SWAMPÚCRIMSON_BLOOD_FORESTÚOUTCAST_MINE_SHAFTSÚCORRUPTED_FIEND_RUINS)é   é   é   é   é   Úmodule)ÚscopeÚreturnr   c                 óx   — t          t          ¦  «                             ¦   «         j        j        j        dz  dz  S )z,Return canonical path to data/map_styles.db.Údatazmap_styles.db)r   Ú__file__ÚresolveÚparent© ó    ú6C:\Projects\FreeExile\tests\unit\test_map_styles_db.pyÚdb_pathr'   ,   s/   € õ •‰>Œ>×!Ò!Ñ#Ô#Ô*Ô1Ô8¸6ÑAÀOÑSÐSr%   r'   ú)Generator[sqlite3.Connection, None, None]c              #  ó
  K  — |                       ¦   «         sJ d| › �¦   «         ‚t          j        t          | ¦  «        ¦  «        }t          j        |_        |                     d¦  «         |V — |                     ¦   «          dS )z7Provide a read connection to seeded data/map_styles.db.z Database file does not exist at zPRAGMA foreign_keys = ON;N)ÚexistsÚsqlite3ÚconnectÚstrÚRowÚrow_factoryÚexecuteÚclose)r'   Úconns     r&   Údb_connr3   2   s{   è è € ð �>Š>ÑÔÐIÐIÐIÀÐIÐIÑIÔIÐÝŒ?�3˜w™<œ<Ñ(Ô(€DÝ”{€DÔØ‡L‚LÐ,Ñ-Ô-Ð-Ø
€J€J€JØ‡J‚J�L„L€L€L€Lr%   c               #  óX   K  — t          d¦  «        } | V — |                      ¦   «          dS )z?Provide an isolated in-memory database with schema initialized.ú:memory:N)r   r1   )r2   s    r&   Útemp_test_dbr6   =   s/   è è € õ �:ÑÔ€DØ
€J€J€JØ‡J‚J�L„L€L€L€Lr%   r   c                ó"   — t          | ¬¦  «        S )z8Provide MapStyleService connected to data/map_styles.db.©r'   r   r8   s    r&   Úmap_servicer9   E   s   € õ  7Ð+Ñ+Ô+Ð+r%   ÚNonec                ó˜   — |                       ¦   «         sJ d| › d�¦   «         ‚|                      ¦   «         j        dk    s
J d¦   «         ‚dS )z?Verify that data/map_styles.db exists on disk and is non-empty.zFile z is missing.r   z!Database file is empty (0 bytes).N)Úis_fileÚstatÚst_sizer8   s    r&   Ú'test_database_file_exists_and_non_emptyr?   K   sW   € à�?Š?ÑÔÐ;Ð;Ð; gÐ;Ð;Ð;Ñ;Ô;ÐØ�<Š<‰>Œ>Ô! AÒ%Ð%Ð%Ð'JÑ%Ô%Ð%Ð%Ð%r%   r3   úsqlite3.Connectionc                ó^  — |                       ¦   «         }|                     d¦  «         d„ |                     ¦   «         D ¦   «         }h d£                     |¦  «        sJ ‚|                     d¦  «         d„ |                     ¦   «         D ¦   «         }h d£                     |¦  «        sJ ‚dS )z-Verify master tables and query indices exist.z3SELECT name FROM sqlite_master WHERE type = 'table'c                ó   — h | ]
}|d          ’ŒS ©Únamer$   ©Ú.0Úrows     r&   ú	<setcomp>z:test_database_schema_tables_and_indices.<locals>.<setcomp>U   s   € Ð4Ð4Ð4˜cˆc�&ŒkÐ4Ð4Ð4r%   >   Ú
map_stylesÚmap_style_propsÚmap_style_tilesz3SELECT name FROM sqlite_master WHERE type = 'index'c                ó   — h | ]
}|d          ’ŒS rC   r$   rE   s     r&   rH   z:test_database_schema_tables_and_indices.<locals>.<setcomp>Y   s   € Ð5Ð5Ð5˜sˆs�6Œ{Ð5Ð5Ð5r%   >   Úidx_map_styles_themeÚidx_map_style_props_styleÚidx_map_style_tiles_styleÚidx_map_styles_biome_codeN)Úcursorr0   ÚfetchallÚissubset)r3   ÚcurÚtablesÚindicess       r&   Ú'test_database_schema_tables_and_indicesrW   Q   sÄ   € à
�.Š.Ñ
Ô
€CØ‡K‚KÐEÑFÔFÐFØ4Ð4 S§\¢\¡^¤^Ð4Ñ4Ô4€FØ?Ð?Ð?×HÒHÈÑPÔPÐPÐPÐPà‡K‚KÐEÑFÔFÐFØ5Ð5 c§l¢l¡n¤nÐ5Ñ5Ô5€Gðð ð ÷
 ‚hˆwÑÔðð ð ð ð r%   c                ó˜   — |                       ¦   «         }|                     d¦  «         |                     ¦   «         d         dk    sJ ‚dS )z.Verify map_styles contains exactly 30 records.z&SELECT count(*) AS cnt FROM map_stylesÚcnté   N)rQ   r0   Úfetchone)r3   rT   s     r&   Ú+test_map_styles_record_count_exactly_thirtyr\   b   sH   € à
�.Š.Ñ
Ô
€CØ‡K‚KÐ8Ñ9Ô9Ð9Ø�<Š<‰>Œ>˜%Ô  BÒ&Ð&Ð&Ð&Ð&Ð&r%   c                ó  — |                       ¦   «         }|                     d¦  «         d„ |                     ¦   «         D ¦   «         }|t          t	          dd¦  «        ¦  «        k    sJ ‚t          t          |¦  «        ¦  «        dk    sJ ‚dS )zJVerify biome_code ranges 1 to 30 with no duplicates and no missing values.z9SELECT biome_code FROM map_styles ORDER BY biome_code ASCc                ó   — g | ]
}|d          ‘ŒS ©Ú
biome_coder$   rE   s     r&   ú
<listcomp>zBtest_biome_code_contiguous_range_one_to_thirty.<locals>.<listcomp>m   s   € Ð9Ð9Ð9 3ˆS�ÔÐ9Ð9Ð9r%   r   é   rZ   N)rQ   r0   rR   ÚlistÚrangeÚlenÚset)r3   rT   Úcodess      r&   Ú.test_biome_code_contiguous_range_one_to_thirtyrh   i   sƒ   € à
�.Š.Ñ
Ô
€CØ‡K‚KÐKÑLÔLÐLØ9Ð9¨#¯,ª,©.¬.Ð9Ñ9Ô9€EØ•D�˜q "™œÑ&Ô&Ò&Ð&Ð&Ð&Ý�s�5‰zŒz‰?Œ?˜bÒ Ð Ð Ð Ð Ð r%   c           
     óh  — |                       ¦   «         }|                     d¦  «         |                     ¦   «         }t          |¦  «        dk    sJ ‚|D �]Û}|d         r|d                              d¦  «        sJ ‚|d         r+t          |d                              ¦   «         ¦  «        dk    sJ ‚|d         r+t          |d                              ¦   «         ¦  «        dk    sJ ‚|d         t          v sJ ‚|d	         r+t          |d	                              ¦   «         ¦  «        dk    sJ ‚|d
         r+t          |d
                              ¦   «         ¦  «        dk    sJ ‚|d         r+t          |d                              ¦   «         ¦  «        dk    sJ ‚dD ]U}||         }|€J d|› d|d         › �¦   «         ‚t                               |¦  «        sJ d|› d|› d|d         › �¦   «         ‚ŒVd|d         cxk    rdk    sn J ‚|d         dk    sJ ‚|d         dk    sJ ‚|d         dk    sJ ‚�ŒÝdS )zDVerify non-empty strings and valid color formats for all 30 records.zSELECT * FROM map_stylesrZ   Ústyle_idÚSTY_Úname_vir   Úname_enÚtheme_categoryÚtheme_category_nameÚ	asset_dirÚmonster_family)Úfloor_color_hexÚwall_color_hexÚpath_color_hexÚliquid_color_hexÚambient_light_hexNzMissing z for zInvalid HEX color 'z' in ç        Úfog_densityç      ð?Úmovement_modifierÚhazard_damageÚhazard_slow_factor)	rQ   r0   rR   re   Ú
startswithÚstripÚVALID_THEMESÚHEX_COLOR_REGEXÚmatch)r3   rT   ÚrowsÚrÚcolÚvals         r&   Ú*test_required_columns_and_non_empty_valuesr†   r   s•  € à
�.Š.Ñ
Ô
€CØ‡K‚KÐ*Ñ+Ô+Ð+Ø�<Š<‰>Œ>€DÝˆt‰9Œ9˜Š?ˆ?ˆ?ˆ?àð .ñ .ˆØ�Œ}ÐA  :¤×!9Ò!9¸&Ñ!AÔ!AÐAÐAÐAØ�Œ|Ð=¥ A i¤L×$6Ò$6Ñ$8Ô$8Ñ 9Ô 9¸AÒ =Ð =Ð =Ð=Ø�Œ|Ð=¥ A i¤L×$6Ò$6Ñ$8Ô$8Ñ 9Ô 9¸AÒ =Ð =Ð =Ð=ØÐ!Ô"¥lÐ2Ð2Ð2Ð2ØÐ&Ô'ÐU­C°Ð2GÔ0H×0NÒ0NÑ0PÔ0PÑ,QÔ,QÐTUÒ,UÐ,UÐ,UÐUØ�Œ~ÐA¥# a¨¤n×&:Ò&:Ñ&<Ô&<Ñ"=Ô"=ÀÒ"AÐ"AÐ"AÐAØÐ!Ô"ÐK¥s¨1Ð-=Ô+>×+DÒ+DÑ+FÔ+FÑ'GÔ'GÈ!Ò'KÐ'KÐ'KÐKð tð 	ið 	iˆCØ�C”&ˆCØ�?�?Ð$H¨sÐ$HÐ$H¸¸:¼Ð$HÐ$H‘?”?�?Ý"×(Ò(¨Ñ-Ô-ÐhÐhÐ/hÀSÐ/hÐ/hÈsÐ/hÐ/hÐYZÐ[eÔYfÐ/hÐ/hÑhÔhÐ-Ðhà�a˜Ô&Ð-Ð-Ò-Ð-¨#Ò-Ð-Ð-Ð-Ð-Ð-ØÐ$Ô%¨Ò+Ð+Ð+Ð+Ø�Ô! QÒ&Ð&Ð&Ð&ØÐ%Ô&¨#Ò-Ð-Ð-Ð-Ñ-ð%.ð .r%   c                óL  — |                       ¦   «         }|                     d¦  «         d„ |                     ¦   «         D ¦   «         }t          |                     ¦   «         ¦  «        t
          k    sJ ‚|                     ¦   «         D ]\  }}|dk    sJ d|› d|› �¦   «         ‚ŒdS )z9Verify all 6 categories exist with exactly 5 styles each.zNSELECT theme_category, count(*) AS cnt FROM map_styles GROUP BY theme_categoryc                ó,   — i | ]}|d          |d         “ŒS )rn   rY   r$   rE   s     r&   ú
<dictcomp>zCtest_theme_category_distribution_five_per_theme.<locals>.<dictcomp>’   s$   € ÐHÐHÐH°#ˆCÐ Ô! 3 u¤:ÐHÐHÐHr%   r   zTheme z expected 5 styles, found N)rQ   r0   rR   rf   Úkeysr   Úitems)r3   rT   ÚdistÚthemeÚcounts        r&   Ú/test_theme_category_distribution_five_per_themer�   Ž   s¯   € à
�.Š.Ñ
Ô
€CØ‡K‚KÐ`ÑaÔaÐaØHÐH¸¿º¹¼ÐHÑHÔH€DÝˆt�yŠy‰{Œ{ÑÔ�|Ò+Ð+Ð+Ð+ØŸ
š
™œð Mð M‰ˆˆuØ˜ŠzˆzˆzÐL EÐLÐLÀUÐLÐL‰zŒzˆzˆzðMð Mr%   c                ó€  — |                       ¦   «         }|                     d¦  «         |                     ¦   «         d         dk    sJ ‚|                     d¦  «         |                     ¦   «         D ]+}|d         dk    sJ d|d         › d|d         › d	�¦   «         ‚Œ,|                     d
¦  «         |                     ¦   «         D ]u}d|d         cxk    rdk    sn J ‚|d                              d¦  «        sJ ‚|d                              d¦  «        sJ ‚t
                               |d         ¦  «        sJ ‚ŒvdS )zKVerify 600 tile mappings (20 per style) with valid filenames and fallbacks.z+SELECT count(*) AS cnt FROM map_style_tilesrY   iX  zGSELECT style_id, count(*) AS cnt FROM map_style_tiles GROUP BY style_idé   zStyle rj   z has z tile mappings, expected 20z&SELECT * FROM map_style_tiles LIMIT 20r   Útile_type_idé   Útexture_filenameú.pngÚnormal_filenameÚbase_color_fallbackN)rQ   r0   r[   rR   Úendswithr€   r�   )r3   rT   rG   rƒ   s       r&   Ú"test_tile_mappings_table_integrityr™   ˜   sk  € à
�.Š.Ñ
Ô
€CØ‡K‚KÐ=Ñ>Ô>Ð>Ø�<Š<‰>Œ>˜%Ô  CÒ'Ð'Ð'Ð'à‡K‚KÐYÑZÔZÐZØ�|Š|‰~Œ~ð hð hˆØ�5Œz˜RÒÐÐÐ!g¨#¨j¬/Ð!gÐ!gÀÀEÄ
Ð!gÐ!gÐ!gÑÔÐÐà‡K‚KÐ8Ñ9Ô9Ð9Ø�\Š\‰^Œ^ð ?ð ?ˆØ�A�nÔ%Ð+Ð+Ò+Ð+¨Ò+Ð+Ð+Ð+Ð+Ð+ØÐ#Ô$×-Ò-¨fÑ5Ô5Ð5Ð5Ð5ØÐ"Ô#×,Ò,¨VÑ4Ô4Ð4Ð4Ð4Ý×$Ò$ QÐ'<Ô%=Ñ>Ô>Ð>Ð>Ð>Ð>ð	?ð ?r%   c                ó¬  — |                       ¦   «         }|                     d¦  «         |                     ¦   «         d         dk    sJ ‚|                     d¦  «         h d£}|                     ¦   «         D ]\}d|d         cxk     rdk    sn J ‚|d	         |v sJ ‚|d
         dk    r|d         dk    sJ ‚|d                              d¦  «        sJ ‚Œ]dS )zFVerify decorative props integrity, valid weights, and placement rules.z+SELECT count(*) AS cnt FROM map_style_propsrY   éZ   zSELECT * FROM map_style_props>   ÚDEAD_ENDÚ	ANY_FLOORÚ	PATH_SIDEÚ
FLOOR_EDGEÚWALL_ADJACENTÚARENA_PERIMETERrw   Úspawn_weightry   Úplacement_ruleÚfootprint_wr   Úfootprint_hÚsprite_pathr•   N)rQ   r0   r[   rR   r˜   )r3   rT   Úallowed_rulesÚps       r&   Útest_props_table_integrityr©   ª   s	  € à
�.Š.Ñ
Ô
€CØ‡K‚KÐ=Ñ>Ô>Ð>Ø�<Š<‰>Œ>˜%Ô  BÒ&Ð&Ð&Ð&à‡K‚KÐ/Ñ0Ô0Ð0ØlÐlÐl€MØ�\Š\‰^Œ^ð 1ð 1ˆØ�Q�~Ô&Ð-Ð-Ò-Ð-¨#Ò-Ð-Ð-Ð-Ð-Ð-ØÐ!Ô" mÐ3Ð3Ð3Ð3Ø�Ô 1Ò$Ð$¨¨=Ô)9¸QÒ)>Ð)>Ð)>Ð>Ø�Ô×(Ò(¨Ñ0Ô0Ð0Ð0Ð0Ð0ð	1ð 1r%   c                óÀ   — |                       ¦   «         }|                     d¦  «         |                     ¦   «         }t          |¦  «        dk    sJ d|› �¦   «         ‚dS )zHVerify that foreign keys pass with zero violations on existing database.zPRAGMA foreign_key_checkr   zForeign key check failed: N)rQ   r0   rR   re   )r3   rT   Ú
violationss      r&   Ú"test_foreign_key_pragmas_and_checkr¬   ¹   s_   € à
�.Š.Ñ
Ô
€CØ‡K‚KÐ*Ñ+Ô+Ð+Ø—’‘”€JÝˆz‰?Œ?˜aÒÐÐÐ!J¸jÐ!JÐ!JÑÔÐÐÐr%   r6   c                ó\  — |                       ¦   «         }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¦  «         dS # 1 swxY w Y   dS )zEVerify inserting orphan rows into child tables raises IntegrityError.z¼INSERT INTO map_style_tiles (style_id, tile_type_id, tile_type_name, texture_filename, normal_filename, base_color_fallback) VALUES ('STY_INVALID', 1, 'FLOOR', 'f.png', 'n.png', '#333333')NzÍINSERT INTO map_style_props (prop_id, style_id, prop_name_vi, prop_name_en, sprite_key, sprite_path, spawn_weight, placement_rule) VALUES ('p_test', 'STY_INVALID', 'P', 'P', 'k', 'p.png', 0.5, 'ANY_FLOOR')©rQ   ÚpytestÚraisesr+   ÚIntegrityErrorr0   ©r6   rT   s     r&   Ú!test_foreign_key_orphan_rejectionr³   Á   s,  € à
×
Ò
Ñ
Ô
€Cå	Œ•wÔ-Ñ	.Ô	.ð 
ð 
Ø�Šðtñ	
ô 	
ð 	
ð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
õ 
Œ•wÔ-Ñ	.Ô	.ð 
ð 
Ø�ŠðDñ	
ô 	
ð 	
ð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð 
ð 
ó#   ³AÁAÁAÁ>B!Â!B%Â(B%c                óú  — |                       ¦   «         }|                     d¦  «         |                     d¦  «         |                     d¦  «         |                      ¦   «          |                     d¦  «         |                      ¦   «          |                     d¦  «         |                     ¦   «         d         dk    sJ ‚|                     d¦  «         |                     ¦   «         d         dk    sJ ‚d	S )
zHVerify deleting a parent style cascades and deletes its tiles and props.ax  INSERT INTO map_styles (style_id, biome_code, name_vi, name_en, theme_category, theme_category_name, description, floor_color_hex, wall_color_hex, path_color_hex, liquid_color_hex, ambient_light_hex, asset_dir, monster_family) VALUES ('STY_CASCADE_TEST', 199, 'Vi', 'En', 'HOANG_DA_DA_NGOAI', 'T', 'D', '#111111', '#222222', '#333333', '#444444', '#555555', 'dir', 'monsters')zÁINSERT INTO map_style_tiles (style_id, tile_type_id, tile_type_name, texture_filename, normal_filename, base_color_fallback) VALUES ('STY_CASCADE_TEST', 1, 'FLOOR', 'f.png', 'n.png', '#111111')zØINSERT INTO map_style_props (prop_id, style_id, prop_name_vi, prop_name_en, sprite_key, sprite_path, spawn_weight, placement_rule) VALUES ('prop_cascade', 'STY_CASCADE_TEST', 'P', 'P', 'k', 'p.png', 0.5, 'ANY_FLOOR')z:DELETE FROM map_styles WHERE style_id = 'STY_CASCADE_TEST'zOSELECT count(*) AS cnt FROM map_style_tiles WHERE style_id = 'STY_CASCADE_TEST'rY   r   zOSELECT count(*) AS cnt FROM map_style_props WHERE style_id = 'STY_CASCADE_TEST'N)rQ   r0   Úcommitr[   r²   s     r&   Ú!test_foreign_key_cascade_deletionr·   Ó   s  € à
×
Ò
Ñ
Ô
€CØ‡K‚Kð	Tñô ð ð ‡K‚Kð	uñô ð ð ‡K‚Kð	Kñô ð ð ×ÒÑÔÐà‡K‚KÐLÑMÔMÐMØ×ÒÑÔÐà‡K‚KÐaÑbÔbÐbØ�<Š<‰>Œ>˜%Ô  AÒ%Ð%Ð%Ð%Ø‡K‚KÐaÑbÔbÐbØ�<Š<‰>Œ>˜%Ô  AÒ%Ð%Ð%Ð%Ð%Ð%r%   c                ó\  — |                       ¦   «         }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¦  «         dS # 1 swxY w Y   dS )zIVerify CHECK constraints on biome_code, theme_category, fog_density, etc.a[  INSERT INTO map_styles (style_id, biome_code, name_vi, name_en, theme_category, theme_category_name, description, floor_color_hex, wall_color_hex, path_color_hex, liquid_color_hex, ambient_light_hex, asset_dir, monster_family) VALUES ('STY_BAD_BIOME', 0, 'Vi', 'En', 'HOANG_DA_DA_NGOAI', 'T', 'D', '#111', '#222', '#333', '#444', '#555', 'a', 'm')NaY  INSERT INTO map_styles (style_id, biome_code, name_vi, name_en, theme_category, theme_category_name, description, floor_color_hex, wall_color_hex, path_color_hex, liquid_color_hex, ambient_light_hex, asset_dir, monster_family) VALUES ('STY_BAD_THEME', 150, 'Vi', 'En', 'INVALID_THEME', 'T', 'D', '#111', '#222', '#333', '#444', '#555', 'a', 'm')r®   r²   s     r&   Ú!test_check_constraints_rejectionsr¹   ð   s.  € à
×
Ò
Ñ
Ô
€Cõ 
Œ•wÔ-Ñ	.Ô	.ð 
ð 
Ø�ŠðGñ	
ô 	
ð 	
ð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
õ 
Œ•wÔ-Ñ	.Ô	.ð 
ð 
Ø�ŠðEñ	
ô 	
ð 	
ð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð 
ð 
r´   r9   c                ó0  — |                       d¦  «        }|€J ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        j        dk    sJ ‚t
                               ¦   «         D ]M\  }}|                       |¦  «        }|€J d|› d�¦   «         ‚|j        |k    sJ d|› d	|› d
|j        › �¦   «         ‚ŒN|                       d¦  «        �J ‚t          dd¦  «        D ]3}|                      |¦  «        }|€J d|› �¦   «         ‚|j        |k    sJ ‚Œ4|                      d¦  «        �J ‚|                      d¦  «        �J ‚|                      d¦  «        �J ‚|  	                    ¦   «         }t          |¦  «        dk    sJ ‚d„ |D ¦   «         t          t          dd¦  «        ¦  «        k    sJ ‚|                      d¦  «        }t          |¦  «        dk    sJ ‚t          d„ |D ¦   «         ¦  «        sJ ‚|                      dd¦  «        }|€J ‚|j        dk    sJ ‚|j        dk    sJ ‚|                      d¦  «        }t          |¦  «        dk    sJ ‚t          d„ |D ¦   «         ¦  «        sJ ‚t          |                      d¦  «        ¦  «        t          |¦  «        k    sJ ‚dS )zMVerify MapStyleService query methods for style, code, list, tiles, and props.ÚSTY_01_HOANG_MANG_CO_LONé   u   Hoang MÃ£ng Cá»• Lá»™z#3d3730z*Failed to retrieve style by legacy alias 'ú'zAlias z expected code z, got ÚUNKNOWN_STYLE_XYZr   rb   z'Failed to retrieve style by biome code r   éÿÿÿÿrZ   c                ó   — g | ]	}|j         ‘Œ
S r$   r_   )rF   Úss     r&   ra   z2test_map_style_service_queries.<locals>.<listcomp>&  s   € Ð-Ð-Ð-˜QˆAŒLÐ-Ð-Ð-r%   r‘   c              3  ó@   K  — | ]}t          |t          ¦  «        V — Œd S ©N)Ú
isinstancer
   )rF   Úts     r&   ú	<genexpr>z1test_map_style_service_queries.<locals>.<genexpr>+  s-   è è € ÐAÐA°a�z˜!Õ0Ñ1Ô1ÐAÐAÐAÐAÐAÐAr%   ÚFLOORr   c              3  ó@   K  — | ]}t          |t          ¦  «        V — Œd S rÃ   )rÄ   r   )rF   r¨   s     r&   rÆ   z1test_map_style_service_queries.<locals>.<genexpr>5  s-   è è € ÐDÐD¸�z˜!Õ3Ñ4Ô4ÐDÐDÐDÐDÐDÐDr%   )Ú	get_styler`   rl   ÚpaletteÚfloorÚLEGACY_ALIASESr‹   rd   Úget_style_by_codeÚlist_stylesre   rc   Úget_tiles_for_styleÚallÚget_tile_mappingÚ	tile_codeÚtile_type_nameÚget_props_for_styleÚ
list_props)	r9   Ús1ÚcodeÚaliasrÁ   Ú
all_stylesÚtilesÚ
tile_floorÚpropss	            r&   Útest_map_style_service_queriesrÝ     s"  € ð 
×	Ò	Ð8Ñ	9Ô	9€BØˆ>ˆ>ˆ>ØŒ=˜AÒÐÐÐØŒ:Ð0Ò0Ð0Ð0Ð0ØŒ:Ô˜yÒ(Ð(Ð(Ð(õ &×+Ò+Ñ-Ô-ð _ð _‰ˆˆeØ×!Ò! %Ñ(Ô(ˆØˆ}ˆ}ÐSÈ5ÐSÐSÐS‰}Œ}ˆ}ØŒ|˜tÒ#Ð#Ð#Ð%^¨eÐ%^Ð%^ÀDÐ%^Ð%^ÐPQÔP\Ð%^Ð%^Ñ#Ô#Ð#Ð#ð × Ò Ð!4Ñ5Ô5Ð=Ð=Ð=õ �a˜‘”ð $ð $ˆØ×)Ò)¨$Ñ/Ô/ˆØˆ}ˆ}ÐNÈÐNÐN‰}Œ}ˆ}ØŒ|˜tÒ#Ð#Ð#Ð#Ð#à×(Ò(¨Ñ+Ô+Ð3Ð3Ð3Ø×(Ò(¨Ñ,Ô,Ð4Ð4Ð4Ø×(Ò(¨Ñ,Ô,Ð4Ð4Ð4ð ×(Ò(Ñ*Ô*€JÝˆz‰?Œ?˜bÒ Ð Ð Ð Ø-Ð- *Ð-Ñ-Ô-µµe¸A¸r±l´lÑ1CÔ1CÒCÐCÐCÐCð ×+Ò+Ð,EÑFÔF€EÝˆu‰:Œ:˜ÒÐÐÐÝÐAÐA¸5ÐAÑAÔAÑAÔAÐAÐAÐAà×-Ò-Ð.GÈÑKÔK€JØÐ!Ð!Ð!ØÔ 1Ò$Ð$Ð$Ð$ØÔ$¨Ò/Ð/Ð/Ð/ð ×+Ò+Ð,EÑFÔF€EÝˆu‰:Œ:˜Š?ˆ?ˆ?ˆ?ÝÐDÐD¸eÐDÑDÔDÑDÔDÐDÐDÐDÝˆ{×%Ò%Ð&?Ñ@Ô@ÑAÔAÅSÈÁZÄZÒOÐOÐOÐOÐOÐOr%   c                 óÊ   — t          d¬¦  «        } t          |                      ¦   «         ¦  «        dk    sJ ‚|                      d¦  «        €J ‚|                      ¦   «          dS )zRVerify MapStyleService initialized with :memory: automatically seeds and operates.r5   r8   rZ   r   N)r   re   rÎ   rÍ   r1   )Úmem_services    r&   Ú)test_map_style_service_in_memory_instancerà   9  si   € å!¨*Ð5Ñ5Ô5€KÝˆ{×&Ò&Ñ(Ô(Ñ)Ô)¨RÒ/Ð/Ð/Ð/Ø×(Ò(¨Ñ+Ô+Ð7Ð7Ð7Ø×ÒÑÔÐÐÐr%   )r   r   )r'   r   r   r(   )r   r(   )r'   r   r   r   )r'   r   r   r:   )r3   r@   r   r:   )r6   r@   r   r:   )r9   r   r   r:   )r   r:   )*Ú__doc__Ú
__future__r   ÚosÚrer+   Úpathlibr   Útypingr   r¯   Úserver.world.map_style_schemar   Úserver.world.map_style_servicer   Úserver.world.map_style_typesr	   r
   r   Úcompiler€   r   rÌ   Úfixturer'   r3   r6   r9   r?   rW   r\   rh   r†   r�   r™   r©   r¬   r³   r·   r¹   rÝ   rà   r$   r%   r&   ú<module>rì      sì  ððð ð #Ð "Ð "Ð "Ð "Ð "Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à €€€à 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø :Ð :Ð :Ð :Ð :Ð :ðð ð ð ð ð ð ð ð ð ð �"”*Ð1Ñ2Ô2€ðð ð €ð ØØØØðð €ð €„�hÐÑÔðTð Tð Tñ  ÔðTð
 €„�hÐÑÔðð ð ñ  Ôðð „ðð ð ñ „ðð €„�hÐÑÔð,ð ,ð ,ñ  Ôð,ð
Kð Kð Kð Kðð ð ð ð"'ð 'ð 'ð 'ð!ð !ð !ð !ð.ð .ð .ð .ð8Mð Mð Mð Mð?ð ?ð ?ð ?ð$1ð 1ð 1ð 1ðKð Kð Kð Kð
ð 
ð 
ð 
ð$&ð &ð &ð &ð:
ð 
ð 
ð 
ð./Pð /Pð /Pð /Pðdð ð ð ð ð r%   