o
    svXj�›  ã                   @   sì   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Zd dlZd dl	m	Z	 d dl
mZ zd dlZW n ey?   dZY nw d dlZd dlZg d¢Zdd„ Zd	d
„ Zdd„ ZG dd„ dejƒZdd„ Zdd„ Zedkrte e¡ dS dS )é    )Úprint_functionN©Úarray)ÚBytesIOF)©éÿ   r   r   ©éÈ   éx   r
   ©é2   éc   r   c                 K   s|   ddl }|j d¡rt| tjd� tƒ }tj||fi |¤Ž}| 	||¡ |j d¡r:t
| dƒ}| 	| ¡ ¡ | ¡  | ¡ S )a8  
    Convenience function for creating a PNG file "in memory" as
    a string.  Creates a :class:`Writer` instance using the keyword
    arguments, then passes `rows` to its :meth:`Writer.write` method.
    The resulting PNG file is returned as bytes.  `name` is used
    to identify the file for debugging.
    r   NÚPYPNG_TEST_FILENAME©ÚfileÚPYPNG_TEST_TMPÚwb)ÚosÚenvironÚgetÚprintÚsysÚstderrr   ÚpngÚWriterÚwriteÚopenÚgetvalueÚclose)ÚnameÚrowsÚxÚyÚkr   ÚfÚw© r&   úE/var/www/html/myproject/venv/lib/python3.10/site-packages/test_png.pyÚ
topngbytes.   s   	
r(   c                  C   s6   ddl } |  ¡ }|sdS |  |¡d \}}}}}}|S )z×Returns the name of the caller of the caller of this function
    (hence the name of the caller of the function in which
    "mycallersname()" textually appears).  Returns None if this cannot
    be determined.
    r   Né   )ÚinspectÚcurrentframeÚgetouterframes)r*   ÚframeÚframe_Ú	filename_Úlineno_ÚfunnameÚ	linelist_Úlisti_r&   r&   r'   ÚmycallersnameE   s   ÿr4   c                 C   s    d  t| ƒ¡}tj|g| ¢R Ž S )ztConvert a sequence of integers to a *bytes* instance.  Good for
    plastering over Python 2 / Python 3 cracks.
    z{0}B)ÚformatÚlenÚstructÚpack)ÚsÚfmtr&   r&   r'   Úseq_to_bytesW   s   r;   c                   @   sL  e Zd ZG dd„ deƒZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Z d;d<„ Z!d=d>„ Z"d?d@„ Z#dAdB„ Z$dCdD„ Z%dEdF„ Z&dGdH„ Z'dIdJ„ Z(dKdL„ Z)dMdN„ Z*dOdP„ Z+dQdR„ Z,dSdT„ Z-dUdV„ Z.dWdX„ Z/dYdZ„ Z0d[d\„ Z1d]d^„ Z2d_d`„ Z3dadb„ Z4dcdd„ Z5dedf„ Z6dgdh„ Z7didj„ Z8dkdl„ Z9dmdn„ Z:dodp„ Z;dqdr„ Z<dsdt„ Z=dudv„ Z>dwdx„ Z?dydz„ Z@d{d|„ ZAd}d~„ ZBdd€„ ZCd�d‚„ ZDdƒd„„ ZEd…d†„ ZFd‡dˆ„ ZGd‰dŠ„ ZHd‹dŒ„ ZId�dŽ„ ZJd�d�„ ZKd‘d’„ ZLd“d”„ ZMd•d–„ ZNd—d˜„ ZOd™dš„ ZPd›dœ„ ZQd�dž„ ZRdŸd „ ZSd¡d¢„ ZTd£d¤„ ZUd¥d¦„ ZVd§d¨„ ZWd©dª„ ZXd«d¬„ ZYd­d®„ ZZd¯d°„ Z[d±d²„ Z\d³d´„ Z]dµd¶„ Z^d·d¸„ Z_d¹dº„ Z`d»d¼„ Zad½d¾„ Zbd¿dÀ„ ZcdÁdÂ„ ZddÃdÄ„ ZedÅdÆ„ ZfdÇdÈ„ ZgdÉdÊ„ ZhdËdÌ„ ZidÍdÎ„ ZjdÏS )ÐÚTestc                   @   s   e Zd ZdS )zTest.failureExceptionN)Ú__name__Ú
__module__Ú__qualname__r&   r&   r&   r'   ÚfailureExceptiong   s    r@   c                 C   ó
   |   d¡S )zTest L8.é   ©Úhelper_L©Úselfr&   r&   r'   Útest_L8j   ó   
zTest.test_L8c                 C   rA   )zTest L3.é   rC   rE   r&   r&   r'   Útest_L3n   rH   zTest.test_L3c                 C   rA   )zTest L4.é   rC   rE   r&   r&   r'   Útest_L4r   rH   zTest.test_L4c                 C   rA   )zTest L7.é   rC   rE   r&   r&   r'   Útest_L7v   rH   zTest.test_L7c                 C   rA   )zTest L9.é	   rC   rE   r&   r&   r'   Útest_L9z   rH   zTest.test_L9c                 C   rA   )z	Test L12.é   rC   rE   r&   r&   r'   Útest_L12~   rH   zTest.test_L12c           
         s¤   d|> d ‰ t jddd|dd�}tƒ }t‡ fdd„tdd	ƒD ƒƒ}| ||¡ t j| ¡ d
�}| ¡ \}}}}	|  	|d¡ |  	|d¡ |  	t
tj|Ž ƒt
|ƒ¡ d S )Né   é   é   Tr   )Ú	greyscaleÚbitdepthÚchunk_limitc                 3   s   � | ]}ˆ |@ V  qd S ©Nr&   ©Ú.0r!   ©Úmaskr&   r'   Ú	<genexpr>ˆ   s   € z Test.helper_L.<locals>.<genexpr>é   ©Úbytes)r   r   r   Ú	bytearrayÚrangeÚwrite_arrayÚReaderr   ÚasDirectÚassertEqualÚlistÚ	itertoolsÚchain)
rF   Únr%   r$   Úsource_pixelsÚrr!   r"   ÚpixelsÚmetar&   r\   r'   rD   ‚   s   ÿzTest.helper_Lc           
      C   s¦   t jddddd�}tƒ }| |tdtdƒƒ¡ t j| ¡ d�}| ¡ \}}}}|  	|d¡ |  	|d¡ t
|ƒD ]\}}	|  	t|	ƒd¡ |  	t|	ƒd	| gd ¡ q7d
S )zTest L2 (and asRGB8).rS   rK   Tr)   )rV   rW   ÚBr`   rI   éU   N)r   r   r   rd   r   rc   re   r   ÚasRGB8rg   Ú	enumerater6   rh   )
rF   r%   r$   rm   r!   r"   rn   ro   ÚiÚrowr&   r&   r'   Útest_L2‘   s   þzTest.test_L2c              	   C   sZ   t dddggdddddd�}d}tj|d	� ¡ D ]\}}|d
kr$|} nq|  |d¡ dS )z#Create an LA image with bitdepth 4.zla4.pngé   rQ   rS   TrK   ©rV   ÚalpharW   Nr`   s   sBITs   )r(   r   re   Úchunksrg   )rF   ra   ÚsbitÚ
chunk_typeÚcontentr&   r&   r'   Útest_LA4ž   s   ÿþzTest.test_LA4c                 C   s˜   t \}}}tjdddt d�}tƒ }| |tddƒ¡ tj| ¡ d�}| ¡ \}}}	}
|  	|d¡ |  	|d¡ |  	dd	„ |	D ƒd
d	„ ||||fD ƒ¡ dS )z2-bit palette.rS   rK   r)   ©rW   Úpaletterp   )r   rS   rS   r)   r`   c                 S   ó   g | ]}t |ƒ‘qS r&   ©rh   ©r[   ru   r&   r&   r'   Ú
<listcomp>³   ó    z Test.test_P2.<locals>.<listcomp>c                 S   r�   r&   r‚   rƒ   r&   r&   r'   r„   ´   r…   N)
Ú	_palette3r   r   r   rd   r   re   r   rr   rg   )rF   ÚaÚbÚcr%   r$   rm   r!   r"   rn   ro   r&   r&   r'   Útest_P2©   s   
ÿzTest.test_P2c              	   C   sæ   d}d}d}d}d}t jddd|||||gd�}tƒ }| |td	d
ƒ¡ t j| ¡ d�}| ¡ \}	}
}}|  |	d¡ |  |
d¡ |d }|d }|d }|||f|||f|||fg}t	dd„ |ƒ}|  dd„ |D ƒdd„ |D ƒ¡ dS )z6Test colour type 3 and tRNS chunk (and 4-bit palette).©r   r   r   r   )r	   r
   r
   éP   r   r   r   rI   rK   r   rp   )	rK   rI   r)   rI   r)   r   r)   r   rS   r`   )r   c                 S   s
   t j| Ž S rY   )ri   rj   )ru   r&   r&   r'   Ú<lambda>È   s   
 z(Test.test_palette_trns.<locals>.<lambda>c                 S   r�   r&   r‚   rƒ   r&   r&   r'   r„   É   r…   z*Test.test_palette_trns.<locals>.<listcomp>c                 S   r�   r&   r‚   rƒ   r&   r&   r'   r„   Ê   r…   N)
r   r   r   rd   r   re   r   ÚasRGBA8rg   Úmap)rF   r‡   rˆ   r‰   ÚdÚer%   r$   rm   r!   r"   rn   ro   ÚboxedÚflatr&   r&   r'   Útest_palette_trns¶   s(   ÿzTest.test_palette_trnsc                 C   sL   t  ttjƒ¡}| ¡ \}}}}t|ƒd }|  t|dd… ƒg d¢¡ dS )z"asRGBA8() on colour type 2 source.rO   r   rB   )r   éß   r   r   r   éÞ   r   r   N)r   re   r   ÚpngsuiteÚbasn2c08rŽ   rh   rg   ©rF   rm   r!   r"   rn   ro   Úrow9r&   r&   r'   Útest_RGB_to_RGBAÌ   s   ÿzTest.test_RGB_to_RGBAc                 C   óZ   t jtjd�}| ¡ \}}}}|  |d d¡ tt|ƒd ƒ}|  |dd… g d¢¡ dS )	zasRGB() on grey source.r`   ÚplanesrI   rO   r   é   )r–   r–   r–   éÝ   rŸ   rŸ   N)r   re   r—   Úbasi0g08ÚasRGBrg   rh   ©rF   rm   r!   r"   r    ro   rš   r&   r&   r'   Útest_L_to_RGB×   ó   ÿzTest.test_L_to_RGBc                 C   sZ   t jtjd�}| ¡ \}}}}|  |d d¡ tt|ƒd ƒ}|  |dd… g d¢¡ dS )	zasRGB() on 16-bit grey source.r`   r�   rI   rO   r   rž   )é   r¥   r¥   é   r¦   r¦   N)r   re   r—   Úbasi0g16r¡   rg   rh   )rF   rm   Ú_r    ro   rš   r&   r&   r'   Útest_L16_to_RGBà   r¤   zTest.test_L16_to_RGBc                 C   rœ   )	zasRGBA() on grey source.r`   r�   rK   rO   r   rB   )r–   r–   r–   r   rŸ   rŸ   rŸ   r   N)r   re   r—   r    ÚasRGBArg   rh   r™   r&   r&   r'   Útest_L_to_RGBAé   s   ÿzTest.test_L_to_RGBAc                 C   rœ   )	zasRGBA() on LA source.r`   r�   rK   rO   r   rB   )é¤”  r¬   r¬   r   é=�  r­   r­   i…  N)r   re   r—   Úbasn4a16rª   rg   rh   r¢   r&   r&   r'   Útest_LA_to_RGBAó   s   
þzTest.test_LA_to_RGBAc                 C   sF   t jtjd�}| ¡ \}}}}t|ƒd }|  t|dd… ƒd¡ dS )z"Test colour type 2 and tRNS chunk.r`   r   rK   )é   r°   r°   r   N)r   re   r—   Útbrn2c08rŽ   rh   rg   Útuple)rF   rm   r!   r"   rn   ro   Úrow0r&   r&   r'   Útest_RGB_trnsý   s   zTest.test_RGB_trnsc                 C   s�   t jD ]B}| d¡sq| dd¡}|t jvrqtjt j| d�}tjt j| d�}| ¡ d }| ¡ d }|  dd„ |D ƒdd„ |D ƒ¡ qd	S )
zÁAdam7 interlace reading.
        For images in the PngSuite that have both
        an interlaced and straightlaced pair,
        test that both images of the pair give the same array of pixels.Úbasnrk   rt   r`   r)   c                 S   r�   r&   r‚   rƒ   r&   r&   r'   r„     r…   z,Test.test_interlace_read.<locals>.<listcomp>c                 S   r�   r&   r‚   rƒ   r&   r&   r'   r„     r…   N)r—   r   Ú
startswithÚreplacere   Úreadrg   )rF   Ú	candidateÚcandiÚstraightÚadam7r&   r&   r'   Útest_interlace_read  s   


ÿózTest.test_interlace_readc                 C   s  t j ¡ D ]{\}}|dd… dvrqtj|d�}| ¡ \}}}}td| d ||||j|j|j|j	dd�	}tj|d� ¡ \}}}	}tj|d�}| ¡ \}}}}td	| d ||||j|j|j|j	d
d�	}
tj|
d� ¡ \}}}}|  
dd„ |	D ƒdd„ |D ƒ¡ qdS )zªAdam7 interlace writing.
        For each test image in the PngSuite, write an interlaced
        and a straightlaced version.  Decode both, and compare results.
        rI   rw   )Ún0Ún2Ún4Ún6r`   Úadam7wnz.pngF)r!   r"   rW   rV   ry   ÚtransparentÚ	interlaceÚadam7wiTc                 S   r�   r&   r‚   rƒ   r&   r&   r'   r„   :  r…   z-Test.test_interlace_write.<locals>.<listcomp>c                 S   r�   r&   r‚   rƒ   r&   r&   r'   r„   ;  r…   N)r—   r   Úitemsre   r¸   r(   rW   rV   ry   rÃ   rg   )rF   r   ra   Úitr!   r"   rn   ro   ÚpngiÚpsÚpngsÚpir&   r&   r'   Útest_interlace_write  s6   ûûÿêzTest.test_interlace_writec                 C   s0   t ƒ }tjddddd�}| |tg d¢ƒ¡ dS )z’
        Test that when using `write_array` a bytes instance
        can be used.
        As per https://github.com/drj11/pypng/issues/65
        rI   r)   T)rÄ   rV   )rq   éª   r   rÍ   rq   r   N)r   r   r   rd   ra   )rF   r$   r%   r&   r&   r'   Ú test_interlace_write_array_bytes=  s   z%Test.test_interlace_write_array_bytesc                 C   sF   t jtjd�}| ¡ \}}}}|  |d¡ |  |d¡ |  d|¡ dS )z4Test that a palette PNG returns the palette in info.r`   é    r€   N)r   re   r—   Úbasn3p04r¸   rg   ÚassertIn)rF   rm   r!   r"   rn   Úinfor&   r&   r'   Útest_palette_infoH  s
   zTest.test_palette_infoc           
      C   s†   t jtjd�}| ¡ \}}}}t jdi |¤Ž}tƒ }| ||¡ | ¡  | 	d¡ t j|d�}| ¡ \}}}}	|  
|	d |d ¡ dS )zMTest metadata for paletted PNG can be passed from one PNG
        to another.r`   r   r   r€   Nr&   ©r   re   r—   rÐ   r¸   r   r   r   ÚflushÚseekrg   )
rF   rm   r!   r"   rn   rÒ   r%   Úor¨   Ú
again_infor&   r&   r'   Útest_read_palette_writeP  s   
zTest.test_read_palette_writec                 C   s¢   t jtjd�}| ¡ \}}}}dd„ |D ƒ}d|d< t jd
i |¤Ž}tƒ }| ||¡ | ¡  | 	d¡ t j|d�}| ¡ \}}}	}
dd„ |	D ƒ}	|  
|	|¡ d	S )zTTest that palette bitdepth can be increased,
        without change of pixel values.r`   c                 S   r�   r&   r‚   rƒ   r&   r&   r'   r„   d  r…   z,Test.test_deepen_palette.<locals>.<listcomp>rB   rW   r   r   c                 S   r�   r&   r‚   rƒ   r&   r&   r'   r„   n  r…   Nr&   rÔ   )rF   rm   r!   r"   rn   rÒ   r%   r×   r¨   Úagain_pixelsrØ   r&   r&   r'   Útest_deepen_palette_  s   
zTest.test_deepen_palettec                 C   s&   t jtjd�}| ¡  |jdd� dS )z'Test forcing alpha channel for palette.r`   Úforce)ry   N)r   re   r—   rÐ   Úpreambler€   ©rF   rm   r&   r&   r'   Útest_palette_force_alphaq  s   zTest.test_palette_force_alphac                 C   rA   )z'Create greyscale image with tRNS chunk.r   ©Úhelper_L_trnsrE   r&   r&   r'   Útest_L_trns_0w  rH   zTest.test_L_trns_0c                 C   rA   )z"Using 1-tuple for transparent arg.)r   rà   rE   r&   r&   r'   Útest_L_trns_tuple{  rH   zTest.test_L_trns_tuplec           	      C   s‚   t g d¢ƒ}tƒ }tjdddd|d�}| ||¡ tj| ¡ d�}| ¡ \}}}}|  |d ¡ |  |d ¡ |  	|d	 d¡ d
S )z$Helper used by :meth:`test_L_trns*`.)r   é8   éL   éT   é\   é@   rä   r   rB   TrS   )rV   rW   rÃ   r`   ry   rV   rW   N)
Úzipr   r   r   Úwrite_packedre   r   rf   Ú
assertTruerg   )	rF   rÃ   rn   r×   r%   rm   r!   r"   ro   r&   r&   r'   rá     s   ÿzTest.helper_L_trnsc                 C   s.   t jtjd�}| ¡ d }t jdi |¤Ž dS )zdTest that the dictionary returned by `read`
        can be used as args for :meth:`Writer`.
        r`   rI   Nr&   )r   re   r—   Úbasn2c16r¸   r   )rF   rm   rÒ   r&   r&   r'   Útest_read_info_writeŒ  s   zTest.test_read_info_writec                 C   s’   t jdddg d¢d�}tƒ }| |g d¢g d¢g¡ t j| ¡ d�}| ¡ \}}}}t|ƒ}|  t	|ƒd¡ |  d	d
„ |D ƒg d¢g d¢g¡ dS )ú#Test that background keyword works.rS   r)   F)rq   r   rÍ   )rV   Ú
background)rS   rK   éÀ   )é   éà   r   r`   c                 S   r�   r&   r‚   rƒ   r&   r&   r'   r„   Ÿ  r…   z5Test.test_write_background_colour.<locals>.<listcomp>N©
r   r   r   r   re   r   rf   rh   rg   r6   ©rF   r%   r×   rm   r¨   r    rÒ   r&   r&   r'   Útest_write_background_colour”  s   þz!Test.test_write_background_colourc                 C   s�   t jddddgd�}tƒ }| |g d¢g d¢g¡ t j| ¡ d�}| ¡ \}}}}t|ƒ}|  t	|ƒd¡ |  dd	„ |D ƒg d¢g d¢g¡ d
S )rî   r)   Trq   )ry   rï   )rS   r   rK   rð   )rñ   r   rò   r   r`   c                 S   r�   r&   r‚   rƒ   r&   r&   r'   r„   ­  r…   z3Test.test_write_background_grey.<locals>.<listcomp>Nró   rô   r&   r&   r'   Útest_write_background_grey¢  s   þzTest.test_write_background_greyc                 C   sŒ   t jdddd�}tƒ }| |ddgddgg¡ t j| ¡ d�}| ¡ \}}}}t|ƒ}|  t	|ƒd¡ |  dd	„ |D ƒddgddgg¡ d
S )z$Test that compression keyword works.r)   rS   )ÚcompressionrK   rñ   rò   r`   c                 S   r�   r&   r‚   rƒ   r&   r&   r'   r„   »  r…   z/Test.test_write_compression.<locals>.<listcomp>Nró   )rF   r%   r×   rm   r!   r"   r    rÒ   r&   r&   r'   Útest_write_compression°  s   þzTest.test_write_compressionc                 C   s’   t jdddddd�}tƒ }| |t dgdg¡t d	gd
g¡g¡ t j| ¡ d�}| ¡ \}}}}t	|ƒ}|  
t|ƒd¡ |  
t|d ƒd¡ dS )zfTest iterator for row when using write_packed.

        Indicative for Issue 47 (googlecode).
        rñ   r)   TFrS   rx   é
   rÍ   rT   r   r`   r   N)r   r   r   rê   ri   rj   re   r   rf   rh   rg   r6   )rF   r%   r×   rm   r!   r"   rn   rÒ   r&   r&   r'   Útest_write_packed¾  s   ÿzTest.test_write_packedc                 C   ó(   t jtjd�}t| ¡ d ƒd j dS )z6Reading an interlaced PNG yields each row as an array.r`   r)   r   N)r   re   r—   r    rh   r¸   ÚtostringrÞ   r&   r&   r'   Útest_interlaced_arrayÍ  s   zTest.test_interlaced_arrayc                 C   rû   )zRA type 2 PNG with tRNS chunk yields each row
        as an array (using asDirect).r`   r)   r   N)r   re   r—   r±   rh   rf   rü   rÞ   r&   r&   r'   Útest_trns_arrayÒ  s   zTest.test_trns_arrayc                 C   sH   ddl }tjtjd�}| ¡ \}}}}| t|ƒ¡ ¡ }|  	|d¡ dS )zTest read_flat.r   Nr`   Ú 255cd971ab8cd9e7275ff906e5041aa0)
Úhashlibr   re   r—   Úbasn0g02Ú	read_flatÚmd5r;   Ú	hexdigestrg   )rF   r   rm   r!   r"   Úpixelro   r�   r&   r&   r'   Ú	test_flatØ  s
   zTest.test_flatc                 C   sš   d }}dg| g| }t ƒ }tj||dd�}| ||¡ | d¡ |  d| ¡ ¡ | d¡ tj|d�}| ¡ \}}}	}
|  d|
¡ |  	t
|dƒ¡ d	S )
z:
        Check that no pHYs chunk when not asked.
        rI   r   T©ÚwidthÚheightrV   s   pHYsr   ÚphysicalÚx_pixels_per_unitN)r   r   r   r   rÖ   ÚassertNotInr   re   r¸   ÚassertFalseÚhasattr)rF   r  r	  rn   ÚoutÚwriterÚreaderr%   Úhr¨   ro   r&   r&   r'   Útest_no_phys_chunká  s   

zTest.test_no_phys_chunkc                 C   sâ   d }}dg| g| }t ƒ }tj||ddddd�}| ||¡ | d¡ tj|d�}| ¡ \}}}	}
|  d|
¡ |  d|j	¡ |  d|j
¡ |  |j¡ d	}|  ||
d ¡ |
d }|  d|j¡ |  d|j¡ |  |j¡ d
S )z5
        Check that pHYs chunk is generated.
        rI   r   TéÐ  éè  ©r  r	  rV   r  Úy_pixels_per_unitÚunit_is_meterr   r
  )r  r  TN)r   r   r   r   rÖ   re   r¸   rÑ   rg   r  r  rë   r  r!   r"   ©rF   r  r	  rn   r  r  r  r%   r  r¨   ro   ÚexpectedÚresr&   r&   r'   Útest_phys_chunkó  s,   
ý
zTest.test_phys_chunkc                 C   sâ   d }}dg| g| }t ƒ }tj||ddddd�}| ||¡ | d¡ tj|d�}| ¡ \}}}	}
|  d	|
¡ |  d|j	¡ |  d|j
¡ |  |j¡ d
}|  ||
d	 ¡ |
d	 }|  d|j¡ |  d|j¡ |  |j¡ dS )z?
        Check pHYs chunk when unit_is_meter is False.
        rI   r   Tr)   rS   Fr  r   r
  )r)   rS   FN)r   r   r   r   rÖ   re   r¸   rÑ   rg   r  r  r  r  r!   r"   r  r&   r&   r'   Útest_phys_chunk_2  s*   
þ
zTest.test_phys_chunk_2c                    sh   d}t jtj | d�‰ d‰‡ ‡fdd„}tƒ }t  ||ƒ ¡ t j| ¡ d�‰ ˆ  ¡ \}}}}t|ƒ dS )zf
        Test with a PNG that has an ancillary chunk after IDAT chunks.
        For coverage.
        Úf02n0g08r`   )s   tEXts   Comment Test chunk follows IDATc                  3   s0   � ˆ   ¡ D ]\} }| dkrˆV  | |fV  qd S )Ns   IEND©rz   ©ÚtÚv©r  Ú
text_chunkr&   r'   Úmore_chunks/  s   €ýz/Test.test_chunk_after_idat.<locals>.more_chunksN©r   re   r—   r   Úwrite_chunksr   r¸   rh   ©rF   r#   r%  r×   r¨   r    rÒ   r&   r#  r'   Útest_chunk_after_idat&  s   zTest.test_chunk_after_idatc                    sb   d}t jtj | d�‰ ‡ fdd„}tƒ }t  ||ƒ ¡ t j| ¡ d�‰ ˆ  ¡ \}}}}t|ƒ dS )zM
        Test colortype 3 PNG with bKGD chunk.
        For coverage.
        rÐ   r`   c                  3   s0   � ˆ   ¡ D ]\} }| |fV  | dkrdV  qd S )Ns   PLTE)s   bKGDó    r  r   ©r  r&   r'   r%  D  s   €
€ýz(Test.test_plte_bkgd.<locals>.more_chunksNr&  r(  r&   r+  r'   Útest_plte_bkgd<  s   zTest.test_plte_bkgdc                 C   sš   d}t jtj | d�}t jtj | d�}| ¡ \}}}}| ¡ \}}}}ttdtƒ}	|	||ƒD ]\}
}|  |
|¡ tt	|
ƒƒD ]
}d|d  |
|< q?q/dS )z\Tests that the rows yielded by the pixels generator
        can be safely modified.
        r  r`   Úizipim+  rS   N)
r   re   r—   rf   Úgetattrri   ré   rg   rc   r6   )rF   r#   Úr1Úr2r¨   Úpixels1Úinfo1Úpixels2Úinfo2r-  Úrow1Úrow2rt   r&   r&   r'   Útest_modify_rowsQ  s   ÿþzTest.test_modify_rowsc                 C   s4   t  ddgddg¡g}tjdd�}| tƒ |¡ dS )ze
        The length check cannot be used on an itertools.chain object.
        For coverage.
        r   rÍ   rq   r   )rK   rS   ©ÚsizeN)ri   rj   r   r   r   r   ©rF   r    r%   r&   r&   r'   Útest_cannot_length_check`  s   zTest.test_cannot_length_checkc                 C   s    t jdd�}|  t j|j¡ dS )zTest empty file.ó    r`   N)r   re   ÚassertRaisesÚFormatErrorrf   rÞ   r&   r&   r'   Ú
test_emptyn  s   zTest.test_emptyc                 C   s*   t jtjdd… d�}|  t j|j¡ dS )z*Test file containing just signature bytes.NrB   r`   )r   re   r—   Úbasi0g01r=  r>  rf   rÞ   r&   r&   r'   Útest_signature_onlyt  s   zTest.test_signature_onlyc              
   C   ój   t jtjdd… d�}z| ¡  W dS  ty4 } z|  |t j¡ |  dt	|ƒ¡ W Y d}~dS d}~ww )z5
        Chunk doesn't have length and type.
        Né   r`   zchunk length©
r   re   r—   r@  rf   Ú	ExceptionÚassertIsInstancer>  rÑ   Ústr©rF   rm   r‘   r&   r&   r'   Útest_chunk_truncatedz  ó   €þzTest.test_chunk_truncatedc              
   C   rB  )z*
        Chunk that is too short.
        Né   r`   z	too shortrD  rH  r&   r&   r'   Útest_chunk_short…  rJ  zTest.test_chunk_shortc              
   C   rB  )z?
        Chunk that's too small to contain a checksum.
        Né   r`   ÚchecksumrD  rH  r&   r&   r'   Útest_no_checksum�  rJ  zTest.test_no_checksumc              
   C   sr   t tjƒ}d|d< tj|d�}z| ¡  W dS  ty8 } z|  |tj¡ |  	dt
|ƒ¡ W Y d}~dS d}~ww )z)
        Chunk has bad checksum.
        rS   é   r`   zhecksum errorN©rb   r—   r@  r   re   r¸   rE  rF  r>  rÑ   rG  ©rF   Úbad_pngrm   r‘   r&   r&   r'   Útest_checksum_bad›  s   
€þzTest.test_checksum_badc              
   C   sz   t tjƒ}|d  dO  < tj|d�}z| ¡  W dS  ty< } z|  |tj¡ |  	dt
|ƒ¡ W Y d}~dS d}~ww )z%
        Chunk has bad type.
        rT   é€   r`   zinvalid ChunkNrQ  rR  r&   r&   r'   Útest_type_bad¨  s   
€þzTest.test_type_badc                 C   ó   dd„ }|   tjt|¡ dS )z%Test file that has wrong length IHDR.c                 S   s0   | d dkr| S | d }|d7 }| d |f} | S )Nr   ó   IHDRrS   s   garbager&   ©ÚchunkÚdatar&   r&   r'   Úchange_ihdr_length¸  s   z1Test.test_ihdr_length.<locals>.change_ihdr_lengthN©r=  r   r>  Úread_modify_chunks)rF   r\  r&   r&   r'   Útest_ihdr_lengthµ  ó   ýzTest.test_ihdr_lengthc                 C   rW  )z2Test file that has invalid compression IHDR value.c                 S   óD   | d dkr| S | d }|d d… d |dd …  }| d |f} | S )Nr   rX  rS   rù   ó   €é   r&   rY  r&   r&   r'   Úchange_ihdr_compressionÇ  ó   z;Test.test_ihdr_compression.<locals>.change_ihdr_compressionNr]  )rF   rd  r&   r&   r'   Útest_ihdr_compressionÄ  r`  zTest.test_ihdr_compressionc                 C   rW  )z0Test file that has invalid interlace IHDR value.c                 S   s8   | d dkr| S | d }|d d… d }| d |f} | S )Nr   rX  rS   rQ   rb  r&   rY  r&   r&   r'   Úchange_ihdr_interlaceÖ  s   z7Test.test_ihdr_interlace.<locals>.change_ihdr_interlaceNr]  )rF   rg  r&   r&   r'   Útest_ihdr_interlaceÓ  r`  zTest.test_ihdr_interlacec                 C   rW  )z-Test file that has invalid filter IHDR value.c                 S   ra  )Nr   rX  rS   rc  rb  rQ   r&   rY  r&   r&   r'   Úchange_ihdr_filterå  re  z1Test.test_ihdr_filter.<locals>.change_ihdr_filterNr]  )rF   ri  r&   r&   r'   Útest_ihdr_filterâ  r`  zTest.test_ihdr_filterc                 C   s:   t jtjdd… d�}| ¡ \}}}}|  t jt|¡ dS )z"Test file with missing IEND chunk.Niôÿÿÿr`   )r   re   r—   r  r¸   r=  Ú
ChunkErrorrh   )rF   rm   r¨   r    rÒ   r&   r&   r'   Útest_iend_missingñ  s   ýzTest.test_iend_missingc                 C   rW  )z(Test file that contains too many pixels.c                 S   s@   | d dkr| S t  | d ¡}|d7 }t  |¡}| d |f} | S )Nr   ó   IDATrS   s    garbage©ÚzlibÚ
decompressÚcompressrY  r&   r&   r'   Úadd_garbageý  s   
z+Test.test_extra_pixels.<locals>.add_garbageNr]  )rF   rr  r&   r&   r'   Útest_extra_pixelsú  ó   zTest.test_extra_pixelsc                 C   rW  )z'Test file that contains too few pixels.c                 S   s@   | d dkr| S t  | d ¡}|d d… }t  |¡}| d |fS )Nr   rm  rS   éÿÿÿÿrn  rY  r&   r&   r'   Útruncate_idat
  s   
z,Test.test_lack_pixels.<locals>.truncate_idatNr]  )rF   rv  r&   r&   r'   Útest_lack_pixels  rt  zTest.test_lack_pixelsc                 C   rW  )z/Test file that contains impossible filter type.c                 S   sD   | d dkr| S t  | d ¡}d|dd …  }t  |¡}| d |fS )Nr   rm  rS   ó   ™rn  rY  r&   r&   r'   Úcorrupt_filter  s   
z,Test.test_bad_filter.<locals>.corrupt_filterNr]  )rF   ry  r&   r&   r'   Útest_bad_filter  rt  zTest.test_bad_filterc                 C   s(   t  g d¢g d¢gd¡}| tƒ ¡ d S )N©r   é3   éf   ©r   éÌ   é™   ÚL©r   Ú
from_arrayr   r   ©rF   Úimgr&   r&   r'   Útest_from_array_L#  s   zTest.test_from_array_Lc                 C   s&   t  ttdƒdƒd¡}| tƒ ¡ d S )Né   r_   zL;16)r   rƒ  Úgrouprc   r   r   r„  r&   r&   r'   Útest_from_array_L16'  s   zTest.test_from_array_L16c                 C   s,   t  g d¢g d¢gd¡}tƒ }| |¡ d S )N)r   r   r   r   r   rS   r   rS   r   r   rS   rS   )rS   r   r   rS   r   rS   rS   rS   r   rS   rS   rS   zRGB;1)r   rƒ  r   r   )rF   r…  r×   r&   r&   r'   Útest_from_array_RGB+  s   
üùzTest.test_from_array_RGBc                 C   sH   t  t  d¡d¡}dd„ |D ƒ}t |dtdd�¡}tƒ }| |¡ d S )Nrù   é   c                 s   ó   � | ]}|||gV  qd S rY   r&   rZ   r&   r&   r'   r^   9  ó   € z0Test.test_from_array_iterator.<locals>.<genexpr>úRGB;5)r	  )ri   ÚisliceÚcountr   rƒ  Údictr   r   )rF   rt   r…  r$   r&   r&   r'   Útest_from_array_iterator7  s
   zTest.test_from_array_iteratorc                 C   s   |   tjtjdggd¡ dS )z/Invoke from_array incorrectly to provoke Error.rS   ÚgrayN)r=  r   ÚErrorrƒ  rE   r&   r&   r'   Útest_from_array_bad>  s
   ýzTest.test_from_array_badc                 C   s$   t  ddgddggd¡ tƒ ¡ d S )Nr   rS   r)   rI   ÚL2r‚  rE   r&   r&   r'   Útest_from_array_L2E  s   $zTest.test_from_array_L2c                 C   s2   t jg d¢g d¢gdtdd�d�}| tƒ ¡ dS )z<
        Test width argument.
        For coverage.
        r{  r~  r�  ©rI   r)   r8  ©rÒ   N©r   rƒ  r‘  r   r   r„  r&   r&   r'   Útest_from_array_widthH  s   ýzTest.test_from_array_widthc                 C   s.   t jddgddggdtdd�d� tƒ ¡ d S )NrI   rS   r   ÚLA2T)rV   r™  rš  rE   r&   r&   r'   Útest_from_array_LAT  s   ÿzTest.test_from_array_LAc              	   C   ó0   | j tjtjddgddggdtddd�d� d S )	NrI   rS   r   rœ  TF©rV   ry   r™  ©r=  r   ÚProtocolErrorrƒ  r‘  rE   r&   r&   r'   Útest_from_array_LA_alpha_badX  ó   

ûz!Test.test_from_array_LA_alpha_badc              	   C   rž  )	NrI   rS   r   rœ  FTrŸ  r™  r   rE   r&   r&   r'   Útest_from_array_LA_grey_bad`  r£  z Test.test_from_array_LA_grey_badc                 C   s.   | j tjtjddgddggdtdd�d� d S )NrI   rS   r   rœ  rK   )rW   r™  r   rE   r&   r&   r'   Útest_from_array_LA_bitdepth_badh  s   
ûz$Test.test_from_array_LA_bitdepth_badc                 C   s8   t  t  d¡d¡}dd„ |D ƒ}|  tjtj|d¡ dS )z)Row iterator without height raises Error.rù   r‹  c                 s   rŒ  rY   r&   rZ   r&   r&   r'   r^   s  r�  z7Test.test_from_array_iterator_height.<locals>.<genexpr>rŽ  N)ri   r�  r�  r=  r   r¡  rƒ  )rF   rt   r&   r&   r'   Útest_from_array_iterator_heightp  s   üz$Test.test_from_array_iterator_heightc              	   C   ót   t p |  d¡ dd„ tdddƒD ƒg}td|dd	d
ddd� dS  dd„ tdddƒD ƒg}td|dd	d
ddd� dS )znumpy uint16.únumpy is not availablec                 S   ó   g | ]}t  |¡‘qS r&   )ÚnumpyÚuint16rZ   r&   r&   r'   r„   �  ó    z*Test.test_numpy_uint16.<locals>.<listcomp>r   r‡  éUU  znumpyuint16.pngrK   rS   TFrñ   rx   N©rª  ÚskipTestrc   r(   ©rF   r    r&   r&   r'   Útest_numpy_uint16|  ó   

ÿý

ÿzTest.test_numpy_uint16c              	   C   r§  )znumpy uint8.r¨  c                 S   r©  r&   )rª  Úuint8rZ   r&   r&   r'   r„   Š  r¬  z)Test.test_numpy_uint8.<locals>.<listcomp>r   r_   rq   znumpyuint8.pngrK   rS   TFrB   rx   Nr®  r°  r&   r&   r'   Útest_numpy_uint8…  r²  zTest.test_numpy_uint8c                 C   sD   t p|  d¡ t jddggtd�}t |d¡}|jd dks J ‚dS )znumpy bool.r¨  r   rS   )Údtyper�  rW   N)rª  r¯  r   Úboolr   rƒ  rÒ   )rF   r    r…  r&   r&   r'   Útest_numpy_boolŽ  s
   €zTest.test_numpy_boolc                 C   s|   t p"|  d¡ t  ddgddggt j¡}t |d¡}| tƒ ¡ dS  t  ddgddggt j¡}t |d¡}| tƒ ¡ dS )znumpy array.r¨  r   r­  iªª  r�  N)rª  r¯  r   r«  r   rƒ  r   r   )rF   rn   r…  r&   r&   r'   Útest_numpy_array—  s   üzTest.test_numpy_arrayc                 C   sœ   t p*|  d¡ t  ddgddggt j¡}t  |¡ ¡ }tj|dd�}| t	ƒ ¡ dS  t  ddgddggt j¡}t  |¡ ¡ }tj|dd�}| t	ƒ ¡ dS )z+Transposed numpy array (works when copied).r¨  r   rq   rÍ   r�  )ÚmodeN)
rª  r¯  r   r³  Ú	transposeÚcopyr   rƒ  r   r   )rF   r‡   ÚaTr…  r&   r&   r'   Útest_numpy_tranpose   s   ùzTest.test_numpy_tranposec                 C   s¤   t p,|  d¡ g d¢}dd„ |D ƒ}ddg}t  |¡}tjt|d ƒt|ƒ|dd	� d
S  g d¢}dd„ |D ƒ}ddg}t  |¡}tjt|d ƒt|ƒ|dd	� d
S )znumpy palette.r¨  )Ú110010010011Ú101011010100Ú110010110101Ú100010010011c                 S   s   g | ]	}d d„ |D ƒ‘qS )c                 S   r�   r&   )Úint)r[   Úpr&   r&   r'   r„   ¸  r…   z6Test.test_numpy_palette.<locals>.<listcomp>.<listcomp>r&   rƒ   r&   r&   r'   r„   ¸  s    z+Test.test_numpy_palette.<locals>.<listcomp>©rq   rq   rq   )r   r€  r€  r   rS   )r€   rW   N)rª  r¯  r   r   r   r6   )rF   r9   r€   Úpnpr&   r&   r'   Útest_numpy_palette®  s   
"ô
"zTest.test_numpy_palettec                 C   s  t jdd�}d|_tdg d¢ƒ}tdg d¢ƒ}dd„ }| d	||ƒ||ƒ¡}|  t|ƒt|ƒ¡ | d
||ƒ||ƒ¡}|  t|ƒg d¢¡ | d||ƒ||ƒ¡}|  t|ƒg d¢¡ | d||ƒ||ƒ¡}|  t|ƒg d¢¡ | d||ƒ||ƒ¡}|  t|ƒg d¢¡ d S )Nr<  r`   rI   rp   )r‹  rK  é   éÒ   éÓ   éÔ   )rP  rÏ   é"   éæ   éé   éì   c                 S   s
   t d| ƒS )Nrp   r   )r‡   r&   r&   r'   ÚcpÇ  s   
z!Test.test_undo_filter.<locals>.cpr   rS   )rP  rÏ   rË  rK   rO   é   r)   )r   é5   rä   é¸   é¼   rð   )é(   é*   é-   r   ég   él   rK   ©r   re   Úpsizer   Úundo_filterrg   rh   )rF   r  ÚscanprevÚscanlinerÏ  r  r&   r&   r'   Útest_undo_filterÁ  s   zTest.test_undo_filterc                 C   sT   t jdd�}d|_tdg d¢ƒ}tdg d¢ƒ}| d||¡}|  t|ƒg d¢¡ d	S )
z$Edge cases for undoing paeth filter.r<  r`   rI   rp   )r)   r   r   r   rO   rc  )rž   rù   rO   éd   ée   r}  rK   )rB   rù   rO   rØ  éo   éq   NrÙ  )rF   r  rÜ  rÝ  r  r&   r&   r'   Útest_undo_filter_paethÚ  s   zTest.test_undo_filter_paethc                 C   s4   t jdddd�}tƒ }|  t j|j|g d¢g¡ d S )NrK   rS   Tr  )rS   rá  r–   )r   r   r   r=  r¡  r   )rF   r  r×   r&   r&   r'   Útest_row_length_badæ  s   
þzTest.test_row_length_badc                 C   s   | j tjtjdd� dS )z5
        Wrong tuple length in size keyword.
        )r)   r)   rI   r8  N©r=  r   r¡  r   rE   r&   r&   r'   Útest_size_length_badï  s
   
ýzTest.test_size_length_badc                 C   ó   | j tjtjddd� dS )zWrong width in constructor.rI   )r)   rI   )r  r9  Nrå  rE   r&   r&   r'   Útest_width_badø  ó
   
ýzTest.test_width_badc                 C   rç  )zWrong height in constructor.rI   r˜  )r	  r9  Nrå  rE   r&   r&   r'   Útest_height_badÿ  ré  zTest.test_height_badc                 C   s   | j tjtjdg d¢d� dS )z Wrong background in constructor.©r)   r)   rÄ  ©r9  rï   Nrå  rE   r&   r&   r'   Útest_background_bad  s   
üzTest.test_background_badc                 C   s   | j tjtjddgd� dS )ú&non-integer background in constructor.rë  ç      à?rì  Nrå  rE   r&   r&   r'   Útest_background_unnatural  s   
üzTest.test_background_unnaturalc                 C   s    | j tjtjddg d¢d� dS )rî  rë  F)rS   rS   rï  )r9  rV   rï   Nrå  rE   r&   r&   r'   Útest_background_rgb_unnatural  s   
ûz"Test.test_background_rgb_unnaturalc                 C   s   | j tjtjdddgd� dS )z alpha and transparent don't mix.rë  TrS   )r9  ry   rÃ   Nrå  rE   r&   r&   r'   Útest_alpha_trns  s   
ûzTest.test_alpha_trnsc                 C   s   | j tjtjddd� d S )Nrë  r   )r9  rW   rå  rE   r&   r&   r'   Útest_bitdepth_bad(  s   
üzTest.test_bitdepth_badc                 C   s"   | j tjtjdddtd d� dS )z#Palette too big should raise error.rS   rK   r)   éV   r   N©r=  r   r¡  r   r†   rE   r&   r&   r'   Útest_write_palette_big/  s
   
ýzTest.test_write_palette_bigc              	   C   s:   t \}}}|dd… }| jtjtjddd|||gd� dS )z6Palette with incorrect size tuples should raise error.Nr)   rS   rK   r   )r†   r=  r   r¡  r   ©rF   r‡   rˆ   r‰   r&   r&   r'   Útest_write_palette_bad_tuples6  s   

ýz"Test.test_write_palette_bad_tuplesc              	   C   ó0   d}d}d}| j tjtjddd|||gd� dS )	z7Palette with transparent entries following opaque ones.)r   r   r   r   r   r‹   rS   rK   r)   r   Nrå  r÷  r&   r&   r'   Ú#test_write_palette_bad_transparency@  ó   
ýz(Test.test_write_palette_bad_transparencyc                 C   s6   ddgddgg}t jdd�}|  t j|jtƒ |¡ dS )z'
        Wrong number of rows.
        r   rÍ   rq   r   )r)   rS   r8  N)r   r   r=  r¡  r   r   r:  r&   r&   r'   Útest_wrong_rowsJ  s   üzTest.test_wrong_rowsc              	   C   rù  )	z*Palette with fractions should raise error.)r   r   r   gÍÌÌÌÌÌì?r   r   rS   rK   r)   r   Nrå  r÷  r&   r&   r'   Útest_write_palette_bad_fractionV  rû  z$Test.test_write_palette_bad_fractionc                 C   ó   | j tjtjdddtd� dS )z0Palette is incompatible with multiple bitdepths.rS   rK   rë  r   Nrõ  rE   r&   r&   r'   Útest_palette_bitdepths`  ó
   
ýzTest.test_palette_bitdepthsc                 C   rþ  )z,Palette is incompatible with some bitdepths.rS   rK   rM   r   Nrõ  rE   r&   r&   r'   Útest_palette_bitdepth_wrongg  r   z Test.test_palette_bitdepth_wrongc                 C   ó   | j tjtjddtdd� dS )z(Palette is incompatible with transarent.rS   rK   )rO   )r€   rÃ   Nrõ  rE   r&   r&   r'   Útest_palette_transparentn  r   zTest.test_palette_transparentc                 C   r  )z#Palette is incompatible with alpha.rS   rK   T)r€   ry   Nrõ  rE   r&   r&   r'   Útest_palette_alphau  r   zTest.test_palette_alphac                 C   r  )z'Palette is incompatible with greyscale.rS   rK   T)r€   rV   Nrõ  rE   r&   r&   r'   Útest_palette_greyscale|  r   zTest.test_palette_greyscalec                 C   s   |   tjtj¡ dS )z0Invoking Writer with no args should raise error.Nrå  rE   r&   r&   r'   Útest_writer_noargsƒ  s   zTest.test_writer_noargsc                 C   ó   |   tjtjdd¡ dS )z2Invoking Writer with bad width should raise error.r   rK   Nrå  rE   r&   r&   r'   Útest_writer_width_bad‡  ó   zTest.test_writer_width_badc                 C   r  )z3Invoking Writer with bad height should raise error.éüÿÿÿrK   Nrå  rE   r&   r&   r'   Útest_writer_height_bad‹  r	  zTest.test_writer_height_badc                 C   r  )z2Invoking Writer with big width should raise error.ì        rK   Nrå  rE   r&   r&   r'   Útest_writer_width_big�  r	  zTest.test_writer_width_bigc                 C   r  )z3Invoking Writer with big height should raise error.rK   r  Nrå  rE   r&   r&   r'   Útest_writer_height_big“  r	  zTest.test_writer_height_bigc                 C   sl   g }t t d¡ƒD ]}t |tj¡sq	t |¡}| ||f¡ q	dd„ |D ƒ}| jt|ƒdkd| d� d S )Nztest/*c                 S   s   g | ]}|d  r|‘qS )rS   r&   )r[   Úrunr&   r&   r'   r„   ¡  s    z&Test.test_test_dir.<locals>.<listcomp>r   z	%r failed)Úmsg)	ÚsortedÚglobr   ÚaccessÚX_OKÚsystemÚappendrë   r6   )rF   ÚrunsÚpathÚstatusÚfailed_runsr&   r&   r'   Útest_test_dir™  s   


þzTest.test_test_dirN)kr=   r>   r?   rE  r@   rG   rJ   rL   rN   rP   rR   rD   rv   r~   rŠ   r”   r›   r£   r©   r«   r¯   r´   r½   rÌ   rÎ   rÓ   rÙ   rÛ   rß   râ   rã   rá   rí   rõ   rö   rø   rú   rý   rþ   r  r  r  r  r)  r,  r7  r;  r?  rA  rI  rL  rO  rT  rV  r_  rf  rh  rj  rl  rs  rw  rz  r†  r‰  rŠ  r’  r•  r—  r›  r�  r¢  r¤  r¥  r¦  r±  r´  r·  r¸  r½  rÆ  rÞ  rã  rä  ræ  rè  rê  rí  rð  rñ  rò  ró  rö  rø  rú  rü  rý  rÿ  r  r  r  r  r  r  r  r  r  r  r&   r&   r&   r'   r<   a   sÐ    		


!										


r<   c                    sP   t jtjd�‰tƒ }‡ ‡fdd„}t  ||ƒ ¡ t j| ¡ d�‰tˆ ¡ d ƒS )z­Create a temporary PNG file by modifying the chunks of
    an existing one, then read that temporary file.
    Each chunk is passed through the function `modify_chunk`.
    r`   c                  3   s   � ˆ  ¡ D ]} ˆ | ƒV  qd S rY   r  )rZ  ©Úmodify_chunkrm   r&   r'   Ú	newchunks°  s   €ÿz%read_modify_chunks.<locals>.newchunksr)   )	r   re   r—   Úbasn0g01r   r'  r   rh   rf   )r  r×   r  r&   r  r'   r^  §  s   r^  c                 C   s   t tt| ƒg| Ž ƒS rY   )rh   ré   Úiter)r9   rk   r&   r&   r'   rˆ  ¹  s   rˆ  Ú__main__)Ú
__future__r   r  ri   r   r7   r   Úunittestro  r   Úior   rª  ÚImportErrorr   r—   r†   r(   r4   r;   ÚTestCaser<   r^  rˆ  r=   Úmainr&   r&   r&   r'   Ú<module>   sF   ÿ
        Nÿ