U
    b                    @  s  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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 d d	l m!Z!m"Z" d dl#m$  m%  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/m0Z0m1Z1m2Z2m3Z3 e
j4dd e!D ddd Z5e
j4e&j6ddd Z7dd Z8e
j4e8 ddd Z9dd Z:dd Z;dd Z<dd Z=d d! Z>d"d# Z?e@eAe.Be/ZCe
j4eDeEd$d%d&d'd(d)gd*d+d, ZFeFZGeFZHG d-d. d.ZId/d0 ZJG d1d2 d2ZKd3d4 ZLd5d6 ZMG d7d8 d8ZNG d9d: d:ZOG d;d< d<ZPe	jQRd=ZSG d>d? d?ZTejUd@dA ZVejUe
jWXdBdCdDdE ZYejUdFdG ZZejUdHdI Z[e)ej\e(dJZ]dKe^dL< e
jWXde!e
jWXde]dMdN Z_dOdP Z`dQdR Zae
jWXdSdTdUdVgdWdX ZbdYdZ Zcd[d\ Zdd]d^ Zed_d` Zfe
jWXdadbe
jWXd,egehfe
jWXdcegehfddde Zie
jWXdfdgdhgdidj Zjdkdl Zkdmdn Zle
jWXdodpdqgdrds Zmdtdu ZnG dvdw dwZodS )x    )annotations)reduce)productN)PerformanceWarning)is_boolis_floatis_list_like	is_scalar)	DataFrameSeries
date_range)pytables)ENGINESNumExprClobberingError)BaseExprVisitorPandasExprVisitorPythonExprVisitor)NUMEXPR_INSTALLEDUSE_NUMEXPR)ARITH_OPS_SYMSSPECIAL_CASE_ARITH_OPS_SYMSUndefinedVariableError_binary_math_ops_binary_ops_dict_unary_math_opsc              	   c  sD   | ]<}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markZskipifr   r   tdskip_if_no_ne.0engine r&   F/tmp/pip-unpacked-wheel-ck39h295/pandas/tests/computation/test_eval.py	<genexpr>6   s   r(   )paramsc                 C  s   | j S Nr   requestr&   r&   r'   r%   5   s    r%   c                 C  s   | j S r*   r+   r,   r&   r&   r'   parserI   s    r.   c                   C  s   t rttS g S r*   )r   listr   r&   r&   r&   r'   _get_unary_fns_for_neN   s    r0   c                 C  s   | j S r*   r+   r,   r&   r&   r'   unary_fns_for_neR   s    r1   c                 C  s
   t |  jS r*   )r   Zhas_neg_fracr%   r&   r&   r'   engine_has_neg_fracW   s    r3   c              
   C  sh   t | }t|r^z|| |W S  tk
r\ } z"t|drJtj W Y S  W 5 d }~X Y nX || |S )Nz6negative number cannot be raised to a fractional power)r   r3   
ValueErrorstr
startswithnpnan)lhscmp1rhsr%   cer&   r&   r'   _eval_single_bin[   s    r>   c                 C  s@   t | tr t |tjr |jdkp>t |to>t | tjo>| jdkS )N   )
isinstancer   r7   ndarrayndimr9   r;   r&   r&   r'   _series_and_2d_ndarrayi   s    rD   c                 C  s(   t | trt |tp&t |to&t | tS r*   )r@   r   r
   rC   r&   r&   r'   _series_and_frameo   s    rE   c                 C  s   t | tot |tjjjS r*   )r@   boolpdcoreZgenericZNDFramerC   r&   r&   r'   _bool_and_frameu   s    rI   c                 C  s   t |ttjfot| S r*   )r@   complexr7   Zcomplexfloatingisnan)resultexpectedr&   r&   r'   _is_py3_complex_incompaty   s    rN      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
   rO         ?r?      )r
   r7   randomrandr8   randnr   r   )r-   Znan_df1optsr&   r&   r'   r9      s    r9   c                
   @  s^  e Zd Zejdddd Zedd Zedd Z	ej
jd	d
dddddgddddddg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d#d$ Zd%d& Zd'd( Zej
d)ed*d+ Zd,d- Zd.d/ Zd0d1 Zejd2d3 Zd4d5 Zd6d7 Zd8d9 Z d:d; Z!d<d= Z"d>d? Z#ej
d@e$e%j&'dAdBe$e%j&j(dAdCdDe$e%j&)dAdBdEkgdFdG Z*ej
d@e+e%j&'dAe+e%j&j(dAdAdDe+e%j&)dAdEkgdHdI Z,dJdK Z-dLdM Z.ej
dNe%j/e%j0gdOdP Z1dQdR Z2dSdT Z3dUdV Z4dWdX Z5dYdZ Z6d[S )\TestEvalTZautousec                 C  s   || _ || _d S r*   r%   r.   selfr%   r.   r&   r&   r'   set_engine_parser_attrs   s    z TestEval.set_engine_parser_attrsc                 C  s   dd l }|| _d S )Nr   )r   ne)clsr_   r&   r&   r'   setup_class   s    zTestEval.setup_classc                   s    fddt D S )Nc                 3  s   | ]}| j kr|V  qd S r*   r2   r#   r]   r&   r'   r(      s     
 z+TestEval.current_engines.<locals>.<genexpr>)r   rb   r&   rb   r'   current_engines   s    zTestEval.current_enginesr:   z!=z==z<=z>=<>r_   eqlegeltgt)rQ   cmp2binopc              	   C  s   | j dkr`|dkr`d}tjt|d2 d| d| d| d}tj|| j| j d	}W 5 Q R X d S t|||| j}	t|||| j}
t|	||
| j}d| d| d| d}tj|| j| j d	}| || d S )
Npythonandor"'BoolOp' nodes are not implementedmatch(lhs z rhs) z (lhs  rhs)r[   )	r.   r   raisesNotImplementedErrorrG   evalr%   r>   check_equal)r]   r:   rk   rl   r9   r;   msgexrL   lhs_newrhs_newrM   r&   r&   r'   test_complex_cmp_ops   s    zTestEval.test_complex_cmp_opscmp_opc              	   C  sd   |dk }|dk }| j dkrR|dkrRd}tjt|d | ||| W 5 Q R X d S | ||| d S )Nr   rm   innot in&'(In|NotIn)' nodes are not implementedrr   )r.   r   rv   rw   check_simple_cmp_op)r]   r   r9   r;   rz   r&   r&   r'   test_simple_cmp_ops   s    zTestEval.test_simple_cmp_opsopc              	   C  s   | j dkrB|dkrBd}tjt|d | ||| W 5 Q R X d S t|rt|s|dkr| jdkr| j dkrtjjdd}|j	
| | ||| d S )Nrm   r   r   rr   pandasz]Looks like expected is negative, unclear whether expected is incorrect or result is incorrectr   )r.   r   rv   rw   check_compound_invert_opr   r%   r    xfailnodeZ
add_marker)r]   r   r9   r;   r-   rz   r    r&   r&   r'   test_compound_invert_op   s(    z TestEval.test_compound_invert_opc                 C  s   |  ||||| d S r*   )check_chained_cmp_op)r]   r:   rk   r9   midhsr;   r&   r&   r'   test_chained_cmp_op   s    zTestEval.test_chained_cmp_opc                 C  sZ   t |trt|| n>t |tr0t|| n&t |tjrJt|| n||ksVt	d S r*   )
r@   r
   tmassert_frame_equalr   assert_series_equalr7   rA   assert_numpy_array_equalAssertionErrorr]   rL   rM   r&   r&   r'   ry      s    

zTestEval.check_equalc              	   C  s   | j dkrRd| d| d}d}tjt|d tj|| j| j d W 5 Q R X d S t|||| j}t|||| j}	|d k	r|	d k	rd| d| d}d| d| d}
d	| d
| d}t|d|	| j}||
|fD ]$}tj|| j| j d}t	|| qd S )Nrm   lhs  mid  rhsrq   rr   r[    mid and mid rt    mid) & (mid ru   &)
r.   r   rv   rw   rG   rx   r%   r>   r   assert_almost_equal)r]   r9   r:   midrk   r;   ex1rz   r|   r}   ex2ex3rM   r{   rL   r&   r&   r'   r      s     
zTestEval.check_chained_cmp_opc              	   C  s   d| d}d ddg}|dkrbt|sbtjt|d" tj|| j| j||dd	 W 5 Q R X n0t	|||| j}tj|| j| jd
}| 
|| d S )Nr   r   |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 iterabler   rr   rC   r%   r.   
local_dictr[   )joinr   r   rv   	TypeErrorrG   rx   r%   r.   r>   ry   )r]   r9   r:   r;   r{   rz   rM   rL   r&   r&   r'   r     s"    zTestEval.check_simple_cmp_oparith1c                 C  s   d| d}t j|| j| jd}t|||| j}t|| d| d| d}t j|| j| jd}t|||| j}| |||| d S )Nr   r   r[   z rhs )rG   rx   r%   r.   r>   r   r   check_alignment)r]   r   r9   r;   r{   rL   rM   nlhsr&   r&   r'   test_binary_arith_ops#  s    zTestEval.test_binary_arith_opsc              
   C  s|   z| |\}}W n tttfk
r,   Y nLX | jdkr\| jd| d}t|j	| nt
d| d}t|| d S )Nr   znlhs z ghs)Zalignr4   r   AttributeErrorr%   r_   evaluater   r   valuesrx   )r]   rL   r   Zghsr   rM   r&   r&   r'   r   /  s    
zTestEval.check_alignmentc                 C  s   d}t j|| j| jd}|| }t|| | jdkrr| jd}t|t	t
fr`t|j| qt||  nt|d|| j}t|| d S )Nz	lhs % rhsr[   r   zexpected % rhs%)rG   rx   r%   r.   r   r   r_   r   r@   r
   r   r   itemr>   )r]   r9   r;   r{   rL   rM   r&   r&   r'   test_modulusE  s    
zTestEval.test_modulusc              	   C  sv   d}| j dkr8tj|| j | jd}|| }| || n:d}tjt|d" tj|||d| j | jd W 5 Q R X d S )Nz
lhs // rhsrm   r[   zGunsupported operand type\(s\) for //: 'VariableNode' and 'VariableNode'rr   rC   r   r%   r.   )r%   rG   rx   r.   ry   r   rv   r   )r]   r9   r;   r{   resrM   rz   r&   r&   r'   test_floor_divisionU  s    
zTestEval.test_floor_divisionc              	   C  s   d}t |d|| j}tj|| j| jd}t|rnt|rnt||rnd}tjt	|d t
|| W 5 Q R X nPt
|| d}tj|| j| jd}t |d|| j}t |d|| j}t
|| d S )Nz
lhs ** rhs**r[   z-(DataFrame.columns|numpy array) are differentrr   z(lhs ** rhs) ** rhs)r>   r%   rG   rx   r.   r	   rN   r   rv   r   r   r   r   )r]   r9   r;   r{   rM   rL   rz   Zmiddler&   r&   r'   test_powi  s$    zTestEval.test_powc              	   C  s   z| t}W n$ tk
r2   tt|g}Y nX | }tjd| j| jd}t	
|| | jD ]}t	
|tjd|| jd q`d S )Nz~elbr[   )astyperF   r   r7   arrayrG   rx   r%   r.   r   r   rc   )r]   r9   ZelbrM   rL   r%   r&   r&   r'   check_single_invert_op  s    
 zTestEval.check_single_invert_opc              	   C  s  ddg}d| d}d ddg}t|rj||krjtjt|d" tj|| j| j||d	d
 W 5 Q R X nt|rt|rt	dd ||f\}}t
|||| j}t|r| }n| }tj|| j| jd}t|| | jD ]$}	tj|| j| jd}
t|
| qd S )Nr   r   z~(lhs ru   r   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 iterablerr   rC   r   c                 S  s   t | gS r*   )r7   r   xr&   r&   r'   <lambda>      z3TestEval.check_compound_invert_op.<locals>.<lambda>r[   )r   r	   r   rv   r   rG   rx   r%   r.   mapr>   r   r   rc   )r]   r9   r:   r;   Z
skip_theser{   rz   rM   rL   r%   Zevr&   r&   r'   r     s4    
z!TestEval.check_compound_invert_opc              	   C  s  d}t tjdd}| jdkrTd}tjt|d tj	|| j| j
d}W 5 Q R X n2d}tjt|d tj	|| j| j
d}W 5 Q R X t tjjdd	d
}| jdkrd}tjt|d tj	|| j| j
d}W 5 Q R X n&| }tj	|| j| j
d}t|| t tjdddk}| }tj	|| j| j
d}t|| t dddgtjddkd}| jdkrtjtdd tj	|| j| j
d}W 5 Q R X n2d}tjt|d tj	|| j| j
d}W 5 Q R X d S )N~lhsrO   rT   r   -couldn't find matching opcode for 'invert_dd'rr   r[   0ufunc 'invert' not supported for the input typesrO   rT   size)couldn't find matching opcode for 'invertrS   ar?          @   )br<   unknown type object#bad operand type for unary ~: 'str')r
   r7   rU   rW   r%   r   rv   rw   rG   rx   r.   r   randintr   r   rV   r4   r]   exprr9   rz   rL   expectr&   r&   r'   test_frame_invert  s8    
 
   zTestEval.test_frame_invertc              	   C  s  d}t tjd}| jdkrRd}tjt|d tj	|| j| j
d}W 5 Q R X n2d}tjt|d tj	|| j| j
d}W 5 Q R X t tjjddd}| jdkrd	}tjt|d tj	|| j| j
d}W 5 Q R X n&| }tj	|| j| j
d}t|| t tjdd
k}| }tj	|| j| j
d}t|| t dddg}| jdkrtjtdd tj	|| j| j
d}W 5 Q R X n2d}tjt|d tj	|| j| j
d}W 5 Q R X d S )Nr   rO   r   r   rr   r[   r   r   r   rS   r   r?   r   r   r   )r   r7   rU   rW   r%   r   rv   rw   rG   rx   r.   r   r   r   r   rV   r4   r   r&   r&   r'   test_series_invert  s8    
 
  zTestEval.test_series_invertc              	   C  s   d}t tjdd}| }tj|| j| jd}t	|| t tjj
ddd}| }tj|| j| jd}t	|| t tjdddk}| jdkrd	}tjt|d
 tj|| j| jd}W 5 Q R X n&| }tj|| j| jd}t	|| d S )N-lhsrO   rT   r[   r   r   rS   r   *couldn't find matching opcode for 'neg_bb'rr   )r
   r7   rU   rW   rG   rx   r%   r.   r   r   r   rV   r   rv   rw   r]   r   r9   r   rL   rz   r&   r&   r'   test_frame_negate  s"    
 zTestEval.test_frame_negatec              	   C  s   d}t tjd}| }tj|| j| jd}t	|| t tjj
ddd}| }tj|| j| jd}t	|| t tjddk}| jdkrd}tjt|d tj|| j| jd}W 5 Q R X n&| }tj|| j| jd}t	|| d S )	Nr   rO   r[   r   rS   r   r   rr   )r   r7   rU   rW   rG   rx   r%   r.   r   r   r   rV   r   rv   rw   r   r&   r&   r'   test_series_negate*  s"    
 zTestEval.test_series_negater9   rO   rT   r   r   rS   c                 C  s,   d}|}t j|| j| jd}t|| d S Nz+lhsr[   )rG   rx   r%   r.   r   r   r]   r9   r   r   rL   r&   r&   r'   test_frame_posD  s    zTestEval.test_frame_posc                 C  s,   d}|}t j|| j| jd}t|| d S r   )rG   rx   r%   r.   r   r   r   r&   r&   r'   test_series_posV  s    zTestEval.test_series_posc              	   C  sr  d}t jt|d tjd| j| jd W 5 Q R X tjd| j| jddksNttjd| j| jdd	ksjttjd
| j| jddksttjd| j| jddksttjd| j| jddksttjd| j| jddksttjd| j| jddksttjd| j| jddksttjd| j| jddks2ttjd| j| jddksPttjd| j| jddksntd S )Nz%bad operand type for unary ~: 'float'rr   z~1.0r[   z-1.0r.   r%   g      z+1.0      ?z~1z-1z+1r?   z~Truez~Falsez-Truez-Falser   z+Truez+False)r   rv   r   rG   rx   r%   r.   r   )r]   rz   r&   r&   r'   test_scalar_unaryh  s    zTestEval.test_scalar_unaryc                 C  sN   t jtdt jd}t jddddddddd	d
dd
gt jd}t|| d S )NzK[-True, True, ~True, +True,-False, False, ~False, +False,-37, 37, ~37, +37]dtyper   Tr   r?   r   Fi%   i)r7   r   rG   rx   Zobject_r   r   r   r&   r&   r'   test_unary_in_arrayy  s.    zTestEval.test_unary_in_arrayr   c                 C  s\   t dtjdg|di}|d}|jtdgks8t|d}|jtdgksXtd S )Nr   r   r   zx < -0.1Fz-5 > x)r
   r7   r   rx   r   r   )r]   r   dfr   r&   r&   r'   test_float_comparison_bin_op  s
    

z%TestEval.test_float_comparison_bin_opc              
   C  s   d}|d7 }|d7 }|d7 }|d7 }t jddd  }}}tt jdd}|D ]6}d	}tjt|d
 tj|| j	| j
d W 5 Q R X qRd S )N)z1 or 2z1 and 2)za and bza or b)z1 or 2 and (3 + 2) > 3)z2 * x > 2 or 1 and 2)z2 * df > 3 and 1 or ar   r?   rT   ;cannot evaluate scalar only bool ops|'BoolOp' nodes are notrr   r[   )r7   rU   rW   r
   r   rv   rw   rG   rx   r%   r.   )r]   exprsr   r   r   r   r{   rz   r&   r&   r'   test_disallow_scalar_bool_ops  s    z&TestEval.test_disallow_scalar_bool_opsc                 C  sf  d}t jd| j| jd}|dks$tt|s0td}t jd| j| jd}|dksTtt|s`td}t jd| j| jd}|rtt|stt|sttdg}t jd| j| jd}t	
|tdg |jdksttdg}t jd| j| jd}t	
|tdg |jdksttdg}t jd| j| jd}t	
|tdg |jdksbtd S )Nr?   r   r[   g      ?F)r?   )rG   rx   r%   r.   r   r	   r   r7   r   r   r   shape)r]   r   rL   r&   r&   r'   test_identical  s2    zTestEval.test_identicalc                 C  s(   d}t j|| j| jd}|dks$td S )Nz1 + 2 *         5 - 1 + 2 r[      )rG   rx   r%   r.   r   )r]   exprL   r&   r&   r'   test_line_continuation  s    zTestEval.test_line_continuationc                 C  s   d}t j|| j| jd}t|}||ks.ttddddgi}d}|d|d	}|j	s`t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[   Ag~  eAg$  eAg'1  eAg  eAzA < z.4fg   eAzA > r?   rT   A == )rG   rx   r%   r.   r7   float64r   r
   queryemptylocr   r   )r]   r   rL   rM   r   cutoffexactr&   r&   r'   test_float_truncation  s     

zTestEval.test_float_truncationc              	   C  sx   t dddggdddgd}d}tjt|d |d W 5 Q R X t  }d	|j_tjt|d |d
 W 5 Q R X d S )Nr   Zfoobarclasscolumnsz4Python keyword not valid identifier in numexpr queryrr   z
class == 0lambdazlambda == 0)r
   r   rv   SyntaxErrorr   indexnamer]   r   rz   r&   r&   r'   test_disallow_python_keywords  s    z&TestEval.test_disallow_python_keywordsN)7__name__
__module____qualname__r   fixturer^   classmethodra   propertyrc   r    parametrizer   BOOL_OPS_SYMSr~   CMP_OPS_SYMSr   r   r   ry   r   r   _good_arith_opsr   r   r   r   r!   skip_if_windowsr   r   r   r   r   r   r   r
   r7   rU   rW   r   rV   r   r   r   r   r   float32r   r   r   r   r   r   r   r&   r&   r&   r'   rY      s|   








%+/


	!rY   c                  O  s
   t j S r*   )r7   rU   rW   )argskwargsr&   r&   r'   r     r   r   c                   @  sB   e Zd Zejddddddgejdejejgdd	 Z	d
S )TestTypeCastingr   +-*r   /dtc                 C  s   t jddt|d}d| d}tj|||d}|jj|ks>t|jj|ksNtt |t| d| d}tj|||d}|jj|kst|jj|kstt |t| d S )	NrO   r   )
data_gen_fr   df z 3r[   z3  df)	r   makeCustomDataframefrG   rx   r   r   r   r   )r]   r%   r.   r   r  r   sr   r&   r&   r'   test_binop_typecasting  s    z&TestTypeCasting.test_binop_typecastingN)
r   r   r   r   r    r  r7   r	  r   r  r&   r&   r&   r'   r    s   r  c                 C  s   t | jjtjS r*   )
issubclassr   typer7   Z
datetime64r   r&   r&   r'   _is_datetime  s    r  c                  G  s0   t ttd|  }ttjtt| }|o.|S )NZis_monotonic)anyr   operator
attrgetterr   xorr  )r
  Znot_monoZonly_one_dtr&   r&   r'   should_warn  s    r   c                
   @  s  e Zd Zdddg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dgd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iur  r  c                 C  s8   d}t jddtd}tj|||d}t ||d  d S )Nzdf * ~2rO   r   )r  r[   )r   r  r  rG   rx   r   )r]   r%   r.   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 t dt tjddt||d}tjddt||d}t|j|jrxt	t t
jd||d}W 5 Q R X nt
jd||d}t|||  W 5 Q R X d S )	NTrecordalwaysrR   r  
r_idx_typer(     zdf + df2r[   warningscatch_warningssimplefilterRuntimeWarningr   r  r  r   r   assert_produces_warningrG   rx   r   )	r]   r%   r.   r&  r'  r(  r   df2r   r&   r&   r'   test_basic_frame_alignment0  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 )NrR   r,  df < 2r[   rT   )r   r   zdf < df3)r   r  r  rG   rx   r   r
   r7   rU   rW   r   r   r   )r]   r%   r.   r-  r(  r   r   df3r&   r&   r'   test_frame_comparisonG  s        z#TestAlignment.test_frame_comparisonr1c1r2c2c              
   C  s   t jdd 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rt	t t
jd	||d
}
W 5 Q R X nt
jd	||d
}
t|
|| |	  W 5 Q R X d S )NTr)  r+  r   rT   r,     rO   zdf + df2 + df3r[   r/  )r]   r%   r.   r:  r;  r<  r=  r   r5  r8  r   r&   r&   r'   #test_medium_complex_frame_alignmentT  s8                z1TestAlignment.test_medium_complex_frame_alignment
index_namer   r   c              
   C  s   t jdd t dt tjddt||d}t||}tt	j
d|d d }t|j|jrtt tjd||d}	W 5 Q R X ntjd||d}	|d	ks|d	kr|d
kr||n|| }
n|| }
t|	|
 W 5 Q R X d S )NTr)  r+  rR   r,  rO   df + sr[   r  r   )r0  r1  r2  r3  r   r  r  getattrr   r7   rU   rW   r   r   r4  rG   rx   addr   r]   r%   r.   r@  r-  r(  r   r   r  r   rM   r&   r&   r'   !test_basic_frame_series_alignmentm  s&        
z/TestAlignment.test_basic_frame_series_alignmentzr_idx_type, c_idx_type)r  r  zignore::RuntimeWarningc              	   C  s   t jddt||d}t||}ttjd|d d }t|j	|j	rnt 
t tjd||d}	W 5 Q R X ntjd||d}	|dks|dkr|dkr||n|| }
n|| }
t |	|
 d S )	NrR      r,  rO   zs + dfr[   r  r   )r   r  r  rB  r   r7   rU   rW   r   r   r4  r3  rG   rx   rC  r   rD  r&   r&   r'   !test_basic_series_frame_alignment  s"    	    
z/TestAlignment.test_basic_series_frame_alignmentr   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rtt tj|
||d}W 5 Q R X tt tj|||d}W 5 Q R X n tj|
||d}tj|||d}|dkr|dkr|dkrt|| W 5 Q R X d S )NTr)  r+  rR   r,  rO   zs r  r  z sr[   r  r   )r0  r1  r2  r3  r   r  r  rB  r   r7   rU   rW   r   r   r4  rG   rx   r   )r]   r%   r.   r@  r   r-  r(  r   r   r  r9   r;   r   r   r&   r&   r'   test_series_frame_commutativity  s.        

z-TestAlignment.test_series_frame_commutativityc              
   C  s  dd l }d}d}	d|	 }
tjdd\ tdt |dd	g}|d
dg}tj|	|t||d}tj|
|t||d}t	t
 ||}ttj ||d | }|dks|dkr|dkr||}q|| }n|| }|dks|dkr|dkr||}n|| }n|| }t|j|j|jrPtt tjd||d}W 5 Q R X ntjd||d}|j|jksrtt|| W 5 Q R X d S )Nr   r   rO   rT   Tr)  r+  r   r   r   r5  r,  r  r   zdf2 + ser + dfr[   )rU   r0  r1  r2  r3  choicer   r  r  rB  localsgetr   r7   rW   rC  r   r   r4  rG   rx   r   r   r   )r]   r%   r.   r:  r;  r<  r=  rU   nm1m2r@  Zobj_namer   r5  r   ZserZ	expected2rM   r   r&   r&   r'   #test_complex_series_frame_alignment  sP            


z1TestAlignment.test_complex_series_frame_alignmentc              	   C  s  t tjdd}ttjd}|dkr0t}nd}t| tj	d||d W 5 Q R X ttjd}td tj	d||d W 5 Q R X t tjdd}ttjd}td tj	d||d W 5 Q R X t tjdd}ttjd}|dk}|st}nd}t|n}tj	d||d |st
|d	ksFtt|d
 j}	t|j|jd	  }
d|
dd}|	|kstW 5 Q R X d S )Ni  rR   i'  r   FrA  r[   rm   r?   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
   r7   rU   rW   r   r   r   r4  rG   rx   lenr   r5   messagelog10r   r   )r]   r%   r.   r   r  seenZis_python_engineZwrnwrz   ZloggedrM   r&   r&   r'   +test_performance_warning_for_poor_alignment  s:    z9TestAlignment.test_performance_warning_for_poor_alignmentN)r   r   r   Zindex_typesZlhs_index_typesr%  r   r    r  r6  r9  r?  rE  r/   r   filterwarningsrG  rH  rO  rU  r&   r&   r&   r'   r!  %  sJ   


.r!  c                
   @  s.  e Zd Zejddd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ejjd%d&d'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Z ej	d7d8d9d8d:ge!"g d;gej#d<d=d> Z$ej	d7d8d9d;gd?d@ Z%ej	dAd8d9d8d:ge!"g d;d8d:igdBdC Z&dDdE Z'dFdG Z(dHdI Z)dJdK Z*dLdM Z+dNdO Z,ej	dPdQdRdSgdTdU Z-ej	dVdWdXgdYdZ Z.d[S )\TestOperationsTrZ   c                 C  s   || _ || _d S r*   r[   r\   r&   r&   r'   r^   %  s    z&TestOperations.set_engine_parser_attrsc                 O  s4   | j |d< | j|d< |ddd |d< tj||S Nr%   r.   levelr   r?   r%   r.   poprG   rx   r]   r
  r  r&   r&   r'   rx   +  s    

zTestOperations.evalc              
     sP  g  | j 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krd}tjt|d tj|| j	| j d W 5 Q R X qBt
d|d| j	}| j|| j	| j d}	|	|kstt
|	|d| j	}| j|d|	i| j	| j d}
|
|kstt
d||	d | j	}| j|d|	i| j	| j d}
|
|ksBtqBd S )Nrm   r   r   c                   s   g | ]}| kr|qS r&   r&   r$   r   Zexclude_arithr&   r'   
<listcomp>6  s   z8TestOperations.test_simple_arith_ops.<locals>.<listcomp>c                 s  s   | ]}|d kr|V  qdS )z//Nr&   r]  r&   r&   r'   r(   <  s      z7TestOperations.test_simple_arith_ops.<locals>.<genexpr>z1 z 1zx z (x + 1)r   z&argument of type 'int' is not iterablerr   r[   r?   r   r   )r.   r   r   r  r   rv   r   rG   rx   r%   r>   r   )r]   Z	arith_opsopsr   r{   r   r   rz   expecr   yr&   r^  r'   test_simple_arith_ops1  sD    



       z$TestOperations.test_simple_arith_opsr;   Fr9   r   c              	   C  st   | d| d| }| j dkrR|dkrRd}tjt|d | | W 5 Q R X d S | |}t|}||ksptd S N rm   rn   rq   rr   r.   r   rv   rw   rx   r   r]   r;   r9   r   r{   rz   r   r   r&   r&   r'   test_simple_bool_opsX  s    
z#TestOperations.test_simple_bool_opsc              	   C  st   | d| d| }| j dkrR|dkrRd}tjt|d | | W 5 Q R X d S | |}t|}||ksptd S rd  rf  rg  r&   r&   r'   test_bool_ops_with_constantsh  s    
z+TestOperations.test_bool_ops_with_constantsc              	   C  sX   t jdddd}tt jd}d}tjt|d | jd||d	d
 W 5 Q R X d S )Nr   r>  rO      rR   z?N-dimensional objects, where N > 2, are not supported with evalrr   x + yr   rb  r   )r7   rU   rW   r   r   rv   rw   rx   )r]   r   rb  rz   r&   r&   r'   test_4d_ndarray_failsx  s
    z$TestOperations.test_4d_ndarray_failsc                 C  s   |  d}|dkstd S )N1r?   )rx   r   )r]   r   r&   r&   r'   test_constant  s    
zTestOperations.test_constantc                 C  s4   t tjdd}| jdd|id}t|| d S )NrR   rT   r   rm  r
   r7   rU   rW   rx   r   r   )r]   r   r5  r&   r&   r'   test_single_variable  s    z#TestOperations.test_single_variablec              	   C  sX  t dg}d}tt | j|dd}W 5 Q R X t|t dg tt | j|dd}W 5 Q R X t|t dg tt | jddd}W 5 Q R X d}||ksttt | jddd}W 5 Q R X d}||ksttt | jd	dd}W 5 Q R X d}||ksttt | jd	dd}W 5 Q R X d}||ksTtd S )
Nr?   zs / 1F)truedivr   Tz1 / 2rS   zs / 2)r7   r   r   r4  FutureWarningrx   r   r   )r]   r  r{   r   ra  r&   r&   r'   test_truediv  s0    zTestOperations.test_truedivc              	   C  s:   t tjdd}tjtdd | d W 5 Q R X d S )NrO   r   name 'x' is not definedrr   zdf[x > 2] > 2)r
   r7   rU   rW   r   rv   	NameErrorrx   )r]   r   r&   r&   r'   &test_failing_subscript_with_name_error  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 )NrO   r   z(df + 1)[df > 2]r   rm  r?   rT   rq  r]   r   rL   rM   r&   r&   r'   test_lhs_expression_subscript  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 )NrO   r   abcr   zdf.a < df.bzdf.a + df.b + df.czdf.a + df.b + df.c[df.b < 0]r   r   rm  )r
   r7   rU   rW   r/   r   r   r<   zipr   r   rx   )r]   r   expr1Zexpec1Zexpr2Zexpec2Zexpr3Zexpec3r   Zexpecsr=   ra  r&   r&   r'   test_attr_expression  s    

z#TestOperations.test_attr_expressionc              	   C  sf   t tjddtdd}t tjdd}d}d}tjt|d | j|||dd	 W 5 Q R X d S )
NrO   r   r{  r   zdf = df2%cannot assign without a target objectrr   )r   r5  rm  )	r
   r7   rU   rW   r/   r   rv   r4   rx   )r]   r   r5  r}  rz   r&   r&   r'   test_assignment_fails  s    z$TestOperations.test_assignment_failsc              	     s  t tjddtdd   tjtdd  	d W 5 Q R X d}tjt|d  	d	 W 5 Q R X d
}tjt|d  	d W 5 Q R X  }|d |d  |d<    j	ddd t
 |  }|d |d  |d<    j	ddd t
 | fdd}|   }d|d  |d< t
 |    fdd}|     j	ddd d}tjt|d  	d W 5 Q R X   | j	dd i dd  }|d |d  |d< t
 | d S )NrO   rT   abr   invalid syntaxrr   zd c = a + bz5left hand side of an assignment must be a single namezd,c = a + bzcannot assign to function callzTimestamp("20131001") = a + br   r   	a = a + bTinplacer<   	c = a + bc                    s      } d}| jddd | S )Nr?   z	a = 1 + bTr  )copyrx   )r   r   )orig_dfr&   r'   r    s    z0TestOperations.test_assignment_column.<locals>.fr?   c                    sJ   d}  j  } jddd | j }tj| j dd |jd ksFtd S )Nr?   r  Tr  FZcheck_names)r   r  rx   r   r   r   r   r   )r   Zold_arL   )r   r&   r'   r    s    

z#can only assign a single expressionz	c = a = bzc = df.a + df.br   )r   targetr  )r
   r7   rU   rW   r/   r  r   rv   r   rx   r   r   )r]   rz   rM   r  r&   )r   r  r'   test_assignment_column  sL    z%TestOperations.test_assignment_columnc                 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
   rx   r   r   r   ry  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 k	s4t| }|d |d	  |d
< t	|| d S )NrO   rT   r  r   r  Fr  r   r   r<   )
r
   r7   rU   rW   r/   rx   r   r  r   r   )r]   r   actualrM   r&   r&   r'   test_assignment_not_inplace  s    z*TestOperations.test_assignment_not_inplacec              	   C  s   t dddgdddgd}| }|d |d	  |d
< |d
 |d	  |d< |jddd}t|| |d kspt|d d |d< |d d |d< |jddd}t|| |d kstd}tjt|d |jddd W 5 Q R X d S )Nr?   rT   r   r>  rO   rj  r  r   r   r<   d$
        c = a + b
        d = c + bTr  r=   $
        a = a - 1
        e = a + 2z@Multi-line expressions are only valid if all expressions containrr   z(
            a = b + 2
            b - 2F)	r
   r  rx   r   r   r   r   rv   r4   )r]   r   rM   answerrz   r&   r&   r'   test_multi_line_expression$  s0    z)TestOperations.test_multi_line_expressionc                 C  s   t dddgdddg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?   rT   r   r>  rO   rj  r  r   r   r<   r  r  Fr  r=   r  )r
   r  rx   r   r   r]   r   rM   r&   r&   r'   &test_multi_line_expression_not_inplaceI  s     z5TestOperations.test_multi_line_expression_not_inplacec                 C  sp   t dddgdddgd}| }d}|d	 | |d
< |d
 | |d< |jddd}t|| |d ksltd S )Nr?   rT   r   r>  rO   rj  r  rF  r   r<   r  z?
        c = a * @local_var
        d = c + @local_var
        Tr  r
   r  rx   r   r   r   )r]   r   rM   Z	local_varr  r&   r&   r'   )test_multi_line_expression_local_variableb  s    z8TestOperations.test_multi_line_expression_local_variablec                 C  s   t dddgdddgd}dd	 }| }|d
 |dd |d< |d |dd |d< |jddd}t|| |d ks|td S )Nr?   rT   r   r>  rO   rj  r  c                 S  s   |S r*   r&   r  r&   r&   r'   
local_funcx  s    zUTestOperations.test_multi_line_expression_callable_local_variable.<locals>.local_funcr   rF  r<   r  zM
        c = a * @local_func(1, 7)
        d = c + @local_func(1, 7)
        Tr  r  r]   r   r  rM   r  r&   r&   r'   2test_multi_line_expression_callable_local_variablet  s    zATestOperations.test_multi_line_expression_callable_local_variablec                 C  s   t dddgdddgd}dd	 }| }|d
 |ddd |d< |d |ddd |d< |jddd}t|| |d kstd S )Nr?   rT   r   r>  rO   rj  r  c                 S  s   |S r*   r&   r  r&   r&   r'   r    s    zaTestOperations.test_multi_line_expression_callable_local_variable_with_kwargs.<locals>.local_funcr   rF  )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_kwargs  s    zMTestOperations.test_multi_line_expression_callable_local_variable_with_kwargsc              	   C  sZ   t dddgdddgd}| }d}tjt|d	 |d
 W 5 Q R X t|| d S )Nr?   rT   r   r>  rO   rj  r  r  rr   za = 1)r
   r  r   rv   r4   r   r   r   )r]   r   Zdf_origrz   r&   r&   r'   test_assignment_in_query  s    z'TestOperations.test_assignment_in_queryc                 C  sx   t dddgdddgd}| }||d dk }|jd	d
d t|| i }ddi}| jd|d
d t|| d S )Nr?   rT   r   r>  rO   rj  r  r   za == 2Tr  	a = 1 + 2r  r  )r
   r  r   r   r   rx   Zassert_dict_equalr  r&   r&   r'   test_query_inplace  s    z!TestOperations.test_query_inplaceinvalid_targetr?   catrT   )r?   r   zignore::FutureWarningc              	   C  sj   d}d}t jt|d | j||dd W 5 Q R X t|drft jt|d | j||dd W 5 Q R X d S )Nz)Cannot assign expression output to targetr  rr   Tr  r  F)r   rv   r4   rx   hasattrr]   r  rz   
expressionr&   r&   r'   test_cannot_item_assign  s    
z&TestOperations.test_cannot_item_assignc              	   C  s6   d}d}t jt|d | j||dd W 5 Q R X d S )Nz"Cannot return a copy of the targetr  rr   Fr  )r   rv   r4   rx   r  r&   r&   r'   test_cannot_copy_item  s    z$TestOperations.test_cannot_copy_itemr  c              	   C  sN   d}| j ||dddkstd}tjt|d | j ||dd W 5 Q R X d S )N1 + 2Fr  r   z0Cannot operate inplace if there is no assignmentrr   T)rx   r   r   rv   r4   )r]   r  r  rz   r&   r&   r'   test_inplace_no_assignment  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 )NrT   pr"  r  r(  r-  r7  r   rm  r   r  r  rx   r   )r]   r   r=   rr   r&   r&   r'   *test_basic_period_index_boolean_expression  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 )	NrT   r  r"  r  zdf[df < 2 + 3]r   rm  rO   r  r]   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 )NrT   r  r"  r  zdf[df[df < 2] < 2] + df * 2r   rm  r  r  r&   r&   r'   -test_nested_period_index_subscript_expression  s    z<TestOperations.test_nested_period_index_subscript_expressionc                 C  sZ   t tjdd}tddd|d< | jdd|i| j| jd}|jd	k }t	j
||d
d d S )NrO   r   z1/1/2012)Zperiodsdates1zdf.dates1 < 20130101r   r   Z20130101Fr  )r
   r7   rU   rW   r   rx   r%   r.   r  r   r   )r]   r   r   ra  r&   r&   r'   test_date_boolean  s    
z TestOperations.test_date_booleanc              	   C  sL  | j dkr,tjd| j| j d}|s(ttjd| j| j d}|sDttjd| j| j d}|r`ttjd| j| j d}|s|ttjd| j| j d}|sttjd| j| j d}|sttjd	| j| j d}|sttjd
| j| j d}|sttjd| j| j d}|r
ttjd| j| j d}|sHtnd}tjt|d tjd| j| j d W 5 Q R X tjt|d tjd| j| j d W 5 Q R X tjt|d tjd| j| j d W 5 Q R X tjt|d tjd| j| j d W 5 Q R X d}tjt|d tjd| j| j d W 5 Q R X tjt|d tjd| j| j d W 5 Q R X d S )Nrm   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 implementedrr   z[(3,)] in (1, 2, [(3,)])z!'NotIn' nodes are not implementedz[3] not in (1, 2, [[3]]))r.   rG   rx   r%   r   r   rv   rw   )r]   r   rz   r&   r&   r'   test_simple_in_ops  sf      
      z!TestOperations.test_simple_in_opsc                 C  s6   d}d d}d}tj|| j| jd}||ks2td S )Nr?   z * Z!aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar[   )r   rG   rx   r%   r.   r   )r]   r   r   rM   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}| jdkrbd}d|kr,d}tjt|d  tj	|d|i| j| j
d	 W 5 Q R X ntj	|d|i| j| j
d	 d S )
NrO   r   rm   rq   not'Not' nodes are not implementedrr   r   )r   r.   r%   r
   r7   rU   rW   r.   r   rv   rw   rG   rx   r%   )r]   r   r   rz   r&   r&   r'   test_fails_and_or_not2  s$    	
z$TestOperations.test_fails_and_or_notcharr   r   c              	   C  st   t tjdd}d| d}| jdkr\d}tjt|d tj	|| j| j
d W 5 Q R X ntj	|| j| j
d d S )	NrO   r   z(df + 2)[df > 1] > 0 z	 (df > 0)rm   z$cannot evaluate scalar only bool opsrr   r   r  )r]   r  r   r{   rz   r&   r&   r'   test_fails_ampersand_pipeQ  s    
 z(TestOperations.test_fails_ampersand_pipeN)/r   r   r   r   r  r^   rx   rc  r    r  r   r  rh  ri  rn  rp  rr  ru  rx  rz  r~  r  r  r  r   r  r  r  r  r  r  r  r  r7   r   rV  r  r  r  r  r  r  r  r  r  r  r  r&   r&   r&   r'   rW  $  sl   

'"E	
%	 

&
	
7
rW  c                   @  s   e Zd Zejdddd Zdd Zdd Zej	d	e
d
d Zdd Zdd Zdd Zdd Zejdd Zdd Zdd ZdS )TestMathTrZ   c                 C  s   || _ || _d S r*   r[   r\   r&   r&   r'   r^   _  s    z TestMath.set_engine_parser_attrsc                 O  s4   | j |d< | j|d< |ddd |d< tj||S rX  rZ  r\  r&   r&   r'   rx   e  s    

zTestMath.evalc              	   C  sl   t dtjdi}|j}|}| d}| |}tjdd tt||}W 5 Q R X tj	||dd d S )Nr   rR   z(a)ignoreallFr  )
r
   r7   rU   rW   r   rx   errstaterB  r   r   )r]   r1   r   r   fnr   gotr   r&   r&   r'   test_unary_functionsk  s    

zTestMath.test_unary_functionsr  c              	   C  sz   t tjdtjdd}|j}|j}| d}| |}tjdd tt|||}W 5 Q R X t	j
||dd d S )NrR   r  z(a, b)r  r  Fr  )r
   r7   rU   rW   r   r   rx   r  rB  r   r   )r]   r  r   r   r   r   r  r   r&   r&   r'   test_binary_functionsw  s    

zTestMath.test_binary_functionsc                 C  sd   t tjdtjdd}|jd| j| jdd |j}tt	|j
|j}tj||dd d S )NrR   r  ze = arctan2(sin(a), b)Tr%   r.   r  Fr  )r
   r7   rU   rW   rx   r%   r.   r=   Zarctan2sinr   r   r   r   r]   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| j| jdd |j}t|j	|j
 }tj||dd d S )NrR   r  ze = sin(a + b)Tr  Fr  )r
   r7   rU   rW   rx   r%   r.   r=   r  r   r   r   r   r  r&   r&   r'    test_df_arithmetic_subexpression  s
    z)TestMath.test_df_arithmetic_subexpressionc                 C  s   t dtjd|i}|jj|ks*t|jd| j	| j
dd |j}t|j}|j|jksbt||jkspttj||dd d S )Nr   rR   z
b = sin(a)Tr  Fr  )r
   r7   rU   rW   r   r   r   r   rx   r%   r.   r   r  r   r   )r]   r   Zexpect_dtyper   r  r   r&   r&   r'   check_result_type  s    zTestMath.check_result_typec                 C  sD   |  tjtj |  tjtj |  tjtj |  tjtj d S r*   )r  r7   Zint32r   Zint64r	  rb   r&   r&   r'   test_result_types  s    zTestMath.test_result_typesc                 C  s   |  tjtj d S r*   )r  r7   Z
complex128rb   r&   r&   r'   test_result_complex128  s    zTestMath.test_result_complex128c              	   C  sJ   t dtjdi}d}tjt|d |jd| j| j	d W 5 Q R X d S )Nr   rR   z#"mysin" is not a supported functionrr   zmysin(a)r[   )
r
   r7   rU   rW   r   rv   r4   rx   r%   r.   r   r&   r&   r'   test_undefined_func  s    zTestMath.test_undefined_funcc              	   C  sJ   t dtjdi}d}tjt|d |jd| j| j	d W 5 Q R X d S )Nr   rR   z1Function "sin" does not support keyword argumentsrr   zsin(x=a)r[   )
r
   r7   rU   rW   r   rv   r   rx   r%   r.   r   r&   r&   r'   test_keyword_arg  s    zTestMath.test_keyword_argN)r   r   r   r   r  r^   rx   r  r    r  r   r  r  r  r  r  r!   r  r  r  r  r&   r&   r&   r'   r  ^  s   




r  rR   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 * 2rT   r[   )r   r   _var_srG   rx   )r]   r%   r.   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@td S )Nr?   x + 1r   lcls)rJ  r  rG   rx   r[  r   )r]   r%   r.   r   r  Zlcls2r&   r&   r'   test_no_new_locals  s    


zTestScope.test_no_new_localsc                 C  s8   d}t   }tjd||d t   }||ks4td S )Nr?   r  r[   )globalsr  rG   rx   r   )r]   r%   r.   r   ZgblsZgbls2r&   r&   r'   test_no_new_globals  s
    

zTestScope.test_no_new_globalsc              	   C  s8   d}d}t jt|d tjd||i d W 5 Q R X d S )Nr?   rv  rr   r  r   r   rv   r   rG   rx   )r]   r%   r.   r   rz   r&   r&   r'   test_empty_locals  s    zTestScope.test_empty_localsc              	   C  s8   d}d}t jt|d tj|||i d W 5 Q R X d S )Nzname '_var_s' is not definedr  rr   )r%   r.   Zglobal_dictr  )r]   r%   r.   rz   r=   r&   r&   r'   test_empty_globals  s    zTestScope.test_empty_globalsN)r   r   r   r  r  r  r  r  r&   r&   r&   r'   r    s
   r  c               	   C  s8   d} t jt| d tjdddddd W 5 Q R X d S )	NzInvalid engine 'asdf' passedrr   rk  r?   rT   rl  asdf)r   r%   r   rv   KeyErrorrG   rx   rz   r&   r&   r'   test_invalid_engine  s    r  )use_numexprrM   ))Tr   )Frm   c              	   C  s<   ddl m} td|  |d }||ks.tW 5 Q R X d S )Nr   )_check_enginecompute.use_numexpr)Zpandas.core.computation.evalr  rG   option_contextr   )r  rM   r  rL   r&   r&   r'   test_numexpr_option_respected  s    
r  c               	   C  sv   t dd` tddddd d gdddddd	gd
} | d}td d gdd	gd
ddgd}t|| W 5 Q R X d S )Nr  FTr?   rT   r   r>  rO   rj  )r   Bz
A.isnull())r   )rG   r  r
   r   r   r   )r   rL   rM   r&   r&   r'   #test_numexpr_option_incompatible_op  s     
r  c               	   C  s8   d} t jt| d tjdddddd W 5 Q R X d S )	NzInvalid parser 'asdf' passedrr   rk  r?   rT   rl  r  )r   r.   r  r  r&   r&   r'   test_invalid_parser
  s    r  )rm   r   r   z dict[str, type[BaseExprVisitor]]_parsersc              
   C  sN   t | }|d| |}|jD ].}d}tjt|d t||  W 5 Q R X qd S )Nr  znodes are not implementedrr   )r  Zunsupported_nodesr   rv   rw   rB  )r%   r.   ZVisitorClassinstr`  rz   r&   r&   r'   test_disallowed_nodes  s    
r  c              	   C  s2   d}t jtdd tj|| |d W 5 Q R X d S )Nzs +r  rr   r[   r   rv   r   rG   rx   )r%   r.   r=   r&   r&   r'   test_syntax_error_exprs%  s    r  c              	   C  s6   d}d}t jt|d tj|| |d W 5 Q R X d S )Nzs + tzname 's' is not definedrr   r[   )r   rv   rw  rG   rx   )r%   r.   r=   rz   r&   r&   r'   test_name_error_exprs+  s    r  expressza + @bz@a + bz@a + @bc              	   C  sj   d\}}|dkr<t jtdd tj|| |d W 5 Q R X n*t jtdd tj|| |d W 5 Q R X d S )Nr?   rT   r   zThe '@' prefix is onlyrr   r[   zThe '@' prefix is notr  )r%   r.   r  r   r   r&   r&   r'   %test_invalid_local_variable_reference2  s    r  c              	   C  sd   d\}}| dkr@d}t jt|d tjd| |d W 5 Q R X n tjd| |d}||| ks`td S )Nr  r   zVariables in expression .+rr   zsin + dotted_liner[   )r   rv   r   rG   rx   r   )r%   r.   r  Zdotted_linerz   r   r&   r&   r'   test_numexpr_builtin_raises>  s    r  c              	   C  s4   d}t jtdd tjd|| |d W 5 Q R X d S )N)*   g      @zResolver of type .+rr   r  )Z	resolversr%   r.   )r   rv   r   rG   rx   )r%   r.   Zcannot_resolver&   r&   r'   test_bad_resolver_raisesI  s    r  c              	   C  s.   t jtdd tjd| |d W 5 Q R X d S )Nzexpr cannot be an empty stringrr    r[   r   rv   r4   rG   rx   r[   r&   r&   r'   test_empty_string_raisesO  s    r  c              	   C  s.   t jtdd tjd| |d W 5 Q R X d S )Nz#only a single expression is allowedrr   z1 + 1; 2 + 2r[   r  r[   r&   r&   r'   $test_more_than_one_expression_raisesU  s    r  cmprn   r;   c              
   C  s   t dd ttjji}||   }||   } ||  }d| d| d}d| d| d}d| d| d	}	|||	fD ]2}
d
}tjt|d tj	|
||d W 5 Q R X qrd S )Nc                   S  s   t jdS )NrR   )r7   rU   r   r&   r&   r&   r'   r   ^  r   z0test_bool_ops_fails_on_scalars.<locals>.<lambda>r   r   r   r   rt   r   ru   r   rr   r[   )
intrP   r7   rU   rW   r   rv   rw   rG   rx   )r9   r  r;   r%   r.   genr   r   r   r   r{   rz   r&   r&   r'   test_bool_ops_fails_on_scalarsZ  s    


r  otherz'x'z...c                 C  sN   t ddddgi}|d|  }tdddgdd}tr>d |_t|| d S )Nr   r   r   r<   r   F)r   )r
   rx   r   r   r   r   r   )r  r   rL   rM   r&   r&   r'   test_equals_variousm  s    r  c                 C  s*   d}t j}tj|| |d}||ks&td S )Nzinf + 1r[   )r7   infrG   rx   r   )r%   r.   r  rM   rL   r&   r&   r'   test_inf  s    r   c              	   C  s   d}t t}tjd| |dd W 5 Q R X t|dks<t|t|d jksRtt t}tjd| |dd W 5 Q R X t|dkst|t|d jkstd S )Nz0The `truediv` parameter in pd.eval is deprecatedz1+1T)r%   r.   rs  r?   r   F)	r   r4  rt  rG   rx   rP  r   r5   rQ  )r%   r.   rs   mr&   r&   r'   test_truediv_deprecated  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 )NrO   rT   r   r   `z` > 5r2   )r
   r7   rU   rW   r   r   r   )r%   r  r   rM   Zquery_stringrL   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rd}tjt|d |jd| |d	 W 5 Q R X n|jd| |d	}t|| d S )Nr   rR   r?   r.  r  countr   z
~(cat > 0)r[   rm   r  rr   znot (cat > 0))r
   r  r   r   r   r   rv   rw   )r%   r.   r   rM   rL   rz   r&   r&   r'   test_negate_lt_eq_le  s    r  c                   @  s0   e Zd Zejddddddgdgdd Zd	S )
TestValidatevaluer?   TruerT   r   g      @c              	   C  s0   d}t jt|d tjd|d W 5 Q R X d S )Nz8For argument "inplace" expected type bool, received typerr   z2+2r  r  )r]   r	  rz   r&   r&   r'   test_validate_bool_args  s    z$TestValidate.test_validate_bool_argsN)r   r   r   r   r    r  r  r&   r&   r&   r'   r    s   r  )p
__future__r   	functoolsr   	itertoolsr   r  r0  Znumpyr7   r   Zpandas.errorsr   Zpandas.util._test_decoratorsutilZ_test_decoratorsr!   Zpandas.core.dtypes.commonr   r   r   r	   r   rG   r
   r   r   Zpandas._testingZ_testingr   Zpandas.core.computationr   Zpandas.core.computation.enginesr   r   Zpandas.core.computation.exprrH   Zcomputationr   r   r   r   Z#pandas.core.computation.expressionsr   r   Zpandas.core.computation.opsr   r   r   r   r   r   r  r%   ZPARSERSr.   r0   r1   r3   r>   rD   rE   rI   rN   sortedset
differencer  r/   ranger9   r;   r   rY   r  r  r  r   r!  rW  r  rU   rW   r  r  r"   r  r    r  r  r  r  ZPyTablesExprVisitorr  __annotations__r  r  r  r  r  r  r  r  r  rP   r  r  r   r  r  r  r  r&   r&   r&   r'   <module>   s     





    h      >`%
	




	