o
    Eh4F                     @   s   d Z ddlmZmZ ddl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 ddlZddlmZmZmZmZ ddlmZ G dd	 d	Zejd
ejdddgdd Zejjejd
ejdddgdd Zdd Zdd ZdS )z
Collection of tests asserting things that should be true for
any index subclass except for MultiIndex. Makes use of the `index_flat`
fixture defined in pandas/conftest.py.
    )copydeepcopyN)IS64)np_version_gte1p25)is_integer_dtypeis_numeric_dtype)CategoricalIndex
MultiIndexPeriodIndex
RangeIndexc                   @   s  e Zd Zejdddgdd Zdd Zdd	 Zd
d Z	dd Z
dd Zejjdd Zdd Zejddd Zdd Zdd Zdd Zejdejddd  Zejdd!d" Zejdd#d$ Zd%d& Zejdd'd( Zejd)g d*d+d, Zd-d. ZdS )/
TestCommonnameNnew_namec                 C   s   |}|r|}n|j pd}|j|d}|j|u sJ t|jdks"J |jd |ks+J |s7|| j|jus7J |jd|d}|j|usEJ d S )Nr   r      F)indexr   )r   Zto_framer   lencolumnsvalues)selfr   
index_flatZusing_copy_on_writeidxZidx_nameZdf r   @lib/python3.10/site-packages/pandas/tests/indexes/test_common.pytest_to_frame"   s   
zTestCommon.test_to_framec              	   C   s   |}| g |sJ |j|jgfD ],}t|jtr!||ju r!qd}tjt|d | | W d    n1 s:w   Y  qddgfD ]}tjtdd | | W d    n1 s^w   Y  qEd S )NzTCannot remove 1 levels from an index with 1 levels: at least one level must be left.matchwrongz>'Requested level \(wrong\) does not match index name \(None\)')	Z	droplevelequalsr   
isinstancetuplepytestraises
ValueErrorKeyError)r   r   r   levelmsgr   r   r   test_droplevel7   s(   zTestCommon.test_droplevelc                 C   s   |}d}dgg}t jt|d |j|d W d    n1 s w   Y  t jt|d |j|d W d    d S 1 s>w   Y  d S )Nz"Index.name must be a hashable type1r   r   )names)r!   r"   	TypeErrorrename	set_names)r   r   r   messageZrenamedr   r   r   "test_constructor_non_hashable_nameP   s   "z-TestCommon.test_constructor_non_hashable_namec                 C   s*   |}t |||jd}t|j|j d S )Ndtype)typer0   tmZassert_equal_data)r   r   abr   r   r   test_constructor_unwraps_index_   s   z)TestCommon.test_constructor_unwraps_indexc                 C   s   |}|  }t|| d S )N)Zto_flat_indexr2   assert_index_equal)r   r   r   resultr   r   r   test_to_flat_indexf   s   zTestCommon.test_to_flat_indexc                 C   s   |}d}|j }||g}|j |ksJ |j |ksJ |j|dd}|d u s(J |j |ks/J |j|gks7J tjtdd |jddd W d    n1 sPw   Y  d	}|j|dd |j |kseJ |j|gksmJ d S )
Nz#This is the new name for this indexTZinplacezLevel must be Noner   r4   r   r%   )AB)r   r,   r+   r)   r!   r"   r#   )r   r   r   r   original_nameZnew_indresr   r   r   r   test_set_name_methodsm   s"   z TestCommon.test_set_name_methodsc                 C   s>   t jtdd |d W d    d S 1 sw   Y  d S )Nz	list-liker   r4   )r!   r"   r*   r,   )r   r   r   r   r   $test_set_names_single_label_no_level   s   "z/TestCommon.test_set_names_single_label_no_levelc                 C   sT   |}t tfD ]}||}||usJ ||sJ q|j ddd}|jdks(J d S )NTZbanana)deepr   )r   r   r   r   )r   r   r   funcZidx_copyZnew_copyr   r   r   test_copy_and_deepcopy   s   z!TestCommon.test_copy_and_deepcopyz$ignore:Dtype inference:FutureWarningc                 C   s   |}t ||ddd}t ||dd}||usJ t|| ||s&J |jdks-J |jdks4J tjd|d}tjd|d d	 d}|| }|jjdksRJ d S )
NTmario)r   r   F)r      )r      )r1   r2   r7   r   r   pdSeriesr   )r   r   r   firstseconds1s2Zs3r   r   r   test_copy_name   s   zTestCommon.test_copy_namec                 C   s   |}|j ddjdksJ tjtdd |j ddgd W d    n1 s'w   Y  t|j d}tjt|d |j dggd W d    d S 1 sOw   Y  d S )NrE   r   z$Length of new names must be 1, got 2r   Zluigiz.name must be a hashable type)r   r   r!   r"   r#   r1   __name__r*   )r   r   r   r&   r   r   r   test_copy_name2   s   "zTestCommon.test_copy_name2c                 C   s   |}|  }d|jd fD ]}|j|d}t|| qd}tjt|d |jdd W d    n1 s5w   Y  dt	|j
  d}tjt|d |jdd W d    d S 1 s_w   Y  d S )	Nr   r;   z.Too many levels: Index has only 1 level, not 4r   rG   z6Requested level \(wrong\) does not match index name \(z\)r   )drop_duplicatesr   uniquer2   r7   r!   r"   
IndexErrorreescape__repr__r$   )r   r   r   expectedr%   r8   r&   r   r   r   test_unique_level   s    "zTestCommon.test_unique_levelc                 C   s   |}t |std |dgd  }|dg }|jdu sJ z	|jdu s&J W n	 ty0   Y nw | }t|| |j	sCtd |j
dgd  }tj|d< |d d }||}||}	|	jdu sgJ |j|jksoJ |	j|jkswJ |	}
t||	gD ]\}}| }t||
 qd S )Nz)Skip check for empty Index and MultiIndexr      TFz%Skip na-check if index cannot hold narF   )r   r!   skip	is_uniquehasnansNotImplementedErrorrS   r2   r7   Z_can_hold_na_valuesnpnanZ_shallow_copyr0   	enumerate)r   r   r   r   Z
idx_uniquer8   ZvalsZvals_uniqueZidx_nanZidx_unique_nanrX   posir   r   r   test_unique   s8   





zTestCommon.test_uniquez*ignore:Period with BDay freq:FutureWarning3ignore:PeriodDtype\[B\] is deprecated:FutureWarningc                 C   sZ  |}t |tjrtjjdtd}|| |jrt	d |d }d||k
 }}|dkr2t|}|jrk|j|dd}||ksBJ |j|dd}	||	ksOJ |j|dd}
||
ks\J |j|dd}||ksiJ d S |jr|j|dd}||ks{J |j|dd}	||	ksJ d S d}tjt|d	 |j|dd W d    d S 1 sw   Y  d S )
Nz8IntervalIndex.searchsorted does not support Interval arg)reasonr"   zSkip check for empty Indexr   left)Zsiderightz0index must be monotonic increasing or decreasingr   )r   rI   ZIntervalIndexr!   markxfailr^   applymarkeremptyr[   Zargminr   Zis_monotonic_increasingZ_searchsorted_monotonicZsearchsortedZis_monotonic_decreasingr"   r#   )r   r   requestr   rj   valueZexpected_leftZexpected_rightZssm_leftZ	ssm_rightZss_leftZss_rightr&   r   r   r   test_searchsorted_monotonic   s>   

"z&TestCommon.test_searchsorted_monotonicc                 C   s   |}t |trtd t|dkrtd t|}tt|}t|r(|j	nd }|||d}t|}t
jd|t|d }	||j|	 }
t|	j|dj}t|
j|d| |t|
j|d}t|
j|d| d S )NzWRangeIndex is tested in test_drop_duplicates_no_duplicates as it cannot hold duplicatesr   zXempty index is tested in test_drop_duplicates_no_duplicates as it cannot hold duplicatesr/   rF   g      ?)keep)r   r   r!   r[   r   r1   listsetr   r0   r`   ZrandomZdefault_rngchoiceintr   rI   rJ   
duplicatedr2   assert_numpy_array_equalrR   r7   )r   r   rq   r   holderunique_valuesr0   
unique_idxnZduplicated_selectionr   expected_duplicatedZexpected_droppedr   r   r   test_drop_duplicates.  s*   
zTestCommon.test_drop_duplicatesc           	      C   s   |}t |tr
|}nt|}tt|}t|r|jnd }|||d}tjdgt	| dd}t
| | | }t
|| ||usGJ d S )Nr/   Fbool)r   r   r1   rr   rs   r   r0   r`   arrayr   r2   rw   rv   rR   r7   )	r   r   r   rz   rx   ry   r0   r|   Zresult_droppedr   r   r   "test_drop_duplicates_no_duplicatesR  s   
z-TestCommon.test_drop_duplicates_no_duplicatesc                 C   sD   d}t jt|d |jdd W d    d S 1 sw   Y  d S )Nz6drop_duplicates\(\) got an unexpected keyword argumentr   Tr:   )r!   r"   r*   rR   )r   r   r&   r   r   r   test_drop_duplicates_inplacei  s   "z'TestCommon.test_drop_duplicates_inplacec                 C   sZ   |}t |}t|rt|trtd ||d gd }|jdu s$J |jdu s+J d S )Nz6Skip check for empty Index, MultiIndex, and RangeIndexr   rZ   FT)r1   r   r   r   r!   r[   r\   Zhas_duplicates)r   r   r   rx   r   r   r   r   test_has_duplicatesn  s   
zTestCommon.test_has_duplicatesr0   )int64uint64float64categoryzdatetime64[ns]ztimedelta64[ns]c                 C   s   t |trdd t|jD |_nd|_d }|jjdkr*|dv r*tr't	j
j}nt	j}t|jdko4|dk}ztj||dd	 ||}W d    n1 sNw   Y  W n ttttfyb   Y d S w t |trr|j|jkspJ d S |j|jkszJ d S )
Nc                 S   s   g | ]}d t | qS )r   )str).0rd   r   r   r   
<listcomp>  s    z9TestCommon.test_astype_preserves_name.<locals>.<listcomp>r   c)r   r   r   zstring[pyarrow]r   F)Zraise_on_extra_warningsZcheck_stacklevel)r   r	   rangeZnlevelsr)   r   r0   kindr   r`   
exceptionsZComplexWarningr   r2   Zassert_produces_warningZastyper#   r*   r^   SystemError)r   r   r0   warnZis_pyarrow_strr8   r   r   r   test_astype_preserves_name~  s0   


z%TestCommon.test_astype_preserves_namec                 C   s   |}|j dd}tjdgt| td}t|j| |jdu s"J |j dd}|j	}t|dkr3d S t
|jr:d S |jtkrAd S tj|d< t||}tjdgt| td}d|d< t|j| |jdu sjJ d S )NT)rB   Fr/   r   r   )r   r`   r   r   r~   r2   rw   Z_isnanr]   r_   r   r0   ra   r1   )r   r   r   r   rX   r   r   r   r   test_hasnans_isnans  s&   


zTestCommon.test_hasnans_isnans)rP   
__module____qualname__r!   rj   parametrizer   r'   r.   r6   r9   r@   rk   rA   rD   filterwarningsrO   rQ   rY   re   rp   r}   r   r   r   r   r   r   r   r   r   r   !   s@    




(

2

#



 r   rf   na_positionZmiddlec                 C   sF   t jtd| d | j|d W d    d S 1 sw   Y  d S )Nzinvalid na_position: r   r   )r!   r"   r#   sort_values)index_with_missingr   r   r   r   $test_sort_values_invalid_na_position  s   "r   rK   Zlastc                 C   s   t | tr|tjjddd t|  }| | 	  j
}t|}|dkr2td g| |g}n
t|d g| g}t| || jd}| j|d}t|| d S )Nz,missing value sorting order not well-definedF)rg   strictrK   r/   r   )r   r   rl   r!   rj   rk   r`   sumZisnaZnotnar   sortZconcatenater1   r0   r   r2   r7   )r   r   rn   Zmissing_countZnot_na_valsZsorted_valuesrX   r8   r   r   r   test_sort_values_with_missing  s   

r   c                 C   s   t | trtstd | }|j|sJ | |sJ |j}|j	|j	ks*J |j
|j
ks2J |j|jks:J t | ttfsI|j|jksIJ |j |jj d S )NZOverflow)r   r
   r   r!   r[   Tr   Z	transposer   shapendimsizer   r	   nbytes)r   r   r   r   r   r   test_ndarray_compat_properties  s   
r   c                  C   s:   t jg td} d| j_t| }|dk}|jtksJ d S )Nr/   FE   )	r`   r   objectflagsZ	writeablerI   ZIndexr0   r~   )Zarrr   r8   r   r   r   test_compare_read_only_array  s
   
r   ) __doc__r   r   rU   Znumpyr`   r!   Zpandas.compatr   Zpandas.compat.numpyr   Zpandas.core.dtypes.commonr   r   ZpandasrI   r   r	   r
   r   Zpandas._testingZ_testingr2   r   rj   r   r   r   Zfails_arm_wheelsr   r   r   r   r   r   r   <module>   s0       
#
