o
    d                    @  sn  U d dl mZ d dlmZ d dlmZ d dlZd dlZd dlZd dl	Z
d dlZd dlmZmZmZ d dlm  mZ d dlmZmZmZmZ d dlZd dlmZmZmZ d dlmZ  d dl!m"Z"m#Z# d d	l$m%Z% d d
l&m'Z'm(Z(m)Z) d dl*m+Z+m,Z, d dl-m.Z.m/Z/m0Z0m1Z1m2Z2 d dl3m4Z4 ej5dd e%D ddd Z6ej5e"j7ddd Z8dd Z9ej5e:e;dg dddd Z<e<Z=e<Z>G dd dZ?dd Z@G d d! d!ZAd"d# ZBG d$d% d%ZCG d&d' d'ZDG d(d) d)ZEe
jFd*ZGG d+d, d,ZHejId-d. ZJejIejKLd/d0d1d2 ZMejId3d4 ZNejId5d6 ZOe)e#jPe(d7ZQd8eRd9< ejKLde%ejKLdeQd:d; ZSd<d= ZTd>d? ZUejKLd@g dAdBdC ZVdDdE ZWdFdG ZXdHdI ZYdJdK ZZejKLdLdMejKLde[e\fejKLdNe[e\fdOdP Z]ejKLdQdRdSgdTdU Z^dVdW Z_ejKLdXdYdZgd[d\ Z`d]d^ ZaejKLdXe4b d_d` Zcdadb ZdG dcdd ddZedS )e    )annotations)reduce)productN)NumExprClobberingErrorPerformanceWarningUndefinedVariableError)is_boolis_floatis_list_like	is_scalar)	DataFrameSeries
date_range)exprpytables)ENGINES)BaseExprVisitorPandasExprVisitorPythonExprVisitor)NUMEXPR_INSTALLEDUSE_NUMEXPR)ARITH_OPS_SYMSSPECIAL_CASE_ARITH_OPS_SYMS_binary_math_ops_binary_ops_dict_unary_math_ops)DEFAULT_GLOBALSc              	   c  sF    | ]}t j|t jj|d kot dt dt dtjgdV  qdS )numexprznumexpr enabled->z, installed->reasonZmarksN)pytestparammarkskipifr   r   tdskip_if_no_ne).0engine r)   V/app/.heroku/python/lib/python3.10/site-packages/pandas/tests/computation/test_eval.py	<genexpr>:   s    
r+   )paramsc                 C     | j S Nr"   requestr)   r)   r*   r(   9   s   r(   c                 C  r-   r.   r/   r0   r)   r)   r*   parserM   s   r2   c              
   C  sd   t | }t| jr-z|| |W S  ty, } zt|dr'tjW  Y d }~S  d }~ww || |S )Nz6negative number cannot be raised to a fractional power)r   r   Zhas_neg_frac
ValueErrorstr
startswithnpnan)lhscmp1rhsr(   cer)   r)   r*   _eval_single_binR   s   

r=      )r   r   Z	SeriesNaNZDataFrameNaNfloat)r,   idsc                 C  sj   t tjdd}tj||dk< t tjddttjdtddtjtjdg|tj f}|| j S )N
   r>         ?      )r   r6   randomrandr7   randnr   r"   )r1   Znan_df1optsr)   r)   r*   r8   a   s   
r8   c                
   @  s@  e Zd Zejjdg dg ddejjdddgdd	gdejd
ejdd Zejdej	dd Z
ejdej	dd Zejdddgejdddgdd Zejdeeeedd Zdd Zdd Zejdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zejd(eej d)d*eejj!d)d+d,eej"d)d*d-kgd.d/ Z#ejd(e$ej d)e$ejj!d)d)d,e$ej"d)d-kgd0d1 Z%d2d3 Z&d4d5 Z'ejd6ej(ej)gejd7d8d9gd:d; Z*d<d= Z+ejd>d?d@dA Z,dBdC Z-dDdE Z.dFdG Z/dHdI Z0dJdK Z1dLdM Z2dNS )OTestEvalr9   )z!=z==z<=z>=<>)neeqlegeltgt)r@   cmp2rK   rJ   rQ   rP   binopc                 C  s   |dkr8|dv r8d}t jt|d d| d| d| d}	tj|	||d	 W d    d S 1 s1w   Y  d S t||||}
t||||}t|
|||}d| d| d| d}	tj|	||d	}t|| d S )
Npythonandor"'BoolOp' nodes are not implementedmatch(lhs z rhs) z (lhs  rhs)r(   r2   )r!   raisesNotImplementedErrorpdevalr=   tmassert_equal)selfr9   rR   rS   r8   r:   r(   r2   msgexlhs_newrhs_newexpectedresultr)   r)   r*   test_complex_cmp_opsx   s   
zTestEval.test_complex_cmp_opscmp_opc           
      C  s  |dk }|dk }|dkr:|dv r:d}t jt|d d| d}tj|||d W d    d S 1 s3w   Y  d S d| d}d	d
dg}|dv rut|sut jt|d tj|||||dd W d    d S 1 snw   Y  d S t||||}tj|||d}	t	
|	| d S )Nr   rT   innot in&'(In|NotIn)' nodes are not implementedrY   lhs  rhsr]   |zxonly list-like( or dict-like)? objects are allowed to be passed to (DataFrame\.)?isin\(\), you passed a (\[|')bool(\]|')z'argument of type 'bool' is not iterabler8   r:   r(   r2   
local_dict)r!   r^   r_   r`   ra   joinr
   	TypeErrorr=   rb   rc   )
rd   rl   r8   r:   r(   r2   re   rf   ri   rj   r)   r)   r*   test_simple_cmp_ops   s:   
"zTestEval.test_simple_cmp_opsopc                 C  s  |dkr2|dv r2d}t jt|d d| d}tj|||d W d    d S 1 s+w   Y  d S t|rSt|sS|dv rS|dkrS|dkrSt jjd	d
}	|j	|	 ddg}
d| d}d
ddg}t|r||
v rt jt|d tj|||||dd W d    d S 1 sw   Y  d S t|rt|rtdd ||f\}}t||||}t|r| }n| }tj|||d}t|| d S )NrT   rm   rp   rY   z~(lhs r\   r]   pandasz]Looks like expected is negative, unclear whether expected is incorrect or result is incorrectr   rn   ro   rs   zyonly list-like( or dict-like)? objects are allowed to be passed to (DataFrame\.)?isin\(\), you passed a (\[|')float(\]|')z(argument of type 'float' is not iterablert   ru   c                 S  s   t | gS r.   )r6   arrayxr)   r)   r*   <lambda>       z2TestEval.test_compound_invert_op.<locals>.<lambda>)r!   r^   r_   r`   ra   r	   r#   xfailnode
add_markerrw   r   rx   mapr=   rb   assert_almost_equal)rd   rz   r8   r:   r1   r(   r2   re   rf   r#   Z
skip_theseri   rj   r)   r)   r*   test_compound_invert_op   s^   
"	z TestEval.test_compound_invert_opc                 C  s  |}|dkr3d| d| d}	d}
t jt|
d tj|	||d W d    d S 1 s,w   Y  d S t||||}t||||}|d ur|d urd| d| d}	d| d| d}d	| d
| d}t|d||}|	||fD ]}tj|||d}t|| qpd S d S d S )NrT   rq    mid rr   rX   rY   r]    mid and mid r[    mid) & (mid r\   &)r!   r^   r_   r`   ra   r=   rb   r   )rd   r9   rR   r8   midhsr:   r(   r2   midex1re   rg   rh   ex2ex3ri   rf   rj   r)   r)   r*   test_chained_cmp_op   s,   
zTestEval.test_chained_cmp_oparith1c              
   C  s   d| d}t j|||d}t||||}t|| d| d| d}t j|||d}t||||}	z	|	|\}	}
W n tttfyI   Y d S w |dkrddd l	}|
d| d}t|j| d S td| d}t|| d S )	Nrq   rr   r]   z rhs r   r   znlhs z ghs)r`   ra   r=   rb   r   alignr3   rx   AttributeErrorr   evaluatevalues)rd   r   r8   r:   r(   r2   rf   rj   ri   ZnlhsZghsrL   r)   r)   r*   test_binary_arith_ops   s$   zTestEval.test_binary_arith_opsc           	      C  s   d}t j|||d}|| }t|| |dkr;dd l}|d}t|ttfr1t|j	| d S t||
  d S t|d||}t|| d S )Nz	lhs % rhsr]   r   r   zexpected % rhs%)r`   ra   rb   r   r   r   
isinstancer   r   r   itemr=   )	rd   r8   r:   r(   r2   rf   rj   ri   rL   r)   r)   r*   test_modulus"  s   
zTestEval.test_modulusc           	      C  s   d}|dkrt j|||d}|| }t|| d S d}tjt|d t j|||d||d W d    d S 1 s;w   Y  d S )Nz
lhs // rhsrT   r]   zGunsupported operand type\(s\) for //: 'VariableNode' and 'VariableNode'rY   rt   rv   r(   r2   )r`   ra   rb   rc   r!   r^   rx   )	rd   r8   r:   r(   r2   rf   resri   re   r)   r)   r*   test_floor_division4  s   "zTestEval.test_floor_divisionc           
      C  s   d}t |d||}tj|||d}t|rHt|rHt|ttjfrHt|rHd}t	j
t|d t|| W d    d S 1 sAw   Y  d S t|| d}tj|||d}t |d||}	t |	d||}t|| d S )Nz
lhs ** rhs**r]   z-(DataFrame.columns|numpy array) are differentrY   z(lhs ** rhs) ** rhs)r=   r`   ra   r   r   complexr6   Zcomplexfloatingisnanr!   r^   AssertionErrorrb   assert_numpy_array_equalr   )
rd   r8   r:   r(   r2   rf   ri   rj   re   middler)   r)   r*   test_powH  s*   "zTestEval.test_powc                 C  sX   z| t}W n ty   tt|g}Y nw | }tjd||d}t|| d S )Nz~elbr]   )	astypeboolr   r6   r|   r`   ra   rb   r   )rd   r8   r(   r2   Zelbri   rj   r)   r)   r*   test_check_single_invert_opb  s   z$TestEval.test_check_single_invert_opc                 C  s  d}t tjdd}|dkr1d}tjt|d tj|||d W d    n1 s+w   Y  n!d}tjt	|d tj|||d W d    n1 sMw   Y  t tjj
dd	d
}|dkrd}tjt|d tj|||d W d    n1 s|w   Y  n| }tj|||d}t|| t tjdddk}| }tj|||d}t|| t g dtjddkd}|dkrtjtdd tj|||d W d    d S 1 sw   Y  d S d}tjt	|d tj|||d W d    d S 1 sw   Y  d S )N~lhsr>   rD   r   -couldn't find matching opcode for 'invert_dd'rY   r]   0ufunc 'invert' not supported for the input typesr>   rD   size)couldn't find matching opcode for 'invertrB   arC   g       @   )br;   unknown type object#bad operand type for unary ~: 'str')r   r6   rE   rG   r!   r^   r_   r`   ra   rx   randintrb   assert_frame_equalrF   r3   )rd   r(   r2   r   r8   re   expectrj   r)   r)   r*   test_frame_invertl  sF   "$zTestEval.test_frame_invertc                 C  s  d}t tjd}|dkr0d}tjt|d tj|||d}W d    n1 s*w   Y  n!d}tjt	|d tj|||d W d    n1 sLw   Y  t tjj
ddd}|dkrd	}tjt|d tj|||d W d    n1 s{w   Y  n| }tj|||d}t|| t tjdd
k}| }tj|||d}t|| t g d}|dkrtjtdd tj|||d W d    d S 1 sw   Y  d S d}tjt	|d tj|||d W d    d S 1 sw   Y  d S )Nr   r>   r   r   rY   r]   r   r   r   rB   r   r   r   )r   r6   rE   rG   r!   r^   r_   r`   ra   rx   r   rb   assert_series_equalrF   r3   )rd   r(   r2   r   r8   re   rj   r   r)   r)   r*   test_series_invert  sF   ""zTestEval.test_series_invertc                 C  s   d}t tjdd}| }tj|||d}t|| t tjjddd}| }tj|||d}t|| t tj	dddk}|dkrjd	}t
jt|d
 tj|||d W d    d S 1 scw   Y  d S | }tj|||d}t|| d S )N-lhsr>   rD   r]   r   r   rB   r   *couldn't find matching opcode for 'neg_bb'rY   )r   r6   rE   rG   r`   ra   rb   r   r   rF   r!   r^   r_   rd   r(   r2   r   r8   r   rj   re   r)   r)   r*   test_frame_negate  s$   "zTestEval.test_frame_negatec                 C  s   d}t tjd}| }tj|||d}t|| t tjjddd}| }tj|||d}t|| t tj	ddk}|dkrhd}t
jt|d tj|||d W d    d S 1 saw   Y  d S | }tj|||d}t|| d S )	Nr   r>   r]   r   rB   r   r   rY   )r   r6   rE   rG   r`   ra   rb   r   r   rF   r!   r^   r_   r   r)   r)   r*   test_series_negate  s$   "zTestEval.test_series_negater8   r>   rD   r   r   rB   c                 C  (   d}|}t j|||d}t|| d S Nz+lhsr]   )r`   ra   rb   r   rd   r8   r(   r2   r   r   rj   r)   r)   r*   test_frame_pos     zTestEval.test_frame_posc                 C  r   r   )r`   ra   rb   r   r   r)   r)   r*   test_series_pos  r   zTestEval.test_series_posc                 C  sN  d}t jt|d tjd||d W d    n1 sw   Y  tjd||ddks-J tjd||dd	ks9J tjd
||ddksEJ tjd||ddksQJ tjd||ddks]J tjd||ddksiJ tjd||ddksuJ tjd||ddksJ tjd||ddksJ tjd||ddksJ tjd||ddksJ d S )Nz%bad operand type for unary ~: 'float'rY   z~1.0r]   z-1.0r2   r(   g      z+1.0g      ?z~1z-1z+1rC   z~Truez~Falsez-Truez-Falser   z+Truez+Falser!   r^   rx   r`   ra   )rd   r(   r2   re   r)   r)   r*   test_scalar_unary  s   zTestEval.test_scalar_unaryc                 C  s:   t jtdt jd}t jg dt jd}t|| d S )NzK[-True, True, ~True, +True,-False, False, ~False, +False,-37, 37, ~37, +37]dtype)r   Tr   rC   r   Fr   r   i%   ir   )r6   r|   r`   ra   Zobject_rb   r   )rd   rj   ri   r)   r)   r*   test_unary_in_array/  s   zTestEval.test_unary_in_arrayr   r   zx < -0.1z-5 > xc                 C  s<   t dtjdg|di}||}|jtdgksJ d S )Nr~   r   r   F)r   r6   r|   ra   r   )rd   r   r   dfr   r)   r)   r*   test_float_comparison_bin_opN  s   
z%TestEval.test_float_comparison_bin_opc                 C  sl   t dddtjgi}|d}|jd}tj||t d |d}|jj	ddd}tj||t d d S )	Nr~   r   rC   zx.fillna(-1)r   Zcheck_nameszx.shift(1, fill_value=-1))Z
fill_value)
r   r6   r7   ra   r~   Zfillnarb   r   r   shiftrd   r   rj   ri   r)   r)   r*   test_unary_in_functionV  s   

zTestEval.test_unary_in_functionrf   )z1 or 2z1 and 2za and bza or bz1 or 2 and (3 + 2) > 3z2 * x > 2 or 1 and 2z2 * df > 3 and 1 or ac           	      C  sr   t jddd}}}tt jdd}d}tjt|d tj|||d W d    d S 1 s2w   Y  d S )Nr   rC   rD   ;cannot evaluate scalar only bool ops|'BoolOp' nodes are notrY   r]   )	r6   rE   rG   r   r!   r^   r_   r`   ra   )	rd   rf   r(   r2   r~   r   r   r   re   r)   r)   r*   test_disallow_scalar_bool_opsd  s   "z&TestEval.test_disallow_scalar_bool_opsc                 C  sJ  d}t jd||d}|dksJ t|sJ d}t jd||d}|dks&J t|s,J d}t jd||d}|r:J t|s@J t|sFJ tdg}t jd||d}t|tdg |jdkseJ tdg}t jd||d}t|tdg |jdksJ tdg}t jd||d}t|tdg |jdksJ d S )NrC   r~   r]   g      ?F)rC   )	r`   ra   r   r   r6   r|   rb   r   shape)rd   r(   r2   r~   rj   r)   r)   r*   test_identicalx  s2   zTestEval.test_identicalc                 C  s$   d}t j|||d}|dksJ d S )Nz1 + 2 *         5 - 1 + 2 r]      r`   ra   )rd   r(   r2   exprj   r)   r)   r*   test_line_continuation  s   zTestEval.test_line_continuationc           	      C  s   d}t j|||d}t|}||ksJ tdg di}d}|d|d}|js-J d}|d	|d}|jd
dgd d f }t	|| d}|d|d}|jd
gd d f }t	|| d S )Nz1000000000.006r]   A)g~  eA$  eAg'1  eAg  eAzA < z.4fg   eAzA > rC   rD   r   A == )
r`   ra   r6   float64r   queryemptylocrb   r   )	rd   r(   r2   r   rj   ri   r   cutoffexactr)   r)   r*   test_float_truncation  s    

zTestEval.test_float_truncationc                 C  s   t g dgg dd}d}tjt|d |d W d    n1 s$w   Y  t  }d|j_tjt|d |d W d    d S 1 sHw   Y  d S )	N)r   r   r   )Zfoobarclasscolumnsz4Python keyword not valid identifier in numexpr queryrY   z
class == 0lambdazlambda == 0)r   r!   r^   SyntaxErrorr   indexnamerd   r   re   r)   r)   r*   test_disallow_python_keywords  s   "z&TestEval.test_disallow_python_keywordsc                 C  s:   t ddks	J t ddksJ t ddksJ d S )Nznot Truer   z	not Falser   zTrue and not Truer   r   )rd   r)   r)   r*   test_true_false_logic  s   zTestEval.test_true_false_logicc                 C  sR   t ddi}t|jdj sJ t|jdjo"|jdj s'J d S )Nr   Zhello)r   r`   ra   r4   rZ   r   )rd   eventr)   r)   r*   test_and_logic_string_match  s   ,z$TestEval.test_and_logic_string_matchN)3__name__
__module____qualname__r!   r#   parametrizer   BOOL_OPS_SYMSrk   CMP_OPS_SYMSry   r   r   sortedsetr   
differencer   r   r   r   r%   skip_if_windowsr   r   r   r   r   r   r   r6   rE   rG   r   rF   r   r   r   r   r   float32r   r   r   r   r   r   r   r   r   r   r)   r)   r)   r*   rI   w   s|    
"
3
 

+/


!rI   c                  O  s
   t j S r.   )r6   rE   rG   )argskwargsr)   r)   r*   r     s   
 r   c                   @  sN   e Zd Zejdg dejdejejgejdddgdd Z	d	S )
TestTypeCastingrz   )+-*r   /dt
left_right)r   3)r  r   c                 C  sr   t jddt|d}|\}}| d| d| }	tj|	||d}
|jj|ks'J |
jj|ks/J t |
t|	 d S )Nr>   r   )
data_gen_fr    r]   )rb   makeCustomDataframefr`   ra   r   r   r   )rd   r(   r2   rz   r  r  r   leftrightsr   r)   r)   r*   test_binop_typecasting  s   z&TestTypeCasting.test_binop_typecastingN)
r   r   r   r!   r#   r   r6   r   r   r  r)   r)   r)   r*   r    s
    r  c                  G  s4   t ttd|  }ttjtdd | }|o|S )NZis_monotonic_increasingc                 S  s   t | jjtjS r.   )
issubclassr   typer6   Z
datetime64r}   r)   r)   r*   r     s    zshould_warn.<locals>.<lambda>)anyr   operator
attrgetterr   xor)r   Znot_monoZonly_one_dtr)   r)   r*   should_warn  s
   r  c                	   @  s  e Zd Zg dZedg Zdd Zejdeejdeejdedd	 Z	ejd
eejdedd Z
ejdeejdeejdeejdedd Zejdddgejdeejd
edd Zejdddgejdeeddgddgdg ejddd Zejdeejd
eejdddgejddd gd!d" Zejdeejdeejdeejded#d$ Zd%d& Zd'S )(TestAlignment)ir  r  r  c                 C  s8   d}t jddtd}tj|||d}t ||d  d S )Nzdf * ~2r>   r   )r	  r]   )rb   r  r  r`   ra   r   )rd   r(   r2   r  r   r   r)   r)   r*   test_align_nested_unary_op  s   z(TestAlignment.test_align_nested_unary_oplr_idx_typerr_idx_type
c_idx_typec           	   	   C  s   t jddX t dt tjddt||d}tjddt||d}t|j|jrFt	t t
jd||d}W d    n1 s@w   Y  nt
jd||d}t|||  W d    d S 1 saw   Y  d S )	NTrecordalwaysrA   r	  
r_idx_typer     zdf + df2r]   warningscatch_warningssimplefilterRuntimeWarningrb   r  r  r  r   assert_produces_warningr`   ra   r   )	rd   r(   r2   r  r  r  r   df2r   r)   r)   r*   test_basic_frame_alignment  s    

"z(TestAlignment.test_basic_frame_alignmentr#  c                 C  st   t jddt||d}tjd||d}t ||dk  ttjj	|j
 |j|jd}tjd||d}t |||k  d S )NrA   r"  df < 2r]   rD   )r   r   zdf < df3)rb   r  r  r`   ra   r   r   r6   rE   rG   r   r   r   )rd   r(   r2   r#  r  r   r   df3r)   r)   r*   test_frame_comparison  s   
z#TestAlignment.test_frame_comparisonr1c1r2c2c              	   C  s   t jddf t dt tjddt||d}tjddt||d}tjddt||d}	t|j|j|	jrRt	t t
jd	||d
}
W d    n1 sLw   Y  nt
jd	||d
}
t|
|| |	  W d    d S 1 sow   Y  d S )NTr  r!  r   rD   r"     r>   zdf + df2 + df3r]   r%  )rd   r(   r2   r0  r1  r2  r3  r   r+  r.  r   r)   r)   r*   #test_medium_complex_frame_alignment   s&   


"z1TestAlignment.test_medium_complex_frame_alignment
index_namer   r   c              	   C  s  t jddx t dt tjddt||d}t||}tt	j
d|d d }t|j|jrNtt tjd||d}	W d    n1 sHw   Y  ntjd||d}	|d	ks^|d	krl|d
krg||n|| }
n|| }
t|	|
 W d    d S 1 sw   Y  d S )NTr  r!  rA   r"  r>   df + sr]   r  r   )r&  r'  r(  r)  rb   r  r  getattrr   r6   rE   rG   r  r   r*  r`   ra   addr   )rd   r(   r2   r6  r#  r  r   r   r  r   ri   r)   r)   r*   !test_basic_frame_series_alignment8  s$   

"z/TestAlignment.test_basic_frame_series_alignmentzr_idx_type, c_idx_typer  )r  r  zignore::RuntimeWarningc              
   C  s8  |dkr1|dv r1|dkr1|dkr1|dkr1d| d| d| d	| d
| 
}|j tjj|dd tjddt||d}t||}	t	t
jd|	d d }
t|
j|jrrtt tjd||d}W d    n1 slw   Y  ntjd||d}|dks|dkr|dkr||
n|
| }n|
| }t|| d S )Nr   )r{   rT   r   r  r  z"Flaky column ordering when engine=z	, parser=z, index_name=z, r_idx_type=z, c_idx_type=F)r   strictrA      r"  r>   zs + dfr]   r  )r   r   r!   r#   r   rb   r  r  r8  r   r6   rE   rG   r  r   r*  r)  r`   ra   r9  r   )rd   r1   r(   r2   r6  r#  r  r   r   r   r  r   ri   r)   r)   r*   !test_basic_series_frame_alignmentR  sH   


z/TestAlignment.test_basic_series_frame_alignmentrz   r  r  c              	   C  s  t jdd t dt tjddt||d}t||}tt	j
d|d d }	d| d}
d	| d
}t|j|	jrwtt tj|
||d}W d    n1 sTw   Y  tt tj|||d}W d    n1 sqw   Y  ntj|
||d}tj|||d}|dkr|dkr|dkrt|| W d    d S W d    d S W d    d S W d    d S 1 sw   Y  d S )NTr  r!  rA   r"  r>   zs z dfzdf z sr]   r  r   )r&  r'  r(  r)  rb   r  r  r8  r   r6   rE   rG   r  r   r*  r`   ra   r   )rd   r(   r2   r6  rz   r#  r  r   r   r  r8   r:   r   r   r)   r)   r*   test_series_frame_commutativityy  s:   

"z-TestAlignment.test_series_frame_commutativityc              	   C  s  d}d}d| }	t jdd t dt tddg}
td	d
g}tj||t||d}tj|	|t||d}t	t
 ||
}ttj||d | }|dksU|dkrd|dkr_||}n	|| }n|| }|dksp|dkr|dkrz||}n	|| }n|| }t|j|j|jrtt tjd||d}W d    n1 sw   Y  ntjd||d}|j|jksJ t|| W d    d S 1 sw   Y  d S )Nr   r>   rD   Tr  r!  r   r   r   r+  r"  r  r   zdf2 + ser + dfr]   )r&  r'  r(  r)  rE   choicerb   r  r  r8  localsgetr   r6   rG   r9  r  r   r*  r`   ra   r   r   )rd   r(   r2   r0  r1  r2  r3  nm1m2r6  obj_namer   r+  r   serZ	expected2ri   r   r)   r)   r*   #test_complex_series_frame_alignment  sD   



"z1TestAlignment.test_complex_series_frame_alignmentc                 C  s  t tjdd}ttjd}|dkrt}nd}t| tj	d||d W d    n1 s2w   Y  ttjd}td tj	d||d W d    n1 sWw   Y  t tjdd}ttjd}td tj	d||d W d    n1 sw   Y  t tjdd}ttjd}|dk}|st}nd}t|B}tj	d||d |st
|d	ksJ t|d
 j}	t|j|jd	  }
d|
dd}|	|ksJ W d    d S W d    d S 1 sw   Y  d S )Ni  rA   i'  r   Fr7  r]   rT   rC   r   z_Alignment difference on axis 1 is larger than an order of magnitude on term 'df', by more than z.4gz; performance may suffer.)r   r6   rE   rG   r   r   rb   r*  r`   ra   lenr4   messagelog10r   r   )rd   r(   r2   r   r  seenZis_python_engineZwrnwre   Zloggedri   r)   r)   r*   +test_performance_warning_for_poor_alignment  sL   "z9TestAlignment.test_performance_warning_for_poor_alignmentN)r   r   r   Zindex_typesZlhs_index_typesr  r!   r#   r   r,  r/  r5  r:  listr   filterwarningsr=  r>  rG  rM  r)   r)   r)   r*   r    sL    

!,r  c                
   @  sB  e Zd Zdd Zdd Zejdddgejdddgejd	ej	d
d Z
ejdddgejdddgejd	ej	dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zejjd0d1d2d3 Zd4d5 Zd6d7 Z d8d9 Z!d:d; Z"d<d= Z#d>d? Z$d@dA Z%ejdBdCdDdCdEge&'g dFgdGdH Z(ejdBg dIdJdK Z)ejdLdCdDdCdEge&'g dFdCdEigdMdN Z*dOdP Z+dQdR Z,dSdT Z-dUdV Z.dWdX Z/dYdZ Z0ejd[g d\d]d^ Z1ejd_d`dagdbdc Z2ddS )eTestOperationsc                 O  $   | ddd |d< tj|i |S Nlevelr   rC   popr`   ra   rd   r   r   r)   r)   r*   ra        zTestOperations.evalc              	     sH  g  |dkr
ddg  fddt jt j D }dd |D }|D ]}d| d	}d
| d	}d| d}|dv rZd}	tjt|	d tj|||d W d    n1 sTw   Y  q td|d|}
| j|||d}||
ksoJ t||d|}
| j|d|i||d}||
ksJ td||d |}
| j|d|i||d}||
ksJ q d S )NrT   rn   ro   c                   s   g | ]}| vr|qS r)   r)   r'   rz   Zexclude_arithr)   r*   
<listcomp>  s    z8TestOperations.test_simple_arith_ops.<locals>.<listcomp>c                 s  s    | ]	}|d kr|V  qdS )z//Nr)   rX  r)   r)   r*   r+   	  s    z7TestOperations.test_simple_arith_ops.<locals>.<genexpr>z1 z 1zx z (x + 1)rm   z&argument of type 'int' is not iterablerY   r]   rC   r~   r   )	r   r   r   r!   r^   rx   r`   ra   r=   )rd   r(   r2   Z	arith_opsopsrz   rf   r   r   re   expecr~   yr)   rY  r*   test_simple_arith_ops  s6   

z$TestOperations.test_simple_arith_opsr:   TFr8   rz   c                 C     | d| d| }t dkr3|dv r3d}tjt|d | | W d    d S 1 s,w   Y  d S | |}t|}||ksBJ d S Nr
  rT   rU   rX   rY   r2   r!   r^   r_   ra   rd   r:   r8   rz   rf   re   r   r   r)   r)   r*   test_simple_bool_ops!     

z#TestOperations.test_simple_bool_opsc                 C  r_  r`  ra  rb  r)   r)   r*   test_bool_ops_with_constants1  rd  z+TestOperations.test_bool_ops_with_constantsc                 C  sn   t jdddd}tt jd}d}tjt|d | jd||d	d
 W d    d S 1 s0w   Y  d S )Nr   r4  r>      rA   z?N-dimensional objects, where N > 2, are not supported with evalrY   x + yr~   r]  rv   )r6   rE   rG   r   r!   r^   r_   ra   )rd   r~   r]  re   r)   r)   r*   test_4d_ndarray_failsA  s   "z$TestOperations.test_4d_ndarray_failsc                 C  s   |  d}|dksJ d S )N1rC   )ra   )rd   r~   r)   r)   r*   test_constantH  s   
zTestOperations.test_constantc                 C  s4   t tjdd}| jdd|id}t|| d S )NrA   rD   r   ri  r   r6   rE   rG   ra   rb   r   )rd   r   r+  r)   r)   r*   test_single_variableL  s   z#TestOperations.test_single_variablec                 C  sP   t tjdd}tjtdd | d W d    d S 1 s!w   Y  d S )Nr>   r   name 'x' is not definedrY   zdf[x > 2] > 2)r   r6   rE   rG   r!   r^   	NameErrorra   rd   r   r)   r)   r*   &test_failing_subscript_with_name_errorQ  s   "z5TestOperations.test_failing_subscript_with_name_errorc                 C  sD   t tjdd}| jdd|id}|d |dk }t|| d S )Nr>   r   z(df + 1)[df > 2]r   ri  rC   rD   rm  r   r)   r)   r*   test_lhs_expression_subscriptV  s   z,TestOperations.test_lhs_expression_subscriptc                 C  s   t tjddtdd}d}|j|jk }d}|j|j |j }d}|j|j |j|jdk   }|||f}|||f}	t||	D ]\}
}t	
|| j|
d	|id
 q?d S )Nr>   r   abcr   zdf.a < df.bzdf.a + df.b + df.czdf.a + df.b + df.c[df.b < 0]r   r   ri  )r   r6   rE   rG   rN  r   r   r;   ziprb   r   ra   )rd   r   expr1Zexpec1Zexpr2Zexpec2Zexpr3Zexpec3exprsZexpecsr<   r\  r)   r)   r*   test_attr_expression\  s   

z#TestOperations.test_attr_expressionc                 C  s|   t tjddtdd}t tjdd}d}d}tjt|d | j|||dd	 W d    d S 1 s7w   Y  d S )
Nr>   r   rt  r   zdf = df2%cannot assign without a target objectrY   )r   r+  ri  )	r   r6   rE   rG   rN  r!   r^   r3   ra   )rd   r   r+  rv  re   r)   r)   r*   test_assignment_failsi  s   "z$TestOperations.test_assignment_failsc                 C  sX   t tjddtdd}tjtdd |d W d    d S 1 s%w   Y  d S )Nr>   rD   abr   invalid syntaxrY   zd c = a + b	r   r6   rE   rG   rN  r!   r^   r   ra   rq  r)   r)   r*   %test_assignment_column_multiple_raiseq  s   "z4TestOperations.test_assignment_column_multiple_raisec                 C  \   t tjddtdd}d}tjt|d |d W d    d S 1 s'w   Y  d S )Nr>   rD   r{  r   z5left hand side of an assignment must be a single namerY   zd,c = a + br}  r   r)   r)   r*   %test_assignment_column_invalid_assignw  s
   "z4TestOperations.test_assignment_column_invalid_assignc                 C  r  )Nr>   rD   r{  r   zcannot assign to function callrY   zTimestamp("20131001") = a + br}  r   r)   r)   r*   3test_assignment_column_invalid_assign_function_call~  s
   "zBTestOperations.test_assignment_column_invalid_assign_function_callc                 C  sT   t tjddtdd}| }|d |d  |d< |jddd	 t|| d S )
Nr>   rD   r{  r   r   r   	a = a + bTinplace	r   r6   rE   rG   rN  copyra   rb   r   rd   r   ri   r)   r)   r*   &test_assignment_single_assign_existing  
   z5TestOperations.test_assignment_single_assign_existingc                 C  sT   t tjddtdd}| }|d |d  |d< |jdd	d
 t|| d S )Nr>   rD   r{  r   r   r   r;   	c = a + bTr  r  r  r)   r)   r*   !test_assignment_single_assign_new  r  z0TestOperations.test_assignment_single_assign_newc                 C  s\   t tjddtdd}| }d}|jddd | }d|d	  |d
< t|| d S )Nr>   rD   r{  r   rC   z	a = 1 + bTr  r   r   r  )rd   r   r   ri   r)   r)   r*   +test_assignment_single_assign_local_overlap  s   z:TestOperations.test_assignment_single_assign_local_overlapc                 C  sd   t tjddtdd}d}|j }|jddd ||j }t	j
||jd	d
 |jd u s0J d S )Nr>   rD   r{  r   rC   r  Tr  Fr   )r   r6   rE   rG   rN  r   r  ra   r   rb   r   r   )rd   r   r   Zold_arj   r)   r)   r*   "test_assignment_single_assign_name  s   

z1TestOperations.test_assignment_single_assign_namec                 C  sj   t tjddtdd}|jddd d}tjt|d	 |d
 W d    d S 1 s.w   Y  d S )Nr>   rD   r{  r   r  Tr  z#can only assign a single expressionrY   z	c = a = b)	r   r6   rE   rG   rN  ra   r!   r^   r   r   r)   r)   r*   test_assignment_multiple_raises  s   "z.TestOperations.test_assignment_multiple_raisesc                 C  s\   t tjddtdd}| jdd|i|dd | }|d	 |d
  |d< t|| d S )Nr>   rD   r{  r   zc = df.a + df.br   T)rv   targetr  r   r   r;   	r   r6   rE   rG   rN  ra   r  rb   r   r  r)   r)   r*   test_assignment_explicit  s
   z'TestOperations.test_assignment_explicitc                 C  s:   t dgdgd}|d}tdg}tj||dd d S )N   ir   r   za in [11, -32]TFr   )r   ra   r   rb   r   r   r)   r)   r*   test_column_in  s   

zTestOperations.test_column_inz%Unknown: Omitted test_ in name prior.r   c                 C  s`   t tjddtdd}|jddd}|d usJ | }|d |d	  |d
< t|| d S )Nr>   rD   r{  r   r  Fr  r   r   r;   r  )rd   r   actualri   r)   r)   r*   test_assignment_not_inplace  s   z*TestOperations.test_assignment_not_inplacec                 C  s   t g dg dd}| }|d |d  |d< |d |d  |d< |jdd	d
}t|| |d u s6J |d d |d< |d d |d< |jdd	d
}t|| |d u sYJ d}tjt|d |jddd
 W d    d S 1 suw   Y  d S )NrC   rD   r   r4  r>   rf  r  r   r   r;   d$
        c = a + b
        d = c + bTr  rC   rD   r<   $
        a = a - 1
        e = a + 2z@Multi-line expressions are only valid if all expressions containrY   z(
            a = b + 2
            b - 2F)r   r  ra   rb   r   r!   r^   r3   )rd   r   ri   answerre   r)   r)   r*   test_multi_line_expression  s2   "z)TestOperations.test_multi_line_expressionc                 C  s   t g dg dd}| }|d |d  |d< |d |d  |d< |jdd	d
}t|| |d d |d< |d d |d< |jdd	d
}t|| d S )Nr  r  r  r   r   r;   r  r  Fr  rC   rD   r<   r  r   r  ra   rb   r   r  r)   r)   r*   &test_multi_line_expression_not_inplace  s    z5TestOperations.test_multi_line_expression_not_inplacec                 C  sl   t g dg dd}| }d}|d | |d< |d | |d< |jdd	d
}t|| |d u s4J d S )Nr  r  r  r<  r   r;   r  z?
        c = a * @local_var
        d = c + @local_var
        Tr  r  )rd   r   ri   Z	local_varr  r)   r)   r*   )test_multi_line_expression_local_variable  s   z8TestOperations.test_multi_line_expression_local_variablec                 C  s|   t g dg dd}dd }| }|d |dd |d	< |d	 |dd |d
< |jddd}t|| |d u s<J d S )Nr  r  r  c                 S     |S r.   r)   r  r)   r)   r*   
local_func!     zUTestOperations.test_multi_line_expression_callable_local_variable.<locals>.local_funcr   rC   r<  r;   r  zM
        c = a * @local_func(1, 7)
        d = c + @local_func(1, 7)
        Tr  r  rd   r   r  ri   r  r)   r)   r*   2test_multi_line_expression_callable_local_variable  s   zATestOperations.test_multi_line_expression_callable_local_variablec                 C  s   t g dg dd}dd }| }|d |ddd	 |d
< |d
 |ddd	 |d< |jddd}t|| |d u s>J d S )Nr  r  r  c                 S  r  r.   r)   r  r)   r)   r*   r  5  r  zaTestOperations.test_multi_line_expression_callable_local_variable_with_kwargs.<locals>.local_funcr   r<  rC   )r   r   r;   r  zU
        c = a * @local_func(b=7, a=1)
        d = c + @local_func(b=7, a=1)
        Tr  r  r  r)   r)   r*   >test_multi_line_expression_callable_local_variable_with_kwargs1  s   zMTestOperations.test_multi_line_expression_callable_local_variable_with_kwargsc                 C  sj   t g dg dd}| }d}tjt|d |d W d    n1 s(w   Y  t|| d S )Nr  r  r  ry  rY   za = 1)r   r  r!   r^   r3   r   rb   r   )rd   r   Zdf_origre   r)   r)   r*   test_assignment_in_queryE  s   z'TestOperations.test_assignment_in_queryc                 C  st   t g dg dd}| }||d dk }|jddd t|| i }dd	i}| jd
|dd t|| d S )Nr  r  r  r   rD   za == 2Tr  r   	a = 1 + 2r  r  )r   r  r   rb   r   ra   Zassert_dict_equalr  r)   r)   r*   test_query_inplaceN  s   z!TestOperations.test_query_inplaceinvalid_targetrC   catrD   rC   r   c                 C  s   d}d}t jt|d | j||dd W d    n1 sw   Y  t|drJt jt|d | j||dd W d    d S 1 sCw   Y  d S d S )Nz)Cannot assign expression output to targetr  rY   Tr  r  F)r!   r^   r3   ra   hasattrrd   r  re   
expressionr)   r)   r*   test_cannot_item_assign\  s   
"z&TestOperations.test_cannot_item_assign)rC   r  r  c                 C  sL   d}d}t jt|d | j||dd W d    d S 1 sw   Y  d S )Nz"Cannot return a copy of the targetr  rY   Fr  )r!   r^   r3   ra   r  r)   r)   r*   test_cannot_copy_itemh  s
   "z$TestOperations.test_cannot_copy_itemr  c                 C  sd   d}| j ||dddksJ d}tjt|d | j ||dd W d    d S 1 s+w   Y  d S )N1 + 2Fr  r   z0Cannot operate inplace if there is no assignmentrY   T)ra   r!   r^   r3   )rd   r  r  re   r)   r)   r*   test_inplace_no_assignmentp  s   "z)TestOperations.test_inplace_no_assignmentc                 C  sR   t jddtddd}|dk }| jdd|id}|dk }t || t || d S )NrD   pr  r	  r  r#  r-  r   ri  rb   r  r  ra   r   )rd   r   r<   rr~   r)   r)   r*   *test_basic_period_index_boolean_expressionz  s   z9TestOperations.test_basic_period_index_boolean_expressionc                 C  sB   t jddtddd}| jdd|id}||dk  }t || d S )	NrD   r  r  r  zdf[df < 2 + 3]r   ri  r>   r  rd   r   r  r<   r)   r)   r*   ,test_basic_period_index_subscript_expression  s   z;TestOperations.test_basic_period_index_subscript_expressionc                 C  sR   t jddtddd}| jdd|id}|||dk  dk  |d  }t || d S )NrD   r  r  r  zdf[df[df < 2] < 2] + df * 2r   ri  r  r  r)   r)   r*   -test_nested_period_index_subscript_expression  s   z<TestOperations.test_nested_period_index_subscript_expressionc                 C  sV   t tjdd}tddd|d< | jdd|i||d}|jd	k }tj||d
d d S )Nr>   r   z1/1/2012)Zperiodsdates1zdf.dates1 < 20130101r   r   Z20130101Fr   )	r   r6   rE   rG   r   ra   r  rb   r   )rd   r(   r2   r   r   r\  r)   r)   r*   test_date_boolean  s   
z TestOperations.test_date_booleanc                 C  s  |dkr~t jd||d}|sJ t jd||d}|sJ t jd||d}|r(J t jd||d}|s4J t jd||d}|s@J t jd||d}|sLJ t jd	||d}|sXJ t jd
||d}|sdJ t jd||d}|rpJ t jd||d}|s|J d S d}tjt|d t jd||d W d    n1 sw   Y  tjt|d t jd||d W d    n1 sw   Y  tjt|d t jd||d W d    n1 sw   Y  tjt|d t jd||d W d    n1 sw   Y  d}tjt|d t jd||d W d    n	1 sw   Y  tjt|d t jd||d W d    d S 1 s:w   Y  d S )NrT   z1 in [1, 2]r]   z2 in (1, 2)z3 in (1, 2)z3 not in (1, 2)z[3] not in (1, 2)z[3] in ([3], 2)z[[3]] in [[[3]], 2]z(3,) in [(3,), 2]z(3,) not in [(3,), 2]z[(3,)] in [[(3,)], 2]z'In' nodes are not implementedrY   z[(3,)] in (1, 2, [(3,)])z!'NotIn' nodes are not implementedz[3] not in (1, 2, [[3]]))r`   ra   r!   r^   r_   )rd   r(   r2   r   re   r)   r)   r*   test_simple_in_ops  sR   $z!TestOperations.test_simple_in_opsc                 C  s2   d}d d}d}tj|||d}||ksJ d S )NrC   z * Z!aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar]   )rw   r`   ra   )rd   r(   r2   r   r   ri   r   r)   r)   r*   test_check_many_exprs  s
   
z$TestOperations.test_check_many_exprsr   )zdf > 2 and df > 3zdf > 2 or df > 3z
not df > 2c                 C  s   t tjdd}|dkr:d}d|v rd}tjt|d tj|d|i||d	 W d    d S 1 s3w   Y  d S tj|d|i||d	 d S )
Nr>   r   rT   rX   not'Not' nodes are not implementedrY   r   )rv   r2   r(   	r   r6   rE   rG   r!   r^   r_   r`   ra   )rd   r   r(   r2   r   re   r)   r)   r*   test_fails_and_or_not  s&   	"	
z$TestOperations.test_fails_and_or_notcharrs   r   c                 C  s   t tjdd}d| d}|dkr7d}tjt|d tj|||d W d    d S 1 s0w   Y  d S tj|||d d S )	Nr>   r   z(df + 2)[df > 1] > 0 z	 (df > 0)rT   z$cannot evaluate scalar only bool opsrY   r   r  )rd   r  r(   r2   r   rf   re   r)   r)   r*   test_fails_ampersand_pipe  s   "z(TestOperations.test_fails_ampersand_pipeN)3r   r   r   ra   r^  r!   r#   r   r   r   rc  re  rj  rl  rn  rr  rs  rx  rz  r~  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r6   r|   r  r  r  r  r  r  r  r  r  r  r  r)   r)   r)   r*   rP    sp    #

	
%	 

&
	
/
rP  c                   @  s   e Zd Zdd Zejje ddejde	dd Z
ejdedd	 Zd
d Zdd Zejdejejfejejfejejfejejfejejejejdgdd Zdd Zdd ZdS )TestMathc                 O  rQ  rR  rT  rV  r)   r)   r*   ra     rW  zTestMath.evalz&Unary ops only implemented for numexprr   fnc                 C  s|   t dtjdi}|j}| d}| |}tjdd tt||}W d    n1 s/w   Y  tj	||dd d S )Nr   rA   z(a)ignoreallFr   )
r   r6   rE   rG   r   ra   errstater8  rb   r   )rd   r  r   r   r   gotr   r)   r)   r*   test_unary_functions  s   

zTestMath.test_unary_functionsc                 C  s   t tjdtjdd}|j}|j}| d}| |}tjdd tt|||}W d    n1 s8w   Y  t	j
||dd d S )NrA   r  z(a, b)r  r  Fr   )r   r6   rE   rG   r   r   ra   r  r8  rb   r   )rd   r  r   r   r   r   r  r   r)   r)   r*   test_binary_functions  s   

zTestMath.test_binary_functionsc                 C  s`   t tjdtjdd}|jd||dd |j}tt|j|j	}t
j||dd d S )NrA   r  ze = arctan2(sin(a), b)Tr(   r2   r  Fr   )r   r6   rE   rG   ra   r<   Zarctan2sinr   r   rb   r   rd   r(   r2   r   r  r   r)   r)   r*   test_df_use_case  s   zTestMath.test_df_use_casec                 C  s\   t tjdtjdd}|jd||dd |j}t|j|j }t	j
||dd d S )NrA   r  ze = sin(a + b)Tr  Fr   )r   r6   rE   rG   ra   r<   r  r   r   rb   r   r  r)   r)   r*    test_df_arithmetic_subexpression)  s
   z)TestMath.test_df_arithmetic_subexpressionzdtype, expect_dtyper    c                 C  s   t dtjd|i}|jj|ksJ |jd||dd |j}t	|j}|j|jks/J ||jks6J t
j||dd d S )Nr   rA   z
b = sin(a)Tr  Fr   )r   r6   rE   rG   r   r   r   ra   r   r  rb   r   )rd   r   Zexpect_dtyper(   r2   r   r  r   r)   r)   r*   test_result_types0  s   zTestMath.test_result_typesc                 C  \   t dtjdi}d}tjt|d |jd||d W d    d S 1 s'w   Y  d S )Nr   rA   z#"mysin" is not a supported functionrY   zmysin(a)r]   )r   r6   rE   rG   r!   r^   r3   ra   rd   r(   r2   r   re   r)   r)   r*   test_undefined_funcI  
   "zTestMath.test_undefined_funcc                 C  r  )Nr   rA   z1Function "sin" does not support keyword argumentsrY   zsin(x=a)r]   )r   r6   rE   rG   r!   r^   rx   ra   r  r)   r)   r*   test_keyword_argP  r  zTestMath.test_keyword_argN)r   r   r   ra   r!   r#   r$   r   r   r   r  r   r  r  r  r6   Zint32r   Zint64r   r"   Z
complex128r%   r   r  r  r  r)   r)   r)   r*   r    s.    







r  rA   c                   @  s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )	TestScopec                 C  s$   d}t td tj|||d d S )N
_var_s * 2rD   r]   )rb   r   _var_sr`   ra   )rd   r(   r2   r<   r)   r)   r*   test_global_scope\  s   zTestScope.test_global_scopec                 C  sD   d}t   }tjd|||d t   }|d ||ks J d S )NrC   x + 1r   lcls)r@  r  r`   ra   rU  )rd   r(   r2   r~   r  Zlcls2r)   r)   r*   test_no_new_localsb  s   


zTestScope.test_no_new_localsc                 C  s8   d}t   }tjd||d t   }||ksJ d S )NrC   r  r]   )globalsr  r`   ra   )rd   r(   r2   r~   ZgblsZgbls2r)   r)   r*   test_no_new_globalsj  s
   

zTestScope.test_no_new_globalsc                 C  sN   d}d}t jt|d tjd||i d W d    d S 1 s w   Y  d S )NrC   ro  rY   r  ru   r!   r^   r   r`   ra   )rd   r(   r2   r~   re   r)   r)   r*   test_empty_localsq  
   "zTestScope.test_empty_localsc                 C  sN   d}d}t jt|d tj|||i d W d    d S 1 s w   Y  d S )Nzname '_var_s' is not definedr  rY   )r(   r2   Zglobal_dictr  )rd   r(   r2   re   r<   r)   r)   r*   test_empty_globalsx  r  zTestScope.test_empty_globalsN)r   r   r   r  r  r  r  r  r)   r)   r)   r*   r  [  s    r  c                  C  N   d} t jt| d tjdddddd W d    d S 1 s w   Y  d S )	NzInvalid engine 'asdf' passedrY   rg  rC   rD   rh  asdf)rv   r(   r!   r^   KeyErrorr`   ra   re   r)   r)   r*   test_invalid_engine     "r  )use_numexprri   ))Tr   )FrT   c                 C  sR   ddl m} td|  |d }||ksJ W d    d S 1 s"w   Y  d S )Nr   )_check_enginecompute.use_numexpr)Zpandas.core.computation.evalr  r`   option_context)r  ri   r  rj   r)   r)   r*   test_numexpr_option_respected  s
   
"r  c                  C  s|   t dd. tg dg dd} | d}td d gddgdd	dgd
}t|| W d    d S 1 s7w   Y  d S )Nr  F)TFTFNN)rC   rD   r   r4  r>   rf  )r   Bz
A.isnull()r>   rf  r4  )r   )r`   r  r   r   rb   r   )r   rj   ri   r)   r)   r*   #test_numexpr_option_incompatible_op  s   
"r  c                  C  r  )	NzInvalid parser 'asdf' passedrY   rg  rC   rD   rh  r  )rv   r2   r  r  r)   r)   r*   test_invalid_parser  r  r  )rT   r   r{   z dict[str, type[BaseExprVisitor]]_parsersc              	   C  sb   t | }|d| |}|jD ]!}d}tjt|d t||  W d    n1 s)w   Y  qd S )Nr  znodes are not implementedrY   )r  Zunsupported_nodesr!   r^   r_   r8  )r(   r2   ZVisitorClassinstr[  re   r)   r)   r*   test_disallowed_nodes  s   
r  c                 C  sH   d}t jtdd tj|| |d W d    d S 1 sw   Y  d S )Nzs +r|  rY   r]   r!   r^   r   r`   ra   )r(   r2   r<   r)   r)   r*   test_syntax_error_exprs  s   "r  c                 C  sL   d}d}t jt|d tj|| |d W d    d S 1 sw   Y  d S )Nzs + tzname 's' is not definedrY   r]   )r!   r^   rp  r`   ra   )r(   r2   r<   re   r)   r)   r*   test_name_error_exprs  s
   "r  express)za + @bz@a + bz@a + @bc                 C  s   d\}}|dkr*t jtdd tj|| |d W d    d S 1 s#w   Y  d S t jtdd tj|| |d W d    d S 1 sEw   Y  d S )NrC   rD   r{   zThe '@' prefix is onlyrY   r]   zThe '@' prefix is notr  )r(   r2   r  r   r   r)   r)   r*   %test_invalid_local_variable_reference  s   ""r  c                 C  s|   d\}}| dkr,d}t jt|d tjd| |d W d    d S 1 s%w   Y  d S tjd| |d}||| ks<J d S )Nr  r   zVariables in expression .+rY   zsin + dotted_liner]   )r!   r^   r   r`   ra   )r(   r2   r  Zdotted_linere   r   r)   r)   r*   test_numexpr_builtin_raises  s   "r   c                 C  sJ   d}t jtdd tjd|| |d W d    d S 1 sw   Y  d S )N)*   g      @zResolver of type .+rY   r  )	resolversr(   r2   r   )r(   r2   Zcannot_resolver)   r)   r*   test_bad_resolver_raises  s   "r  c                 C  D   t jtdd tjd| |d W d    d S 1 sw   Y  d S )Nzexpr cannot be an empty stringrY    r]   r!   r^   r3   r`   ra   r]   r)   r)   r*   test_empty_string_raises  s   "r  c                 C  r  )Nz#only a single expression is allowedrY   z1 + 1; 2 + 2r]   r  r]   r)   r)   r*   $test_more_than_one_expression_raises  s   "r  cmprU   r:   c              	   C  s   t dd ttjji}||   }||   } ||  }d| d| d}d| d| d}d| d| d	}	|||	fD ]#}
d
}tjt|d tj	|
||d W d    n1 sWw   Y  q9d S )Nc                   S  s   t jdS )NrA   )r6   rE   r   r)   r)   r)   r*   r     r   z0test_bool_ops_fails_on_scalars.<locals>.<lambda>rq   r   rr   r   r[   r   r\   r   rY   r]   )
intr?   r6   rE   rG   r!   r^   r_   r`   ra   )r8   r	  r:   r(   r2   genr   r   r   r   rf   re   r)   r)   r*   test_bool_ops_fails_on_scalars  s   


r  otherz'x'z...c                 C  sJ   t dg di}|d|  }tg ddd}trd |_t|| d S )Nr   )r   r   r;   r   )FFFr   )r   ra   r   r   r   rb   r   )r  r   rj   ri   r)   r)   r*   test_equals_various  s   r  c                 C  s*   d}t j}tj|| |d}||ksJ d S )Nzinf + 1r]   )r6   infr`   ra   )r(   r2   r  ri   rj   r)   r)   r*   test_inf  s   r  columnu	   Temp(°C)u   Capacitance(μF)c                 C  sT   t tjdd|dgd}||| dk }d| d}|j|| d}t|| d S )Nr>   rD   r   r   `z` > 5)r(   )r   r6   rE   rG   r   rb   r   )r(   r  r   ri   Zquery_stringrj   r)   r)   r*   test_query_token  s
   r  c                 C  s   t ddgddggddgd}||jdk  }|jd| |d	}t|| |d
krLd}tjt|d |jd| |d	 W d    d S 1 sEw   Y  d S |jd| |d	}t|| d S )Nr   rA   rC   r$  r  countr   z
~(cat > 0)r]   rT   r  rY   znot (cat > 0))r   r  r   rb   r   r!   r^   r_   )r(   r2   r   ri   rj   re   r)   r)   r*   test_negate_lt_eq_le)  s   "r  c                 C  st   |dv r| j tjjtd| d ttjj	dddd|dgd	}||| d
k }|
| d}t|| d S )N)TrueFalser  ZInfz+GH 47859 DataFrame eval not supported with )r^   r   r   d   )rA   rD   r   Zcol1r   rf  z>6)r   r   r!   r#   r   r  r   r6   rE   r   r   rb   r   )r1   r  r   ri   rj   r)   r)   r*    test_eval_no_support_column_name9  s   r  c                 C  s   t g dg dg dd}|d d  }|d }|jddd t g d	g dg dd}t|| | sIt||d  t|d |d  d S tg ddd
}t|| t|d | d S )Nr  r  )r<     	   )r   r  Cr   z	A = B + CTr  )r        r  )r   ra   rb   r   r   r   )Zusing_copy_on_writer   Zresult_viewrF  ri   r)   r)   r*   test_set_inplaceN  s   r   c                   @  s.   e Zd Zejdddg ddgdd ZdS )	TestValidatevaluerC   r  r  g      @c                 C  sF   d}t jt|d tjd|d W d    d S 1 sw   Y  d S )Nz8For argument "inplace" expected type bool, received typerY   z2+2r  r  )rd   r"  re   r)   r)   r*   test_validate_bool_argsb  s   "z$TestValidate.test_validate_bool_argsN)r   r   r   r!   r#   r   r#  r)   r)   r)   r*   r!  a  s    r!  )f
__future__r   	functoolsr   	itertoolsr   r  rE   r&  numpyr6   r!   Zpandas.errorsr   r   r   Zpandas.util._test_decoratorsutilZ_test_decoratorsr%   Zpandas.core.dtypes.commonr   r	   r
   r   r{   r`   r   r   r   Zpandas._testingZ_testingrb   Zpandas.core.computationr   r   Zpandas.core.computation.enginesr   Zpandas.core.computation.exprr   r   r   Z#pandas.core.computation.expressionsr   r   Zpandas.core.computation.opsr   r   r   r   r   Zpandas.core.computation.scoper   Zfixturer(   ZPARSERSr2   r=   rN  ranger8   r:   r   rI   r  r  r  r  rP  r  rG   r  r  r&   r  r#   r   r  r  r  ZPyTablesExprVisitorr  __annotations__r  r  r  r  r   r  r  r  r
  r?   r  r  r  r  r  keysr  r   r!  r)   r)   r)   r*   <module>   s    



    \  	    	Z%
	





	
