U
    NZf                     @   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 dd Zejddd	gd
dd Zejededdgd
dd Zejejdddejdd	dejdddejd ddddejgddgd
dd ZG dd dZdS )    )permutationsN)IntervalTree)IS64c                 C   s    t jjt dd}t j| |dS )z
    Skip parameters in a parametrize on 32bit systems. Specifically used
    here to skip leaf_size parameters related to GH 23440.
    z$GH 23440: int type mismatch on 32bitreason)marks)pytestmarkskipifr   param)r   r    r   T/tmp/pip-unpacked-wheel-nbcvw55c/pandas/tests/indexes/interval/test_interval_tree.pyskipif_32bit   s    r   int64float64uint64)paramsc                 C   s   | j S Nr   requestr   r   r   dtype   s    r         
   c                 C   s   | j S )zd
    Fixture to specify IntervalTree leaf_size parameter; to be used with the
    tree fixture.
    r   r   r   r   r   	leaf_size   s    r      r         c                 C   s   | j }t||d |dS )Nr   )r   )r   r   )r   r   leftr   r   r   tree#   s    	r!   c                   @   s  e Zd Zdd Zejdddgdd Zdd	 Zejdddgd
d Z	dd Z
ejdedededdgdd Zejdejdddgddedddgdfejdddgddedddgdfeddejgeddejgdfejdddgddedddgdfeddejgeddejgdfgejdd d! eedD d"d# Zejdd$d! eedD d%d& Zejd'ejg ddejg ddfejdgddejdgddfeejgeejgfeejgd eejgd fgd(d) Zejje d*d+d,d- Zejje d*d+ejdej d.gd.d/gd0fej d1gd1d2gd1fd1d2gd2ejgd0fd.d/gd/ejgd/fgd3d4 Zd5S )6TestIntervalTreec              	   C   sf   | tdddg}tjdddgdd}t|| tjtd	d
 | tdg W 5 Q R X d S )N      ?g      @      @r   r   intpr   6'indexer does not intersect a unique set of intervals'matchg      @)get_indexernparraytmassert_numpy_array_equalr   raisesKeyError)selfr!   resultexpectedr   r   r   test_get_indexer1   s     z!TestIntervalTree.test_get_indexerz!dtype, target_value, target_dtype)r   l           r   )r   r%   r   c           	      C   sf   t jddg|dt jddg|d }}t||}|t j|g|d}t jdgdd}t|| d S )Nr   r   r   r   r%   r&   )r+   r,   r   r*   r-   r.   )	r1   r   target_valuetarget_dtyper    rightr!   r2   r3   r   r   r   test_get_indexer_overflow;   s
    &
z*TestIntervalTree.test_get_indexer_overflowc                 C   s   | tdddg\}}|d d }tjdgdd}t|| t|dd }tjddgdd}t|| t|dd  }tjd	gdd}t|| |}tjd
gdd}t|| d S )Nr#          @r$   r   r   r&   r   r   r%   r   )get_indexer_non_uniquer+   r,   r-   r.   sort)r1   r!   indexermissingr2   r3   r   r   r   test_get_indexer_non_uniqueG   s    z,TestIntervalTree.test_get_indexer_non_uniquec                 C   s   t jddg|dt jddg|d }}t||}t j|g|d}||\}}	t jdgdd}
t||
 t jdgdd}t|	| d S )Nr   r   r   r   r   r%   r&   )r+   r,   r   r:   r-   r.   )r1   r   r5   r6   r    r7   r!   targetZresult_indexerZresult_missingZexpected_indexerZexpected_missingr   r   r   $test_get_indexer_non_unique_overflowZ   s    &
z5TestIntervalTree.test_get_indexer_non_unique_overflowc              	   C   s   t jdddg|d}t||d }tjtdd |t dg W 5 Q R X |t dg\}}t |}t jdddgdd}t	
|| |}t jg dd}t	
|| d S )	Nr   r   r   r'   r(         ?r   r&   )r+   r,   r   r   r/   r0   r*   r:   r;   r-   r.   )r1   r   r    r!   r<   r=   r2   r3   r   r   r   test_duplicatesj   s     
z TestIntervalTree.test_duplicatesr   r   r   d   i'  c                 C   s   t jddd}|d}dt d d}t||d ||d}t|||d  |jr`|n|}t|||d	  |j	r|n|}t|||d  d S )
Ni  r   r   r&   r%   rA   )closedr   g      ?        )
r+   arangeZastypeZonesr   r-   r.   r*   Zclosed_leftZclosed_right)r1   rD   r   xfound	not_foundr!   r3   r   r   r   test_get_indexer_closed|   s    
z(TestIntervalTree.test_get_indexer_closedzleft, right, expectedr   r   r   r   r   r   r   TForderc                 c   s   | ]}t |V  qd S r   list.0rG   r   r   r   	<genexpr>   s     zTestIntervalTree.<genexpr>c                 C   s,   t || || |d}|j}||ks(td S )NrD   r   is_overlappingAssertionError)r1   rD   rK   r    r7   r3   r!   r2   r   r   r   test_is_overlapping   s    z$TestIntervalTree.test_is_overlappingc                 c   s   | ]}t |V  qd S r   rL   rN   r   r   r   rP      s     c                 C   sP   t jdddt dd }}t|| || |d}|j}|dk}||ksLtdS )	z*shared endpoints are marked as overlappingr   r   r   r   r   rQ   ZbothN)r+   rF   r   rS   rT   )r1   rD   rK   r    r7   r!   r2   r3   r   r   r   test_is_overlapping_endpoints   s
    z.TestIntervalTree.test_is_overlapping_endpointszleft, rightc                 C   s    t |||d}|jdkstd S )NrQ   FrR   )r1   rD   r    r7   r!   r   r   r   test_is_overlapping_trivial   s    z,TestIntervalTree.test_is_overlapping_trivialzGH 23440r   c                 C   s\   t jdddt t jjgd  }}t||}|jj}dt t jj d }||ksXtd S )Ne   r   r   2   r   )	r+   rF   Ziinfor   maxr   rootpivotrT   )r1   r    r7   r!   r2   r3   r   r   r   test_construction_overflow   s
    $
z+TestIntervalTree.test_construction_overflowr#   r9   rE   g       g      c                 C   s*   t |d |d }|jj}||ks&td S )NrX   )r   r[   r\   rT   )r1   r    r7   r3   r!   r2   r   r   r   !test_inf_bound_infinite_recursion   s    z2TestIntervalTree.test_inf_bound_infinite_recursionN)__name__
__module____qualname__r4   r   r	   Zparametrizer8   r>   r@   rB   r   rJ   r+   r,   nanr   rangerU   rV   rW   r
   r   r]   Zxfailinfr^   r   r   r   r   r"   0   sh   


 
$$$$$

	"	


	r"   )	itertoolsr   Znumpyr+   r   Zpandas._libs.intervalr   Zpandas.compatr   Zpandas._testingZ_testingr-   r   Zfixturer   r   rF   r,   rb   r!   r"   r   r   r   r   <module>   s&   	


