o
    tVÆgY\  ã                   @   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   úT/home/ubuntu/.local/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ÚformatÚ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)Úselfrt   rk   ry   rj   rp   ÚprefixÚtypecoder6   r|   Úoffsetr   r   r   Ú__init__ˆ   sb   ÿÿ


 
ÿzExporter.__init__c                 C   s   t  | j¡| jd fS ©Nr   )rd   r€   Úbufferrt   ©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‡   )rt   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   ro   rp   r   rn   rk   r   rv   rt   r   rw   ry   Ú
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   TÚFAF)ry   rp   rx   ro   rt   )r‚   Úfortranr6   r   r   r   r•   ð   s    "ÿ"üzExporter.is_contiguous)NNNN)$Ú__name__Ú
__module__Ú__qualname__Ú__doc__rb   rd   r   Úc_byter}   Úc_int8Úc_uint8Úc_boolÚc_shortÚc_ushortÚc_int16Úc_uint16Úc_intÚc_uintÚc_int32Úc_uint32Úc_longÚc_ulongÚ
c_longlongÚc_ulonglongÚc_int64Ú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Ú	newbufferÚ	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‚   Úformat_addrr   r   r   rk   !  s   zImporter.formatc                 C   r½   rÀ   )r»   rp   r‰   r   r   r   rp   )  r¾   zImporter.itemsizec                 C   r½   rÀ   )r»   ro   r‰   r   r   r   ro   .  r¾   zImporter.ndimc                 C   ó   |   | jj¡S ©z'return int tuple or None for NULL field)Ú_to_ssize_tupler»   rt   r‰   r   r   r   rt   3  ó   zImporter.shapec                 C   rÆ   rÇ   )rÈ   r»   ry   r‰   r   r   r   ry   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Œ   ru   )rd   r‹   rŒ   ru   rs   r»   ro   )r‚   Úaddrr‹   rŒ   ru   r   r   r   rÈ   G  s   zImporter._to_ssize_tupleN)rŸ   r    r¡   r¢   r†   r   r˜   r   ra   rj   rk   rp   ro   rt   ry   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!qÚ1xrG   rI   )rJ   rJ   rK   rM   )rN   rN   rO   )rP   rP   rQ   )rR   rR   rU   rV   )rT   rT   Ú1hz=1h)rH   rF   r   ÚWz^Qz=Wz=fz=dz<fz<dz>fz>dz!fz!dÚ0xÚ11xÚBB)rd   re   r   r§   r«   r¯   r±   rµ   r¶   r·   r¦   Ú
check_argsÚassertRaisesrh   r   )
r‚   Úchar_szÚshort_szÚint_szÚlong_szÚlonglong_szÚfloat_szÚ	double_szÚvoidp_szÚ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   rp   rt   ry   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  ro   rp   r  rj   rt   rk   ry   ra   r|   r   rd   r€   r~   rû   Ú
isinstancers   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   rp   )é(   rS   ÚweirdrN   )é   rN   )r   r   r   r  rp   rk   ry   )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   rp   rt   ry   )r‚   Ú
call_flagsrt   rk   ry   ÚlengthÚbufsizerp   r…   Ú
format_argÚ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¸   ÚHAVE_NEWBUFÚemsgÚImportErrorÚpygame.newbufferr   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   Úunittestrd   rq   Ú	functoolsr   Ú__all__ru   ÚAttributeErrorre   r·   Ú	void_p_szr§   r«   r¯   r±   ÚRuntimeErrorr   r¹   ÚBufferMixinr   r   ÚTestCaserË   rŸ   Úmainr   r   r   r   Ú<module>   sJ    L




€õ 7M  ÿ