B
    18\g{                @   s  d dl Z d dlZd dlmZ d dlmZmZ d dlmZm	Z	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mZ d dlmZ yd dlT W n ek
r   dZY nX yd dlZW n ek
r   dZY nX yd dlZW n ek
r   dZY nX y:e (e_e  d dlmZ W dQ R X W dQ R X W n ek
rF   dZY nX d	Zd d d d d d d d d d d d d d d d
Zered= ed= ery e dd d ed< d ed< W n ej!k
r   Y nX ddddddddddddddd>  dd> fdZ"dd Z#eee"e"e"e"dZ$er6x"e$d D ]Z%e#e%e$d e%< qW e& Z'e& Z(xeD ]Z)e)d krLe(e)= qLW e& Z*xeD ]Z)e)d!krte*e)= qtW e'e$d"< e'e$d#< e(e$d$< e*e$d%< e*e$d&< d Z+dZ,d'dd(d)d*d+gd'd,d-d.gfd$gd'gfd'gd'gfd#d"gd'gfd&d%gd'gfd/Z-d0d1 Z.d2d3 Z/d4d5 Z0d6d7 Z1dd9d:Z2dd;d<Z3dd=d>Z4d?d@ Z5dAdB Z6dCdD e$d D Z7dEdF Z8dGdH Z9dIdJ Z:dKdL Z;dMdN Z<dOdP Z=dQdR Z>dSdT Z?dUdV Z@dWdX ZAdYdZ ZBd[d\ ZCd]d^ ZDd_d` ZEdadb ZFdcdd ZGdedf ZHdgdh ZIdidj ZJdkdl ZKdmdn ZLdodp ZMddtduZNdvdw ZOdxdy ZPddzd{ZQd|d} ZRdd~dZSdd ZTdddZUdd ZVdd ZWdd ZXdddZYdddZZdddZ[dddZ\dd Z]dZ^dqZ_dZ`erdZ^dZ_dZ`eZZWe[ZXe\ZeaedeaedG dd dejbZceddkree  dS )    N)support)permutationsproduct)	randrangesamplechoice)Decimal)Fraction)*)ndarrayT)?cbBhHiIlLnNfdPr   r   Ql    q)r      )r      )i   )i i   )r   i   )i   l        )r   l        )l         l            )r   l               i  )r   r   r   r   r   r   r   r   r   r   r   r   r   r   c          	   C   s   | dkrd}n| dkrd}n| dkr*d}n| dkrFdd	>  dd	> f}nfx>d
D ]6}yt | d|> d  P W qL t jk
r   Y qLX qLW |d@ rd|>  d|> fn
dd|> f}|S )zReturn range of a native type.r   )r   r   r   )r   r   r   )l         l            r   r    i  )
r      @   ?                      r   )structpackerror)fmtlhexp r0   T/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/test/test_buffer.pynative_type_rangeW   s     

&r2   ) @<>=!r4   Z
bBhHiIlLfdZBbcmz@mar   z@br3   r5   r6   r7   r8   123)r   arraynumpy
memoryviewbytefmtc             C   sv   t t|  |  }|dkr6t|g}|dkr6|dkr6d}|dkrFt|}|dksV|dkrrt||}t||d }|S )	zWReturn random item for a type specified by a mode and a single
       format character.r   r?          r   r   r   r   )r   fmtdictbytesboolr*   r+   unpack)modecharobjxr0   r0   r1   randrange_fmt   s    
rL   c             C   sN   |  d\}}g }x|D ]}|t||| qW t|dkrF|d S t|S )zReturn single random item.#r    r   )splitappendrL   lentuple)r-   rJ   rH   charsrK   r   r0   r0   r1   gen_item   s
    
rS   c             C   s@   | dkrt ||S dg|  }xt| D ]}t ||||< q&W |S )z,Return a list of random items (or a scalar).r   )rS   range)r   r-   rJ   lstr   r0   r0   r1   	gen_items   s    

rV   c             C   s   t t| t }|d }|d}tdd}xTt|D ]H}t tt| }t t| t }||t	|rh|nd 7 }||| 7 }q6W t
| ||}	t||}
||	|
fS )NrM   ambr   
   r    )r   capMODEstripr   rT   rQ   rD   MULTintrV   rS   )r   rJ   rH   Zxfmtr-   nmemb_rI   
multiplieritemsitemr0   r0   r1   struct_items   s    


rc   r   c             C   s   |dkrt t| t }|dkr0t tt| }t t| t }|d |t|rR|nd  }t| ||}t||}|	d| | }|||fS )z"Return random format, items, item.NrM   r    rW   )
r   rY   rZ   rQ   rD   r\   r]   rV   rS   r[   )r   rJ   rH   rI   r`   r-   ra   rb   r0   r0   r1   	randitems   s    
rd   c             c   s<   x6t | t D ]&}x t| D ]}t| |||V  qW qW dS )z1Iterate through supported mode/char combinations.N)rY   rZ   rD   rd   )r   rJ   rH   rI   r0   r0   r1   	iter_mode   s    re   c             c   s6   xt | |D ]
}|V  qW |dkr&dS t| |V  dS )zwYield (format, items, item) for all possible modes and format
       characters plus one random compound format string.r   N)re   rc   )nitemsZtestobjtr0   r0   r1   iter_format   s
    
rh   c             C   s   d| kpd| kpd| kS )Nr   r   r   r0   )r-   r0   r0   r1   is_byte_format   s    ri   c             C   s4   t | }|dks$|dko2| d dko2| |d  tkS )zformat suitable for memoryviewr    r   r   r4   )rP   
MEMORYVIEW)r-   rK   r0   r0   r1   is_memoryview_format   s    rk   c             C   s   g | ]}t |s|qS r0   )ri   ).0r   r0   r0   r1   
<listcomp>   s    rm   c             C   s   t | t S )z9Tuple items (representing structs) are regarded as atoms.)
isinstancelist)rU   r0   r0   r1   atomp   s    rp   c             C   s
   t | tS )N)rn   ro   )rU   r0   r0   r1   listp   s    rq   c             C   s:   t | dkrdS | d }x| dd D ]}||9 }q&W |S )zProduct of list elements.r   r    N)rP   )rU   rK   vr0   r0   r1   prod   s    rs   c             C   s   | dkrdS |dkr^t |dd |g }xtt| d ddD ]}||  ||d  9  < q<W nB|gt |dd  }x*td| D ]}||  ||d  9  < qW |S )zOCalculate strides of a contiguous array. Layout is 'C' or
       'F' (Fortran).r   r0   Cr    Nr   )ro   rT   )ndimshapeitemsizeZlayoutstridesr   r0   r0   r1   strides_from_shape   s    rz   c             C   s   t | r| S t|dkr | d S dg|d  }|d rFt| |d  nd}x>t|d D ].}|| }t| |||  |dd ||< qXW |S )zmConvert flat item list to the nested list representation of a
       multidimensional C array with shape 's'.r   r    N)rp   rP   rT   _ca)ra   srU   strider   startr0   r0   r1   r{     s    &r{   c             C   sp   t | r| S t|dkr | d S dg|d  }|d }x4t|d D ]$}t| |d| |dd ||< qDW |S )zsConvert flat item list to the nested list representation of a
       multidimensional Fortran array with shape 's'.r   Nr    )rp   rP   rT   _fa)ra   r|   rU   r}   r   r0   r0   r1   r     s    $r   c             C   s2   t | r(d|kr(t|t| kr(tdt| |S )Nr   zprod(shape) != len(items))rq   rs   rP   
ValueErrorr{   )ra   rw   r0   r0   r1   carray*  s     r   c             C   s2   t | r(d|kr(t|t| kr(tdt| |S )Nr   zprod(shape) != len(items))rq   rs   rP   r   r   )ra   rw   r0   r0   r1   farray/  s     r   c             C   s   dd | D }t | S )z(Generate all possible tuples of indices.c             S   s   g | ]}t |qS r0   )rT   )rl   rr   r0   r0   r1   rm   6  s    zindices.<locals>.<listcomp>)r   )rw   	iterablesr0   r0   r1   indices4  s    r   c             C   s.   d}x$t | D ]}||| ||  7 }qW |S )zAConvert multi-dimensional index to the position in the flat list.r   )rT   )rv   indry   retr   r0   r0   r1   getindex9  s    r   c       	      C   s   |s| S t |}t||dd}t||ddd dd}dgt |  }x>t|D ]2}t|||}t||ddd |}| | ||< qNW |S )zTranspose flat item list that is regarded as a multi-dimensional
       matrix defined by shape: dest...[k][j][i] = src[i][j][k]...  r    rt   Nru   r   )rP   rz   r   r   )	srcrw   rv   ZsstridesZdstridesdestr   frtor0   r0   r1   	transpose@  s    r   c             C   s6   | g kr| S t | r| gS t| d t| dd  S )zflatten listr   r    N)rp   _flatten)rU   r0   r0   r1   r   O  s
    r   c             C   s   t | r| S t| S )zflatten list or return scalar)rp   r   )rU   r0   r0   r1   flattenW  s    r   c             C   s4   t | rg S t| |d  gt| d |dd  S )zMGet the shape of lst after slicing: slices is a list of slice
       objects.r   r    N)rp   rP   slice_shape)rU   slicesr0   r0   r1   r   ]  s    r   c                s&   t | r| S  fdd|  d  D S )z=Multi-dimensional slicing: slices is a list of slice objects.c                s   g | ]}t | d d qS )r    N)
multislice)rl   Zsublst)r   r0   r1   rm   h  s    zmultislice.<locals>.<listcomp>r   )rp   )rU   r   r0   )r   r1   r   d  s    r   c                sF   t |r|S  fddt|  d  |d  D }||  d < | S )a  Multi-dimensional slice assignment: llst and rlst are the operands,
       lslices and rslices are lists of slice objects. llst and rlst must
       have the same structure.

       For a two-dimensional example, this is not implemented in Python:

         llst[0:3:2, 0:3:2] = rlst[1:3:1, 1:3:1]

       Instead we write:

         lslices = [slice(0,3,2), slice(0,3,2)]
         rslices = [slice(1,3,1), slice(1,3,1)]
         multislice_assign(llst, rlst, lslices, rslices)
    c          	      s.   g | ]&\}}t || d d d d qS )r    N)m_assign)rl   r   r)lslicesrslicesr0   r1   rm   {  s   zm_assign.<locals>.<listcomp>r   )rp   zip)llstrlstr   r   r0   )r   r   r1   r   j  s    r   c             C   sf   t | |}t ||}t|t|kr(dS x8tt|D ](}|| || krNdS || dkr6dS q6W dS )z9Compare the structure of llst[lslices] and rlst[rslices].ru   r   )r   rP   rT   )r   r   r   r   lshapershaper   r0   r0   r1   cmp_structure  s    

r   c             C   s(   t | |||dk rtdt| |||S )z:Return llst after assigning: llst[lslices] = rlst[rslices]r   z+lvalue and rvalue have different structures)r   r   r   )r   r   r   r   r0   r0   r1   multislice_assign  s    r   c                s   |  rdS |dk s |  | kr$dS t  fddD r>dS |dkrZ|dkoX oX S dkrfdS tfddt|D }tfddt|D }d|| ko||   | kS )zVerify that the parameters represent a valid array within
       the bounds of the allocated memory:
           char *mem: start of the physical memory block
           memlen: length of the physical memory block
           offset: (char *)buf - mem
    Fr   c             3   s   | ]}|  V  qd S )Nr0   )rl   rr   )rx   r0   r1   	<genexpr>  s    z#verify_structure.<locals>.<genexpr>Tc             3   s.   | ]&}| d kr|  | d  V  qdS )r   r    Nr0   )rl   j)rw   ry   r0   r1   r     s    c             3   s.   | ]&}| d kr|  | d  V  qdS )r   r    Nr0   )rl   r   )rw   ry   r0   r1   r     s    )anysumrT   )memlenrx   rv   rw   ry   offsetiminimaxr0   )rx   rw   ry   r1   verify_structure  s    r   c             C   s   x|D ]}| | } qW | S )Nr0   )rU   r   r   r0   r0   r1   get_item  s    
r   c       
      C   s>   |\}}}}}}|}x$t |D ]}	|||	 | |	  7 }qW |S )z-Location of an item in the underlying memory.)rT   )
r   rg   r   rx   rv   rw   ry   r   pr   r0   r0   r1   memory_index  s
    r   c             C   sT   | \}}}}}}d|> }x6t |D ]*}t|| }	d|	> }
||
@ rDdS ||
O }q"W dS )zThe structure 't' is overlapping if at least one memory location
       is visited twice while iterating through all possible tuples of
       indices.r    TF)r   r   )rg   r   rx   rv   rw   ry   r   Zvisitedr   r   bitr0   r0   r1   is_overlapping  s    
r      r&   r0   c                sb   st |d }|dkrd|r,| | |dddfS t dd}||  }t ddkrP|  n|}|| |dd|fS d}	t d}
|
dkr|rd}	n|
dkrd}	dg|  x,t|D ]}t |	|d  |< qW nt }d	}t d}
|
dkr|
d@ rd
nd}dg| | t | |d  |d < |s4|d  dkr4| |d < x~t|d ddD ]j}| |d  rf |d  nd9 }|r| t | |d  |< n"dt d |  t d|d  |< qFW d }}d krt fddt|D }t fddt|D }|| }|r(| |  }||d |   }n*| | |  }t ddkrN| |  n|}|| | |fS )zReturn random structure:
           (memlen, itemsize, ndim, shape, strides, offset)
       If 'valid' is true, the returned structure is valid, otherwise invalid.
       If 'shape' is given, use that instead of creating a random shape.
    r    r   r0      r   d   _   Z   r   TFru   )r    ru   c             3   s.   | ]&}| d kr|  | d  V  qdS )r   r    Nr0   )rl   r   )rw   ry   r0   r1   r     s    z!rand_structure.<locals>.<genexpr>c             3   s.   | ]&}| d kr|  | d  V  qdS )r   r    Nr0   )rl   r   )rw   ry   r0   r1   r     s    )r   rT   rP   r   )rx   Zvalidmaxdimmaxshaperw   rv   rf   r   r   minshaper   r   Z	maxstrideZzero_strider   r   r0   )rw   ry   r1   rand_structure  sT    


"(

r   c       
      C   sp   ||  }t |d }| r$|| |  nd}t d|d }|| |  }t|||}t||\}}}}	|	| krlt|S )z=Create a random slice of len slicelen that fits into listlen.r    )r   sliceslice_indicesRuntimeError)
slicelenZlistlenZmaxstartr~   Zmaxstepstepstopr|   r_   Zcontrolr0   r0   r1   randslice_from_slicelen  s    r   c             C   st   dg|  }dg|  }xNt | D ]B}|| }|dkr@td|d nd}t||||< t||||< qW t|t|fS )zxCreate two sets of slices for an array x with shape 'shape'
       such that shapeof(x[lslices]) == shapeof(x[rslices]).r   r    )rT   r   r   rQ   )rv   rw   r   r   r   r   r   r0   r0   r1   randslice_from_shape,  s    

r   c             C   s  t d| d }d}t d}|dkr(d}n|dkr4d}t ddkrDdnd	}dg| }dg| }dg| }dg| }	x(t|D ]}t ||d }
t ||d }||
k r|
| }}
|rt |
 |
d }t |
 |
d }d
t d t d|
d  }t|||}t||
\}}}}n&|
dkr(t d|
d nd}t||
}t||}t ddkrt||
 ||< ||< || |	|< ||< q||
| ||< ||< || |	|< ||< q|W ||t|t|	fS )zCreate (lshape, rshape, tuple(lslices), tuple(rslices)) such that
       shapeof(x[lslices]) == shapeof(y[rslices]), where x is an array
       with shape 'lshape' and y is an array with shape 'rshape'.r    r   r   r   r   r   P   TF)r    ru   )r   rT   r   r   r   rQ   )r   r   rv   r   r   Z
all_randomr   r   r   r   Zsmallbigr~   r   r   Zs_smallr_   r   Zs_bigr0   r0   r1   rand_aligned_slices8  s@    
 

 



r   c             C   s$   |\}}}}}}t || d|  dS )zMReturn a list of random items for structure 't' with format
       'fmtchar'.rM   r?   )rV   )r-   rg   r   rx   r_   r0   r0   r1   randitems_from_structurec  s    r   c       
      C   s(   |\}}}}}}	t | ||||	t|B dS )z:Return ndarray from the tuple returned by rand_structure())rw   ry   formatr   flags)r   ND_WRITABLE)
ra   r-   rg   r   r   rx   rv   rw   ry   r   r0   r0   r1   ndarray_from_structurei  s    
r   c             C   sT   |\}}}}}}t |}	x(t| D ]\}
}t||	|
| | q"W t|	||||dS )z>Return numpy_array from the tuple returned by rand_structure())bufferrw   ry   dtyper   )	bytearray	enumerater*   	pack_intonumpy_array)ra   r-   rg   r   rx   rv   rw   ry   r   bufr   rr   r0   r0   r1   numpy_array_from_structureo  s    r   c                s   | j }|r$t|  |krld|fS nH|g krH| jdks> |krld|fS n$t| \}}|g}|dkrld|fS |   fddtdt D }g }x6|D ].}	t||	d }
|
|
krd|fS |	|
 qW |g kr||fS |d |fS )a  Interpret the raw memory of 'exporter' as a list of items with
       size 'itemsize'. If shape=None, the new structure is assumed to
       be 1-D with n * itemsize = bytelen. If shape is given, the usual
       constraint for contiguous arrays prod(shape) * itemsize = bytelen
       applies. On success, return (items, shape). If the constraints
       cannot be met, return (None, None). If a chunk of bytes is interpreted
       as NaN as a result of float conversion, return ('nan', None).Nr   c                s   g | ]}||   qS r0   r0   )rl   r   )rx   memr0   r1   rm     s    zcast_items.<locals>.<listcomp>nan)
nbytesrs   rv   divmodtobytesrT   rP   r*   rG   rO   )Zexporterr-   rx   rw   Zbytelenr   r   Z	byteitemsra   rr   rb   r0   )rx   r   r1   
cast_items}  s(    

 
r   c              #   s   xt dD ]} | gV  q
W tdd}tddkr4dnd  fdd	t |D V  tdd}tddkrjdnd  fd
d	t |D V  dS )z Generate shapes to test casting.r$         r   r   r    r   c                s   g | ]}t  d qS )r   )r   )rl   r_   )r   r0   r1   rm     s    z!gencastshapes.<locals>.<listcomp>c                s   g | ]}t  d qS )r   )r   )rl   r_   )r   r0   r1   rm     s    N)rT   r   )r   rv   r0   )r   r1   gencastshapes  s    

r   c             C   s0   t t|  | d t|  | d t|  | d S )z4Generate all possible slices for a single dimension.r    )r   rT   )r   r0   r0   r1   	genslices  s    r   c                s    fddt | D }t| S )z/Generate all possible slice tuples for 'shape'.c                s   g | ]}t  | qS r0   )r   )rl   r   )rw   r0   r1   rm     s    z"genslices_ndim.<locals>.<listcomp>)rT   r   )rv   rw   r   r0   )rw   r1   genslices_ndim  s    r   Fc             C   s,   |s| dkrdnd}t || d }t|| S )zGenerate random slice for a single dimension of length n.
       If zero=True, the slices may be empty, otherwise they will
       be non-empty.r   r    )r   r   )r   allow_emptyZminlenr   r0   r0   r1   rslice  s    r   c             c   s"   xt dD ]}t| |V  q
W dS )z.Generate random slices for a single dimension.r   N)rT   r   )r   r   r_   r0   r0   r1   r     s    r   c             #   sx   x,t |D ] }t fddt | D V  q
W x,t |D ] }t fddt | D V  q8W tdd t | D V  dS )z)Generate random slice tuples for 'shape'.c             3   s   | ]}t  | V  qd S )N)r   )rl   r   )rw   r0   r1   r     s    zrslices_ndim.<locals>.<genexpr>c             3   s   | ]}t  | d dV  qdS )T)r   N)r   )rl   r   )rw   r0   r1   r     s    c             s   s   | ]}t d dd V  qdS )r   r    N)r   )rl   r_   r0   r0   r1   r     s    N)rT   rQ   )rv   rw   Z
iterationsr_   r0   )rw   r1   rslices_ndim  s
      r   c             c   s0   t | }|d krt|n|}t t||V  d S )N)rQ   rP   r   )iterabler   poolr0   r0   r1   rpermutation  s    r   c          
   C   s   y|   }W n  ttfk
r,   |  }Y nX t| trF| j}| j}nd}d}td|| j	| j
| j|| j| j|f  tj  dS )zPrint ndarray for debugging.unknownz_ndarray(%s, shape=%s, strides=%s, suboffsets=%s, offset=%s, format='%s', itemsize=%s, flags=%s)N)tolist	TypeErrorNotImplementedErrorr   rn   r   r   r   printrw   ry   
suboffsetsr   rx   sysstdoutflush)ndrK   r   r   r0   r0   r1   ndarray_print  s    
r   r   rX      r   z%struct module required for this test.z%ndarray object required for this testc            
   @   s  e Zd Zdd Zddhddhdhdddddf
ddZdd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d8d9 Zd:d; Zd<d= Zd>d? Z d@dA Z!dBdC Z"dDdE Z#dFdG Z$dHdI Z%dJdK Z&dLdM Z'dNdO Z(dPdQ Z)e*j+Z+dRdS Z,dTdU Z-dVdW Z.dXdY Z/dZd[ Z0d\d] Z1d^d_ Z2d`da Z3dbdc Z4e5j6ddde Z7dfdg Z8dhdi Z9djdk Z:dldm Z;dndo Z<dpdq Z=drds Z>dtdu Z?dvdw Z@dxdy ZAdzd{ ZBd|d} ZCd~d ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdS )TestBufferProtocolc             C   s   t  | _d S )N)Zget_sizeof_void_psizeof_void_p)selfr0   r0   r1   setUp  s    zTestBufferProtocol.setUpru   r    Fc       %   	      s8  |rt | }ns t|	}n}d}|jr| |d d}xFtd|D ]8}|| dkr\P || dkrJ|||  || d  7 }qJW |gdd t|d D  }| j}|d dk r| }|gt|dd   }| |j| | 	|j
| | 	|j | 	|j | 	|j| | 	|j| | 	|jt| |
rB|sT| 	|jt| | 	|jt| t|ts|trr| n| }| 	||	 sd S |st }d }xt|D ]|}yLt||}t|	|}t|trtjf| }nt|}|| W n tk
r.   d}P Y nX | 	|| qW |s| 	| | t|}d dd	 |D }| 	|! | rnd
}t"|	}xhdD ]^}|}|dkrt#|drt#|drt$||}t|||t%d}n0t#|drt#|dr|dkrt|||d}t&|t'| | 	  | | (t) | |dkrTqt|}|rfdnt*} t+|dt, | 	t |   fddt|D }!t|!d dkrdd |!D }!t|!|| d}"| 	t|"t| t+|dt, | 	t |   fddt|D }!t|!d dkrBdd |!D }!t|!|| t%B d}"| 	t|"t| t+|dt, | 	t |   fddt|D }!t|!d dkrdd |!D }!t#|drt%nd}#t|!||#| B d}"| 	t|"t| qW tr4yt|}W n tk
r2   d S X t|trF|jn|}$| |j|$ | 	|j
| | 	|j | 	|j | 	|j| | 	|j| | 	|jt| |
r|s| 	|jt| | 	|jt| |dkrdnt|	}| 	t|| r| n| }| 	||	 | 	|| d S )Nr0   r   r    c             S   s   g | ]}d qS )ru   r0   )rl   rr   r0   r0   r1   rm     s    z-TestBufferProtocol.verify.<locals>.<listcomp>Tr3   c             s   s   | ]}d | V  qdS )z%02xNr0   )rl   r   r0   r0   r1   r   N  s    z,TestBufferProtocol.verify.<locals>.<genexpr>r   )rt   FAr   r   rt   )rw   r   r   )rw   r   c                s   g | ]}t  | qS r0   )r*   unpack_from)rl   r   )contigr-   rx   r0   r1   rm   y  s   c             S   s   g | ]}|d  qS )r   r0   )rl   rr   r0   r0   r1   rm   |  s    )rw   r   r   c                s   g | ]}t  | qS r0   )r*   r   )rl   r   )r   r-   rx   r0   r1   rm     s   c             S   s   g | ]}|d  qS )r   r0   )rl   rr   r0   r0   r1   rm     s    c                s   g | ]}t  | qS r0   )r*   r   )rl   r   )r   r-   rx   r0   r1   rm     s   c             S   s   g | ]}|d  qS )r   r0   )rl   rr   r0   r0   r1   rm     s    )-rs   rP   r   assertGreaterrT   r   ro   assertIsrJ   assertEqualr   rx   r   readonlyrv   rw   rQ   ry   rn   r   rk   r   r   r   r   get_pointerr   r*   r+   extendBufferErrorr@   joinhexr   is_contiguousr   
ND_FORTRANget_contiguous
PyBUF_READ
assertTrue
cmp_contigr   py_buffer_to_contiguousPyBUF_FULL_RO)%r   resultrJ   rx   r-   r   rv   rw   ry   rU   slicedcastZexpected_lenr   Z
suboffset0r   Zstride0repr   Zbuf_errr   item1item2rK   r9   r   ZffZ	flattenedorderexpectedZtransr^   roZinitlstyr   exr0   )r   r-   rx   r1   verify  s    







zTestBufferProtocol.verifyc             C   st  dd }dd }|j r ||ts||tr0|jr||tr@|jr||trP|jr||ts`|j	s||t
sp|jr||ts||tr| jtt||d d S t|tst|jr| }nt|td}| }||trdn|j }	|j}
|j}|j}||ts
d}
| }||tsd}||tr,|jnd	}||t
rB|jnd	}t||d}| j||||
|	|||||d

 d S )Nc             S   s   | j dkp| j dkS )Nr3   r   )r   )r  r0   r0   r1   
simple_fmt  s    z4TestBufferProtocol.verify_getbuf.<locals>.simple_fmtc             S   s   | |@ |kS )Nr0   )reqflagr0   r0   r1   match  s    z/TestBufferProtocol.verify_getbuf.<locals>.match)getbufr   r3   r    r0   )	rJ   rx   r-   r   rv   rw   ry   rU   r  )r   PyBUF_WRITABLEPyBUF_C_CONTIGUOUSc_contiguousPyBUF_F_CONTIGUOUSf_contiguousPyBUF_ANY_CONTIGUOUS
contiguousPyBUF_INDIRECTr   PyBUF_STRIDESPyBUF_NDPyBUF_FORMATassertRaisesr   r   rn   rk   r   r   r  rx   rv   r   rw   ry   r  )r   Zorig_exr  r  r  r  r  rU   r   r
  r-   rx   rv   rw   ry   r0   r0   r1   verify_getbuf  s>    
z TestBufferProtocol.verify_getbufc                s^  t ttttttttt	t
ttttf}dd tdD dfddddd	d
ddddddgdfddddd	d
ddddddgdfdd tdD dff}g g dfdddgg dfdgg dfdgdgdfd
gdgdfd
gdgdfddgg dfddgddgdfddgddgdfddgddgdff
}dttttB tttB f}dttttB f}x|D ]\}}t| x|D ]\}}	}
 fdd|	D }	|
 9 }
x\|D ]R}|	r|t@ rq|s|t@ rq|r|n|d }t|||||	|
d}|r|d d d nd }t|}|r
t|}|jdks.|jdkr:|r:|	r:| || |rd|jdkrd|rd|	rd| || xt|D ]l}xd|D ]\}| ||||B  | ||||B  |rt| j||||B dd | j||||B dd qtW qjW qW qZW q>W ddddd	d
ddddddg}t|dgtd}| tt| tdgdg}t|td}| jtt|td | jtt|td | jtt|td | jtt|td | jtt|td | jtt|td t|td}xdddgdddgfD ]}xdtfD ]t}t|||tB d}| t |d | t |d x:|D ]2}t||d}| t |d | t |d qW qW qW d S ) Nc             S   s   g | ]}|d  rdndqS )r   TFr0   )rl   rK   r0   r0   r1   rm     s    z:TestBufferProtocol.test_ndarray_getbuf.<locals>.<listcomp>   r   r    r   r   r   r   r   r)   r(   	   rX      r   r   c             S   s$   g | ]}|d  rd| nd| qS )r   l        i   r0   )rl   rK   r0   r0   r1   rm     s    r   r   ru   c                s   g | ]}|  qS r0   r0   )rl   rr   )rx   r0   r1   rm     s    )r   r   rw   ry   r   T)r  )rw   r   )r  r   rt   )!r  r  r  PyBUF_SIMPLEr  r  r  
PyBUF_FULLr  PyBUF_RECORDSPyBUF_RECORDS_ROPyBUF_STRIDEDPyBUF_STRIDED_ROPyBUF_CONTIGPyBUF_CONTIG_ROrT   r   r   ND_PILr  r  r*   calcsizer   r@   rv   r   r  ND_GETBUF_FAILr  r   r   r   )r   requestsZ	items_fmtZ	structureZndflagsZ
real_flagsra   r-   rw   ry   r   r   Z_itemsex1ex2m1m2r  bitsr  baser   r  r0   )rx   r1   test_ndarray_getbuf  s    


$

&
z&TestBufferProtocol.test_ndarray_getbufc       
      C   s  t dgdg}t dgdgtd}xt |j|jfD ]z}| t|dddh | t|dddg | t|dddg | jt|dddgdhd | jt|dddgdgdhd	 | jt|dddgdgg d
 | jt|dgdgi d | jt|dgdgi d | jt|dgdgi d | jt|dgdgdgtd | jt|dgg td | jt|g dgd | jt|dgdgdd | jtj	|dgdgdd | jt|ddgdgdd | jt|dddgdgdd t
d }| jt|dg| dg| d | jt|dgdgd | jt|dddgdgd | jt|dgdd gd | jt|dddddgddgdd
 | jt|dddgdgdgd	 | jt|dgdgdd gd	 | jt|ddgddgdgd	 | jt|ddddgdgdgdd | jt|dddgdgdd
 | jt|dddgdgddd | jt|dddgdgdd | jtj	|dgdgdd ddddddd d!dd"g
}| jt||ddgd#d$gdd% | jt|t d&d' | jt|dgdgtd | t|dg q2W | jtt d(td) t dgdgtd}| jt|jdgdgtd t d(}| t|jdgdg | t|j t dgdg}|dgdg t|}| t|jdgdg | t|j |  |  | t|j ~| tti dddg | ttd(i  t ttd*dgd* d}| tt|dg t ttd+ddgd}| tt|dddg | tt|ddg | tt|d#dg | tt|d,dg t dddgdgdd}t |td)}| t|j t dddgdgdd}t |}	t |	}| t|j t d-gdgd.d}| t|j t
}t tt|dg| d}| t|j t dgdgd}| ttddddd | tt|d/d0 | tt|d,d0 | tt|td1 | tt|td2 | tt|td3 | tt|d4d5 t dgdgd}| ttddddd | tti | | tt|i  t dgdgd}| ttddddd | tti d5 | tt|d6 d S )7Nr!  r    )r   r   r   r=   )r   r   )rw   )rw   ry   )rw   r   )rw   r   )rw   r   )rw   r  )rw   ry   r   ZXXXr   i  r   )r   r   ZQLru   r   r   r   r;   )rw   ry   r   )rw   r   r   r3   )r    r   r   z@#$r   r)   r(   rX   r#  )rw   ry   r   r   )r   s   123)r  r   r   l            )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    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    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    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    ZLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLxyzrt   i  u    Z   r      )r   ND_VAREXPORTpushr  r   r   r-  r   r*   r,   ZND_MAX_NDIMOverflowErrorr   r&  r   r  popr@   releaser   ro   rT   r%  r   memoryview_from_bufferr   r   UnicodeEncodeErrorr   r   )
r   r   Zndmr   r   ra   r9   r  r1  r2  r0   r0   r1   test_ndarray_exceptionsL  s    "z*TestBufferProtocol.test_ndarray_exceptionsc             C   s   xt tdD ]}dgd }tdddgdgtd}t||d< x4tddD ]&}|jdddgdgd t|||< qJW x tdD ]}|||    q~W | t|j	 ~qW d S )Nr   r   r    r   r   )rw   r   )rw   )
r   rT   r   r=  r@   r>  rA  r  r   r@  )r   Zpermr9   r   r   r0   r0   r1   test_ndarray_linked_list  s    
z+TestBufferProtocol.test_ndarray_linked_listc             C   sP   xJt dD ]>\}}}t|}t|d|d}| j|d ||dddd|d	 q
W d S )Nr   r0   )rw   r   r    )rJ   rx   r-   r   rv   rw   ry   rU   )rh   r*   r.  r   r  )r   r-   Zscalarr_   rx   r   r0   r0   r1   test_ndarray_format_scalar  s    
z-TestBufferProtocol.test_ndarray_format_scalarc             C   st   t dd}xdt|D ]X\}}}t|}xBdtfD ]6}t||g||d}| j|d ||dd|f|f|d	 q2W qW d S )Nr    rX   r   )rw   r   r   )rJ   rx   r-   r   rv   rw   ry   rU   )r   rh   r*   r.  r-  r   r  )r   rf   r-   ra   r_   rx   r   r   r0   r0   r1   test_ndarray_format_shape  s    


z,TestBufferProtocol.test_ndarray_format_shapec             C   s   t dd}xt|D ]\}}}t|}xtddD ]}|dkrBq4t|d d | g}|| g}|dk rt||d  nd}	xJdtfD ]>}
t|||||	|
d}| j|d ||dd|||d d | d	 qW q4W qW d S )Nr       r   r   )rw   ry   r   r   r   )rJ   rx   r-   r   rv   rw   ry   rU   )	r   rh   r*   r.  rT   rP   r-  r   r  )r   rf   r-   ra   r_   rx   r   rw   ry   r   r   r   r0   r0   r1   test_ndarray_format_strides  s     


z.TestBufferProtocol.test_ndarray_format_stridesc             C   sT   ddddddddd	d
ddg}t |ddd}t |ttB d}| | t|d d S )Nr    r   r   r   r   r   r)   r(   r!  rX   r"  r   )r   r   )r    r   )rw   ry   )r  )r   r  r  r   r   r   )r   ra   r  r   r0   r0   r1   test_ndarray_fortran%  s    z'TestBufferProtocol.test_ndarray_fortranc             C   sp  xht dD ]Z}dd t |D }t|}x8t|D ]*}t|\}}}t|}x
dtfD ]}	|dkrx|	tkrxqbt||||	d}
t|||d}t	||}| j
|
d ||d||||d	 t|rt|||d	}t|ttB d
}
| |
jdk |
 }| j
|d ||d||||d	 t||||	tB d}
t|||d}t||}| j
|
d ||d||||d	 qbW q8W qW d S )Nr   c             S   s   g | ]}t d dqS )r   rX   )r   )rl   r_   r0   r0   r1   rm   -  s    z<TestBufferProtocol.test_ndarray_multidim.<locals>.<listcomp>r   )rw   r   r   rt   r    )rJ   rx   r-   r   rv   rw   ry   rU   )rw   r   )r  r0   r   )rT   rs   r   rd   r*   r.  r-  r   rz   r   r  rk   r,  r  r   ry   rB  r   r   )r   rv   shape_trf   rw   r-   ra   r_   rx   r   r   ry   rU   r  mvr0   r0   r1   test_ndarray_multidim+  sB    



z(TestBufferProtocol.test_ndarray_multidimc             C   s  t dgdgd}| t|jdd t|}| || | t|jdd t dgdgtd}| t|jd t|}| || | t|jd t dgdgtd}| t|j	d | t|jdd t|}| || | t
|j	d | t
|jdd ddddd	d
ddg}t |t|gdtd}| tj|jdd | t|jdd t|}| || | t|jdd | t|jdd dddg}t |t|gdtd}| t|jdd | tj|jdd d S )Nr    )rw   r(   )rw   r   l            r   r   r   r   r   r)   r   )rw   r   r   i,  )r      )r    r   )r   r   )r   r   ZLQ)s    1rO  )r   r  r   __setitem__r@   r   r   __delitem__r?  __getitem__
IndexErrorrP   r*   r,   r   )r   r   rM  ra   r0   r0   r1   test_ndarray_index_invalidX  s:    
z-TestBufferProtocol.test_ndarray_index_invalidc             C   sJ  t ddtd}t|}| || |d }| |d |d }| | |  |d }| |d |d }| | |  | t|jd | t|jd | t|jdd | t|jdd | | d | | d d|d< | | d d|d< | | d d|d< | | d d|d< | | d d S )	Nr    r0   )rw   r   .r   r(   r!  r   )	r   r   r@   r   r   r  r   rR  rP  )r   r   rM  rK   r0   r0   r1   test_ndarray_index_scalar  s2            z,TestBufferProtocol.test_ndarray_index_scalarc             C   sR   t ttdddgtd}t |td}| t|jd | t|jtddd d S )	Nr(   r   r   )rw   r   )r  r    r   r   )	r   ro   rT   r   r+  r  r   rR  r   )r   r  r   r0   r0   r1   test_ndarray_index_null_strides  s    z2TestBufferProtocol.test_ndarray_index_null_stridesc             C   s,  xt dD ]\}}}t|dg|d}x&tddD ]}| || ||  q0W | t|jd | t|jd t|r
t|}| || x&tddD ]}| || ||  qW | t|jd | t|jd q
W xt dD ]\}}}t|dgt	|d}t|t
tB d}x(tddD ]}| || ||  qW t|r| }| ||t x(tddD ]}| || ||  qbW qW ddd	d
dg}t|dgd}t|td}x(tddD ]}| || ||  qW ddd	d
dg}t|dgd}t|td}x(tddD ]}| || ||  q
W d S )Nr   )rw   r   rI  i)rw   r   r   )r  r    r   r   r   )rw   )rh   r   rT   r   r  rS  rR  rk   r@   r   r+  r  rB  r   __eq__NotImplementedr,  r%  )r   r-   ra   r_   r   r   rM  r  r0   r0   r1   !test_ndarray_index_getitem_single  sB    z4TestBufferProtocol.test_ndarray_index_getitem_singlec             C   s  xt dD ]\}}}t|dg|td}x tdD ]}|||< |||< q2W | | | | t|jd| | t|jd| t	|sqt|dg|td}t
|}| || x tdD ]}|||< |||< qW | | | | t|jd| | t|jd| qW xt dD ]\}}}t|dg|td}x4tddD ]&}||d  ||< ||d  ||< q:W | | | t	|sqt|dg|td}t
|}| || x4tddD ]&}||d  ||< ||d  ||< qW | | | qW d S )Nr   )rw   r   r   irI  r   r    )rh   r   r   rT   r   r   r  rS  rP  rk   r@   )r   r-   ra   Zsingle_itemr   r   rM  r0   r0   r1   !test_ndarray_index_setitem_single  sD    
z4TestBufferProtocol.test_ndarray_index_setitem_singlec          
   C   s  d}t |}xt|D ]}t|\}}}xdtfD ]}t||||d}t||}	xt|d  |d D ]}
| |	|
 ||
   x~t|d  |d D ]f}| |	|
 | ||
 |   x@t|d  |d D ](}| |	|
 | | ||
 | |  qW qW qnW t||||t	B d}t
||}	xt|d  |d D ]}
| |	|
 ||
   xt|d  |d D ]h}| |	|
 | ||
 |   x@t|d |d D ]*}| |	|
 | | ||
 | |  qW qtW qBW q8W qW d S )N)r   r   r   r   )rw   r   r   r    r   )rs   r   rd   r-  r   r   rT   r   r   r   r   )r   rL  rf   rw   r-   ra   r_   r   r   rU   r   r   kr0   r0   r1   #test_ndarray_index_getitem_multidim   s,    
 0
 z6TestBufferProtocol.test_ndarray_index_getitem_multidimc             C   s   t ddd}| ttdt  t|}| || | ttdt  xtdD ]\}}}t |dg|d}x2t|D ]&\}}| |||  | 	||k qrW t
|rNt|}x2t|D ]&\}}| |||  | 	||k qW qNW d S )Nr    r0   )rw   z1 in ndz1 in mvr   )rw   r   )r   r  r   evallocalsr@   r   rh   r   r   rk   )r   r   rM  r-   ra   r_   r   rr   r0   r0   r1   test_ndarray_sequence  s    z(TestBufferProtocol.test_ndarray_sequencec          	   C   s  ddddddddg}t |dgtd	}t|}| t|jtd
dd| | t|jtd
dd| t |dgtd	}t |dgtd	}t |td}| t|jtd
dd| t |dgdtd}t|}| t	|j
td
dd
 | t	|j
td
dd
 t |ddgdtd}t|}| t	|j
td
ddtd
dd
f | t	|j
td
dd
td
ddf | t|j
d | t|j
dtd
ddf | t|j
td
ddi f | t|j
td
ddtd
dd
f | t|j
d t |dgdtd}t |dgdd}t|}t|}| t	|jtd
dd|dd  | | | | t	|jtd
dd|dd  | | | t |dgdtd}t |dgdd}	t|}t|}| t	|jtd
dd|dd  | | | | t	|jtd
dd|dd  | | | t |ddgdtd}t |dgdd}t|}t|}| t	|jtd
dd|dd  | | ddddgddddgg | t|jtd
dd|dd  t |dgdtd}t |dgdd}t|}t|}| t	|jtd
dd|dd  | | | | t	|jtd
dd|dd  | | | | tttd
ddi  | ttdd | t	ttd
dd
d t |dgdtd}
| t|
j t |dgdd}t |td}
| t|
j d S )Nr    r   r   r   r   r   r)   r(   )rw   r   r   )r  r   )rw   r   r   z@%$r   r   )rw   r   z###########)r   r   r@   r  r   rP  r   r  r   r   rR  r   r   r   r   r-  add_suboffsetsr%  )r   ra   xlmlr  xrr   rM  mryrrK   r0   r0   r1   test_ndarray_slice_invalid2  s    


"""""$""z-TestBufferProtocol.test_ndarray_slice_invalidc             C   s  ddddddddd	d
ddg}t |dgdtd}t |dgdd}|d	d	 |dd< | | | t|}t|}| || | || |d	d	 |dd< | | | t |ddgdtd}t |ddgdd}|ddddf |ddddf< | | t|ddg d S )Nr    r   r   r   r   r   r)   r(   r!  rX   r"  r   r   )rw   r   r   )rw   r   )r   r   r   r   r@   r   )r   ra   rK   r  rb  rd  r0   r0   r1   test_ndarray_slice_zero_shape  s    $z0TestBufferProtocol.test_ndarray_slice_zero_shapec             C   s"  d}t |}t|}xt|D ]}t|\}}}t|}xdtfD ]}	t||||	d}
t||}xt	||D ]}d }yt
||}W n( tk
r } z
|j}W d d }~X Y nX d }y|
| }W n( tk
r } z
|j}W d d }~X Y nX |s|r| || qp| | | qpW qFW q W d S )N)r   r   r   r   )rw   r   r   )rP   rs   r   rd   r*   r.  r-  r   r   r   r   	Exception	__class__r   r   r   )r   rL  rv   rf   rw   r-   ra   r_   rx   r   r   rU   r   listerrr  enderrndslicedr0   r0   r1   test_ndarray_slice_multidim  s.    


z.TestBufferProtocol.test_ndarray_slice_multidimc             C   s:  d}t |}t|}xt|D ]}t|\}}}t|}t|||d}	|	  t|||d}
|
  t|
}t	||}xt
||D ]}d }yt||}W n( tk
r } z
|j}W d d }~X Y nX d }y|	| }W n* tk
r } z
|j}W d d }~X Y nX |s|r| || q| | | qW q W d S )N)r   r   r   r   )rw   r   )rP   rs   r   rd   r*   r.  r   r`  r@   r   r   r   rh  ri  r   r   r   )r   rL  rv   rf   rw   r-   ra   r_   rx   r   r  rM  rU   r   rj  r  rk  rl  rm  r0   r0   r1   'test_ndarray_slice_redundant_suboffsets  s4    

z:TestBufferProtocol.test_ndarray_slice_redundant_suboffsetsc             C   s$  xt dD ]\}}}x tdD ]}xtdD ]}xdtfD ]}|tB }t|dg||d}t|dg||d}	t|	}
d }d }|d d  }y0|| }|| }|| ||< t|t|k}W n( tk
r } z
|j}W d d }~X Y nX d }y|| ||< W n* tk
r. } z
|j}W d d }~X Y nX |rD| 	|t
 n| | | | 	|| t|slqHd }y|
| |
|< W n* tk
r } z
|j}W d d }~X Y nX |r| 	|t
 qH| |
 | | |
| | 	|| | j|
|	|j|d|j|j|j| d	 qHW q6W q$W qW d S )Nr   r   )rw   r   r   )rJ   rx   r-   r   rv   rw   ry   rU   )rh   r   r-  r   r   r@   rP   rh  ri  r   r   r   r   rk   r  rx   rv   rw   ry   )r   r-   ra   r_   lslicer   r   r   r   r  rM  ZlsterrZdiff_structurerU   ZlvalZrvalrk  rl  Zmverrr0   r0   r1    test_ndarray_slice_assign_single  sV    
z3TestBufferProtocol.test_ndarray_slice_assign_singlec             C   s4  d}t |}t|}xt|D ]
}t|\}}}xdtfD ]}xttD ]}t||\}	}
t||||t	B d}t
||}d }yt|||	|
}W n( tk
r } z
|j}W d d }~X Y nX d }y||
 ||	< W n( tk
r } z
|j}W d d }~X Y nX |s|r| || qL| | | qLW q>W q W d S )N)r   r   r   r   )rw   r   r   )rP   rs   r   rd   r-  rT   
ITERATIONSr   r   r   r   r   rh  ri  r   r   r   )r   rL  rv   rf   rw   r-   ra   r_   r   r   r   r   rU   rj  r  rk  rl  r0   r0   r1   "test_ndarray_slice_assign_multidim  s0    
z5TestBufferProtocol.test_ndarray_slice_assign_multidimc             C   sF  x>t tD ]0}x(td D ]}t|}t|dttd}| t	|  t
||}t|||}| }t|}t|r| }	| |	| |d dkrt|||td}
|
 }| || t|
}t|r| ||
 | }	| |	| tr|d }d|krqt|||}| j|d |j|d|j|j|j| d	 qW qW d S )	Nr4   T)r   r   r   r   )r   r   )rJ   rx   r-   r   rv   rw   ry   rU   )rT   rr  rD   r*   r.  r   MAXDIMMAXSHAPEr   r   r   r   r   r@   rk   r   r-  r   r   r  rx   rv   rw   ry   )r   r_   r-   rx   rg   ra   rK   ZxlistrM  Zmvlistr  Zylistrw   zr0   r0   r1   test_ndarray_random9  s>    


z&TestBufferProtocol.test_ndarray_randomc             C   s   xt tD ]}xtd D ]}t|}t|dttd}| t	|  t
||}d}yt|||}W n( tk
r } z
|j}W d d }~X Y nX | | trd}	yt|||}
W q tk
r } z
|j}	W d d }~X Y qX qW q
W d S )Nr4   F)r   r   )rT   rr  rD   r*   r.  r   rt  ru  assertFalser   r   r   rh  ri  r   r   r   )r   r_   r-   rx   rg   ra   rl  rK   rk  Z	numpy_errr  r0   r0   r1   test_ndarray_random_invalidb  s(    


z.TestBufferProtocol.test_ndarray_random_invalidc             C   s>  x6t tD ](}x td D ]}t|}tttd\}}}}t|d|d}t|d|d}	| 	t
|  | 	t
|	  t||}
t||	}t|
||}t|||	}|| ||< | }| }t|}t|}| | | | | | |d dkr|	d dkrt|
||td}t|||	td}|| ||< | }| }| || | || t|}t|}| | | | | | trd|ksd|krqt|
||}t|||	}|| ||< t|s
t|	s
| j|d |j|d|j|j|j| d	 | j|d |j|d|j|j|j| d	 qW qW d S )	Nr4   )r   r   T)rw   r   r   )r   )rJ   rx   r-   r   rv   rw   ry   rU   )rT   rr  rD   r*   r.  r   rt  ru  r   r   r   r   r   r   r@   r   r-  r   r   r   r  rx   rv   rw   ry   )r   r_   r-   rx   r   r   r   r   tltrZlitemsZritemsra  rc  ZxllistZxrlistrb  rd  Zylre  ZyllistZyrlistZzlZzrr0   r0   r1    test_ndarray_random_slice_assign~  s\    


z3TestBufferProtocol.test_ndarray_random_slice_assignc             C   s   ddddddddd	d
ddg}t |ddgtd}t |}| |jt@  | |j| | |jd | |j	 | |j
 | |j d S )Nr    r   r   r   r   r   r)   r(   r!  rX   r"  r   )rw   r   )r   ru   )r   r-  r   r   r   rJ   r   r   rx  r  r  r  )r   ra   r   r  r0   r0   r1   test_ndarray_re_export  s    z)TestBufferProtocol.test_ndarray_re_exportc          	   C   s   xdt fD ]}tdddgdg|d}t|}| || | | g  | | g  tdddgdddg|d}| | g  tdddgdddg|d}| | g g g g tdddgdddg|d}| | g g g gg g g gg g g gg q
W d S )Nr   r    r   r   )rw   r   )r-  r   r@   r   r   )r   r   r   rM  r0   r0   r1   test_ndarray_zero_shape  s    
z*TestBufferProtocol.test_ndarray_zero_shapec          	   C   st   xndt fD ]b}tdgdgdg|d}t|}| || | | dddddg | | dddddg q
W d S )Nr   r    r   )rw   ry   r   )r-  r   r@   r   r   )r   r   r   rM  r0   r0   r1   test_ndarray_zero_strides  s    z,TestBufferProtocol.test_ndarray_zero_stridesc             C   s@   t ttddgdd}| |jd | | dddg d S )N   r   r)   )rw   r   r(   r!  )r   ro   rT   r   r   r   )r   r   r0   r0   r1   test_ndarray_offset  s    z&TestBufferProtocol.test_ndarray_offsetc             C   sB   x<dt fD ]0}tttddg|d}| }| || q
W d S )Nr   r   )rw   r   )r-  r   ro   rT   rB  r   )r   r   r   r9   r0   r0   r1   #test_ndarray_memoryview_from_buffer  s    z6TestBufferProtocol.test_ndarray_memoryview_from_bufferc             C   sX   xRdt fD ]F}tttddg|d}x(tdD ]}| || t||g q0W q
W d S )Nr   r   )rw   r   )r-  r   ro   rT   r   r   )r   r   r   r   r0   r0   r1   test_ndarray_get_pointer  s    z+TestBufferProtocol.test_ndarray_get_pointerc             C   s^   t ttddddgd}t |ttB d}| | |  t|}| | |  d S )Nr  r   r   )rw   )r  )r   ro   rT   r  r  r   r   r@   )r   r  r   r9   r0   r0   r1    test_ndarray_tolist_null_strides  s
    z3TestBufferProtocol.test_ndarray_tolist_null_stridesc             C   s   |  tdd tttdddgd}tttdddgd}|  t|| tdgdgdd	}| t|d
 | td
| d S )Ns   123s   456r   r   r   )rw   r    r   )rw   r   rC   )rx  r   r   ro   rT   r   )r   rK   r  r0   r0   r1   test_ndarray_cmp_contig  s    z*TestBufferProtocol.test_ndarray_cmp_contigc             C   s  t  ddddg}t|}| tt| tttd}tttddgd}| t|t| tttdddgd}| t|t| tttddddgd}| t|t| tt	ttdddgd}tttdddgt
d}| t|t| tt	ttddddgd}tttddddgt
d}| t|t| tttd}tttddddgtd}| t|t| tttddddgdd	}| t|t|  d S )
Nr   r    r   r   r   )rw   r   )rw   r   )rw   r   )r>   r   r  r   hashrE   ro   rT   r   r   r   r-  r   )r   r:   r   r   r0   r0   r1   test_ndarray_hash  s*    z$TestBufferProtocol.test_ndarray_hashc             C   s  t ttttttttt	t
tf}| tti dt tdddtd}x6dD ].}x(|D ] }t|||}| ||  qNW qDW tdgdgdtd}x2dD ]*}x$|D ]}t|||}| |d	 qW qW tttd
dddgdtd}x2dD ]*}x$|D ]}t|||}| |d	 qW qW xdtgD ]}tdgdgd|tB d}| }x6dD ].}x&|D ]}t|||}| || qNW qDW tdddgdgd|tB d}| }x6dD ].}x&|D ]}t|||}| || qW qW qW tdddgdgdgtd}| }x:dD ]2}x*ttgD ]}t|||}| || qW q W |d d d }| }xVdD ]N}xF|D ]>}yt|||}W n tk
r   w\Y nX | || q\W qRW ttd}xdtgD ]}t|ddg|tB d}trtt|ddgd|dkrdndd}	|tkr4tt|ddgddgtd}
|
 }n| }x|D ]}yt|d|}W n tk
rp   wBY nX | || tdd |D ddgtd}| t|t| trB| ||	jdd qBW |dkrtt|ddgddgtd}
nt|ddgtd}
|
 }xttt ttgD ]}yt|d|}W n tk
rN   w Y nX | || tdd |D ddgttB d}| t|t| tr | ||	jdd q W |tkrt|ddgtd}
|
 }n| }xttt ttgD ]}yt|d|}W n tk
r   wY nX | || tdd |D ddg|tB d}| t|t| tr| ||	jdd qW qW tttdddgttB d}t|dt}| ||  tdd |D ddgtd}| t|t| t|dt}tt|ddgddgtd}
| ||
  tdd |D ddgttB d}| t|t| t|dt}| ||  td d |D ddgtd}| t|t| d S )!Nr   r!  r0   r   )rw   r   r   )rt   r   r   r    r       r(   r   r)   r   r   r   )rw   ry   r   ru   r   r   )rw   r   r   rt   )r   rw   r   r  c             S   s   g | ]}|qS r0   r0   )rl   rr   r0   r0   r1   rm     s    zCTestBufferProtocol.test_py_buffer_to_contiguous.<locals>.<listcomp>)r  c             S   s   g | ]}|qS r0   r0   )rl   rr   r0   r0   r1   rm     s    r   c             S   s   g | ]}|qS r0   r0   )rl   rr   r0   r0   r1   rm   	  s    c             S   s   g | ]}|qS r0   r0   )rl   rr   r0   r0   r1   rm   	  s    c             S   s   g | ]}|qS r0   r0   )rl   rr   r0   r0   r1   rm   	  s    c             S   s   g | ]}|qS r0   r0   )rl   rr   r0   r0   r1   rm   	  s    )r  r  r  r%  r&  r  r'  r(  r)  r*  r+  r,  r  r   r   r   r   r   r   ro   rT   r   r   r   r   r   r@   tostringr-  )r   r0  r   r  requestr   r   ZndbytesrU   ZnarK   r	  r  r0   r0   r1   test_py_buffer_to_contiguous0  s    













B






 


   z/TestBufferProtocol.test_py_buffer_to_contiguousc             C   s  dg fdddgdgft tddddgfg}xR|D ]H\}}t||d}t|}| |j | |j t|}t||dd}t	||}| j
||dd	d||||d
	 t|}	| j
|	|dd	d||||d
	 t|ttB d}
| |
jd |
 }| j
|d dd	d||||d
	 t|td}
| |
jd | |
jd | |
jd |
 }|dkrZ|gn|}| j
|d dd	dd|jgd|d
	 q4W x|D ]\}}t||td}t|}| |j | |j t|}t||dd}t||}| j
||dd	d||||d
	 t|}	| j
|	|dd	d||||d
	 qW x|dd  D ]v\}}t||td}t|}t|}t	||}| j
||dd	d|||j|d
	 t|}	| j
|	|dd	d|||j|d
	 q2W | ttdd | tti  tdddgdgd}t|td}
| tt|
 t|ttB d}
| tt|
 tdgd dgd dd}
| tt|
 | t|
j | tt|
td | tt|
td | tt|
d d d td d S )Nr!  r    r   r   rH  r   )rw   rt   r   )rJ   rx   r-   r   rv   rw   ry   rU   )r  r0   r3   r   )r    )rw   r   r      9rK   r   r   )rw   r   ru   )ro   rT   r   r@   r   r  r  rP   rz   r   r  r,  r  r   ry   rB  r%  r   rw   r   r   r  r   r-  r  r   r   r   r   r   )r   Zitems_shapera   rw   r  r9   rv   ry   rU   r4  r   r0   r0   r1   test_memoryview_construction 	  s    ,



z/TestBufferProtocol.test_memoryview_constructionc             C   s   dddg}xTdddgdddgdddgfD ]4}t ||d}| |j t|}| t|jd q(W xJtddD ]<\}}}td}||}| |	 d | |
 g  qlW d S )	Nr    r   r   r   )rw   r   r@   r  )r   r   r  r@   r  r   r  rh   r   r   r   )r   ra   rw   r  msrcr-   r_   r9   r0   r0   r1   test_memoryview_cast_zero_shape	  s    
"
z2TestBufferProtocol.test_memoryview_cast_zero_shapec             C   s   | j }tj}d}d}ttd}|td||d|   t|ddgdd	}|t|||d|   t|dddgdd	}|t|||d
|   d S )NzPnin 2P2n2i5P PZ3nr(   r  r    r   r   r   )rw   r   r   )check_sizeofr   calcvobjsizero   rT   r@   r   )r   checkZvsizeZbase_structZper_dimra   r:   r0   r0   r1   test_memoryview_sizeof	  s    z)TestBufferProtocol.test_memoryview_sizeofc             C   s  G dd dt }G dd dt }dd }|d|ddtd	d
tdddddgdddhddiddddd tddtdtddddd|dd g}xJtddD ]:\}}}t|dg|td}t|dg|td}	t|}
t	
||	d | ||
d < | |
d  |	d   t	|}d!|krqx|D ]}d }yt	
||	|| W n t	jk
rT   t	j}Y nX d }y||
d< W n. ttfk
r } z
|j}W d d }~X Y nX |s|r| |d  | |d  n| |
d |	d  qW qW d S )"Nc               @   s   e Zd Zdd Zdd ZdS )z=TestBufferProtocol.test_memoryview_struct_module.<locals>.INTc             S   s
   || _ d S )N)val)r   r  r0   r0   r1   __init__	  s    zFTestBufferProtocol.test_memoryview_struct_module.<locals>.INT.__init__c             S   s   | j S )N)r  )r   r0   r0   r1   __int__	  s    zETestBufferProtocol.test_memoryview_struct_module.<locals>.INT.__int__N)__name__
__module____qualname__r  r  r0   r0   r0   r1   INT	  s   r  c               @   s   e Zd Zdd Zdd ZdS )z=TestBufferProtocol.test_memoryview_struct_module.<locals>.IDXc             S   s
   || _ d S )N)r  )r   r  r0   r0   r1   r  	  s    zFTestBufferProtocol.test_memoryview_struct_module.<locals>.IDX.__init__c             S   s   | j S )N)r  )r   r0   r0   r1   	__index__	  s    zGTestBufferProtocol.test_memoryview_struct_module.<locals>.IDX.__index__N)r  r  r  r  r  r0   r0   r0   r1   IDX	  s   r  c               S   s   dS )Nr)   r0   r0   r0   r0   r1   r   	  r  z;TestBufferProtocol.test_memoryview_struct_module.<locals>.fr!  y@      @z-21.1gffffff(@r   r   r    r   r   r   r)   r(   r0   )r!  TF   as   abcr:   abcc             S   s   | S )Nr0   )rK   r0   r0   r1   <lambda>	  r  zBTestBufferProtocol.test_memoryview_struct_module.<locals>.<lambda>rX   r@   )rw   r   r   r   r   )objectr   r	   rX  r   rh   r   r   r@   r*   r   r   r.  r,   r   r   ri  assertIsNot)r   r  r  r   valuesr-   ra   rb   r  r   r9   rx   rr   Z
struct_errZmv_errrk  r0   r0   r1   test_memoryview_struct_module	  sF    


z0TestBufferProtocol.test_memoryview_struct_modulec             C   s@   t dddgdgdgd}| |j t|}| t|jd d S )Nr    r   r   r   )rw   ry   r   )r   rx  r  r@   r  r   r  )r   r  r  r0   r0   r1   !test_memoryview_cast_zero_strides	  s    z4TestBufferProtocol.test_memoryview_cast_zero_stridesc             C   s  xt D ]}tdrd| n|}t|}xft D ]^}tdrBd| n|}t|}tttdd| g|d}t|}| t	|j
|d| g q.W qW xtdD ]\}}	}
t|	dg|d}t|}x`tdD ]T\}}
}
t|s| t|j
|d| g qt|st|s| t	|j
|d| g qW qW td}td}tttd| dd|gdd}t|}| jt	|j
dd|gdd tttd	ddd
ddgd}t|}| t	|j
 | t	|j
ddd
 | t	|j
i  | t|j
d | t|j
d | t|j
d | t|j
d | t|j
d | t|j
d | t|j
d | t|j
d | t|j
d tddgdgdd}t|}| t|jd | t|jdd | t|j tttd	ddd
ddgd}t|}| jt	|j
di d tttd	d	gd}t|}| jt|j
ddgd | jt|j
ddgd | jt|j
ddd
dddddgd | jt|j
ddd
dddddgd | jt	|j
ddd
ddddd gd ttd!d" td#D d
ddd$gd}t|}| jt	|j
d%dd
ddgd tttd&d&gd%d}t|}| t|j
d%dgd&  ttd'd" td#D d#gd}t|}| jt	|j
d%dd
ddgd ttd(d" td#D d#gd}t|}| jt	|j
ddd
ddgd tttd&d&gd%d}t|}tttd&d&gdd}t|}tjd)krJ| t	|j
dddd*d+d,d-d.g | t|j
dd/d/d0d0dg | t|j
d%d/d/d0d0dg nN| t	|j
ddd1g | t|j
dd0d0dddg | t|j
d%d0d0dddg d S )2Nr   r4   r$   )rw   r   r    r   r   r   x   r   r   )rw   Xz@Xz@XYz=Bz!Lz<Pz>lZBIZxBI)r    r   )r   r   ZIIr   r(   r   l            ru   r   r)   rK   c             S   s   g | ]}d qS )r!  r0   )rl   r_   r0   r0   r1   rm   C
  s    zCTestBufferProtocol.test_memoryview_cast_invalid.<locals>.<listcomp>i  r"  r   r   c             S   s   g | ]}d qS )r!  r0   )rl   r_   r0   r0   r1   rm   M
  s    c             S   s   g | ]}d qS )r!  r0   )rl   r_   r0   r0   r1   rm   R
  s    l    I   r!   iQ  iAj i	 i   i   i)NON_BYTE_FORMATr   r*   r.  r   ro   rT   r@   r  r   r  rh   rk   r   ri   r   rR  rP  r   r?  r   maxsize)r   ZsfmtZsformatZssizeZdfmtZdformatZdsizer  r  Zsitemsr_   Zsize_hZsize_dr9   r   r3  r4  r0   r0   r1   test_memoryview_cast_invalid	  s    



 

 """&  
z/TestBufferProtocol.test_memoryview_cast_invalidc                st  ddd fddd fddd ff  fdd	}t d
}tdg d
d}t|dd\}}t|}|d}j||dddd|d|dd
 t d
}tdg| |gdd}t|d
|g d\}}t|}|jd
g d}j|||d
dddd|dd
 x:tddD ],\}	}
}t|	|
}t|}||||
|	 qW xBtddD ]4\}	}
}t|
dg|	t	d}t|}||||
|	 q8W d S )Nr   c             S   s   t |  S )N)ro   r   )r  r0   r0   r1   r  l
  r  z9TestBufferProtocol.test_memoryview_cast.<locals>.<lambda>r   c             S   s   dd t |  D S )Nc             S   s    g | ]}|d kr|d n|qS )r!   r   r0   )rl   rK   r0   r0   r1   rm   m
  s    zMTestBufferProtocol.test_memoryview_cast.<locals>.<lambda>.<locals>.<listcomp>)ro   r   )r  r0   r0   r1   r  m
  r  r   c             S   s   dd t |  D S )Nc             S   s   g | ]}t t|d qS )zlatin-1)rE   chr)rl   rK   r0   r0   r1   rm   n
  s    zMTestBufferProtocol.test_memoryview_cast.<locals>.<lambda>.<locals>.<listcomp>)ro   r   )r  r0   r0   r1   r  n
  r  c       
         s   t |}x D ]~\}}||}|| }j|| d|ddd| gd|dd
 ||}	|	|  |  }j|	| ||dddg|f|dd
 qW d S )Nr    r   r%   )r    T)	rJ   rx   r-   r   rv   rw   ry   rU   r  )r*   r.  r  r  r   r   )
r  r9   ra   r-   srcsizerA   Zto_bytelistr4  rU   m3)bytespecr   r0   r1   iter_roundtripq
  s    




z?TestBufferProtocol.test_memoryview_cast.<locals>.iter_roundtripr   r!  )rw   r   r    )r    T)	rJ   rx   r-   r   rv   rw   ry   rU   r  )rw   r   r0   r%   r>   r@   )rw   r   r   )
r*   r.  r   r   r@   r  r  rh   r>   r   )r   r  r  r  Z	destitemsZ	destshaper9   r4  Zdestsizer-   ra   r_   r0   )r  r   r1   test_memoryview_castj
  s<    






z'TestBufferProtocol.test_memoryview_castc             C   s  xt  D ]}xtd D ]}dtd | }t|}t|| }t|rTdnd}xJt||D ]:\}}}	t|}
|dkr|gng }||
g }t|||d}t	|}t
||||d\}}|d kr| t|j|| qf|d	krqft|||d}|j||d}t|}|j}| }| j||||d
||||dd
 ||}|j||d}t|}|j}| }| j|||
|d
||||dd
 | j|||
|d
||||dd
 qfW qW q
W trG dd dtj}|dd}t	|}|d}| |j| | |jd
 | |jd | |jd
 | |j|jf | |jd | |jd td}t	|}|d}| |j| | |jd
 | |jd | |jd
 | |j|jf | |jd | |jd d S )Nr4   )r3   r4   r   r@   rA   r   )rw   r   )rw   r   r    T)	rJ   rx   r-   r   rv   rw   ry   rU   r  c               @   s    e Zd ZdejfdejfgZdS )z>TestBufferProtocol.test_memoryview_cast_1D_ND.<locals>.BEPointrK   r  N)r  r  r  ctypesc_longc_double_fields_r0   r0   r0   r1   BEPoint
  s   r  r   g33333i@r   )r    r0   g333333?r   )r   rD   r   r*   r.  rs   ri   rh   r   r@   r   r  r   r  rP   ry   r   r  r  BigEndianStructurer   rJ   rx   r   rv   rw   r   r   r  )r   Z_tshaperI   ZtfmtZtsizer   rJ   r-   ra   r_   sizerw   Ztshaper  r9   Ztitemsr   r4  rv   ry   rU   r  Zm4r  pointr3  rK   r0   r0   r1   test_memoryview_cast_1D_ND
  s|    









z-TestBufferProtocol.test_memoryview_cast_1D_NDc             C   s@  t  dttdd}t|}| || | | |  |dd d }|dd d }| || | | |  tttdddddd	gd
d}t|}| | |  tddgdgdd}t|}| t|j tdgdgdd}t|}| t|j tddddddgddgdd}t|}| t|j d S )Nr   ir   r   r   i	  r"  r)   r   r   )rw   r   )r   r   )r)   r"  r.   s   12345r    r|   r     b   c   d   e   f)	r>   ro   rT   r@   r   r   r   r  r   )r   r:   r9   r  r0   r0   r1   test_memoryview_tolist
  s(     z)TestBufferProtocol.test_memoryview_tolistc             C   sH   t td}| }| |d |  | }| |d d S )Nr!  z<memoryz	<released)r@   r   __repr__r   
startswithrA  )r   r9   r   r0   r0   r1   test_memoryview_repr  s    z'TestBufferProtocol.test_memoryview_reprc             C   s   xRdD ]J}t d}t|d|dg}t|}| d| | d| | d| qW tdg dd}t|}| ttdt  d S )	N)r   r   g      g      ?g      @g      "@r   )r   z9.0 in m)	floatr>   r@   assertInr   r  r   r]  r^  )r   r-   infr  r9   r0   r0   r1   test_memoryview_sequence  s    
z+TestBufferProtocol.test_memoryview_sequencec          	   c   s8   |  t}d V  W d Q R X | t|jd|f  d S )Nz#index out of bounds on dimension %d)r  rS  r   str	exception)r   dimcmr0   r0   r1   assert_out_of_bounds_error+  s    z-TestBufferProtocol.assert_out_of_bounds_errorc          
   C   s*  t dg dd}t|}| |d d | |d | | |d | | t|jd t dg dd}t|}| t|jd t ttd	d	gt	d
}t|}| t
|jd | t|jd | t|jd | t
|jd | t
|jd t ttdddgt	d
}t|}| |d d | |d d | |d d | |d d | |d d x2dD ]*}| jdd ||df  W d Q R X qdW x2dD ]*}| jdd |d|f  W d Q R X qW | t
|jd | t
|jd | t|jd  | t|jd! | t|jd | t|jd d S )"Ng      )@r   )rw   r   r0   .r   )r    r   r   Ziiir)   )rw   r   l            g       @g        ir(   r   r   r   )r   r   )r   r   )r   r   r"  )ru   ru   )r8  r$  )r   r$  r    )r  )r   rI  r   )l            r   )r   l            )r   r   r   )g        g        )r   r@   r   r  r   rR  r   ro   rT   r   rS  r  )r   r  r9   indexr0   r0   r1   test_memoryview_index2  sF    

z(TestBufferProtocol.test_memoryview_indexc          
   C   s  t dg dtd}t|}d|d< | |d d d|d< | |d d | t|jdd	 t ttd
d
gd}t|}| t|jdd t ttd
d
gtd}t|}| t	|jdd | t|jdd | t|jdd | t	|jdd | t	|jdd xt
d D ]t}|dks|dkr*qt dddgdg|td}t|}tdd}d||< | || d | || ||  qW t ddd gdgdtd}t|}d!|d< | |d d! t d"d#d"gdgdtd}t|}d"|d< | |d d" t d$gdgdtd}t|}| t|jdd% t ttd&dddd'd(gtd}t|}xt
d  D ]\}}|dkrpqZ|dkr~qZ||}|\}	}
|d)ks|dkrdd*  dd*  }	}
|d+kr| t|jd|	d  | t|jdd, | t|jd|
 qZW |d}| t|jdd- t ttddgd.td}t|}| t|jdd t d/gdgd0td}t|}| t|jdd t ttd1dd'gtd}t|}d2|d3< | |d d d2 d4|d5< | |d d d4 x2d6D ]*}| jdd7 d||df< W d Q R X qW x2d8D ]*}| jdd7 d|d|f< W d Q R X qW | t	|jd9d | t	|jd:d | t|jd;d | t|jd<d | t|jdddg d S )=Ng      )@r   )rw   r   r   g     6@r0   g     7@.r   g333338@r)   )rw   r   rX   )rw   r   l            r!  g       @g        r"  ir  r(      r4   r   r   r    r   r8     1   2   3r  TF   xr   r  r   r   r   i   r   r9  s   ZxLs   12345r|   r   *   )r   r    +   )ru   ru   )r   r$  )r  )r   rI  )l            r   )r   l            )r   r   r   )g        g        )r   r   r@   r   r  r   rP  ro   rT   rS  rD   r   ra   r  r   r   r  )r   r  r9   r-   r   r   r3  Z_ranger4  lohir  r0   r0   r1   test_memoryview_assigng  s    
 






z)TestBufferProtocol.test_memoryview_assignc          	   C   s  t ttddgtd}t|}| t|jtddd | t|j	tdddt
ddg | t|jd t ttddgtd}t|}| t|jtdddtdddf | t|j	tdddtdddft
ddg | t|jtdddi f | t|j	tdddi ft
ddg | t|j	tddddg xzdtfD ]l}t ttddgdgdt|B d	}t ttd
dgdg|d}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 d d |ddd d d d< |ddd d d d |ddd d d d< | || | || qFW d S )Nr   )rw   r   r   r   r    r0   ru   r"  )rw   ry   r   r      )rw   ry   r   r   r   r   r#  )r   ro   rT   r   r@   r  r   rR  r   rP  r   r   r   r-  r   )r   r  r9   r   r1  r2  r3  r4  r0   r0   r1   test_memoryview_slice  sD    

$((,,z(TestBufferProtocol.test_memoryview_slicec             C   s  dd }xt ddD ]}xt|dD ]\}}}xt|D ]}xt|D ]}t||}t||}	t|	}
| |
| | |
 |  | |
 |  | t|
t| || ||	|
| d }d }y0|| }|| }|| ||< t|t|k}W n* t	k
r4 } z
|j
}W d d }~X Y nX d }y|
| |
|< W n* t	k
rt } z
|j
}W d d }~X Y nX |r| |t qT|s|r| || qT| |
| | |
 |  | |
 |  || ||	|
| qTW qBW q*W qW d S )Nc       	      S   s   xt |D ]\}}|| }|| }| || |||< ||krX| || | || n| || | || |||< | || | || |||< |||< q
W d S )N)r   r   assertNotEqual)	testcaser:   r   r9   
singleitemr   r_   aimir0   r0   r1   cmptest  s    z9TestBufferProtocol.test_memoryview_array.<locals>.cmptestr    r   r>   )rT   rh   r   r>   r@   r   r   r   rP   rh  ri  r   r   )r   r  r   r-   ra   r  rp  r   r:   r   r9   Z	array_errZhave_resizeZalarrk  Zm_errr0   r0   r1   test_memoryview_array  sF    z(TestBufferProtocol.test_memoryview_arrayc       	      C   s  t  ddddg}t  ddddg}t|}t|}x8dD ]0}| t|||t | t|||t q:W t|}|  | || | || | || t|}t|}|  | || | || t|}| |dddg tdgdgdt	d	}d
t
df|d< | t|| t  dd}t|}| || | || trG dd dtj}|dd}t|}t|}| || | || | || | t|j d S )Nr   r    r   r   r)   )__lt____le____gt____ge__)r   r   zl x d x)rw   r   r   ru   r   r   ur9  c               @   s    e Zd ZdejfdejfgZdS )zITestBufferProtocol.test_memoryview_compare_special_cases.<locals>.BEPointrK   r  N)r  r  r  r  r  r  r0   r0   r0   r1   r  u  s   r  r   rO  )r>   r@   r   getattrrX  rA  r   r  r   r   r  r  r  r  r   r   )	r   r:   r   rr   wattrr   r  r  r0   r0   r1   %test_memoryview_compare_special_casesJ  sF    

z8TestBufferProtocol.test_memoryview_compare_special_casesc             C   sn  t dg dd}t dg dtd}t|}t|}| || | || | || | || | || | || | || | || d|d< | || | || | || | || | || | || | || | || t tt	ddgtt
B d	}t tt	ddgtt
B d	}t|}| || d
|d< | || t dg dd}t dg dtd}t|}t|}| || | || | || | || | || | || t dg dd}t dg dtd}t|}t|}| || | || | || | || | || | || | || | || d S )Ni  z@L)rw   r   r   )rw   r   r   i  r0   r   )rw   r   r   r!  )i  g333333?s   12345ZLf5sZhf5s)i?g333333?s   12345)r   r   r@   r   rx  __ne__r  rW  ro   rT   r-  )r   nd1nd2rr   r  r   r  r9   r0   r0   r1   !test_memoryview_compare_ndim_zero  sf    z4TestBufferProtocol.test_memoryview_compare_ndim_zeroc             C   s  t dddddgdgdd}t ddddd	gdgdd}t|}t|}| || | || | || | || | || t dddddgdgd
d}t ddddd	gdgdd}t|}t|}| || | || | || | || | || t dddgdgdd}t dddddgdgdd}t|}t|}| ||d d d  | |d d d | | ||d d d  | |d d d |d d d  t dddgdgdd}t dddddgdgdd}t|}t|}| ||d d d  | |d d d | | ||d d d  | |d d d |d d d  t dddgdgdd}t dddddgdgdtd}t|}t|}| ||d d d  | |d d d | | ||d d d  | |d d d |d d d  t dddgdgdd}t dddddgdgdtd}t|}t|}| ||d d d  | |d d d | | ||d d d  | |d d d |d d d  d S )Nii@  ii  i'r   z@h)rw   r   i  z<iz>hr   r   ru   r#  z!hz<l)rw   r   r   zh  0cz>  h)r   r@   r   r  r-  )r   r  r  rr   r  r0   r0   r1    test_memoryview_compare_ndim_one  sh       z3TestBufferProtocol.test_memoryview_compare_ndim_onec             C   s   t ddgdgdd}t ddgdgdd}t|}t|}| || | || | || | || | || t ddgdgdd}t ddgdgd	d}t|}t|}| || | || | || | || | || d S )
Ni  i  r   z@h)rw   r   i|i?z= h0cz@   i)r   r@   r   )r   r  r  rr   r  r0   r0   r1   "test_memoryview_compare_zero_shape  s$    z5TestBufferProtocol.test_memoryview_compare_zero_shapec             C   s   t ddddgdgdd}t dgdgdgdd}t|}t|}| || | || | || | || | || t dgd dgd	d}t dgdgdgd
d}t|}t|}| || | || | || | || | || d S )Ni  r   z@L)rw   r   r   r   )rw   ry   r   )i  i  z@ Liz!L  h)r   r@   r   )r   r  r  rr   r  r0   r0   r1   $test_memoryview_compare_zero_strides   s$    z7TestBufferProtocol.test_memoryview_compare_zero_stridesc       
      C   s  d}x~t d D ]r}t|dd|\}}}xXdtfD ]L}t||g||d}t|}| || |d d d }t|}| || q0W qW d}xxtdD ]l}	t|\}}}xXdtfD ]L}t||g||d}t|}| || |d d d }t|}| || qW qW d S )	NrX   z@mr@   r4   r   )rw   r   r   r8  r   )rD   rd   r-  r   r@   r   rT   )
r   r   rI   r-   ra   r  r   r   r9   r_   r0   r0   r1   &test_memoryview_compare_random_formats:  s(    z9TestBufferProtocol.test_memoryview_compare_random_formatsc             C   s  t ttdddddgdd}t ttdd	dddgdd}t|}t|}| || | || | || | || | || t d
gd	 dddgdd}t dgd	 dddgdd}t|}t|}| || | || | || | || | || t ttd	dddgdd}t ttd	dddgdd}t|}t|}| || | || | || | || | || t d
gd ddgdd}t d
gd ddgdd}t|}t|}| || | || | || | || | || t ttd	dddgdd}t ttd	dddgdd}t|}t|}| || | || | || | || | || d S )Nir'   r   r   r   z@h)rw   r   r   rH  )r   r    r   z=f q xxL)g333333r    r   z< f 2Qr      r)   z! b B xLz
= Qx l xxLr   )r   ro   rT   r@   r   r  )r   r  r  rr   r  r0   r0   r1   "test_memoryview_compare_multidim_cV  sZ    z5TestBufferProtocol.test_memoryview_compare_multidim_cc             C   s  t ttdddddgdtd}t ttdd	dddgdtd}t|}t|}| || | || | || | || | || t d
gd ddgdtd}t dgd ddgdtd}t|}t|}| || | || | || | || | || t ttdddddgdtd}t ttdddddgdtd}t|}t|}| || | || | || | || | || t ttdddddgdtd}t ttdddddgdtd}t|}t|}| || | || | || | || | || t ttd	dddgdtd}t ttd	dddgdtd}t|}t|}| || | || | || | || | || d S )Nir'   r   r   r   z@h)rw   r   r   r   rH  )l    ru   r   z=Qq)ru   l    z=qQr   Z0llz@b)r   ro   rT   r   r@   r   r  )r   r  r  rr   r  r0   r0   r1   (test_memoryview_compare_multidim_fortran  sn    z;TestBufferProtocol.test_memoryview_compare_multidim_fortranc       	      C   sh  t tdd}t|dddg}t|dddgdd}t|dddgdtd	}t|}t|}| || | || | || d
gd }d|d< t|dddg}t|dddgdd}t|dddgdtd	}t|}t|}| || | || | || tt tdddgdd}|dddd d df }tt tdddgdd}|dddd d df }t|}t|}| || | || | || | || | || tdgd ddgdd}|dddd d df }tdgd ddgdd}|dddd d df }t|}t|}| || | || | || | || | || tt tddddgdd}|ddd d df }tt tddddgdd}|ddd d df }t|}t|}| || | || | || | || | || tt tddddgdd}|ddd d df }tt tddddgdd}|ddd d df }t|}t|}| || | || | || | || | || tdgd dddgdd}|ddd d df }tdgd dddgdd}|ddd d df }t|}t|}| || | || | || | || | || d S ) Nir'   r   r   r   z@l)rw   r   r   )rw   r   r   )gffffff
ir  rH  )gir  zd b czd h c(   r(   z@Ir    ru   r#  r   )ii      r"  z=iiz>iir   r   )r   s   123Zb3sZi3s)ro   rT   r   r   r   r@   r   r  )	r   lst1lst2r  r  rr   r  r1  r2  r0   r0   r1   &test_memoryview_compare_multidim_mixed  s    
z9TestBufferProtocol.test_memoryview_compare_multidim_mixedc             C   s  t ttddddgdd}t ttddddgdd}t|}t|}| || | || | || | || | || t ttddddgdd}t ttddddgdd}t|}t|}| || | || | || | || | || d S )	NrH  r   r   r   r   )rw   r   r   z@i)r   ro   rT   r@   r   r  )r   r  r  rr   r  r0   r0   r1   +test_memoryview_compare_multidim_zero_shape=  s$    z>TestBufferProtocol.test_memoryview_compare_multidim_zero_shapec             C   s  t dgd dddgdd}t dgdddgdddgdd	}t|}t|}| || | || | || | || | || | | |  t d
gd ddgdd}t d
gddgddgdd	}t|}t|}| || | || | || | || | || d S )Ni  r   r   r   z@L)rw   r   r   r   )rw   ry   r   )r    r   rX   r   z=lQz<lQ)r   r@   r   r   )r   r  r  rr   r  r0   r0   r1   -test_memoryview_compare_multidim_zero_stridesW  s&    z@TestBufferProtocol.test_memoryview_compare_multidim_zero_stridesc       	      C   sz  t ttdddgdd}|dddd d d	f }t ttdddgd
td}|dddd d d	f }t|}t|}| || | || | || | || | || t dgd ddgdtd}d|d d< |dddd d d	f }t dgd ddgdttB d}d|d d< |dddd d d	f }t|}t|}| || | || | || | || | || t ttddddgdtd}|ddd d d	f }t ttddddgdd}|ddd d d	f }t|}t|}| || | || | || | || | || t dgd dddgdttB d}|ddd d d	f }t dgd dddgdd}|ddd d d	f }t|}t|}| || | || | || | || | || t ttddddgdtd}|ddd d d	f }t ttddddgdtd}|ddd d d	f }t|}t|}| || | || | || | || | || t dgd dddgdttB d}d|d d d< |ddd d d	f }t dgd dddgdttB d}d|d d d< |ddd d d	f }t|}t|}| || | || | || | || | || ttdd}t|dddg}t |dddgdtd}t |dddgdt	tB d}t|}t|}| || | || | || dgd }d |d!< t|dddg}t |dddgd"td}t |dddgd#t	tB d}t|}t|}| || | || | || d S )$Nr  r   r(   z@I)rw   r   r   r    ru   r#  r   )rw   r   r   )l    ru   z=Qq)r    r#  r   r)   z>QqrH  r   )r;  ru   ZBbr   )s   hellor  r       Z5s0sP)s   sushir  r    ir'   z@lr   )s   sashimis   slicedg4@)s   ramens   spicygfffff"@r"  z
< 10p 9p dz
> 10p 9p d)
r   ro   rT   r-  r@   r   r  r   r   r   )	r   r1  r  r2  r  rr   r  r  r  r0   r0   r1   +test_memoryview_compare_multidim_suboffsetsr  s    
z>TestBufferProtocol.test_memoryview_compare_multidim_suboffsetsc             C   sr  xjdD ]`}t dgd dddddg|d d}t dgd dddddg|d ttB d	}d
|d d d
 d
 d
< t|}t|}| || | || | || | || | || t dgd dddddg|d d}t dgd dddddg|d ttB d	}d|d d d
 d
 d
< t|}t|}| || | || | || | || | || qW d S )N)r7   r5   r6   r8   l            r  r   r   r   r   )rw   r   )rw   r   r   r    )l            l        i   ZQLH)r    r    r    )r   r   r   r@   r   r  )r   	byteorderrK   r  r:   r   r0   r0   r1   !test_memoryview_compare_not_equal  s0    "z4TestBufferProtocol.test_memoryview_compare_not_equalc             C   s  t  ddddg}t|}|  | tt| | t|jd | tt| | t|j | t|j | tt	dt
  | t|jd | t|jdd xd	D ]}| t|j| qW t  ddddg}t|}t|}| || |  | || | || | || d S )
Nr   g?g@gffffff
@r   z1.0 in mr   r    )rJ   r   r   rx   r   rv   rw   ry   r   r  r  r  )r>   r@   rA  r  r   r  r   r   r   r]  r^  rR  rP  __getattribute__r   r  )r   r:   r9   r  r   r3  r4  r0   r0   r1   test_memoryview_check_released  s*    
z1TestBufferProtocol.test_memoryview_check_releasedc                sX  d t  dgdd}t|}| || | | |  t  gdgdd}t|}| || | | |  t  fddtd	D d
d
dgdd}t|}| || | | |  t  fddtdD dd
d
dd
gdd}t|}| || | | |  trTG dd dtj}|dd}t|}| | t| d S )N)ii@  ii  i'r   z@h)rw   r   r    z>hQiLlc                s   g | ]} qS r0   r0   )rl   r_   )rg   r0   r1   rm   G  s    z>TestBufferProtocol.test_memoryview_tobytes.<locals>.<listcomp>r   r   r   z=hQiLlc                s   g | ]} qS r0   r0   )rl   r_   )rg   r0   r1   rm   L  s    r  z<hQiLlc               @   s    e Zd ZdejfdejfgZdS )z;TestBufferProtocol.test_memoryview_tobytes.<locals>.BEPointrK   r  N)r  r  r  r  r  r  r0   r0   r0   r1   r  U  s   r  r   rO  )r   r@   r   r   rT   r  r  rE   )r   r   r9   r  r  r:   r0   )rg   r1   test_memoryview_tobytes8  s.    &"
z*TestBufferProtocol.test_memoryview_tobytesc             C   s<  |  tti td |  ttdtd tdddgdgdgd}|  tt|td td	d
dd}x4dD ],}t|t|}| || | |d
 d	 qbW td	d
dtd}x4dD ],}t|t|}| || | |d
 d	 qW xddD ]\}d	|d
< t|t|}| || | |d
 d	 d|d
< | |d
 d | |d
 d qW tdgdgdtd}xFdD ]>}t|t|}|  t	|j
d | || | | g  qXW tttddddgdtd}x2dD ]*}t|t|}| t| g g g qW tdgdgdtd}x:dD ]2}t|t|}| || | | |  qW tdddgdgdtd}x:dD ]2}t|t|}| || | | |  qZW tdddgdgdgtd}xldD ]d}t|t|}| || | | |  |  t|jdd | |d d | |d d qW |d d d }xldD ]d}t|t|}| || | | |  |  t|jdd | |d d | |d d q,W tttdddgtd}x2dD ]*}t|t|}| t| |  qW |  tt|td t|t|}| t| |  tttdddgttB d}x2dD ]*}t|t|}| t| |  q<W |  tt|td t|t|}| t| |  tttdddgttB d}xDdD ]<}|  tt|t| t|t|}| t| |  qW tdddddgdgdgd}t|td}| |j d S )Nr   r  rt   r    r   r   )rw   ry   r   r!  r0   r   )rw   r   )rt   r   r   )rw   r   r   rX   r   r(   r)   r   r   )rw   ry   r   r  ru   r   r   )rw   r   )rt   r   )r   r   r   )r  r   r   r   r   ZPyBUF_WRITEr   r   r   rS  rR  r   ro   rT   rP  r   r-  r   r  )r   r   r  r9   r0   r0   r1   test_memoryview_get_contiguous[  s    











z1TestBufferProtocol.test_memoryview_get_contiguousc             C   s   t d}tddddddg}t|}t|}td| }|| | |	 | t d}t
ttddddgdd	}t|}t|}td| }|| | |	 | d S )
Nr   r    r   r   r   r   r   r   )rw   r   )r*   r.  r>   r@   ioBytesIOr   readintor   r   r   ro   rT   )r   r  r:   r9   r   r   r   r0   r0   r1   test_memoryview_serializing  s    





z.TestBufferProtocol.test_memoryview_serializingc       	      C   s  t ttd}t|}| t|t| |jdddgd}| t|t| |d d d }t ttdd d d }| t|t| tttdddd	gtd
}t|}| t|t| tttdddd	gd}|d d dd d d d df }t|}| t|t| tttddd	dgt	d
}|d d dd d d d df }t|}| t|t| tttddgdd}t|}tttddgdd}t|}| || | t|t| tttddddgdd}t|}| 
t|j tttdddddgdd}t|}| 
t|j tttddddgdd}t|}| 
t|j tttdddddgdd}t|}| 
t|j d S )Nr   r   r   r   )rw   r#  rH  r   r   )rw   r   ru   r   )rw   r   r   r   ir   r   z= Lz< h)rE   ro   rT   r@   r   r  r  r   r   r-  r  r   __hash__)	r   r   r9   ZmcZmxr   rK   r:   r  r0   r0   r1   test_memoryview_hash  sJ    z'TestBufferProtocol.test_memoryview_hashc             C   s  t dddg}t|}t|}| t|j ~|  t dddg}t|}t|ttd}t|ttd}| |j	| | t|j ~~|  t dddg}t|}t|}t|}|  | t|j ~|  t dddg}t|}t|}t|ttd}t|ttd}| |j	| |  | t|j ~~|  tdddgdgt
d}t|}|jdddd	d
gdgd t|}t|}| | |  t|}	| |	 |  | |	 |  |  |	  |  | | |  ~|  |  dd }
t d}t|"}|
| | |d td W d Q R X tttddddgdd}t|ttd}	t|	ttd}| |j	| t|8}|
| | |dd  dddgdddggg W d Q R X xdtfD ]}t d}t|}~t|t|d}	t|	}~	t|t|d}t|^}~|
| |
| |
| | |d td | |d td | |d td ~W d Q R X ~W d Q R X ~W d Q R X t d}t|}~t|t|d}	t|	}~	t|t|d}t|b}~|
| |
| |
| | |d td | |d td | |d td ~~~W d Q R X W d Q R X W d Q R X qW t d}| t2 t|}t|}|d tdk W d Q R X W d Q R X d S )Nr    r   r   )r  r   )rw   r   r   r   r   r)   r(   )rw   c          	   S   s   t | }W d Q R X d S )N)r@   )r   r4  r0   r0   r1   catch22l  s    
z;TestBufferProtocol.test_memoryview_release.<locals>.catch22s   123r   r  r   r   )rw   r   r  r  )r   r@   r   r  r   rA  r  ND_REDIRECTr   rJ   r=  r>  r   r   r@  ordro   rT   )r   r:   r9   r   r  r  r3  r4  rK   r  r  rv  r   r  r  r0   r0   r1   test_memoryview_release*  s    

4





*
z*TestBufferProtocol.test_memoryview_releasec             C   s4  t dd tdD dgdd}tddd tdD }x||fD ]}t |ttd}t |ttd}t|}| |j| | |j| | |j| | || | || | || | |dd	 |dd	  | |dd	 |dd	  | |dd	 |dd	  ~~| |dd	 |dd	  qBW d S )
Nc             S   s   g | ]}d | qS )g      ?r0   )rl   rK   r0   r0   r1   rm     s    z?TestBufferProtocol.test_memoryview_redirect.<locals>.<listcomp>r   r   )rw   r   c             S   s   g | ]}d | qS )g      ?r0   )rl   rK   r0   r0   r1   rm     s    )r  r   r    r   )	r   rT   r>   r  r  r@   r   rJ   r   )r   r   r:   rK   r  rv  r9   r0   r0   r1   test_memoryview_redirect  s"    z+TestBufferProtocol.test_memoryview_redirectc             C   s  d}dddddddd	d
dddg}|  ttddd t }t|}| j||d|dddgdg|d	 x tdD ]}| || | qjW ~~t }t|}~~t }t|td}t|td}t|}| 	|j
| | 	|j
| | j||d|dddgdg|d	 ~~~~t }t|ttd}t|ttd}t|}| 	|j
| | 	|j
| | 	|j
| | j||d|dddgdg|d	 ~~~~tdd}t|}| j|d d|dddgdg|d	 x"tdD ]}| || | qW ~~tdd}t|}~~tdd}t|td}t|td}t|}| 	|j
d  | 	|j
| | j||d|dddgdg|d	 ~~~~tdd}t|ttd}t|ttd}t|}| 	|j
d  | 	|j
| | 	|j
| | j||d|dddgdg|d	 ~~~~d S )Nr   r   r    r   r   r   r   r   r)   r(   r!  rX   r"  r   )rJ   rx   r-   r   rv   rw   ry   rU   )r  )r  r   T)Zlegacy_mode)r  r   Zstaticarrayr@   r  rT   r   r   r  r   rJ   r  )r   r-   rU   rK   r  r   rv  r9   r0   r0   r1   $test_memoryview_from_static_exporter  s    









z7TestBufferProtocol.test_memoryview_from_static_exporterc             C   s,   t dddgdgttB d}| tt| d S )Nr    r   r   )r   )r   r/  ZND_GETBUF_UNDEFINEDr  r   r@   )r   r   r0   r0   r1   #test_memoryview_getbuffer_undefined   s    z6TestBufferProtocol.test_memoryview_getbuffer_undefinedc             C   s(   t dddgdgtd}| tt| d S )Nr    r   r   )rw   r   )r   r/  r  r   r@   )r   rK   r0   r0   r1   test_issue_7385&  s    z"TestBufferProtocol.test_issue_7385N)F)Sr  r  r  r   r  r  r7  rD  rE  rF  rG  rJ  rK  rN  rT  rU  rV  rY  rZ  r\  r_  rf  rg  rn  ro  rq  rs  rw  ry  r|  r}  r~  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  
contextlibcontextmanagerr  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  r0   r0   r0   r1   r     s   
 3
2i 
-'	0.Y #6!)>		% qu8	s<P	5m8>5?H>Ha (#u< ^r   __main__)r   NN)r   )r   )r   r&   r0   )r   r&   )r   )N)F)F)r   )N)fr  unittesttestr   	itertoolsr   r   randomr   r   r   warningsr   r>   r  osdecimalr   Z	fractionsr	   Z_testbufferImportErrorr   r*   r  EnvironmentVarGuardenvironcatch_warningsr?   r   Z
SHORT_TESTZNATIVEr+   r,   ZSTANDARDr2   rD   r-   copyrj   ZARRAYr[  ZBYTEFMTrZ   r\   rY   rL   rS   rV   rc   rd   re   rh   ri   rk   r  rp   rq   rs   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   rr  rt  ru  
skipUnlessTestCaser   r  mainr0   r0   r0   r1   <module>   sT   



$
	





	



	
?
+

!




                            Q
