o
    PZŽhY\  ã                   @   s  d Z ddlZejsdZeeƒ‚ddlZddlmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZ ddlZddlZddlZddlmZ ddgZzej W nI ey   e ej ¡Z!e ej"¡e!krnej"e_n-e ej#¡e!kr{ej#e_n e ej$¡e!krˆej$e_ne ej%¡e!kr•ej%e_ne&de! ƒ‚Y nw d	d
„ Z'G dd„ dej(j)ƒZ*G dd„ dƒZ+G dd„ dej,ƒZ-e.dkrÆe /¡  dS dS )aR  Module pygame.tests.test_utils.array

Export the Exporter and Importer classes.

Class Exporter has configurable shape and strides. Exporter objects
provide a convenient target for unit tests on Pygame objects and functions
that import a new buffer interface.

Class Importer imports a buffer interface with the given PyBUF_* flags.
It returns NULL Py_buffer fields as None. The shape, strides, and suboffsets
arrays are returned as tuples of ints. All Py_buffer field properties are
read-only. This class is useful in comparing exported buffer interfaces
with the actual request. The simular Python builtin memoryview currently
does not support configurable PyBUF_* flags.

This module contains its own unit tests. When Pygame is installed, these tests
can be run with the following command line statement:

python -m pygame.tests.test_utils.array

é    Nz:This Pygame build does not support the new buffer protocol)ÚPyBUF_SIMPLEÚPyBUF_FORMATÚPyBUF_NDÚPyBUF_WRITABLEÚPyBUF_STRIDESÚPyBUF_C_CONTIGUOUSÚPyBUF_F_CONTIGUOUSÚPyBUF_ANY_CONTIGUOUSÚPyBUF_INDIRECTÚPyBUF_STRIDEDÚPyBUF_STRIDED_ROÚPyBUF_RECORDSÚPyBUF_RECORDS_ROÚ
PyBUF_FULLÚPyBUF_FULL_ROÚPyBUF_CONTIGÚPyBUF_CONTIG_RO)ÚreduceÚExporterÚImporterz*Cannot set c_ssize_t: sizeof(void *) is %ic                 C   s   t | ƒS ©N)Úproperty)Úfn© r   úO/var/www/auris/lib/python3.10/site-packages/pygame/tests/test_utils/buftools.pyÚ	_prop_getH   s   r   c                   @   s¬  e Zd ZdZddddddddddd	d
ddœZi dej“dej“dej“dej	“dej	“dej
“dej“dej	“dej“dej“dej“dej“dej“dej“dej“dej“dej“i dej“dej“d ej“d!ej“d"ej“d#ej“d$ej“d%ej“d&ej“d'ej“d(ejd) “d*ejd+ “d,ejd- “d.ejd/ “d0ejd1 “d2ejd3 “d4ejd5 “¥ejd6 ejd7 d8œ¥ZdFd:d;„Zd<d=„ Zd>d?„ Z d@dA„ Z!dBdC„ Z"dDdE„ Z#d9S )Gr   zŠAn object that exports a multi-dimension new buffer interface

    The only array operation this type supports is to export a buffer.
    Ú ú=Ú2Ú3Ú4Ú5Ú6Ú7Ú8Ú9)ú@r   ú<ú>ú!r   r   r    r!   r"   r#   r$   r%   ÚcÚbÚBú=cú=bú=Bú?ú=?ÚhÚHú=hú=HÚiÚIú=iú=IÚlÚLú=lú=LÚqÚQú=qú=QÚfÚdÚPÚxé   Ú2xé   Ú3xé   Ú4xé   Ú5xé   Ú6xé   Ú7xé   é   é	   )Ú8xÚ9xNc                 C   s@  |d u rd}|d u rd}d}d}d}|t |ƒk r/z| j||  }|d7 }W n	 ty.   Y nw |t |ƒk r?|| dkr?|d7 }|t |ƒd krK|| }|d u rkzt | j||  ¡}W n tyj   td| d ƒ‚w t|ƒ| _	|| _
t | d	¡¡| _t |ƒ| _|| _ttj|dƒ| j | _ t|ƒ| _tj| j | jŽ | _|d u rÔtj| j ƒ | _|| j| jd < t| jd dd
ƒD ]}| j| | j|  | j|d < q»t| jƒ| _nt |ƒ| jkrët|ƒ| _tj| j | jŽ | _ntdƒ‚tdd„ t| j| jƒD ƒƒ}	|	| _tj|	 ƒ | _tdd„ t| j| jƒD ƒƒ}
t  | j¡|
 | _!d S )Nr,   Fr   r   rF   Ú1zUnknown item format 'ú'Úlatin_1éÿÿÿÿz'Mismatch in length of strides and shapec                 s   s     | ]\}}|t |ƒ V  qd S r   ©Úabs©Ú.0rC   Úsr   r   r   Ú	<genexpr>²   s   € z$Exporter.__init__.<locals>.<genexpr>c                 s   s,    | ]\}}|d k r|d t |ƒ V  qdS )r   rF   Nr[   r]   r   r   r   r`   µ   s   € "ÿ)"ÚlenÚprefixesÚLookupErrorÚctypesÚsizeofÚtypesÚKeyErrorÚ
ValueErrorÚboolÚreadonlyÚformatZcreate_string_bufferÚencodeÚ_formatÚndimÚitemsizer   ÚoperatorÚmulÚtupleÚshapeÚ	c_ssize_tÚ_shapeÚ_stridesÚrangeÚstridesÚmaxÚzipÚbuflenÚc_ubyteÚ_bufÚsumÚ	addressofÚbuf)Úselfrs   rk   rx   rj   ro   ÚprefixÚtypecoder6   r{   Úoffsetr   r   r   Ú__init__ˆ   sb   ÿÿ


 
ÿzExporter.__init__c                 C   s   t  | j¡| jd fS ©Nr   )rd   r   Úbufferrs   ©r   r   r   r   Úbuffer_infoº   s   zExporter.buffer_infoc                 C   s    t  | jt  t j¡¡d| j… S r†   )rd   Úcastr‡   ÚPOINTERÚc_charÚ_lenrˆ   r   r   r   Útobytes½   s    zExporter.tobytesc                 C   s
   | j d S r†   )rs   rˆ   r   r   r   Ú__len__À   s   
zExporter.__len__c                 C   sp  ddl m} |t@ tkr| jrtdƒ‚|t@ tkr"|  d¡s"tdƒ‚|t@ tkr1|  d¡s1tdƒ‚|t@ tkr@|  d¡s@td	ƒ‚| j	|_	| j|_| j
|_
|tB tkrVd|_n| j|_| j|_|t@ tkrk|| jƒ|_nd |_|t@ tkr{|| jƒ|_n|  d¡r„d |_n	td
| j› dƒ‚|t@ tkr›t  | j¡|_n|jd u s¥|  d¡r©d |_ntdƒ‚d |_d |_| |_d S )Nr   )r   zbuffer is read-onlyÚCzdata is not C contiguousÚFzdata is not F contiguousÚAzdata is not contiguouszshape required for z dimensional dataz+strides required for none C contiguous data)rd   r   r   rj   ÚBufferErrorr   Úis_contiguousr   r	   r€   ra   rn   ro   r   rm   rk   r   ru   rs   r   rv   rx   Ú
suboffsetsÚinternalÚobj)r   ÚviewÚflagsr   r   r   r   Ú_get_bufferÃ   sX   þþþþþþ

zExporter._get_bufferc                 C   s¸   |dv r-| j d | jkr-t| jd ddƒD ]}| j |d  | j| | j |  kr* nqdS |dv rZ| j d | jkrZtd| jd ƒD ]}| j |d  | j| | j |  krW dS qAdS dS )NÚCArZ   rF   r   TZFAF)rx   ro   rw   rn   rs   )r   Úfortranr6   r   r   r   r”   ð   s    "ÿ"üzExporter.is_contiguous)NNNN)$Ú__name__Ú
__module__Ú__qualname__Ú__doc__rb   rd   rŒ   Zc_byter|   Zc_int8Zc_uint8Úc_boolÚc_shortZc_ushortZc_int16Zc_uint16Úc_intZc_uintZc_int32Zc_uint32Úc_longZc_ulongÚ
c_longlongZc_ulonglongZc_int64Zc_uint64Úc_floatÚc_doubleÚc_void_prf   r…   r‰   rŽ   r   rš   r”   r   r   r   r   r   L   s¼    óÿþýüûúùø	÷
öõôóòñðïîíìëêéèçæå
ä
ã
â
á
 à
!ß
"Þ#Ü
'2-c                   @   s¤   e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZedd	„ ƒZed
d„ ƒZ	edd„ ƒZ
edd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZdd„ ZdS )r   z An object that imports a new buffer interface

    The fields of the Py_buffer C struct are exposed by identically
    named Importer read-only properties.
    c                 C   s   t j ¡ | _| j ||¡ d S r   )ÚpygameÚ	newbufferZ	Py_bufferÚ_viewÚ
get_buffer)r   r—   r™   r   r   r   r…   	  s   zImporter.__init__c                 C   ó   | j jS )z$return object or None for NULL field)r«   r—   rˆ   r   r   r   r—     ó   zImporter.objc                 C   r­   ©z!return int or None for NULL field)r«   r€   rˆ   r   r   r   r€     r®   zImporter.bufc                 C   r­   ©z
return int)r«   ra   rˆ   r   r   r   ra     r®   zImporter.lenc                 C   r­   )zreturn bool)r«   rj   rˆ   r   r   r   rj     r®   zImporter.readonlyc                 C   s*   | j j}|du r
dS t |tj¡j d¡S )z#return bytes or None for NULL fieldNÚascii)r«   rk   rd   rŠ   Úc_char_pÚvalueÚdecode)r   Zformat_addrr   r   r   rk   !  s   zImporter.formatc                 C   r­   r°   )r«   ro   rˆ   r   r   r   ro   )  r®   zImporter.itemsizec                 C   r­   r°   )r«   rn   rˆ   r   r   r   rn   .  r®   zImporter.ndimc                 C   ó   |   | jj¡S ©z'return int tuple or None for NULL field)Ú_to_ssize_tupler«   rs   rˆ   r   r   r   rs   3  ó   zImporter.shapec                 C   rµ   r¶   )r·   r«   rx   rˆ   r   r   r   rx   8  r¸   zImporter.stridesc                 C   rµ   r¶   )r·   r«   r•   rˆ   r   r   r   r•   =  r¸   zImporter.suboffsetsc                 C   r­   r¯   )r«   r–   rˆ   r   r   r   r–   B  r®   zImporter.internalc                 C   s>   ddl m}m}m} |d u rd S t||||ƒƒd| jj… ƒS )Nr   )rŠ   r‹   rt   )rd   rŠ   r‹   rt   rr   r«   rn   )r   ÚaddrrŠ   r‹   rt   r   r   r   r·   G  s   zImporter._to_ssize_tupleN)r   rž   rŸ   r    r…   r   r—   r€   ra   rj   rk   ro   rn   rs   rx   r•   r–   r·   r   r   r   r   r     s4    










c                   @   s\   e Zd Z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d„ZdS )ÚExporterTestzClass Exporter unit testsc           
   	   C   sº  t  t j¡}t  t j¡}t  t j¡}t  t j¡}t  t j¡}t  t j¡}t  t j¡}t  t j	¡}t  t j
¡}	|  ddddddd¡ |  ddddddd¡ |  ddddddd¡ |  ddd|f|||¡ |  ddd|f|||¡ |  ddd|f|||¡ |  ddd	|f|||¡ |  ddd
|f|||¡ |  ddd|f|||¡ |  ddd|f|||¡ |  ddd|f|||¡ |  ddd|f|||¡ |  ddd|f|||¡ |  ddd|f|||¡ |  ddddddd¡ |  ddd|f|||¡ |  ddd|	f|	|	|	¡ |  ddddddd¡ |  ddddddd¡ |  ddd|f|||¡ |  ddd|f|||¡ |  ddd|f|||¡ |  ddd|f|||¡ |  ddd|f|||¡ |  ddd|f|||¡ |  ddd|f|||¡ |  ddd|f|||¡ |  ddd|f|||¡ |  ddd|f|||¡ |  ddd |f|||¡ |  ddd!|	f|	|	|	¡ |  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'¡ |  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+¡ |  ddd.d*d+d+d+¡ |  ddd/d0d1d1d1¡ |  ddd2d0d1d1d1¡ |  ddd3dddd¡ |  ddd4d&d'd'd'¡ |  ddd5d&d'd'd'¡ |  ddd6d&d'd'd'¡ |  ddd7d0d1d1d1¡ |  ddd8d0d1d1d1¡ |  ddd9d0d1d1d1¡ |  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+¡ |  ddd@dAdBdBdB¡ |  dddCdDdEdEdE¡ |  dddFdGdHdHdH¡ |  dddId0d1d1d1¡ |  dddJdKdLdLdL¡ |  dddMd&d'd'd'¡ |  dddNd&d'd'd'¡ |  ttdOdP¡ |  ttdOdQ¡ |  ttdOdR¡ |  ttdOdS¡ |  ttdOdT¡ |  ttdOdU¡ |  ttdOdV¡ |  ttdOdW¡ |  ttdOdX¡ |  ttdOdY¡ |  ttdOdZ¡ |  ttdOd[¡ |  ttdOd\¡ |  ttdOd]¡ |  ttdOd^¡ d S )_Nr   ©rF   r,   rF   r+   r*   r2   r3   r6   r7   r:   r;   r>   r?   rB   rC   rE   rD   r0   z@bz@Bz@cz@hz@Hz@iz@Iz@lz@Lz@qz@Qz@fz@dz@?r.   r/   r-   r4   ©rH   rH   r5   r8   )rL   rL   r9   r<   r=   r@   ©rS   rS   rA   r1   z<hz>hz!hz<qz>qz!qZ1xrG   rI   )rJ   rJ   rK   rM   )rN   rN   rO   )rP   rP   rQ   )rR   rR   rU   rV   )rT   rT   Z1hz=1h)rH   rF   r   ÚWz^Qz=Wz=fz=dz<fz<dz>fz>dz!fz!dÚ0xZ11xÚBB)rd   re   rŒ   r¢   r£   r¤   r¥   r¦   r§   r¨   r¡   Ú
check_argsÚassertRaisesrh   r   )
r   Zchar_szZshort_szZint_szZlong_szZlonglong_szZfloat_szZ	double_szZvoidp_szZbool_szr   r   r   Útest_formatsR  s¸   ÿÿÿÿzExporterTest.test_formatsc              	   C   sà   |   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¡ |   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¡ |   ddddddd¡ |   ddddddd¡ d S )NrF   ©é
   r4   r¼   é   rH   )rN   rJ   )rP   rH   é   )rR   rJ   rN   )rÇ   rÅ   rH   éÒ   ©é   rN   é   rJ   ©iJ  éB   rP   rH   éÂ  rJ   )rH   é   é*   )rH   é   é0   éð   ©i¸  éX   rS   rH   éX  )rR   rN   rI   )é   rJ   éi   )rJ   é   )rJ   é   éx   ©rÁ   rˆ   r   r   r   Útest_strides±  s   zExporterTest.test_stridesc                 C   sB   t dddd}|  |j¡ t|tƒ}|  tt|t¡ t|tƒ}d S )Nr¼   r2   T)rj   )r   Ú
assertTruerj   r   r   rÂ   r“   r   ©r   Úar+   r   r   r   Útest_readonly½  s
   
zExporterTest.test_readonlyc                 C   sœ  t ddƒ}|  | d¡¡ |  | d¡¡ |  | d¡¡ t ddƒ}|  | d¡¡ |  | d¡¡ |  | d¡¡ t dddƒ}|  | d¡¡ |  | d¡¡ |  | d¡¡ t ddd	ƒ}|  | d¡¡ |  | d¡¡ |  | d¡¡ t ddd
ƒ}|  | d¡¡ |  | d¡¡ |  | d¡¡ t dddƒ}|  | d¡¡ t dddƒ}|  | d¡¡ t dddƒ}|  | d¡¡ t dddƒ}|  | d¡¡ d S )NrÄ   r4   r   r‘   r’   )rÅ   rL   rÉ   rÌ   )rH   rÆ   )rH   é   é‚   i–  )rH   rË   rP   rL   )i@  rÒ   rS   rH   )rH   rL   rÒ   i   )rJ   rH   rH   )rÑ   rS   rL   )rL   é   rÚ   )r   rÞ   r”   ÚassertFalse©r   rà   r   r   r   Útest_is_contiguousÄ  s8   

zExporterTest.test_is_contiguousc                 C   sv  t ddƒ}t|tƒ}|  |j|u ¡ |  |jd u ¡ |  |j|j¡ |  |j|j¡ |  |j	d u ¡ |  |j
d u ¡ |  |jd u ¡ |  |jd u ¡ |  |j¡ t|tƒ}|  |j|u ¡ |  |jd u ¡ |  |j|j¡ |  |j|j¡ |  |j	d u ¡ |  |j
d u ¡ |  |jd u ¡ |  |jd u ¡ |  |j¡ t|tƒ}|  |j|u ¡ |  |jd u ¡ |  |j|j¡ |  |j|j¡ |  |j	|j	¡ |  |j
d u ¡ |  |jd u ¡ |  |jd u ¡ |  |j¡ t dddƒ}t|tƒ}|  |j|u ¡ |  |jd u ¡ |  |j|j¡ |  |j|j¡ |  |j	|j	¡ |  |j
|j
¡ |  |jd u ¡ |  |jd u ¡ |  |j¡ t|tƒ}|  |j|u ¡ |  |jd¡ |  |j|j¡ |  |j|j¡ |  |j	|j	¡ |  |j
|j
¡ |  |jd u ¡ |  |jd u ¡ |  |j¡ |  tt|t¡ |  tt|t¡ |  tt|t¡ |  tt|t¡ |  tt|t¡ |  tt|t¡ |  tt|t¡ d S )N)rÅ   rH   rC   )rN   rÅ   r4   )rÚ   rH   )r   r   r   rÞ   r—   rk   ÚassertEqualra   ro   rs   rx   r•   r–   rå   rj   r   r   r   r   rÂ   r“   r   r   r	   r   rß   r   r   r   Útest_PyBUF_flagsâ  sv   





zExporterTest.test_PyBUF_flagsc              
   C   s|   |   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dddd¡ |   dddddddd¡ d S )NrJ   )rJ   rN   rL   r,   )rÆ   rL   rZ   é<   rF   )rJ   rN   rJ   é-   rH   )rÆ   éüÿÿÿrF   rÑ   )iìÿÿÿrì   rZ   é;   é:   rÜ   rˆ   r   r   r   Útest_negative_strides  s
   z"ExporterTest.test_negative_stridesc                 C   sp  t dddƒ}|  |jd¡ |  |jd¡ |  |j¡ |  |jd¡ |  |jd¡ |  |jd¡ |  |j	d¡ |  |j
d¡ |  |jt |j¡¡ t dƒ}|  |jd	¡ |  |jd	¡ |  |j¡ |  |jd¡ |  |jd
¡ |  t|jtƒ¡ |  |jd¡ |  |j	d¡ |  |j
d¡ t g d¢dg d¢ƒ}|  t|jtƒ¡ |  t|jtƒ¡ |  |jd¡ |  |jd¡ d S )NrÉ   r4   rÔ   rL   rH   rÎ   rÖ   r½   rF   r,   r»   rS   )r   rè   rn   ro   rå   rj   rs   rk   rx   ra   r{   r€   rd   r   r}   rÞ   Ú
isinstancerr   ræ   r   r   r   Útest_attributes&  s2   zExporterTest.test_attributesc                 C   sˆ   t dddd}t|tƒ}|  |jd¡ |  |jd¡ |  |jd¡ t dddd}t|tƒ}|  |jd¡ |  |jd¡ |  |jd¡ d S )	N)rL   rN   r,   rS   )rk   ro   )é(   rS   ZweirdrN   )é   rN   )r   r   r   rè   ro   rk   rx   )r   ÚexpÚimpr   r   r   Útest_itemsizeA  s   

zExporterTest.test_itemsizer   c	                 C   s¸   |d@ r|nd }	|d@ r|nd }
t ||	|
ƒ}|  |j|¡ |  |jt |j¡| ¡ t|tƒ}|  |j|j¡ |  |j	|¡ |  |j
|¡ |  |j|¡ |  |j|¡ |  |j|¡ d S )NrF   rH   )r   rè   r{   r€   rd   r   r}   r   r   ra   rk   ro   rs   rx   )r   Z
call_flagsrs   rk   rx   ÚlengthÚbufsizero   r„   Z
format_argZstrides_argrà   Úmr   r   r   rÁ   M  s   
zExporterTest.check_argsN)r   )r   rž   rŸ   r    rÃ   rÝ   rá   rç   ré   rï   rñ   rö   rÁ   r   r   r   r   rº   O  s    _=ÿrº   Ú__main__)0r    r©   ZHAVE_NEWBUFZemsgÚImportErrorZpygame.newbufferr   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   Zunittestrd   rp   Ú	functoolsr   Ú__all__rt   ÚAttributeErrorre   r¨   Z	void_p_szr¢   r£   r¤   r¥   ÚRuntimeErrorr   rª   ZBufferMixinr   r   ZTestCaserº   r   Úmainr   r   r   r   Ú<module>   sJ    L




€õ 7M  ÿ