o
    ҷhD                     @   s   d dl mZ d dlZd dl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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)IntervalDtype)
CategoricalCategoricalDtypeCategoricalIndexIndexIntervalIntervalIndex
date_rangenotnaperiod_rangetimedelta_range)IntervalArrayfooparamsc                 C   s   | j S Nparam)request r   b/var/www/html/venv/lib/python3.10/site-packages/pandas/tests/indexes/interval/test_constructors.pyname      r   c                   @   s  e Zd ZdZejg d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	g dejddfe	g dejddfe	g dejddfe	g d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	g dejde	g dej
de	g d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d+d, Zejd"ed-ed.ejed.edejed.d/dgd0d1 Zejd2eegd3d4 Zd5d6 Zd7S )8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      ?20180101periodsz<M8[ns]z
US/Eastern)r)   tzzdatetime64[ns, US/Eastern]z1 dayz<m8[ns]r   c                 C      |j S r   r   selfr   r   r   r   breaks_and_expected_subtype%   s   z,ConstructorTests.breaks_and_expected_subtypec           	      C   s   |\}}|  ||}|d||d|}|j|ksJ |j|ks"J |jj|ks*J t|jt|d d |d t|j	t|dd  |d d S )N)closedr   r!      r   )
get_kwargs_from_breaksr/   r   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, subtype)r   r1      r      float64zdatetime64[ns]ztimedelta64[ns]z
2017-01-01   c           
      C   sf   |  ||}|di |}|  |}t|d}|t|fD ]}|dd|i|}	t|	| qd S )Nr7   r"   r   )r2   astyper   strr4   r5   )
r-   r8   r9   r3   expected_kwargsexpectedr;   iv_dtyper"   r<   r   r   r   test_constructor_dtypeD   s   

z'ConstructorTests.test_constructor_dtyper9   c              	   C   sx   t |j}| |}|t|fD ])}td  |d|dd|}W d    n1 s,w   Y  |jjdks9J qd S )Nr6   r"   r/   r   )r   r"   r2   rC   r4   assert_produces_warningr/   )r-   r8   r9   rF   r;   r"   r<   r   r   r   test_constructor_pass_closedZ   s   

z-ConstructorTests.test_constructor_pass_closedr>   r?   2   c                 C   sl   |  |}|dd|i|}tj}tj|d d td}|j|ks#J |jj|ks+J t	t|| d S )Nr/   r0   r!   r   )
r2   npr@   arrayobjectr/   r"   r3   r4   assert_numpy_array_equal)r-   r8   r9   r/   r;   r<   r:   expected_valuesr   r   r   test_constructor_nano   s   
z%ConstructorTests.test_constructor_nanuint64c                 C   sv   |  |}|dd|i|}tjg td}t|dtj}|js!J |j|ks(J |jj	|ks0J t
t|| d S )Nr/   r!   r"   r   )r2   rL   rM   rN   getattrr    emptyr/   r"   r3   r4   rO   )r-   r8   r9   r/   r;   r<   rP   r:   r   r   r   test_constructor_empty|   s   

z'ConstructorTests.test_constructor_empty
0123456789
abcdefghijz<U1c                 C   sL   d}t jt|d |di | | W d    d S 1 sw   Y  d S )NIcategory, object, and string subtypes are not supported for IntervalIndexmatchr   )pytestraises	TypeErrorr2   )r-   r8   r9   msgr   r   r   test_constructor_string   s
   "z(ConstructorTests.test_constructor_stringcat_constructorc                 C   sH   t jddd}t|}||}| |}|di |}t|| d S )Nr   r    r!   r   )rL   aranger	   from_breaksr2   r4   r5   )r-   r8   r`   r9   rE   
cat_breaksr;   r<   r   r   r   "test_constructor_categorical_valid   s   

z3ConstructorTests.test_constructor_categorical_validc                 C   s  |  td}d}tjt|d |dddi| W d    n1 s$w   Y  d}tjt|d |dddi| W d    n1 sFw   Y  d	}tjt|d |dddi| W d    n1 shw   Y  td
dd}|  |}d}tjt|d |di | W d    n1 sw   Y  |  tddd}d}tjt|d |di | W d    d S 1 sw   Y  d S )Nr   z8closed must be one of 'right', 'left', 'both', 'neither'rY   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 insteadr0   z+left side of interval must be <= right sider   )r2   ranger[   r\   
ValueErrorr]   r   )r-   r8   fillerr^   r)   periods_kwargsdecreasing_kwargsr   r   r   test_generic_errors   s0   
"z$ConstructorTests.test_generic_errorsN) __name__
__module____qualname____doc__r[   fixturerL   r    ra   r   rR   r@   r
   r   r.   r=   markparametrizerG   rJ   nanrQ   rM   rU   tuplelistrN   r_   r   r   rd   rk   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      t jS r   )r	   from_arraysr-   r   r   r   r8      r   zTestFromArrays.constructorr7   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
        Nr0   r1   )r6   r7   r   r-   r9   r/   r   r   r   r2      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 d    n1 s*w   Y  g d}d	d
g}d}tjt|d t|| W d    d S 1 sRw   Y  d S )N
01234abcdeTorderedrX   rY   r0   r1   )r   r1   r>   r>   r   z(left and right must have the same length)r   ru   r[   r\   r]   r	   rx   rg   )r-   datar^   r6   r7   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s<J dS )z:mixed int/float left/right results in float for both sides	   r!   r1   r   N)rL   ra   r	   rx   r   r@   r4   r5   r6   r7   r"   r3   )	r-   left_subtyperight_subtyper6   r7   r<   expected_leftexpected_rightr:   r   r   r   test_mixed_float_int   s   z#TestFromArrays.test_mixed_float_intNr7   )rl   rm   rn   ro   r[   rp   r8   r2   r   rq   rr   rL   r    r@   r   r   r   r   r   rv      s    

rv   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   rw   r   )r	   rb   ry   r   r   r   r8     r   zTestFromBreaks.constructorr7   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
        r9   r   rz   r   r   r   r2     s   z%TestFromBreaks.get_kwargs_from_breaksc                 C   sR   t tddd}d}tjt|d t| W d    d S 1 s"w   Y  d S )Nr{   Tr|   rX   rY   )r   ru   r[   r\   r]   r	   rb   )r-   r~   r^   r   r   r   r     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	   rb   r4   r5   )r-   r9   r<   rE   r   r   r   test_length_one  s   

zTestFromBreaks.test_length_onec                 C   s>   t d}t|j}|jjd u s|jj|jjusJ d S d S )NrA   )rL   ra   r	   rb   _data_leftbase_right)r-   r9   r<   r   r   r   test_left_right_dont_share_data#  s   
(z.TestFromBreaks.test_left_right_dont_share_dataNr   )rl   rm   rn   ro   r[   rp   r8   r2   r   r   r   r   r   r   r   r     s    


r   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   rw   r   )r	   from_tuplesry   r   r   r   r8   -  r   zTestFromTuples.constructorr7   c                 C   s   t |rt|j d t|dkrd|iS tt|dd |dd }t|tt	fr2d|iS tt
|ddtrBd||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   r~   Nr0   r1   r"   )r4   is_unsigned_integer_dtyper[   skipr"   lenru   zip
isinstancert   rS   r   _constructorcomasarray_tuplesafe)r-   r9   r/   tuplesr   r   r   r2   1  s   
z%TestFromTuples.get_kwargs_from_breaksc                 C   s   g d}d}t jt|j|dd t| W d    n1 s!w   Y  g d}d}t jt|j|dd t| W d    n1 sGw   Y  g d}t jt|j|dd t| W d    d S 1 slw   Y  d S )N)r   r1   r>   r   r?   z5IntervalIndex.from_tuples received an invalid item, 2)trY   )r   )r>   r   z>IntervalIndex.from_tuples requires tuples of length 2, got {t})r   )r>   r   r?   )rA      )r[   r\   r]   formatr	   r   rg   )r-   r   r^   r   r   r   r   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   )rL   rs   r	   r   r4   r5   )r-   na_tupleidx_na_tupleidx_na_elementr   r   r   test_na_tuplesT  s   
zTestFromTuples.test_na_tuplesNr   )
rl   rm   rn   ro   r[   rp   r8   r2   r   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   r+   r   r   r,   r   r   r   klass_  s   zTestClassConstructors.klassc                 C   s   t S r   )r	   ry   r   r   r   r8   g  s   z!TestClassConstructors.constructorr7   c                    s   t |rt|j d t|dkrd|iS  fddt|dd |dd D }t|tr5d|iS tt	|d	dt
rEd||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   r~   c                    s(   g | ]\}}t |rt|| n|qS r   )r   r   ).0r6   r7   r/   r   r   
<listcomp>v  s    z@TestClassConstructors.get_kwargs_from_breaks.<locals>.<listcomp>Nr0   r1   r"   r!   )r4   r   r[   r   r"   r   r   r   ru   rS   r   r   rL   rM   rN   )r-   r9   r/   ivsr   r   r   r2   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-   r8   r   r   r   rk     s    z)TestClassConstructors.test_generic_errorsc                 C   s   d S r   r   ry   r   r   r   r_     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 d    n1 s&w   Y  d
}tjt|d	 |d W d    n1 sCw   Y  d}tjt|d	 |ddg W d    d S 1 scw   Y  d S )Nr   r1   r7   r   r>   r   r6   z-intervals must all be closed on the same siderY   zX(IntervalIndex|Index)\(...\) must be called with a collection of some kind, 5 was passedrA   z?type <class 'numpy.int(32|64)'> with value 0 is not an interval)r   r[   r\   rg   r]   )r-   r   r   r^   r   r   r   r     s   

"z-TestClassConstructors.test_constructor_errorszdata, closedbothneitherr   r   r   r>   rA   r6   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   r6   r7   )r   ivr   r   r   r     s   $ zGTestClassConstructors.test_override_inferred_closed.<locals>.<listcomp>r   )r   r	   	to_tuplesr   r4   r5   )r-   r8   r~   r/   r   rE   r<   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u s J t|jt| d S )Nr   r1   r>   r   r!   )	r   r   rN   typer4   rO   valuesrL   rM   )r-   r   	intervalsr   r<   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   r1   r6   r   r>   r7   r   r   r?   r   r!   )r   r   rN   r4   r5   )r-   r   r<   rE   r   r   r   test_index_mixed_closed  s   z-TestClassConstructors.test_index_mixed_closedNr   )rl   rm   rn   ro   r[   rp   r	   r   r   r   r8   r2   rk   r_   r   rq   rr   rL   rs   r   rb   rf   r   ru   rM   r   r   r   r   r   r   r   r   \  s@    





	r   c                  C   s   t tjd} d}tjt|d tg | dd W d    n1 s!w   Y  tjt|d tg | dd W d    d S 1 s@w   Y  d S )Nr6   z*closed keyword does not match dtype.closedrY   r   rH   )r   rL   r    r[   r\   rg   r	   r   )r"   r^   r   r   r   test_dtype_closed_mismatch  s   "r   )#	functoolsr   numpyrL   r[   pandas.core.dtypes.dtypesr   pandasr   r   r   r   r   r	   r
   r   r   r   pandas._testing_testingr4   pandas.core.arraysr   pandas.core.commoncorecommonr   rp   r   r   rv   r   r   r   r   r   r   r   r   <module>   s"    0
 61&2x