§
    4Ü¾j±  ã                   óø   — d Z ddlZddlmc mZ ddlmZ ddl	Z	ddl
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 ej        ded	efd
„¦   «         Z G d„ d¦  «        Z G d„ d¦  «        Z G d„ d¦  «        ZdS )z}
Unit test suite for FreeExile R&D Asset Pipeline Tools.
Tests LOD Generator, WebP Texture Compressor, and Mipmap Utilities.
é    N)ÚPath)ÚImage)Úevaluate_lod_generationÚgenerate_sprite_lods)Úgenerate_and_save_mipmapsÚgenerate_mipmap_chainÚsave_mipmap_chain)Úbatch_compress_directoryÚcompress_to_webpÚtmp_pathÚreturnc                 ó  — t          t          ¦  «                             ¦   «         j        j        j        dz  dz  dz  dz  dz  }|                     ¦   «         r|S | dz  }t          j        ddd	¦  «        }|                     |d
¬¦  «         |S )zFProvides a realistic character sprite texture from assets or fallback.ÚclientÚwebappÚassetsÚ
characterszchar_feral_berserker.pngztest_sprite.pngÚRGBA©é   r   )éd   é–   éÈ   éÿ   ÚPNG©Úformat)r   Ú__file__ÚresolveÚparentÚexistsr   ÚnewÚsave)r   Ú	canonicalÚimg_pathÚimgs       ú=C:\Projects\FreeExile\tests\unit\test_asset_pipeline_tools.pyÚsample_sprite_pngr'      s�   € õ •X‘”×&Ò&Ñ(Ô(Ô/Ô6Ô=ÀÑHÈ8ÑSÐV^Ñ^ÐamÑmð  qKñ  K€IØ×ÒÑÔð ØÐð Ð+Ñ+€HÝ
Œ)�F˜JÐ(<Ñ
=Ô
=€CØ‡H‚HˆX˜e€HÑ$Ô$Ð$Ø€Oó    c                   óF   — e Zd Zdededdfd„Zdededdfd„Zdeddfd„ZdS )ÚTestLODGeneratorr'   r   r   Nc                 óØ  — |dz  }t          ||¦  «        }d}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}}d	}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}}d
}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}}d}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}}d}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}}|d         }|j	        } |¦   «         }	|	s`dt          j        |¦  «        t          j        |¦  «        t          j        |	¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚d x}x}}	|d	         }|j	        } |¦   «         }	|	s`dt          j        |¦  «        t          j        |¦  «        t          j        |	¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚d x}x}}	|d
         }|j	        } |¦   «         }	|	s`dt          j        |¦  «        t          j        |¦  «        t          j        |	¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚d x}x}}	t          j        |¦  «        5 }
|
j        \  }}d d d ¦  «         n# 1 swxY w Y   t          j        |d         ¦  «        5 }|j        }||f}	||	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 d d ¦  «         n# 1 swxY w Y   t          j        |d	         ¦  «        5 }|j        }|dz  |dz  f}	||	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 d d ¦  «         n# 1 swxY w Y   t          j        |d
         ¦  «        5 }|j        }|dz  |dz  f}	||	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 d d ¦  «         d S # 1 swxY w Y   d S )NÚlodsÚlod0)Úin)z%(py1)s in %(py3)sÚpaths)Úpy1Úpy3zassert %(py5)sÚpy5Úlod1Úlod2zLOD-0zLOD-2zAassert %(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.exists
}()
})r0   r1   r2   ©ú==)z,%(py2)s
{%(py2)s = %(py0)s.size
} == %(py5)sÚimg0©Úpy0Úpy2r2   úassert %(py7)sÚpy7é   Úimg1é   Úimg2)r   Ú
@pytest_arÚ_call_reprcompareÚ	_safereprÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚAssertionErrorÚ_format_explanationr    r   ÚopenÚsize)Úselfr'   r   Úout_dirr/   Ú@py_assert0Ú@py_assert2Ú@py_format4Ú@py_format6Ú@py_assert4Úorig_imgÚowÚohr7   Ú@py_assert1Ú@py_assert3Ú@py_format8r>   r@   s                      r&   Útest_generate_sprite_lodsz*TestLODGenerator.test_generate_sprite_lods)   sú	  € Ø˜VÑ#ˆÝ$Ð%6¸Ñ@Ô@ˆàÐˆv˜ˆÐÐÐÕÔÐÐÐÐˆv˜ÐÑÔÕÔˆvÑÔÐÕÔÑÔÐÐÕÔ˜ÑÔÐÕÔ˜ÑÔÐÐÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÐˆv˜ˆÐÐÐÕÔÐÐÐÐˆv˜ÐÑÔÕÔˆvÑÔÐÕÔÑÔÐÐÕÔ˜ÑÔÐÕÔ˜ÑÔÐÐÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÐˆv˜ˆÐÐÐÕÔÐÐÐÐˆv˜ÐÑÔÕÔˆvÑÔÐÕÔÑÔÐÐÕÔ˜ÑÔÐÕÔ˜ÑÔÐÐÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÐˆw˜%ÐÐÐÐÕÔÐÐÐÐˆw˜%ÐÑÔÕÔˆwÑÔÐÕÔÑÔÐÐÕÔ˜%ÑÔÐÕÔ˜%ÑÔÐÐÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÐˆw˜%ÐÐÐÐÕÔÐÐÐÐˆw˜%ÐÑÔÕÔˆwÑÔÐÕÔÑÔÐÐÕÔ˜%ÑÔÐÕÔ˜%ÑÔÐÐÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐà�VŒ}Ð%ˆ}Ô#Ð%Ð#Ð#Ñ%Ô%Ð%Ð%Ð%Ð%Õ%Ô%ˆ}Ñ%Ô%Õ%Ô%Ð#Ñ%Ô%Õ%Ô%Ð%Ñ%Ô%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ø�VŒ}Ð%ˆ}Ô#Ð%Ð#Ð#Ñ%Ô%Ð%Ð%Ð%Ð%Õ%Ô%ˆ}Ñ%Ô%Õ%Ô%Ð#Ñ%Ô%Õ%Ô%Ð%Ñ%Ô%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ø�VŒ}Ð%ˆ}Ô#Ð%Ð#Ð#Ñ%Ô%Ð%Ð%Ð%Ð%Õ%Ô%ˆ}Ñ%Ô%Õ%Ô%Ð#Ñ%Ô%Õ%Ô%Ð%Ñ%Ô%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%åŒZÐ)Ñ*Ô*ð 	#¨hØ”]‰FˆB�ð	#ð 	#ð 	#ñ 	#ô 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#øøøð 	#ð 	#ð 	#ð 	#åŒZ˜˜fœÑ&Ô&ð 	)¨$Ø”9Ð(  R Ð(�9 Ò(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(�9 Ð(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(�4Ñ(Ô(Ð(Õ(Ô(�4Ñ(Ô(Ð(Ð(Õ(Ô(�9Ñ(Ô(Õ(Ô( Ñ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)åŒZ˜˜fœÑ&Ô&ð 	3¨$Ø”9Ð2  q¡¨"°©'Ð 2Ð2�9Ð 2Ò2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2�9Ð 2Ð2Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2�4Ñ2Ô2Ð2Õ2Ô2�4Ñ2Ô2Ð2Ð2Õ2Ô2�9Ñ2Ô2Õ2Ô2Ð 2Ñ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2ð	3ð 	3ð 	3ñ 	3ô 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3øøøð 	3ð 	3ð 	3ð 	3åŒZ˜˜fœÑ&Ô&ð 	3¨$Ø”9Ð2  q¡¨"°©'Ð 2Ð2�9Ð 2Ò2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2�9Ð 2Ð2Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2�4Ñ2Ô2Ð2Õ2Ô2�4Ñ2Ô2Ð2Ð2Õ2Ô2�9Ñ2Ô2Õ2Ô2Ð 2Ñ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2ð	3ð 	3ð 	3ñ 	3ô 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3øøøð 	3ð 	3ð 	3ð 	3ð 	3ð 	3sK   ÓS3Ó3S7Ó:S7ÔCW(×(W,×/W,ØC
[#Û#['Û*['ÜC
_ß_#ß&_#c                 ól  — t          ||dz  ¦  «        }|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}}|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  }t          j        d|j
        › d�¦  «        dz   d|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}x}}d S )NÚ	lods_evalr   ©ú>)z4%(py2)s
{%(py2)s = %(py0)s.original_size
} > %(py5)sÚresr8   r;   r<   gš™™™™™Ù?©ú<=)z7%(py2)s
{%(py2)s = %(py0)s.lod2_size_ratio
} <= %(py5)szLOD-2 ratio z exceeded 40% budgetú
>assert %(py7)s)r   Úoriginal_sizerA   rB   rD   rE   rF   rC   rG   rH   Úlod2_size_ratioÚ_format_assertmsg)	rK   r'   r   r]   rU   rQ   rV   rP   rW   s	            r&   Útest_lod2_size_budgetz&TestLODGenerator.test_lod2_size_budget@   sÿ  € Ý%Ð&7¸ÀKÑ9OÑPÔPˆØÔ Ð$ 1Ð$Ð  1Ò$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$Ð  1Ð$Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$ˆsÑ$Ô$Ð$Õ$Ô$ˆsÑ$Ô$Ð$Ð$Õ$Ô$Ð Ñ$Ô$Õ$Ô$ 1Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$ØÔ"Ð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ÑdÔdÐdÕdÔdˆsÑdÔdÐdÐdÕdÔdÐ"ÑdÔdÕdÔd dÑdÔdÐdÐdÑdÐdÕdÔdÐ,d¸3Ô;NÐ,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Ðdr(   c                 óŽ   — t          j        t          ¦  «        5  t          |dz  ¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )Nznon_existent.png)ÚpytestÚraisesÚFileNotFoundErrorr   ©rK   r   s     r&   Útest_missing_input_raises_errorz0TestLODGenerator.test_missing_input_raises_errorE   sŸ   € ÝŒ]Õ,Ñ-Ô-ð 	@ð 	@Ý  Ð,>Ñ!>Ñ?Ô?Ð?ð	@ð 	@ð 	@ñ 	@ô 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@øøøð 	@ð 	@ð 	@ð 	@ð 	@ð 	@ó   š:º>Á>)Ú__name__Ú
__module__Ú__qualname__r   rX   rd   rj   © r(   r&   r*   r*   (   s™   € € € € € ð3¸4ð 3È4ð 3ÐTXð 3ð 3ð 3ð 3ð.e°tð eÀtð eÐPTð eð eð eð eð
@¸ð @Àð @ð @ð @ð @ð @ð @r(   r*   c                   óB   — e Zd Zdededdfd„Zdeddfd„Zdeddfd„ZdS )ÚTestTextureCompressorr'   r   r   Nc                 óÄ	  — |dz  }t          ||d¬¦  «        }|j        }||k    }|sÕt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }d	d
|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}}|j        }|j
        } |¦   «         }	|	sžddt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |	¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚d x}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}}
|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  }t          j        d|j        › d�¦  «        dz   d|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}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}}
|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 )Nzcompressed.webpéP   ©Úqualityr5   )z3%(py2)s
{%(py2)s = %(py0)s.output_path
} == %(py4)sr]   Úout_webp©r9   r:   Úpy4zassert %(py6)sÚpy6úbassert %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.output_path
}.exists
}()
}©r9   r:   rx   ry   r   r[   )z6%(py2)s
{%(py2)s = %(py0)s.compressed_size
} > %(py5)sr8   r;   r<   g      à?r^   )z9%(py2)s
{%(py2)s = %(py0)s.compression_ratio
} <= %(py5)szWebP ratio z exceeded 50% budgetr`   )z2%(py2)s
{%(py2)s = %(py0)s.saved_bytes
} > %(py5)sg      I@)ú>=)z<%(py2)s
{%(py2)s = %(py0)s.reduction_percentage
} >= %(py5)s)r   Úoutput_pathrA   rB   rD   rE   rF   rC   rG   rH   r    Úcompressed_sizeÚcompression_ratiorc   Úsaved_bytesÚreduction_percentage)rK   r'   r   rv   r]   rU   rV   Ú@py_format5Ú@py_format7Ú@py_assert5rQ   rP   rW   s                r&   Útest_compress_to_webpz+TestTextureCompressor.test_compress_to_webpK   s�  € ØÐ/Ñ/ˆÝÐ0°(ÀBÐGÑGÔGˆàŒÐ*ˆ (Ò*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*ˆ (Ð*Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*ˆsÑ*Ô*Ð*Õ*Ô*ˆsÑ*Ô*Ð*Ð*Õ*Ô*ˆÑ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô* (Ñ*Ô*Ð*Õ*Ô* (Ñ*Ô*Ð*Ð*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*ØŒÐ'ˆÔ%Ð'Ð%Ð%Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆsÑ'Ô'Ð'Õ'Ô'ˆsÑ'Ô'Ð'Ð'Õ'Ô'ˆÑ'Ô'Õ'Ô'Ð%Ñ'Ô'Õ'Ô'Ð'Ñ'Ô'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ØÔ"Ð& QÐ&Ð" QÒ&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&Ð" QÐ&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆsÑ&Ô&Ð&Õ&Ô&ˆsÑ&Ô&Ð&Ð&Õ&Ô&Ð"Ñ&Ô&Õ&Ô& QÑ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ØÔ$Ðg¨ÐgÐ$¨Ò,ÐgÐgÐgÕgÔgÐgÐgÐgÐgÐ$¨ÐgÑgÔgÐgÕgÔgÑgÔgÐgÐgÕgÔgˆsÑgÔgÐgÕgÔgˆsÑgÔgÐgÐgÕgÔgÐ$ÑgÔgÕgÔg¨ÑgÔgÐgÐgÑgÐgÕgÔgÐ.g¸CÔ<QÐ.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ØŒÐ" Ð"ˆ Ò"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆ Ð"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆsÑ"Ô"Ð"Õ"Ô"ˆsÑ"Ô"Ð"Ð"Õ"Ô"ˆÑ"Ô"Õ"Ô" Ñ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"ØÔ'Ð/¨4Ð/Ð'¨4Ò/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð'¨4Ð/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/ˆsÑ/Ô/Ð/Õ/Ô/ˆsÑ/Ô/Ð/Ð/Õ/Ô/Ð'Ñ/Ô/Õ/Ô/¨4Ñ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/r(   c           	      ób  — |dz  }|                      ¦   «          t          d¦  «        D ];}t          j        dd|dz  dddf¦  «        }|                     |d	|› d
�z  ¦  «         Œ<|dz  }t          ||d¬¦  «        }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 �]ž}|j        }|j        } |¦   «         }|sžddt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }
t          t          j        |
¦  «        ¦  «        ‚d x}x}}|j        }|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        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}x}x}}�Œ d S )NÚ	src_batché   r   )é€   r‰   é2   r   r   r   Útex_z.pngÚ	out_batchrs   rt   r5   ©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚlenÚresults©r9   r0   r1   ry   úassert %(py8)sÚpy8rz   Úrr{   z.webp)zO%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.output_path
}.suffix
} == %(py7)s)r9   r:   rx   r<   zassert %(py9)sÚpy9)ÚmkdirÚranger   r!   r"   r
   rŽ   rA   rB   rD   rE   rF   rC   rG   rH   r}   r    Úsuffix)rK   r   Úsrc_dirÚir%   rL   r�   rN   r„   rQ   rƒ   Ú@py_format9r“   rU   rV   Ú@py_assert6rW   Ú@py_format10s                     r&   Útest_batch_compress_directoryz3TestTextureCompressor.test_batch_compress_directoryV   sˆ  € Ø˜[Ñ(ˆØ�Š‰ŒˆÝ�q‘”ð 	/ð 	/ˆAÝ”)˜F J°°R±¸¸cÀ3Ð0GÑHÔHˆCØ�HŠH�W˜~ a˜~˜~˜~Ñ-Ñ.Ô.Ð.Ð.à˜[Ñ(ˆÝ*¨7°GÀRÐHÑHÔHˆÝ�7‰|Œ|Ð ˜qÐ ˆ|˜qÒ Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆ|˜qÐ Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô �sÑ Ô Ð Õ Ô �sÑ Ô Ð Ð Ð Õ Ô Ñ Ô Ð Ð Õ Ô �7Ñ Ô Ð Õ Ô �7Ñ Ô Ð Ð Õ Ô ˆ|Ñ Ô Õ Ô ˜qÑ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ð Ð Øð 	3ñ 	3ˆAØ”=Ð)�=Ô'Ð)Ð'Ð'Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)�1Ñ)Ô)Ð)Õ)Ô)�1Ñ)Ô)Ð)Ð)Õ)Ô)�=Ñ)Ô)Õ)Ô)Ð'Ñ)Ô)Õ)Ô)Ð)Ñ)Ô)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ø”=Ð2�=Ô'Ð2¨7Ð2Ð'¨7Ò2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð'¨7Ð2Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2�1Ñ2Ô2Ð2Õ2Ô2�1Ñ2Ô2Ð2Ð2Õ2Ô2�=Ñ2Ô2Õ2Ô2Ð'Ñ2Ô2Õ2Ô2¨7Ñ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ñ2ð	3ð 	3r(   c                 óŽ   — t          j        t          ¦  «        5  t          |dz  ¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )Nzmissing.png)rf   rg   rh   r   ri   s     r&   Útest_compress_missing_filez0TestTextureCompressor.test_compress_missing_filed   sŠ   € ÝŒ]Õ,Ñ-Ô-ð 	7ð 	7Ý˜X¨Ñ5Ñ6Ô6Ð6ð	7ð 	7ð 	7ñ 	7ô 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7øøøð 	7ð 	7ð 	7ð 	7ð 	7ð 	7rk   )rl   rm   rn   r   r…   r�   rŸ   ro   r(   r&   rq   rq   J   s‚   € € € € € ð	0°tð 	0Àtð 	0ÐPTð 	0ð 	0ð 	0ð 	0ð3°dð 3¸tð 3ð 3ð 3ð 3ð7°4ð 7¸Dð 7ð 7ð 7ð 7ð 7ð 7r(   rq   c                   ó6   — e Zd Zdd„Zdeddfd„Zdeddfd„ZdS )ÚTestMipmapUtilsr   Nc                 ó  — t          j        ddd¦  «        }t          |d¬¦  «        }g d¢}d„ |D ¦   «         }||k    }|sÂt          j        d|fd	||f¦  «        d
t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d }d S )Nr   ©é@   r¤   )r   r   r   r   é   ©Úmin_dimension)r£   )é    r¨   )é   r©   )é   rª   )r?   r?   )r=   r=   )r¥   r¥   c                 ó   — g | ]	}|j         ‘Œ
S ro   )rJ   )Ú.0Úms     r&   ú
<listcomp>zITestMipmapUtils.test_generate_mipmap_chain_dimensions.<locals>.<listcomp>p   s   € Ð.Ð.Ð. 1˜œÐ.Ð.Ð.r(   r5   )z%(py0)s == %(py2)sÚactual_sizesÚexpected_sizes)r9   r:   zassert %(py4)srx   )r   r!   r   rA   rB   rD   rE   rF   rC   rG   rH   )rK   r%   Úchainr°   r¯   rU   Ú@py_format3r‚   s           r&   Ú%test_generate_mipmap_chain_dimensionsz5TestMipmapUtils.test_generate_mipmap_chain_dimensionsj   s2  € ÝŒi˜ Ð*:Ñ;Ô;ˆÝ% c¸Ð;Ñ;Ô;ˆð XÐWÐWˆØ.Ð.¨Ð.Ñ.Ô.ˆØ˜~Ò-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-ˆ|˜~Ð-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-ˆ|Ñ-Ô-Ð-Õ-Ô-ˆ|Ñ-Ô-Ð-Ð-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-˜~Ñ-Ô-Ð-Õ-Ô-˜~Ñ-Ô-Ð-Ð-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-r(   r   c                 ó  — |dz  }t          j        ddd¦  «                             |d¬¦  «         |dz  }t          ||d¬	¦  «        }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 ]¤}
|
j        } |¦   «         }|s‹ddt          j        ¦   «         v st          j	        |
¦  «        rt          j
        |
¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚d x}}Œ¥d S )Nzmip_test.pngr   r   ©éx   r   rs   r   r   r   Úmipsr©   r¦   é   r5   r�   rŽ   r/   r�   r‘   r’   úAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}Úprw   )r   r!   r"   r	   rŽ   rA   rB   rD   rE   rF   rC   rG   rH   r    )rK   r   r$   rL   r/   rN   r„   rQ   rƒ   rš   rº   rU   rV   r‚   s                 r&   Útest_save_mipmap_chainz&TestMipmapUtils.test_save_mipmap_chains   s-  € Ø˜nÑ,ˆÝŒ	�&˜*Ð&9Ñ:Ô:×?Ò?ÀÐQVÐ?ÑWÔWÐWØ˜VÑ#ˆÝ! (¨GÀ2ÐFÑFÔFˆå�5‰zŒzÐ˜QÐˆz˜QŠÐÐÐÕÔÐÐÐÐˆz˜QÐÑÔÐÕÔÑÔÐÐÕÔ�sÑÔÐÕÔ�sÑÔÐÐÐÕÔÑÔÐÐÕÔ�5ÑÔÐÕÔ�5ÑÔÐÐÕÔˆzÑÔÕÔ˜QÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐØð 	ð 	ˆAØ”8Ð�8�8‘:”:Ð�:ÐÐÐÕÔÑÔÐÐÕÔ�1ÑÔÐÕÔ�1ÑÔÐÐÕÔ�8ÑÔÕÔ�:ÑÔÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐð	ð 	r(   c                 ó   — |dz  }t          j        ddd¦  «                             |d¬¦  «         t          ||dz  d¬	¦  «        }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 ]¤}	|	j        }
 |
¦   «         }|s‹ddt          j        ¦   «         v st          j	        |	¦  «        rt          j
        |	¦  «        ndt          j
        |
¦  «        t          j
        |¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚d x}
}Œ¥d S )Nzmip_hook_test.pngr   r   rµ   r   r   Ú	hook_mipsr¨   r¦   r?   r5   r�   rŽ   r/   r�   r‘   r’   r¹   rº   rw   )r   r!   r"   r   rŽ   rA   rB   rD   rE   rF   rC   rG   rH   r    )rK   r   r$   r/   rN   r„   rQ   rƒ   rš   rº   rU   rV   r‚   s                r&   Ú#test_generate_and_save_mipmaps_hookz3TestMipmapUtils.test_generate_and_save_mipmaps_hook}   s*  € ØÐ1Ñ1ˆÝŒ	�&˜*Ð&9Ñ:Ô:×?Ò?ÀÐQVÐ?ÑWÔWÐWÝ)¨(°H¸{Ñ4JÐZ\Ð]Ñ]Ô]ˆå�5‰zŒzÐ˜QÐˆz˜QŠÐÐÐÕÔÐÐÐÐˆz˜QÐÑÔÐÕÔÑÔÐÐÕÔ�sÑÔÐÕÔ�sÑÔÐÐÐÕÔÑÔÐÐÕÔ�5ÑÔÐÕÔ�5ÑÔÐÐÕÔˆzÑÔÕÔ˜QÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐØð 	ð 	ˆAØ”8Ð�8�8‘:”:Ð�:ÐÐÐÕÔÑÔÐÐÕÔ�1ÑÔÐÕÔ�1ÑÔÐÐÕÔ�8ÑÔÕÔ�:ÑÔÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐð	ð 	r(   )r   N)rl   rm   rn   r³   r   r»   r¾   ro   r(   r&   r¡   r¡   i   sl   € € € € € ð.ð .ð .ð .ð¨tð ¸ð ð ð ð ð¸Dð ÀTð ð ð ð ð ð r(   r¡   )Ú__doc__ÚbuiltinsrD   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterA   Úpathlibr   ÚtempfileÚPILr   rf   Ú"tools.asset_pipeline.lod_generatorr   r   Ú!tools.asset_pipeline.mipmap_utilsr   r   r	   Ú'tools.asset_pipeline.texture_compressorr
   r   Úfixturer'   r*   rq   r¡   ro   r(   r&   ú<module>rË      sŸ  ððð ð
 € € € € € € € € € € € € Ð Ð Ð Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð Ø €€€ðð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð
ð ð ð ð ð ð ð ð „ð
 ð 
¨ð 
ð 
ð 
ñ „ð
ð@ð @ð @ð @ð @ñ @ô @ð @ðD7ð 7ð 7ð 7ð 7ñ 7ô 7ð 7ð>ð ð ð ð ñ ô ð ð ð r(   