U
    f/e                     @   s,  d dl Zd dlZd dlm  mZ d dlZd dl	m
Z ejdddZd dlmZ dd ejD Zedd ejD 7 Zeejd	d
d	dgddg7 Zejedd eD ddd Zdd Zeddd Zeddd Zeddd Zeddd Zejdd Zdd Zeddd  ZdS )!    NZpyarrowz0.17.0)Z
minversion)pyarrow_array_to_numpy_and_maskc                 C   s"   g | ]}t jd dddg|dqS )         Ndtypepdarray.0r    r   P/tmp/pip-unpacked-wheel-tiezk1ph/pandas/tests/arrays/masked/test_arrow_compat.py
<listcomp>   s     r   c                 C   s"   g | ]}t jd dddg|dqS )g?g?g333333?Nr   r   r   r   r   r   r      s     TFbooleanr   c                 C   s   g | ]}|j jqS r   )r   name)r   ar   r   r   r      s     )paramsidsc                 C   s   | j S )N)param)requestr   r   r   data   s    r   c                 C   s>   t | }t j| jtd dt | jjd}||s:td S )N)Zna_valuetype)	par
   Zto_numpyobjectfrom_numpy_dtyper   numpy_dtypeequalsAssertionError)r   arrexpectedr   r   r   test_arrow_array   s    
r"   c                 C   s`   t d| i}t|}|djt| jjks4t	|
 }|d j| jksPt	t|| d S )Nr   )r	   	DataFramer   tablefieldr   strr   r   r   	to_pandastmassert_frame_equalr   dfr$   resultr   r   r   test_arrow_roundtrip    s    
r-   c                 C   s   t d| dd i}t|}|djt| jjks<t	tjtj
g |djdg|jd}| }|d j| jks|t	t|| d S )Nr   r   r   )schema)r	   r#   r   r$   r%   r   r&   r   r   r   Zchunked_arrayr.   r'   r(   r)   r*   r   r   r    test_arrow_load_from_zero_chunks*   s    
 r/   c                  C   sN   t  } | tjddddd gdd}t jddddd gdd}t|| d S )	Nr   r   r      Zint64r   ZUInt32r   )r	   ZUInt32Dtype__from_arrow__r   r
   r(   Zassert_extension_array_equal)r   r,   r!   r   r   r   test_arrow_from_arrow_uint9   s    r2   c                 C   s   t d| i}t|}|dd  }|jdd  jdd}t	|| |
| d }t|}|dd  }|jdd  jdd}t	|| d S )Nr   r   T)Zdropr   )r	   r#   r   r$   slicer'   ZilocZreset_indexr(   r)   Zfillna)r   r+   r$   r,   r!   Zdf2r   r   r   test_arrow_slicedE   s    

r4   c                 C   s\   t | }t|}tjdddd g|d}t jdddg|d}t ddddg}||||fS )Nr   r   r   r   r   TF)npr   r   r   r
   )Zany_real_dtypenp_dtypeZpa_typepa_arraynp_expectedmask_expectedr   r   r   np_dtype_to_arraysW   s    

r:   c                 C   s  | \}}}}t ||\}}t|dd | t|| | d }| d }| d  }	t|	d }
tjj|j	t
|||
g|jd}|  t ||\}}t|dd | t|| d|j	jd  }t||	 }td}tjj|j	t
|||g|jd d}|  t ||\}}t|dd | t|| tjg |d	}tjg tjd	}tjj|j	d||g|jd}|  t ||\}}t|dd | t|| dS )
a&  
    Test conversion from pyarrow array to numpy array.

    Modifies the pyarrow buffer to contain padding and offset, which are
    considered valid buffers by pyarrow.

    Also tests empty pyarrow arrays with non empty buffers.
    See https://github.com/pandas-dev/pandas/issues/40896
    Nr   r   r       )r   lengthbuffersoffset      r   )r   r(   Zassert_numpy_array_equalr=   Z
to_pybytesr   Z	py_bufferArrayZfrom_buffersr   lenr>   validateZ	bit_widthr5   r
   Zbool_)r:   r6   r7   r8   r9   r   maskZmask_bufferZdata_bufferZdata_buffer_bytesZdata_buffer_trailZpa_array_trailr>   Zdata_buffer_offsetZmask_buffer_offsetZpa_array_offsetZnp_expected_emptyZmask_expected_emptyr   r   r   $test_pyarrow_array_to_numpy_and_maske   sV    

rE   c              	   C   s\   |j dkr"| jtjjd dd t|d}tj	t
d d |j | W 5 Q R X d S )Nr   z#numeric dtypes don't error but cast)raisesreasonstring)match)r   nodeZ
add_markerpytestmarkZxfailr   r
   castrF   	TypeErrorr1   )r   r   r    r   r   r   test_from_arrow_type_error   s    
rO   )Znumpyr5   rK   Zpandas.util._test_decoratorsutilZ_test_decoratorstdZpandasr	   Zpandas._testingZ_testingr(   Zimportorskipr   Zpandas.core.arrays._arrow_utilsr   ZALL_EA_INT_DTYPESZarraysZFLOAT_EA_DTYPESr
   Zfixturer   r"   Z
skip_if_nor-   r/   r2   r4   r:   rE   rO   r   r   r   r   <module>   s2   
	
	



?