U
    NZfD                     @   s   d dl mZ d dlZd dlZd dlmZ d dlmZ d dl	m
Z
mZmZmZmZmZmZmZmZ d dlmZ d dlmZ d dlm  mZ ejddgdd	d
 ZG dd dZG dd deZG dd deZ G dd deZ!G dd deZ"dd Z#dS )    )partialN)is_categorical_dtype)IntervalDtype)	CategoricalCategoricalIndexIndexIntervalIntervalIndex
date_rangenotnaperiod_rangetimedelta_range)IntervalArrayZfooparamsc                 C   s   | j S Nparam)request r   S/tmp/pip-unpacked-wheel-nbcvw55c/pandas/tests/indexes/interval/test_constructors.pyname   s    r   c                   @   s  e Zd ZdZejdddddgejfejddd	ejfe	ejd
dejd	ejfe	ejddej
d	ej
fe	edddejd	ejfeddddfedddddfeddddfgddd Zdd Zejde	ddd dd!gejd	d"fe	ddd dd!gejd	d#fe	ddd dd!gejd	d$fe	ddd dd!gejd	dfed%d&ddfedd&ddfgd'd( Zejd)e	ddd dd!gejd	e	ddd dd!gej
d	e	ddd dd!gejd	ed%d&dedd&dgd*d+ Zejd)ejgd  ejgd! ejgd, gd-d. Zejd)g ejg dd	ejg d/d	ejg d"d	ejg d#d	ejg d$d	gd0d1 Zejd)ed2ed3ejed3ed	ejed3d4d	gd5d6 Zejd7eegd8d9 Zd:d; Zd<S )=ConstructorTestsz
    Common tests for all variations of IntervalIndex construction. Input data
    to be supplied in breaks format, then converted by the subclass method
    get_kwargs_from_breaks to the expected format.
             \   i  
   int64dtypei            g      ?Z20180101periodsz<M8[ns]z
US/Eastern)r&   tzzdatetime64[ns, US/Eastern]z1 dayz<m8[ns]r   c                 C   s   |j S r   r   selfr   r   r   r   breaks_and_expected_subtype%   s    z,ConstructorTests.breaks_and_expected_subtypec           	      C   s   |\}}|  ||}|f ||d|}|j|ks6t|j|ksDt|jj|ksTtt|jt	|d d |d t|j
t	|dd  |d d S )N)closedr   r      )get_kwargs_from_breaksr+   AssertionErrorr   r    subtypetmassert_index_equalleftr   right)	r)   constructorr*   r+   r   breaksexpected_subtyperesult_kwargsresultr   r   r   test_constructor7   s    z!ConstructorTests.test_constructorzbreaks, subtyper   r-         float64zdatetime64[ns]ztimedelta64[ns]z
2017-01-01   c           
      C   sb   |  ||}|f |}|  |}t|d}|t|fD ]"}|f d|i|}	t|	| q:d S )Nr4   r    )r.   Zastyper   strr1   r2   )
r)   r5   r6   r0   Zexpected_kwargsexpectedr8   iv_dtyper    r9   r   r   r   test_constructor_dtypeD   s    


z'ConstructorTests.test_constructor_dtyper6   c              
   C   sd   t |j}| |}|t|fD ]>}td  |f |dd|}W 5 Q R X |jjdks tq d S )Nr3   r    r+   )r   r    r.   r?   r1   Zassert_produces_warningr+   r/   )r)   r5   r6   rA   r8   r    r9   r   r   r   test_constructor_pass_closedZ   s    

z-ConstructorTests.test_constructor_pass_closed2   c                 C   sl   |  |}|f d|i|}tj}tj|d d td}|j|ksFt|jj|ksVtt	
t|| d S )Nr+   r,   r   )r.   npr=   arrayobjectr+   r/   r    r0   r1   assert_numpy_array_equal)r)   r5   r6   r+   r8   r9   r7   expected_valuesr   r   r   test_constructor_nano   s    
z%ConstructorTests.test_constructor_nanuint64c                 C   sv   |  |}|f d|i|}tjg td}t|dtj}|jsBt|j|ksPt|j	j
|ks`ttt|| d S )Nr+   r   r    )r.   rF   rG   rH   getattrr   emptyr/   r+   r    r0   r1   rI   )r)   r5   r6   r+   r8   r9   rJ   r7   r   r   r   test_constructor_empty|   s    

z'ConstructorTests.test_constructor_empty
0123456789Z
abcdefghijz<U1c              	   C   s2   d}t jt|d |f | | W 5 Q R X d S )NIcategory, object, and string subtypes are not supported for IntervalIndexmatch)pytestraises	TypeErrorr.   )r)   r5   r6   msgr   r   r   test_constructor_string   s    z(ConstructorTests.test_constructor_stringcat_constructorc                 C   sD   t jddd}t|}||}| |}|f |}t|| d S )Nr   r   r   )rF   aranger	   from_breaksr.   r1   r2   )r)   r5   rY   r6   r@   Z
cat_breaksr8   r9   r   r   r   "test_constructor_categorical_valid   s    


z3ConstructorTests.test_constructor_categorical_validc              	   C   s  |  td}d}tjt|d |f ddi| W 5 Q R X d}tjt|d |f ddi| W 5 Q R X d	}tjt|d |f ddi| W 5 Q R X td
dd}|  |}d}tjt|d |f | W 5 Q R X |  tddd}d}tjt|d |f | W 5 Q R X d S )Nr   z8closed must be one of 'right', 'left', 'both', 'neither'rR   r+   invalidz)dtype must be an IntervalDtype, got int64r    r   z(data type ["']invalid["'] not understoodz
2000-01-01r%   z:Period dtypes are not supported, use a PeriodIndex insteadr,   z+left side of interval must be <= right side)r.   rangerT   rU   
ValueErrorrV   r   )r)   r5   ZfillerrW   r&   Zperiods_kwargsZdecreasing_kwargsr   r   r   test_generic_errors   s&    
z$ConstructorTests.test_generic_errorsN) __name__
__module____qualname____doc__rT   fixturerF   r   rZ   r   rL   r=   r
   r   r*   r:   markparametrizerB   rD   nanrK   rG   rO   tuplelistrH   rX   r   r   r\   r`   r   r   r   r   r      s|   





*

	
	
r   c                   @   sZ   e Zd ZdZejdd ZdddZdd Zej	
d	ejejfejejfgd
d ZdS )TestFromArraysz+Tests specific to IntervalIndex.from_arraysc                 C   s   t jS r   )r	   from_arraysr)   r   r   r   r5      s    zTestFromArrays.constructorr4   c                 C   s   |dd |dd dS )z
        converts intervals in breaks format to a dictionary of kwargs to
        specific to the format expected by IntervalIndex.from_arrays
        Nr,   r-   )r3   r4   r   r)   r6   r+   r   r   r   r.      s    z%TestFromArrays.get_kwargs_from_breaksc              	   C   s   t tddd}d}tjt|d" t|d d |dd   W 5 Q R X ddd	g}d	d
g}d}tjt|d t|| W 5 Q R X d S )N
01234abcdeTZorderedrQ   rR   r,   r-   r   r;   r   z(left and right must have the same length)r   rj   rT   rU   rV   r	   rl   r_   )r)   datarW   r3   r4   r   r   r   test_constructor_errors   s    &
z&TestFromArrays.test_constructor_errorszleft_subtype, right_subtypec           	      C   s|   t jd|d}t jdd|d}t||}t|t jd}t|t jd}t j}t|j| t|j	| |j
j|ksxtdS )z:mixed int/float left/right results in float for both sides	   r   r-   r   N)rF   rZ   r	   rl   r   r=   r1   r2   r3   r4   r    r0   r/   )	r)   Zleft_subtypeZright_subtyper3   r4   r9   Zexpected_leftZexpected_rightr7   r   r   r   test_mixed_float_int   s    z#TestFromArrays.test_mixed_float_intN)r4   )ra   rb   rc   rd   rT   re   r5   r.   rr   rf   rg   rF   r   r=   rt   r   r   r   r   rk      s   

 rk   c                   @   s@   e Zd ZdZejdd ZdddZdd Zd	d
 Z	dd Z
dS )TestFromBreaksz+Tests specific to IntervalIndex.from_breaksc                 C   s   t jS r   )r	   r[   rm   r   r   r   r5     s    zTestFromBreaks.constructorr4   c                 C   s   d|iS )z
        converts intervals in breaks format to a dictionary of kwargs to
        specific to the format expected by IntervalIndex.from_breaks
        r6   r   rn   r   r   r   r.     s    z%TestFromBreaks.get_kwargs_from_breaksc              	   C   s<   t tddd}d}tjt|d t| W 5 Q R X d S )Nro   Trp   rQ   rR   )r   rj   rT   rU   rV   r	   r[   )r)   rq   rW   r   r   r   rr     s
    z&TestFromBreaks.test_constructor_errorsc                 C   s*   dg}t |}t g }t|| dS )z3breaks of length one produce an empty IntervalIndexr   N)r	   r[   r1   r2   )r)   r6   r9   r@   r   r   r   test_length_one  s    

zTestFromBreaks.test_length_onec                 C   s:   t d}t|j}|jjd ks6|jj|jjk	s6td S )Nr>   )	rF   rZ   r	   r[   _data_leftbaseZ_rightr/   )r)   r6   r9   r   r   r   test_left_right_dont_share_data#  s    
z.TestFromBreaks.test_left_right_dont_share_dataN)r4   )ra   rb   rc   rd   rT   re   r5   r.   rr   rv   rz   r   r   r   r   ru     s   


ru   c                   @   s8   e Zd ZdZejdd ZdddZdd Zd	d
 Z	dS )TestFromTuplesz+Tests specific to IntervalIndex.from_tuplesc                 C   s   t jS r   )r	   from_tuplesrm   r   r   r   r5   -  s    zTestFromTuples.constructorr4   c                 C   s   t |rt|j d t|dkr0d|iS tt|dd |dd }t|tt	frdd|iS t
|rzd||iS dt|iS )z
        converts intervals in breaks format to a dictionary of kwargs to
        specific to the format expected by IntervalIndex.from_tuples
        z- not relevant IntervalIndex.from_tuples testsr   rq   Nr,   r-   )r1   is_unsigned_integer_dtyperT   skipr    lenrj   zip
isinstanceri   r   _constructorcomZasarray_tuplesafe)r)   r6   r+   tuplesr   r   r   r.   1  s    
z%TestFromTuples.get_kwargs_from_breaksc              	   C   s   dddg}d}t jt|j|dd t| W 5 Q R X dddg}d}t jt|j|dd t| W 5 Q R X dd	d
g}t jt|j|dd t| W 5 Q R X d S )Nr   r-   r;   )r   r<   z5IntervalIndex.from_tuples received an invalid item, 2)trR   )r;   z>IntervalIndex.from_tuples requires tuples of length 2, got {t})r;   r   r<   )r>      )rT   rU   rV   formatr	   r|   r_   )r)   r   rW   r   r   r   rr   C  s    


z&TestFromTuples.test_constructor_errorsc                 C   s>   dt jt jfdg}t|}tdt jdg}t|| d S )Nr   )r;   r   )rF   rh   r	   r|   r1   r2   )r)   Zna_tupleZidx_na_tupleZidx_na_elementr   r   r   test_na_tuplesT  s    
zTestFromTuples.test_na_tuplesN)r4   )
ra   rb   rc   rd   rT   re   r5   r.   rr   r   r   r   r   r   r{   *  s   

r{   c                   @   s  e Zd ZdZejeeeddgddgddd Z	ejd	d
 Z
d%ddZdd Zdd Zdd Zejdg dfejejgdfeddddeddddgdfeddddeddddgdfejeddddfgdd Zejdeejeegd d! Zd"d# Zd$S )&TestClassConstructorsz6Tests specific to the IntervalIndex/Index constructorsintervalr   r	   r   )r   idsc                 C   s   |j S r   r   r(   r   r   r   klass_  s    zTestClassConstructors.klassc                 C   s   t S r   )r	   rm   r   r   r   r5   g  s    z!TestClassConstructors.constructorr4   c                    s   t |rt|j d t|dkr0d|iS  fddt|dd |dd D }t|trjd|iS t	|rd|
|iS dtj|td	iS )
z
        converts intervals in breaks format to a dictionary of kwargs to
        specific to the format expected by the IntervalIndex/Index constructors
        z) not relevant for class constructor testsr   rq   c                    s(   g | ] \}}t |r t|| n|qS r   )r   r   ).0r3   r4   r+   r   r   
<listcomp>v  s   z@TestClassConstructors.get_kwargs_from_breaks.<locals>.<listcomp>Nr,   r-   r   )r1   r}   rT   r~   r    r   r   r   rj   r   r   rF   rG   rH   )r)   r6   r+   ivsr   r   r   r.   k  s    


z,TestClassConstructors.get_kwargs_from_breaksc                 C   s   dS )z
        override the base class implementation since errors are handled
        differently; checks unnecessary since caught at the Interval level
        Nr   )r)   r5   r   r   r   r`     s    z)TestClassConstructors.test_generic_errorsc                 C   s   d S r   r   rm   r   r   r   rX     s    z-TestClassConstructors.test_constructor_stringc              	   C   s   t ddddt ddddg}d}tjt|d	 || W 5 Q R X d
}tjt|d	 |d W 5 Q R X d}tjt|d	 |ddg W 5 Q R X d S )Nr   r-   r4   r   r;   r   r3   z-intervals must all be closed on the same siderR   zX(IntervalIndex|Index)\(...\) must be called with a collection of some kind, 5 was passedr>   z?type <class 'numpy.int(32|64)'> with value 0 is not an interval)r   rT   rU   r_   rV   )r)   r   r   rW   r   r   r   rr     s    z-TestClassConstructors.test_constructor_errorszdata, closedbothneitherr   r   r   r;   r>   r3   c                 C   sL   t |tr| }ndd |D }tj||d}|||d}t|| d S )Nc                 S   s$   g | ]}t |r|j|jfn|qS r   )r   r3   r4   )r   Zivr   r   r   r     s     zGTestClassConstructors.test_override_inferred_closed.<locals>.<listcomp>r   )r   r	   Z	to_tuplesr|   r1   r2   )r)   r5   rq   r+   r   r@   r9   r   r   r   test_override_inferred_closed  s    

z3TestClassConstructors.test_override_inferred_closedvalues_constructorc                 C   sX   t ddt ddt ddg}||}t|td}t|tks@tt|jt	| d S )Nr   r-   r;   r   r   )
r   r   rH   typer/   r1   rI   valuesrF   rG   )r)   r   	intervalsr   r9   r   r   r   test_index_object_dtype  s
    z-TestClassConstructors.test_index_object_dtypec                 C   sX   t ddddt ddddt ddddt dd	d
dg}t|}t|td}t|| d S )Nr   r-   r3   r   r;   r4   r   r   r<   r   r   )r   r   rH   r1   r2   )r)   r   r9   r@   r   r   r   test_index_mixed_closed  s    z-TestClassConstructors.test_index_mixed_closedN)r4   )ra   rb   rc   rd   rT   re   r	   r   r   r   r5   r.   r`   rX   rr   rf   rg   rF   rh   r   r[   r^   r   rj   rG   r   r   r   r   r   r   r   r   \  s@   




 
	r   c               	   C   sd   t tjd} d}tjt|d tg | dd W 5 Q R X tjt|d tg | dd W 5 Q R X d S )Nr3   z*closed keyword does not match dtype.closedrR   r   rC   )r   rF   r   rT   rU   r_   r	   r   )r    rW   r   r   r   test_dtype_closed_mismatch  s    r   )$	functoolsr   ZnumpyrF   rT   Zpandas.core.dtypes.commonr   Zpandas.core.dtypes.dtypesr   Zpandasr   r   r   r   r	   r
   r   r   r   Zpandas._testingZ_testingr1   Zpandas.core.arraysr   Zpandas.core.commoncorecommonr   re   r   r   rk   ru   r{   r   r   r   r   r   r   <module>   s"   ,
 61&2x