a
    ze"G                     @   sP  d 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	Z	ddl
Z
G dd dZG dd deZG dd deZG d	d
 d
ZG dd dZG dd dZG dd dejeeZG dd dejeeZG dd dejeeZG dd dejeeZG dd dejeeZG dd dejeeZG dd dejZedkrLe  dS )zUnit tests for the memoryview

   Some tests are in test_bytes. Many tests that require _testbuffer.ndarray
   are in test_buffer.
    Nc                   @   s   e Zd ZdZedd Ze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d0d1 Zd2d3 Zd4d5 Zd6d7 Zd8S )9AbstractMemoryTests   abcdefc                 C   s   | j S N)source_bytesself r   */usr/lib/python3.9/test/test_memoryview.py_source   s    zAbstractMemoryTests._sourcec                 C   s   t d | j| jgS r   )filterro_typerw_typer   r   r   r	   _types   s    zAbstractMemoryTests._typesc                    s$  || j }t|}| | |  d td |  d t |  d td |  d td |  d td | t	 fdd | t	 fd	d | t	 fd
d | t	 fdd | t
 fdd | t
 fdd | t
 fdd d  | t|| d S )Nr      a      fic                      s    d S )N   r   r   mr   r	   <lambda>'       z=AbstractMemoryTests.check_getitem_with_type.<locals>.<lambda>c                      s    d S )Nr   r   r   r   r	   r   (   r   c                      s
    t j S r   sysmaxsizer   r   r   r	   r   )   r   c                      s    t j  S r   r   r   r   r   r	   r   *   r   c                      s    d  S r   r   r   r   r   r	   r   ,   r   c                      s    d S )N        r   r   r   r   r	   r   -   r   c                      s    d S )Nar   r   r   r   r	   r   .   r   )r
   r   getrefcount_viewassertEqualordassertIsInstanceintassertRaises
IndexError	TypeError)r   tpboldrefcountr   r   r	   check_getitem_with_type   s"    


z+AbstractMemoryTests.check_getitem_with_typec                 C   s   | j D ]}| | qd S r   )r   r*   )r   r'   r   r   r	   test_getitem2   s    
z AbstractMemoryTests.test_getitemc                    sJ   | j D ]>}|| j}| | | t  fddtt D  qd S )Nc                    s   g | ]} | qS r   r   ).0ir   r   r	   
<listcomp>:   r   z1AbstractMemoryTests.test_iter.<locals>.<listcomp>)r   r
   r   r    listrangelen)r   r'   r(   r   r   r	   	test_iter6   s    


zAbstractMemoryTests.test_iterc                    s   | j s| d |  | j}t|}| |  fdd}| t|d | t|d | t|td d  | 	t|| d S )Nno read-only type to testc                    s   |  d< d S )Nr   r   )valuer   r   r	   setitemB   s    z:AbstractMemoryTests.test_setitem_readonly.<locals>.setitemr   A   )
r   skipTestr
   r   r   r   r$   r&   
memoryviewr    )r   r(   r)   r5   r   r   r	   test_setitem_readonly<   s    


z)AbstractMemoryTests.test_setitem_readonlyc              	      s  | j s| d | j |  | j}t|}| | t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  fdd}| t	|dd | t	|dd | t	|tj
d | t	|tj
 d | t|dd | t|dd | t|tddddfd | t|dtdddfd | t|dd | t|dd tdddtdddf}| t||d  jdkr tnt}| ||dd | ||dd | t|tddd | t|tddd d  | t|| d S )Nno writable type to test   1r   s   1bcdef   0   s   0bcdefs   12   s   012defr   r      r   s   cdedefs   ababcfc                    s   | | < d S r   r   )keyr4   r   r'   r   r	   r5   c   s    z:AbstractMemoryTests.test_setitem_writable.<locals>.setitemr   r   r   r   )r   r   cs   ab)r   r7   r
   r   r   r   r!   _check_contentsr$   r%   r   r&   sliceNotImplementedErrorformat
ValueErrorr    )r   r(   r)   r5   Zslicesexcr   rA   r	   test_setitem_writableJ   sR    


z)AbstractMemoryTests.test_setitem_writablec              	   C   s   | j D ]|}|| j}| |}| t |d= W d    n1 sD0    Y  | t |dd= W d    q1 sx0    Y  qd S )Nr=      )r   r
   r   r$   r&   r   r'   r(   r   r   r   r	   test_delitem~   s    


$z AbstractMemoryTests.test_delitemc                    sX    j D ]L} | j}| }d fdddD } ||  |t qd S )Nr   c                 3   s   | ]}  t|gV  qd S r   )getitem_typebytes)r,   rB   r   r   r	   	<genexpr>   s   z3AbstractMemoryTests.test_tobytes.<locals>.<genexpr>r   )r   r   r
   tobytesjoinr    r"   rN   )r   r'   r   r(   Zexpectedr   r   r	   test_tobytes   s    
z AbstractMemoryTests.test_tobytesc                 C   s8   | j D ],}| || j}| }| |td qd S )Nr   )r   r   r
   tolistr    r/   )r   r'   r   lr   r   r	   test_tolist   s    
zAbstractMemoryTests.test_tolistc                    s  | j D ]}| || j| j D ]p}| |dk | |dk | |dk | |dk | |dk | |dk q"| k | d d  k | dd d d  k | dd k | dk | dk | dk | dk dfD ]^ | t fdd	 | t fd
d	 | t fdd	 | t fdd	 q,qd S )Nr   s   abcdes   abcde1r   r   r   Zabcdefc                      s    k S r   r   r   rB   r   r   r	   r      r   z2AbstractMemoryTests.test_compare.<locals>.<lambda>c                      s    kS r   r   r   rV   r   r	   r      r   c                      s    kS r   r   r   rV   r   r	   r      r   c                      s    kS r   r   r   rV   r   r	   r      r   )r   r   r
   
assertTrueZassertFalser$   r&   )r   r'   Ztp_compr   rV   r	   test_compare   s,    
z AbstractMemoryTests.test_comparec                 C   s   |  || j}| |j| j | |j| j | |jd | |jd | t|d | |j| jf | |j	d |S )Nr=   )r   r   r   )
r   r
   r    rF   itemsizendimshaper1   strides
suboffsets)r   r'   r   r   r   r	   check_attributes_with_type   s    z.AbstractMemoryTests.check_attributes_with_typec                 C   s.   | j s| d | | j }| |jd d S )Nr3   T)r   r7   r^   r    readonlyr   r   r   r   r	   test_attributes_readonly   s    
z,AbstractMemoryTests.test_attributes_readonlyc                 C   s.   | j s| d | | j }| |jd d S )Nr:   F)r   r7   r^   r    r_   r`   r   r   r	   test_attributes_writable   s    
z,AbstractMemoryTests.test_attributes_writablec                 C   s~   | j D ]r}|| j}t|}| |}t|}t|d}| |||d | t|| d }| t|| qd S )Nzutf-8)	r   r
   r   r   r   strrC   encoder    )r   r'   r(   r)   r   Zoldviewrefcountsr   r   r	   test_getbuffer   s    





z"AbstractMemoryTests.test_getbufferc           	      C   s   | j D ]}t|tsqG dd d}G dd d|}G dd d}||d}| |}| }||_||_t|}d  } }}t	  | 
| d u |  ||d}| }||_||_t|}d  }}t	  | 
| d u |  qd S )Nc                   @   s   e Zd Zdd ZdS )z+AbstractMemoryTests.test_gc.<locals>.MyViewc                 S   s   t || _d S r   )r8   r   )r   baser   r   r	   __init__   s    z4AbstractMemoryTests.test_gc.<locals>.MyView.__init__N)__name__
__module____qualname__rh   r   r   r   r	   MyView   s   rl   c                   @   s   e Zd ZdS )z-AbstractMemoryTests.test_gc.<locals>.MySourceNri   rj   rk   r   r   r   r	   MySource   s   rn   c                   @   s   e Zd ZdS )z-AbstractMemoryTests.test_gc.<locals>.MyObjectNrm   r   r   r   r	   MyObject   s   ro      abc)r   
isinstancetyper   r   oweakrefrefgcZcollectrW   x)	r   r'   rl   rn   ro   r(   r   rs   wrr   r   r	   test_gc   s.    




zAbstractMemoryTests.test_gcc              	   C   s  |  td}| t| W d    n1 s.0    Y  | |  W d    n1 sZ0    Y  | |  W d    n1 s0    Y  | |d  W d    n1 s0    Y  | d|d< W d    n1 s0    Y  | t| W d    n1 s0    Y  | |j W d    n1 s80    Y  | |j W d    n1 sd0    Y  | |j W d    n1 s0    Y  | |j	 W d    n1 s0    Y  | |j
 W d    n1 s0    Y  | |j W d    n1 s0    Y  |6 | W d    n1 s@0    Y  W d    n1 s`0    Y  | dt| | dt| | || | |t|| j | ||| j d S )NZreleasedr      xzreleased memory)ZassertRaisesRegexrG   rN   rP   rS   r1   rF   rY   rZ   r_   r[   r\   ZassertInrc   reprr    ZassertNotEqualr8   r
   )r   r   r'   checkr   r   r	   _check_released   s*    ,,,,,.,,,,,,@z#AbstractMemoryTests._check_releasedc              	   C   s   | j D ]}|| j}| |}|}| || W d    n1 sD0    Y  | || | |}| |  W d    q1 s0    Y  qd S r   )r   r
   r   assertIsr}   release)r   r'   r(   r   cmr   r   r	   test_contextmanager  s    


*
z'AbstractMemoryTests.test_contextmanagerc                 C   sL   | j D ]@}|| j}| |}|  | || |  | || qd S r   )r   r
   r   r   r}   rK   r   r   r	   test_release#  s    


z AbstractMemoryTests.test_releasec                 C   sJ   | j }|d u r| d || j}| |}td}| t|j| d S )Nr3   s   ZZZZ)	r   r7   r
   r   ioBytesIOr$   r&   readinto)r   r'   r(   r   r-   r   r   r	   test_writable_readonly-  s    



z*AbstractMemoryTests.test_writable_readonlyc                 C   s   |  t| ji  d S r   )r$   r&   r   r   r   r   r	   test_getbuf_fail8  s    z$AbstractMemoryTests.test_getbuf_failc                 C   s   | j }|d u r| d || j}| |}| t|td |  | t|td | |}|  | tt| d S )Nr3   r   )	r   r7   r
   r   r    hashr   r$   rG   rK   r   r   r	   	test_hash;  s    



zAbstractMemoryTests.test_hashc                 C   s>   | j }|d u r| d || j}| |}| tt| d S )Nr:   )r   r7   r
   r   r$   rG   r   rK   r   r   r	   test_hash_writableM  s    


z&AbstractMemoryTests.test_hash_writablec                    s|   | j D ]p}|| j}| |}g  |f fdd	}t||}| | | ~tj  | | d  |  d | qd S )Nc                    s     | d S r   )append)rx   r(   Lr   r	   callback\  s    z2AbstractMemoryTests.test_weakref.<locals>.callbackr   )	r   r
   r   rt   ru   r~   testsupport
gc_collect)r   r'   r(   r   r   rx   r   r   r	   test_weakrefV  s    



z AbstractMemoryTests.test_weakrefc              	   C   sj   | j D ]^}|| j}| |}tt| }| tt|| | tt|t|d d d  qd S )Nr   )r   r
   r   r/   reversedrS   r    )r   r'   r(   r   Zaslistr   r   r	   test_reversede  s    


z!AbstractMemoryTests.test_reversedc                 C   sl   | j D ]`}|| j}| |}| }| |j | t|j | | |  |	  |  qd S r   )
r   r
   r   
toreadonlyrW   r_   r8   r    rS   r   )r   r'   r(   r   Zmmr   r   r	   test_toreadonlym  s    


z#AbstractMemoryTests.test_toreadonlyc                 C   s   t  dg d}t|}|d}|d}|dd }t|}~| |d d | |d d | |jd | |jd |d}| |d d | |d d | |jd | |jd d S )NH)   r   r   r   Br   r?   r   I)arrayr8   castr    rF   )r   r   rw   r   r(   rB   d_r   r   r	   test_issue22668x  s     


z#AbstractMemoryTests.test_issue22668N) ri   rj   rk   r   propertyr
   r   r*   r+   r2   r9   rI   rL   rR   rU   rX   r^   ra   rb   rf   ry   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r	   r      s<   

4	
&
	r   c                   @   s    e Zd ZeZeZeZdZdZ	dS )BaseBytesMemoryTestsr=   r   N)
ri   rj   rk   rN   r   	bytearrayr   rM   rY   rF   r   r   r   r	   r     s
   r   c                   @   sT   e Zd ZdZdd Zdd ZedjZdZe	
ddd Ze	
d	d
d ZdS )BaseArrayMemoryTestsNc                 C   s   t  dt|S Nr-   )r   r/   r   r(   r   r   r	   r     r   zBaseArrayMemoryTests.<lambda>c                 C   s   t  dt| S r   )r   r/   rP   r   r   r   r	   r     r   r-   z/XXX test should be adapted for non-byte buffersc                 C   s   d S r   r   r   r   r   r	   rf     s    z#BaseArrayMemoryTests.test_getbufferz:XXX NotImplementedError: tolist() only supports byte viewsc                 C   s   d S r   r   r   r   r   r	   rU     s    z BaseArrayMemoryTests.test_tolist)ri   rj   rk   r   r   rM   r   rY   rF   unittestskiprf   rU   r   r   r   r	   r     s   
r   c                   @   s   e Zd Zdd Zdd ZdS )BaseMemoryviewTestsc                 C   s   t |S r   r8   )r   objr   r   r	   r     s    zBaseMemoryviewTests._viewc                 C   s   |  ||| d S r   r    r   r'   r   contentsr   r   r	   rC     s    z#BaseMemoryviewTests._check_contentsN)ri   rj   rk   r   rC   r   r   r   r	   r     s   r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	BaseMemorySliceTests   XabcdefYc                 C   s   t |}|dd S Nr=      r   r   r   r   r   r   r	   r     s    zBaseMemorySliceTests._viewc                 C   s   |  |dd || d S r   r   r   r   r   r	   rC     s    z$BaseMemorySliceTests._check_contentsc                 C   sF   | j D ]:}t|| j}t|}|dd  | t|| qd S )Nr=   r?   )r   r8   r
   r   r   r    )r   r'   r   r)   r   r   r	   	test_refs  s
    

zBaseMemorySliceTests.test_refsN)ri   rj   rk   r   r   rC   r   r   r   r   r	   r     s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )BaseMemorySliceSliceTestsr   c                 C   s   t |}|d d dd  S )Nr   r=   r   r   r   r   r	   r     s    zBaseMemorySliceSliceTests._viewc                 C   s   |  |dd || d S r   r   r   r   r   r	   rC     s    z)BaseMemorySliceSliceTests._check_contentsN)ri   rj   rk   r   r   rC   r   r   r   r	   r     s   r   c                   @   s   e Zd Zdd ZdS )BytesMemoryviewTestc                 C   sv   | j D ]j}|| j}| t| | t|d | tt | tt|| | jtt|d | jtt|dd qd S )N)object)argumentT)r   r
   rW   r8   r$   r&   )r   r'   obr   r   r	   test_constructor  s    

z$BytesMemoryviewTest.test_constructorN)ri   rj   rk   r   r   r   r   r	   r     s   r   c                   @   s   e Zd Zdd ZdS )ArrayMemoryviewTestc                 C   sH   t  dtd}t|}t  dtddd}||d d < | || d S )Nr-   
   	   r   )r   r0   r8   r    )r   r   r   Znew_ar   r   r	   test_array_assign  s
    z%ArrayMemoryviewTest.test_array_assignN)ri   rj   rk   r   r   r   r   r	   r     s   r   c                   @   s   e Zd ZdS )BytesMemorySliceTestNrm   r   r   r   r	   r     s   r   c                   @   s   e Zd ZdS )ArrayMemorySliceTestNrm   r   r   r   r	   r     s   r   c                   @   s   e Zd ZdS )BytesMemorySliceSliceTestNrm   r   r   r   r	   r     s   r   c                   @   s   e Zd ZdS )ArrayMemorySliceSliceTestNrm   r   r   r   r	   r     s   r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
	OtherTestc              	   C   s   t jd}t|d}| }t|d}|d d |d d< |dd  |dd < | |jd dD ]}| 	|p | }t||}t||d d |d d< t||dd  |dd < | |jd W d    qj1 s0    Y  qjd S )Nctypesg333333?r   r?   ZBbc)
r   r   import_modulerN   Zc_doubler8   r   r    r4   ZsubTest)r   r   Zp6r   r   rF   r   r   r	   test_ctypes_cast  s    zOtherTest.test_ctypes_castc                 C   s6   dd }t |}|d d d }| | dd  d S )Nr<   i@ r   Z30)r8   r    hex)r   rw   Zm1Zm2r   r   r	   test_memoryview_hex  s    zOtherTest.test_memoryview_hexc                 C   s@   t d}| t t| W d    n1 s20    Y  d S )Nrp   )r8   r$   r&   copyr`   r   r   r	   	test_copy  s    zOtherTest.test_copyc              	   C   sV   t d}ttjd D ]:}| t t|| W d    q1 sF0    Y  qd S )Nrp   r=   )r8   r0   pickleHIGHEST_PROTOCOLr$   r&   dumps)r   r   protor   r   r	   test_pickle  s    zOtherTest.test_pickleN)ri   rj   rk   r   r   r   r   r   r   r   r	   r     s   r   __main__)__doc__r   Ztest.supportr   r   rv   rt   r   r   r   r   r   r   r   r   r   r   ZTestCaser   r   r   r   r   r   r   ri   mainr   r   r   r	   <module>   sN      '
