§
    ÇbÀj¾  ã                   óP  — d Z ddlZddlmc mZ ddlZddlm	Z	 ddl
Z
ddlmZ  e	e¦  «                             ¦   «         j        j        j        Zedz  dz  dz  dz  Zedz  dz  dz  d	z  Zedz  dz  Zg d
¢Zg d¢Z G d„ de
j        ¦  «        Zedk    r e
j        ¦   «          dS dS )uõ  
Unit Tests for FreeExile Martial Character Ecosystem.
Validates:
1. 5 canonical character classes (Kiáº¿m Tu, Cuá»“ng Ä�ao, Man Xáº¡ Thá»§, Tháº§n ThÆ°Æ¡ng, ThÃ­ch KhÃ¡ch).
2. Master 512x600 RGBA sprites and tangent-space normal maps.
3. 2.5D Isometric animation atlases, normal maps, and JSON manifests (Idle, Run, Attack, Dodge, Hurt).
4. Kinematic motion-matching metadata (8-direction headings, foot speed, 3-phase skill speed scaling).
5. Client UI bindings and weapon swap pairing definitions.
é    N)ÚPath)ÚImageÚclientÚwebappÚassetsÚ
charactersÚ
animations)Úchar_sword_masterÚchar_sword_maidenÚchar_feral_berserkerÚchar_wild_archerÚchar_glacial_lancerÚchar_shadow_assassin)ÚidleÚrunÚattack_slashÚdodgeÚhurtc                   ó6   — e Zd Zdd„Zdd„Zdd„Zdd„Zdd„ZdS )	ÚTestMartialCharacterEcosystemÚreturnNc                 óà  — t           D �]d}t          |› d�z  }t          |› d�z  }|                      |                     ¦   «         d|› d|› �¦  «         |                      |                     ¦   «         d|› d|› �¦  «         t	          j        |¦  «        5 }|                      |j        d¦  «         |                      |j	        d¦  «         |                      |j
        d¦  «         d	d	d	¦  «         n# 1 swxY w Y   t	          j        |¦  «        5 }|                      |j        d¦  «         |                      |j        |j	        |j
        f¦  «         d	d	d	¦  «         n# 1 swxY w Y   �Œfd	S )
zLVerify all 5 master character sprites & normal maps exist with valid format.z.pngz_normal.pngzMissing sprite for z: zMissing normal map for ÚRGBAi�  iô  N)ÚCLASSESÚCHAR_ASSETS_DIRÚ
assertTrueÚis_filer   ÚopenÚassertEqualÚmodeÚassertGreaterEqualÚwidthÚheightÚsize)ÚselfÚclass_idÚsprite_pathÚnormal_pathÚimgÚn_imgs         úDC:\Projects\FreeExile\tests\unit\test_martial_character_ecosystem.pyÚ6test_01_master_character_sprites_and_normal_maps_existzTTestMartialCharacterEcosystem.test_01_master_character_sprites_and_normal_maps_exist"   s  € åð 	Fñ 	FˆHÝ)¨xÐ,=Ð,=Ð,=Ñ=ˆKÝ)¨xÐ,DÐ,DÐ,DÑDˆKà�OŠO˜K×/Ò/Ñ1Ô1Ð3bÈÐ3bÐ3bÐU`Ð3bÐ3bÑcÔcÐcØ�OŠO˜K×/Ò/Ñ1Ô1Ð3fÈXÐ3fÐ3fÐYdÐ3fÐ3fÑgÔgÐgå”˜KÑ(Ô(ð 9¨CØ× Ò  ¤¨6Ñ2Ô2Ð2Ø×'Ò'¨¬	°3Ñ7Ô7Ð7Ø×'Ò'¨¬
°CÑ8Ô8Ð8ð9ð 9ð 9ñ 9ô 9ð 9ð 9ð 9ð 9ð 9ð 9øøøð 9ð 9ð 9ð 9õ
 ”˜KÑ(Ô(ð F¨EØ× Ò  ¤¨VÑ4Ô4Ð4Ø× Ò  ¤¨c¬i¸¼Ð-DÑEÔEÐEðFð Fð Fñ Fô Fð Fð Fð Fð Fð Fð Føøøð Fð Fð Fð Fùð	Fð 	Fs&   ÂAC3Ã3C7	Ã:C7	ÄAE!Å!E%	Å(E%	c                 ó2  — t           D �]}t          |› d�z  }t          |› d�z  }t          |› d�z  }|                      |                     ¦   «         d|› �¦  «         |                      |                     ¦   «         d|› �¦  «         |                      |                     ¦   «         d|› �¦  «         t	          j        |¦  «        5 }|                      |j        d¦  «         |                      |j        d¦  «         d	d	d	¦  «         n# 1 swxY w Y   �Œd	S )
zGVerify 5 character animation atlases, normal maps, and manifests exist.z_anim_atlas.pngz_anim_atlas_normal.pngú_anim_manifest.jsonzMissing atlas for zMissing normal atlas for zMissing manifest for r   )é   éÀ  N)	r   ÚANIM_ASSETS_DIRr   r   r   r   r   r    r$   )r%   r&   Ú
atlas_pathr(   Úmanifest_pathÚatlass         r+   Ú-test_02_animation_atlases_and_manifests_existzKTestMartialCharacterEcosystem.test_02_animation_atlases_and_manifests_exist4   sb  € åð 	:ñ 	:ˆHÝ(¨hÐ+GÐ+GÐ+GÑGˆJÝ)¨xÐ,OÐ,OÐ,OÑOˆKÝ+°Ð.NÐ.NÐ.NÑNˆMà�OŠO˜J×.Ò.Ñ0Ô0Ð2QÀxÐ2QÐ2QÑRÔRÐRØ�OŠO˜K×/Ò/Ñ1Ô1Ð3YÈxÐ3YÐ3YÑZÔZÐZØ�OŠO˜M×1Ò1Ñ3Ô3Ð5WÈXÐ5WÐ5WÑXÔXÐXå”˜JÑ'Ô'ð :¨5Ø× Ò  ¤¨VÑ4Ô4Ð4Ø× Ò  ¤¨[Ñ9Ô9Ð9ð:ð :ð :ñ :ô :ð :ð :ð :ð :ð :ð :øøøð :ð :ð :ð :ùð	:ð 	:s   Ã7D
Ä
D	ÄD	c           
      óØ  — t           D �]à}t          |› d�z  }t          |dd¬¦  «        5 }t          j        |¦  «        }ddd¦  «         n# 1 swxY w Y   |                      |d         d¦  «         |                      |d         d	¦  «         |                      |d
         d¦  «         |                      |d         d¦  «         |                      d|¦  «         |d         }t          D ]l}|                      ||d|› d|› �¦  «         ||         }|                      |d         d¦  «         |                      t          |d         ¦  «        d¦  «         Œm| 
                    di ¦  «        }|                      d|¦  «         |                      |d         d¦  «         |                      d|¦  «         |                      |d         d¦  «         |                      d|¦  «         �ŒâdS )zSVerify animation manifests contain all required clips and motion-matching metadata.r.   Úrúutf-8©ÚencodingNÚframe_widthé    Úframe_heightéÀ   Útexture_widthr/   Útexture_heightr0   r	   zMissing clip z in Úfpsr   ÚframesÚ
kinematicsÚbase_move_speedÚstride_length_worldÚfoot_speed_sync_formula)r   r1   r   ÚjsonÚloadr   ÚassertInÚCLIPSÚassertGreaterÚlenÚget)	r%   r&   r3   ÚfÚmanifestr	   Ú	clip_nameÚcliprC   s	            r+   Ú/test_03_animation_manifest_kinematics_and_clipszMTestMartialCharacterEcosystem.test_03_animation_manifest_kinematics_and_clipsC   sD  € åð 	Añ 	AˆHÝ+°Ð.NÐ.NÐ.NÑNˆMÝ�m S°7Ð;Ñ;Ô;ð (¸qÝœ9 Q™<œ<�ð(ð (ð (ñ (ô (ð (ð (ð (ð (ð (ð (øøøð (ð (ð (ð (ð ×Ò˜X mÔ4°cÑ:Ô:Ð:Ø×Ò˜X nÔ5°sÑ;Ô;Ð;Ø×Ò˜X oÔ6¸Ñ=Ô=Ð=Ø×Ò˜XÐ&6Ô7¸Ñ=Ô=Ð=ð �MŠM˜,¨Ñ1Ô1Ð1Ø! ,Ô/ˆJÝ"ð ;ð ;�	Ø—’˜i¨Ð5^ÀYÐ5^Ð5^ÐT\Ð5^Ð5^Ñ_Ô_Ð_Ø! )Ô,�Ø×"Ò" 4¨¤;°Ñ2Ô2Ð2Ø×"Ò"¥3 t¨H¤~Ñ#6Ô#6¸Ñ:Ô:Ð:Ð:ð "Ÿš l°BÑ7Ô7ˆJØ�MŠMÐ+¨ZÑ8Ô8Ð8Ø×Ò˜zÐ*;Ô<¸aÑ@Ô@Ð@Ø�MŠMÐ/°Ñ<Ô<Ð<Ø×Ò˜zÐ*?Ô@À!ÑDÔDÐDØ�MŠMÐ3°ZÑ@Ô@Ð@Ñ@ð3	Að 	As   ªAÁA	ÁA	c                 ó`  — t           dz  }|                      |                     ¦   «         ¦  «         |                     d¬¦  «        }t           dz  dz  }|                     ¦   «         r|d|                     d¬¦  «        z   z  }t
          D ]!}|                      d|› d�|d	|› d
�¦  «         Œ"dS )zKVerify modal-char-create in index.html defines all 5 character class cards.z
index.htmlr8   r9   Ú	templateszchar_create_modal.htmlú
zdata-class="ú"zMissing card for z in index.html or templatesN)Ú
WEBAPP_DIRr   r   Ú	read_textÚexistsr   rI   )r%   Ú	html_pathÚhtml_contentÚchar_create_tplr&   s        r+   Ú test_04_html_class_cards_bindingz>TestMartialCharacterEcosystem.test_04_html_class_cards_binding`   sÔ   € å Ñ-ˆ	Ø�Š˜	×)Ò)Ñ+Ô+Ñ,Ô,Ð,Ø ×*Ò*°GÐ*Ñ<Ô<ˆÝ$ {Ñ2Ð5MÑMˆØ×!Ò!Ñ#Ô#ð 	OØ˜D ?×#<Ò#<ÀgÐ#<Ñ#NÔ#NÑNÑNˆLåð 	ð 	ˆHØ�MŠMÐ4¨Ð4Ð4Ð4°lÐD}ÐX`ÐD}ÐD}ÐD}Ñ~Ô~Ð~Ð~ð	ð 	ó    c                 óæ  — t           dz  dz  dz                       d¬¦  «        }t           dz  dz  dz                       d¬¦  «        }t           dz  dz  dz                       d¬¦  «        }t           dz  d	z  d
z                       d¬¦  «        }t          D ]X}|                      ||d|› d�¦  «         |                      ||v p||v d|› d�¦  «         |                      ||d|› d�¦  «         ŒYdS )zTVerify char_creation.js, iso_math.js, and animation_engine.js support all 5 classes.ÚjsÚuizchar_creation.jsr8   r9   Úengineziso_math.jszanimation_engine.jsÚdatazsanctuary_props_catalog.jszMissing z in char_creation.jsz in WEAPON_SWAP_PAIRSz in animation_engine.jsN)rW   rX   r   rI   r   )r%   Úchar_create_jsÚiso_math_jsÚanim_engine_jsÚprops_catalog_jsr&   s         r+   Ú$test_05_client_scripts_class_supportzBTestMartialCharacterEcosystem.test_05_client_scripts_class_supportl   s;  € å$ tÑ+¨dÑ2Ð5GÑG×RÒRÐ\cÐRÑdÔdˆÝ! DÑ(¨8Ñ3°mÑC×NÒNÐX_ÐNÑ`Ô`ˆÝ$ tÑ+¨hÑ6Ð9NÑN×YÒYÐcjÐYÑkÔkˆÝ&¨Ñ-°Ñ6Ð9UÑU×`Ò`ÐjqÐ`ÑrÔrÐåð 	bð 	bˆHØ�MŠM˜( NÐ4]¸xÐ4]Ð4]Ð4]Ñ^Ô^Ð^Ø�OŠOØ˜KÐ'ÐG¨8Ð7GÐ+GØ:˜8Ð:Ð:Ð:ñô ð ð �MŠM˜( NÐ4`¸xÐ4`Ð4`Ð4`ÑaÔaÐaÐað	bð 	br^   )r   N)Ú__name__Ú
__module__Ú__qualname__r,   r5   rR   r]   rh   © r^   r+   r   r   !   sŠ   € € € € € ðFð Fð Fð Fð$:ð :ð :ð :ðAð Að Að Að:
ð 
ð 
ð 
ðbð bð bð bð bð br^   r   Ú__main__)Ú__doc__ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arrG   Úpathlibr   ÚunittestÚPILr   Ú__file__ÚresolveÚparentÚ	REPO_ROOTr   r1   rW   r   rJ   ÚTestCaser   ri   Úmainrl   r^   r+   ú<module>r~      sF  ððð ð € € € € € € € € € € € € €€€€Ø Ð Ð Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð àˆD�‰NŒN×"Ò"Ñ$Ô$Ô+Ô2Ô9€	Ø˜hÑ&¨Ñ1°HÑ<¸|ÑK€Ø˜hÑ&¨Ñ1°HÑ<¸|ÑK€Ø˜Ñ! HÑ,€
ðð ð €ð 	9Ð8Ð8€ðXbð Xbð Xbð Xbð Xb HÔ$5ñ Xbô Xbð Xbðv ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr^   