U
    jg?                     @   sN  d dl 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 d dl	Z
d dlmZmZmZmZmZmZmZmZmZ d dl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  d d	l!m"Z" d d
l#m$Z$ d dl%m&Z&m'Z'm(Z( d dl%m)Z) G dd de*Z+G dd de*Z,dd Z-G dd de'e&Z.G dd de&e'Z/e0dkrJe1  dS )    N)OrderedDict)	booleandeferred_typefloat32float64int16int32njitoptionaltypeof)errorstypes)
Dispatcher)LoweringErrorTypingError)MemInfo)jitclass)_box)JitClassType)MemoryLeakMixinTestCaseskip_if_typeguard)skip_unless_scipyc                   @   s   e Zd ZdddddZdS )
TestClass1      ac                C   s   || _ || _|| _|| _d S N)xyzr   )selfr   r    r!   r    r#   ?/tmp/pip-unpacked-wheel-qtpwf23r/numba/tests/test_jitclasses.py__init__   s    zTestClass1.__init__N)r   __name__
__module____qualname__r%   r#   r#   r#   r$   r      s   r   c                   @   s   e Zd ZdddddZdS )
TestClass2r   r   r   c                G   s"   || _ || _|| _|| _|| _d S r   )r   r    r!   argsr   )r"   r   r    r!   r   r+   r#   r#   r$   r%   !   s
    zTestClass2.__init__N)r   r&   r#   r#   r#   r$   r*       s   r*   c                 C   s   t | }t|}|  |S r   )r   Zbox_get_meminfoptrr   acquire)Zboxptrmir#   r#   r$   _get_meminfo)   s    
r/   c                   @   sz  e Zd Zd\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d&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zed4d5 Zd6d7 Zd8d9 Zd:d; Z d<d= Z!d>d? Z"d@dA Z#dBdC Z$dDdE Z%dFdG Z&dHdI Z'dJdK Z(dLdM Z)dNdO Z*dPdQ Z+dRdS Z,dTdU Z-dVdW Z.dXdY Z/dZd[ Z0dS )]TestJitClassNc           
      C   s   |d kr$t |G dd dt}|}|jj}t|j }t|j }|d krht|t	rd|
 }n|}|d k	stt| t|t| tt|||D ]0\}}	| |d |	d  | |d |	d  qd S )Nc                   @   s   e Zd Zdd ZdS )z&TestJitClass._check_spec.<locals>.Testc                 S   s   d S r   r#   r"   r#   r#   r$   r%   7   s    z/TestJitClass._check_spec.<locals>.Test.__init__Nr&   r#   r#   r#   r$   Test4   s   r2   r   r   )r   object
class_typeinstance_typeliststructkeysvalues
isinstancer   itemsAssertionErrorassertEquallenzip)
r"   spectest_clsall_expectedr2   Zclstynamesr9   gotexpectedr#   r#   r$   _check_spec2   s     

zTestJitClass._check_specc                 C   s$   t  }t|d< t|d< | | d S Nr   r    )r   r   r   rF   r"   r@   r#   r#   r$   test_ordereddict_specL   s    z"TestJitClass.test_ordereddict_specc                 C   s   dt fdtfg}| | d S rG   )r   r   rF   rH   r#   r#   r$   test_list_specR   s    zTestJitClass.test_list_specc              	   C   sD   dt fg}t|G dd dt}| |||dttfg  d S )Nr   c                   @   s,   e Zd ZU eed< eje ed< dd ZdS )z1TestJitClass.test_type_annotations.<locals>.Test1r   r    c                 S   s   d S r   r#   r1   r#   r#   r$   r%   _   s    z:TestJitClass.test_type_annotations.<locals>.Test1.__init__N)	r'   r(   r)   int__annotations__ptListfloatr%   r#   r#   r#   r$   Test1Z   s   
rP   r    )r   r   r3   rF   r   ZListTyper   )r"   r@   rP   r#   r#   r$   test_type_annotationsW   s    
z"TestJitClass.test_type_annotationsc                 C   sH   G dd d}t G dd d|}| j|dtdfdtdfgd	 d S )
Nc                   @   s   e Zd ZU eed< dS )z:TestJitClass.test_type_annotation_inheritance.<locals>.Foor   N)r'   r(   r)   rK   rL   r#   r#   r#   r$   Foof   s   
rR   c                   @   s&   e Zd ZU eed< eddddZdS )z:TestJitClass.test_type_annotation_inheritance.<locals>.Barr    N)valuereturnc                 S   s   t || _|| _d S r   )rK   r   r    r"   rS   r#   r#   r$   r%   m   s    
zCTestJitClass.test_type_annotation_inheritance.<locals>.Bar.__init__r'   r(   r)   rO   rL   r%   r#   r#   r#   r$   Bari   s   
rW   r   r   r            )rA   rB   )r   rF   r   )r"   rR   rW   r#   r#   r$    test_type_annotation_inheritanced   s     z-TestJitClass.test_type_annotation_inheritancec              	   C   s   dt fdtd d  fg}dtfdtd d  fg}G dd dt}| t}t|| W 5 Q R X | dt|j	 | t}t|| W 5 Q R X | 
t|j	d d S )Nr   r    r   c                   @   s   e Zd Zdd ZdS )z+TestJitClass.test_spec_errors.<locals>.Testc                 S   s   d S r   r#   r1   r#   r#   r$   r%   {   s    z4TestJitClass.test_spec_errors.<locals>.Test.__init__Nr&   r#   r#   r#   r$   r2   y   s   r2   z*spec values should be Numba type instancesz"spec keys should be strings, got 1)rK   r   r   r3   assertRaises	TypeErrorr   assertInstr	exceptionr=   )r"   Zspec1Zspec2r2   raisesr#   r#   r$   test_spec_errorsu   s    zTestJitClass.test_spec_errorsc              	   C   sJ   t g G dd d}| tj}|  W 5 Q R X | dt|j d S )Nc                   @   s   e Zd Zdd ZdS )z+TestJitClass.test_init_errors.<locals>.Testc                 S   s   dS N   r#   r1   r#   r#   r$   r%      s    z4TestJitClass.test_init_errors.<locals>.Test.__init__Nr&   r#   r#   r#   r$   r2      s   r2   z"__init__() should return None, not)r   rZ   r   r   r\   r]   r^   )r"   r2   r_   r#   r#   r$   test_init_errors   s    zTestJitClass.test_init_errorsc                 C   sB   t  }t|d< t|d< td d  |d< t|G dd dt}|S )Nr   r    arrc                   @   s   e Zd Zdd Zdd ZdS )z9TestJitClass._make_Float2AndArray.<locals>.Float2AndArrayc                 S   s   || _ || _|| _d S r   r   r    rd   )r"   r   r    rd   r#   r#   r$   r%      s    zBTestJitClass._make_Float2AndArray.<locals>.Float2AndArray.__init__c                 S   s    |  j |7  _ |  j|7  _|S r   r   r    r"   valr#   r#   r$   add   s    z=TestJitClass._make_Float2AndArray.<locals>.Float2AndArray.addN)r'   r(   r)   r%   ri   r#   r#   r#   r$   Float2AndArray   s   rj   )r   r   r   r3   )r"   r@   rj   r#   r#   r$   _make_Float2AndArray   s    z!TestJitClass._make_Float2AndArrayc                 C   s2   t  }t|d< t|d< t|G dd dt}|S )Nr   r    c                   @   s   e Zd Zdd ZdS )z+TestJitClass._make_Vector2.<locals>.Vector2c                 S   s   || _ || _d S r   rf   )r"   r   r    r#   r#   r$   r%      s    z4TestJitClass._make_Vector2.<locals>.Vector2.__init__Nr&   r#   r#   r#   r$   Vector2   s   rl   )r   r   r   r3   )r"   r@   rl   r#   r#   r$   _make_Vector2   s    zTestJitClass._make_Vector2c                    sv   |    |  tdd t fdd}tjdtjd}||\}}}| |d | |d | || d S )	Nc                 S   s   | j | j S r   rf   objr#   r#   r$   bar   s    z*TestJitClass.test_jit_class_1.<locals>.barc                    s4    dd| }| d dd}|||jfS )Nr      {         )ri   rd   )r   ro   vecrj   rl   rp   r#   r$   foo   s    

z*TestJitClass.test_jit_class_1.<locals>.foo
   Zdtype   rb   )rk   rm   r	   npZonesr   r=   assertPreciseEqual)r"   rw   inpr   bcr#   rv   r$   test_jit_class_1   s    
zTestJitClass.test_jit_class_1c                 C   s  |   }tdd }tdd }tjdtjd}|dd|}t|}| |jd | |jt	
| | |jj|j ||}t|}| |jd	 | |jd	 | |jt	
| | |j|j ~~| |jd ||\}	}
}| |	d | |
d | || | |jd | |jd | |j| | |d
d
 | |jd | |jd d|_d|_tjdtjd |_}| |jd | |jd | |j| d S )Nc                 S   s   | S r   r#   rn   r#   r#   r$   identity   s    z>TestJitClass.test_jitclass_usage_from_python.<locals>.identityc                 S   s   | j | j| jfS r   re   rn   r#   r#   r$   retrieve_attributes   s    zITestJitClass.test_jitclass_usage_from_python.<locals>.retrieve_attributesrx   ry   r   rq   rt   rr   |   }   iM  i  r   )rk   r	   r{   aranger   r/   r=   refcountdatar   box_get_dataptrZ_numba_type_r4   assertIsr   r    rd   ri   )r"   rj   r   r   rd   ro   Zobj_meminfootherZother_meminfoZout_xZout_yZout_arrZnewarrr#   r#   r$   test_jitclass_usage_from_python   sJ    


z,TestJitClass.test_jitclass_usage_from_pythonc                 C   sJ   t  }t|d< t|G dd dt}| |dj | |dj d S )Nrh   c                   @   s   e Zd Zdd ZdS )z2TestJitClass.test_jitclass_datalayout.<locals>.Fooc                 S   s
   || _ d S r   rh   rg   r#   r#   r$   r%     s    z;TestJitClass.test_jitclass_datalayout.<locals>.Foo.__init__Nr&   r#   r#   r#   r$   rR     s   rR   TF)r   r   r   r3   
assertTruerh   assertFalse)r"   r@   rR   r#   r#   r$   test_jitclass_datalayout  s    z%TestJitClass.test_jitclass_datalayoutc           	         s  t  }t }t|d< t||d< tdd  t|G  fdddt}||jj	 |dd }| 
|jd | |j |d|}t|}t|}| 
|jd	 | 
|jj|j | 
|jd	 | 
|jd
 | }| 
||j | |j ||dd  | |j | 
|jjd | |jj ||dd  | |jj | 
|jjjd | 
|jd	 ~~| 
|jd
 d S )Nr   nextc                 S   s   | j S r   r   )noder#   r#   r$   get_data  s    z1TestJitClass.test_deferred_type.<locals>.get_datac                       s(   e Zd Zdd Z fddZdd ZdS )z3TestJitClass.test_deferred_type.<locals>.LinkedNodec                 S   s   || _ || _d S r   )r   r   )r"   r   r   r#   r#   r$   r%     s    z<TestJitClass.test_deferred_type.<locals>.LinkedNode.__init__c                    s
    | j S r   r   r1   r   r#   r$   get_next_data#  s    zATestJitClass.test_deferred_type.<locals>.LinkedNode.get_next_datac                 S   s    | }|j d k	r|j }q||_ d S r   r   )r"   r   curr#   r#   r$   append_to_tail'  s    
zBTestJitClass.test_deferred_type.<locals>.LinkedNode.append_to_tailN)r'   r(   r)   r%   r   r   r#   r   r#   r$   
LinkedNode  s   r   rr   A  rs   rq   7  i  )r   r   r   r
   r	   r   r3   Zdefiner4   r5   r=   r   ZassertIsNoner   r/   r   r   r   ZassertIsNotNone)	r"   Z	node_typer@   r   firstsecondZfirst_meminfoZsecond_meminfoZ	first_valr#   r   r$   test_deferred_type  s@    


zTestJitClass.test_deferred_typec                 C   s   t  }t|d< t|d< t|d< t|G dd dt}|ddd}G d	d
 d
tj}tt	
|}t|t|d }| |j|j | |j|j | |j|j d S )Nr   r~   r   c                   @   s   e Zd Zdd ZdS )z-TestJitClass.test_c_structure.<locals>.Structc                 S   s   || _ || _|| _d S r   )r   r~   r   )r"   r   r~   r   r#   r#   r$   r%   X  s    z6TestJitClass.test_c_structure.<locals>.Struct.__init__Nr&   r#   r#   r#   r$   StructU  s   r   iͫ     o!	@c                   @   s(   e Zd ZdejfdejfdejfgZdS )z.TestJitClass.test_c_structure.<locals>.CStructr   r~   r   N)r'   r(   r)   ctypesc_int32c_int16c_double_fields_r#   r#   r#   r$   CStruct_  s   r   r   )r   r   r   r   r   r3   r   	Structurec_void_pr   r   castPOINTERr=   r   r~   r   )r"   r@   r   str   r-   Zcstructr#   r#   r$   test_c_structureO  s    zTestJitClass.test_c_structurec              	   C   sT   |   }|dd}tdd }| t}||| W 5 Q R X | dt|j d S )Nr   rq   c                 S   s   | |kS r   r#   r   r~   r#   r#   r$   do_isp  s    z#TestJitClass.test_is.<locals>.do_iszno default `is` implementation)rm   r	   rZ   r   r\   r]   r^   )r"   ZVectorZvec_ar   r_   r#   r#   r$   test_isl  s    

zTestJitClass.test_isc                 C   s"   |   }|dd}| || d S Nr   rq   )rm   assertIsInstance)r"   rl   ru   r#   r#   r$   test_isinstancey  s    
zTestJitClass.test_isinstancec              	   C   sD   |   }| t}G dd d|}W 5 Q R X | t|jd d S )Nc                   @   s   e Zd ZdS )z+TestJitClass.test_subclassing.<locals>.SubVN)r'   r(   r)   r#   r#   r#   r$   SubV  s   r   zcannot subclass from a jitclass)rm   rZ   r[   r=   r]   r^   )r"   rl   r_   r   r#   r#   r$   test_subclassing~  s    zTestJitClass.test_subclassingc                 C   sJ   G dd dt }tdtfgG dd d|}|d}| | d d S )Nc                   @   s   e Zd Zdd ZdS )z*TestJitClass.test_base_class.<locals>.Basec                 S   s   | j S r   attrr1   r#   r#   r$   what  s    z/TestJitClass.test_base_class.<locals>.Base.whatN)r'   r(   r)   r   r#   r#   r#   r$   Base  s   r   r   c                   @   s   e Zd Zdd ZdS )z*TestJitClass.test_base_class.<locals>.Testc                 S   s
   || _ d S r   r   r"   r   r#   r#   r$   r%     s    z3TestJitClass.test_base_class.<locals>.Test.__init__Nr&   r#   r#   r#   r$   r2     s   r2   rr   )r3   r   r   r=   r   )r"   r   r2   ro   r#   r#   r$   test_base_class  s
    zTestJitClass.test_base_classc              	   C   sD   G dd dt }| t}t| W 5 Q R X | t|jd d S )Nc                   @   s   e Zd ZdZdd ZdS )z'TestJitClass.test_globals.<locals>.Minerr   c                 S   s   d S r   r#   r1   r#   r#   r$   r%     s    z0TestJitClass.test_globals.<locals>.Mine.__init__N)r'   r(   r)   Zconstantr%   r#   r#   r#   r$   Mine  s   r   z-class members are not yet supported: constantr3   rZ   r[   r   r=   r]   r^   )r"   r   r_   r#   r#   r$   test_globals  s    zTestJitClass.test_globalsc                 C   s   t dtfgG dd dt}|d}| |jd | |jd d|_| |jd | |jd tdd	 }||d
\}}}| |d | |d
 | |d d S )Nr   c                   @   s.   e Zd Zdd Zedd Zejdd ZdS )z1TestJitClass.test_user_getter_setter.<locals>.Fooc                 S   s
   || _ d S r   r   r   r#   r#   r$   r%     s    z:TestJitClass.test_user_getter_setter.<locals>.Foo.__init__c                 S   s
   | j d S Nr   r   r1   r#   r#   r$   rS     s    z7TestJitClass.test_user_getter_setter.<locals>.Foo.valuec                 S   s   |d | _ d S r   r   rg   r#   r#   r$   rS     s    N)r'   r(   r)   r%   propertyrS   setterr#   r#   r#   r$   rR     s
   
rR   rr   r   i  i  c                 S   s"   | j }|| _ | j }| j}|||fS r   )rS   r   )rw   rh   r   r~   r   r#   r#   r$   rp     s
    z1TestJitClass.test_user_getter_setter.<locals>.barr   i6  )r   r   r3   r=   r   rS   r	   )r"   rR   rw   rp   r   r~   r   r#   r#   r$   test_user_getter_setter  s    
z$TestJitClass.test_user_getter_setterc              	   C   sD   G dd dt }| t}t| W 5 Q R X | t|jd d S )Nc                   @   s.   e Zd Zdd Zedd Zejdd ZdS )z1TestJitClass.test_user_deleter_error.<locals>.Fooc                 S   s   d S r   r#   r1   r#   r#   r$   r%     s    z:TestJitClass.test_user_deleter_error.<locals>.Foo.__init__c                 S   s   dS r   r#   r1   r#   r#   r$   rS     s    z7TestJitClass.test_user_deleter_error.<locals>.Foo.valuec                 S   s   d S r   r#   r1   r#   r#   r$   rS     s    N)r'   r(   r)   r%   r   rS   deleterr#   r#   r#   r$   rR     s
   
rR   zdeleter is not supported: valuer   r"   rR   r_   r#   r#   r$   test_user_deleter_error  s    z$TestJitClass.test_user_deleter_errorc              	   C   s   G dd dt }| t}t|dtfg W 5 Q R X | t|jd | t}t|dtfg W 5 Q R X | t|jd d S )Nc                   @   s(   e Zd Zdd Zedd Zdd ZdS )z3TestJitClass.test_name_shadowing_error.<locals>.Fooc                 S   s   d S r   r#   r1   r#   r#   r$   r%     s    z<TestJitClass.test_name_shadowing_error.<locals>.Foo.__init__c                 S   s   d S r   r#   r1   r#   r#   r$   my_property  s    z?TestJitClass.test_name_shadowing_error.<locals>.Foo.my_propertyc                 S   s   d S r   r#   r1   r#   r#   r$   	my_method  s    z=TestJitClass.test_name_shadowing_error.<locals>.Foo.my_methodN)r'   r(   r)   r%   r   r   r   r#   r#   r#   r$   rR     s   
rR   r   zname shadowing: my_propertyr   zname shadowing: my_method)r3   rZ   	NameErrorr   r   r=   r]   r^   r   r#   r#   r$   test_name_shadowing_error  s    z&TestJitClass.test_name_shadowing_errorc                 C   s   t dtfgG dd dt}|}t dtfgG dd dt}|}|d}| |jd | | d |d}| |jd | | d	 d S )
Nr   c                   @   s   e Zd Zdd Zdd ZdS )/TestJitClass.test_distinct_classes.<locals>.Fooc                 S   s   |d | _ d S Nrq   r   r"   r   r#   r#   r$   r%     s    8TestJitClass.test_distinct_classes.<locals>.Foo.__init__c                 S   s
   | j d S r   r   r1   r#   r#   r$   run  s    3TestJitClass.test_distinct_classes.<locals>.Foo.runNr'   r(   r)   r%   r   r#   r#   r#   r$   rR     s   rR   c                   @   s   e Zd Zdd Zdd ZdS )r   c                 S   s   |d | _ d S r   r   r   r#   r#   r$   r%     s    r   c                 S   s
   | j d S r   r   r1   r#   r#   r$   r     s    r   Nr   r#   r#   r#   r$   rR     s   r   rb      rs   rq   )r   r   r3   r=   r   r   )r"   rR   ZFirstFooZ	SecondFoorw   r#   r#   r$   test_distinct_classes  s    z"TestJitClass.test_distinct_classesc                    s   G dd dt   fdd}|d}| |jd |d}| |jd |tdg}tj|jdg |tdg}tj|jdg d S )Nc                   @   s   e Zd Zdd ZdS )z0TestJitClass.test_parameterized.<locals>.MyClassc                 S   s
   || _ d S r   rS   rU   r#   r#   r$   r%     s    z9TestJitClass.test_parameterized.<locals>.MyClass.__init__Nr&   r#   r#   r#   r$   MyClass  s   r   c                    s   t  dt| fg}|| S )NrS   )r   r   )rS   clsr   r#   r$   create_my_class  s    z8TestJitClass.test_parameterized.<locals>.create_my_classrr   g(@)r3   r=   rS   r{   arraytestingZassert_equal)r"   r   r   r~   r   dr#   r   r$   test_parameterized  s    zTestJitClass.test_parameterizedc              	   C   s  t tt t d}t|G dd dt}d}||}| |j| | |j|d  | |j|d  | |j|j |j}| jd8  _| |j|d  | |	d|d  | |	|d d | |
d|jd  | |d|jd  | |j|d  | jd	8  _| |j|d
  tdd }| tj}|| W 5 Q R X | dt|j | t}|| W 5 Q R X | dt|j d S )N)rS   _valueZ__value	__value__c                   @   st   e Zd Zdd Zedd Zedd Zejdd Zedd	 Zejd
d	 Zdd Z	dd Z
dd Zdd ZdS )z2TestJitClass.test_protected_attrs.<locals>.MyClassc                 S   s(   || _ |d | _|d | _|d | _d S )Nrq   r   )rS   r   _MyClass__valuer   rU   r#   r#   r$   r%   0  s    

z;TestJitClass.test_protected_attrs.<locals>.MyClass.__init__c                 S   s   | j S r   r   r1   r#   r#   r$   private_value6  s    z@TestJitClass.test_protected_attrs.<locals>.MyClass.private_valuec                 S   s   | j S r   r   r1   r#   r#   r$   _inner_value:  s    z?TestJitClass.test_protected_attrs.<locals>.MyClass._inner_valuec                 S   s
   || _ d S r   r   r"   vr#   r#   r$   r   >  s    c                 S   s   | j S r   r   r1   r#   r#   r$   __private_valueB  s    zBTestJitClass.test_protected_attrs.<locals>.MyClass.__private_valuec                 S   s
   || _ d S r   r   r   r#   r#   r$   r   F  s    c                 S   s   | j }|| _ |S r   )_MyClass__private_value)r"   newoldr#   r#   r$   swap_private_valueJ  s    zETestJitClass.test_protected_attrs.<locals>.MyClass.swap_private_valuec                 S   s
   | j | S r   r   r"   Zfactorr#   r#   r$   _protected_methodO  s    zDTestJitClass.test_protected_attrs.<locals>.MyClass._protected_methodc                 S   s
   | j | S r   r   r   r#   r#   r$   Z__private_methodR  s    zCTestJitClass.test_protected_attrs.<locals>.MyClass.__private_methodc                 S   s
   |  |S r   )_MyClass__private_methodr   r#   r#   r$   check_private_methodU  s    zGTestJitClass.test_protected_attrs.<locals>.MyClass.check_private_methodN)r'   r(   r)   r%   r   r   r   r   r   r   r   r   r   r#   r#   r#   r$   r   -  s   




r   rr   rq   r   r   rs   d   e   c                 S   s   | j S r   )_TestJitClass__value)instr#   r#   r$   access_dundero  s    z8TestJitClass.test_protected_attrs.<locals>.access_dunderr   )r   r   r   r3   r=   rS   r   r   r   r   r   r   r   r	   rZ   r   r   r\   r]   r^   AttributeErrorpy_func)r"   r@   r   rS   r   Zfreeze_inst_valuer   r_   r#   r#   r$   test_protected_attrs%  s>    *
z!TestJitClass.test_protected_attrsc                 C   sJ   ddl m} dti}t||}|d}| |jd | |dd dS )zM
        Methods with annotations should compile fine (issue #1911).
        r   )AnnotatedClassr   r   rq   rb   N)Zannotation_usecasesr   r   r   r=   r   ri   )r"   r   r@   r   ro   r#   r#   r$   test_annotations}  s    
zTestJitClass.test_annotationsc                 C   sV   t G dd dt}| |jd | |jjd | |jjd | |jjd d S )Nc                   @   s,   e Zd ZdZdd Zdd Zedd ZdS )	z*TestJitClass.test_docstring.<locals>.AppleClass docstringc                 S   s   dS )init docstringNr#   r1   r#   r#   r$   r%     s    z3TestJitClass.test_docstring.<locals>.Apple.__init__c                 S   s   dS )foo method docstringNr#   r1   r#   r#   r$   rw     s    z.TestJitClass.test_docstring.<locals>.Apple.fooc                 S   s   dS )aval property docstringNr#   r1   r#   r#   r$   aval  s    z/TestJitClass.test_docstring.<locals>.Apple.avalN)r'   r(   r)   __doc__r%   rw   r   r   r#   r#   r#   r$   Apple  s
   r   r   r   r   r   )r   r3   r=   r   r%   rw   r   )r"   r   r#   r#   r$   test_docstring  s    zTestJitClass.test_docstringc                 C   st   dt fdtfg}t|G dd dt}d}d}d}||d}|f ddi|}| |j||  | |j| d S )	Nr   r~   c                   @   s   e Zd Zdd ZdS )z+TestJitClass.test_kwargs.<locals>.TestClassc                 S   s   || | _ || _d S r   r   r"   r   r    r!   r#   r#   r$   r%     s    
z4TestJitClass.test_kwargs.<locals>.TestClass.__init__Nr&   r#   r#   r#   r$   	TestClass  s   r  rq   g?)r    r!   r   )r   r   r   r3   r=   r   r~   )r"   r@   r  r   r    r!   kwargstcr#   r#   r$   test_kwargs  s    
zTestJitClass.test_kwargsc                 C   s   dt fdt fdt fg}t|G dd dt}|ddd}| |jd | |jd | |jd |dd}| |jd | |jd | |jd |dd	dd
}| |jd | |jd | |jd	 d S )Nr   r    r!   c                   @   s   e Zd ZdddZdS )z1TestJitClass.test_default_args.<locals>.TestClassr   c                 S   s   || _ || _|| _d S r   )r   r    r!   r  r#   r#   r$   r%     s    z:TestJitClass.test_default_args.<locals>.TestClass.__init__N)r   r&   r#   r#   r#   r$   r    s   r  r   rq   rs   r   )r    r!   r   )r   r   r3   r=   r   r    r!   r"   r@   r  r  r#   r#   r$   test_default_args  s$    
zTestJitClass.test_default_argsc                 C   s>  dt fdt fdt fdt fg}tt|}|dd}| |jd | |jd | |jd | |jd |d	dd
dd}| |jd | |jd	 | |jd | |jd
 |d	dd
d}| |jd | |jd	 | |jd | |jd
 |d	dd}| |jd | |jd	 | |jd | |jd d S )Nr   r    r!   r   rq   rs   r   r   rt   *   r   )r    r   r   r!   )r    r   r   )r    r   )r   r   r   r=   r   r    r!   r   r  r#   r#   r$   test_default_args_keyonly  s4    

z&TestJitClass.test_default_args_keyonlyc              	   C   sf   dt fdt fdt fdtt dfdt fg}| tj}tt| W 5 Q R X d}| |t	|j
 d S )Nr   r    r!   r+   rq   r   z(VAR_POSITIONAL argument type unsupported)r   r   ZUniTuplerZ   r   ZUnsupportedErrorr   r*   r\   r]   r^   )r"   r@   r_   msgr#   r#   r$   &test_default_args_starargs_and_keyonly  s    z3TestJitClass.test_default_args_starargs_and_keyonlyc                 C   sb   g }t |G dd dt}dd }tdD ]0}t||| |D ]\}}| || qFq,d S )Nc                   @   s   e Zd Zdd Zdd ZdS )z5TestJitClass.test_generator_method.<locals>.TestClassc                 S   s   d S r   r#   r1   r#   r#   r$   r%     s    z>TestJitClass.test_generator_method.<locals>.TestClass.__init__c                 s   s   t |D ]}t|V  qd S r   ranger{   r   )r"   niterir#   r#   r$   gen  s    z9TestJitClass.test_generator_method.<locals>.TestClass.genN)r'   r(   r)   r%   r  r#   r#   r#   r$   r    s   r  c                 s   s   t | D ]}t|V  qd S r   r  )r  r  r#   r#   r$   expected_gen  s    z8TestJitClass.test_generator_method.<locals>.expected_genrx   )r   r3   r  r?   r  r|   )r"   r@   r  r  r  expectrD   r#   r#   r$   test_generator_method  s    z"TestJitClass.test_generator_methodc                    s   dt d d  fg}t|G dd dt t fdd}tdd }| }| ||dd | ||d	d	 | ||d
d
 d S )Nr   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )z,TestJitClass.test_getitem.<locals>.TestClassc                 S   s   t jdt jd| _d S Nrx   ry   r{   zerosr   r   r1   r#   r#   r$   r%     s    z5TestJitClass.test_getitem.<locals>.TestClass.__init__c                 S   s   || j |< d S r   r   r"   keyr   r#   r#   r$   __setitem__  s    z8TestJitClass.test_getitem.<locals>.TestClass.__setitem__c                 S   s
   | j | S r   r   r"   r  r#   r#   r$   __getitem__  s    z8TestJitClass.test_getitem.<locals>.TestClass.__getitem__Nr'   r(   r)   r%   r  r  r#   r#   r#   r$   r    s   r  c                     s"     } d| d< d| d< d| d< | S )Nr   rq   rs   r#   tr  r#   r$   create_and_set_indices  s
    z9TestJitClass.test_getitem.<locals>.create_and_set_indicesc                 S   s   | | S r   r#   )r  nr#   r#   r$   	get_index$  s    z,TestJitClass.test_getitem.<locals>.get_indexr   rq   rs   r   r   r3   r	   r=   )r"   r@   r   r"  r  r#   r  r$   test_getitem  s    

zTestJitClass.test_getitemc                 C   sl   dt d d  fg}t|G dd dt}| }d|d< tdd }||}| |d | |d d	 d S )
Nr   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )z2TestJitClass.test_getitem_unbox.<locals>.TestClassc                 S   s   t jdt jd| _d S r  r  r1   r#   r#   r$   r%   2  s    z;TestJitClass.test_getitem_unbox.<locals>.TestClass.__init__c                 S   s   || j |< d S r   r   r  r#   r#   r$   r  5  s    z>TestJitClass.test_getitem_unbox.<locals>.TestClass.__setitem__c                 S   s
   | j | S r   r   r  r#   r#   r$   r  8  s    z>TestJitClass.test_getitem_unbox.<locals>.TestClass.__getitem__Nr  r#   r#   r#   r$   r  0  s   r  rx   r   c                 S   s   d| d< | d S )N   rq   r   r#   r  r#   r#   r$   set2return1>  s    z4TestJitClass.test_getitem_unbox.<locals>.set2return1rq   r%  r#  )r"   r@   r  r  r&  Zt_1r#   r#   r$   test_getitem_unbox-  s    

zTestJitClass.test_getitem_unboxc                 C   s   dt d d d d f fg}t|G dd dt}| }d|tdd< tdd }tdd	 }| ||ddd ||d
d
d | |td
d
 d d S )Nr   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )z8TestJitClass.test_getitem_complex_key.<locals>.TestClassc                 S   s   t jdt jd| _d S N)rx   rx   ry   r  r1   r#   r#   r$   r%   L  s    zATestJitClass.test_getitem_complex_key.<locals>.TestClass.__init__c                 S   s   || j t|jt|jf< d S r   r   rK   realimagr  r#   r#   r$   r  O  s    zDTestJitClass.test_getitem_complex_key.<locals>.TestClass.__setitem__c                 S   s   | j t|jt|jf S r   r)  r  r#   r#   r$   r  R  s    zDTestJitClass.test_getitem_complex_key.<locals>.TestClass.__getitem__Nr  r#   r#   r#   r$   r  J  s   r  rs   r   c                 S   s   | t || S r   complex)r  r*  r+  r#   r#   r$   get_keyY  s    z6TestJitClass.test_getitem_complex_key.<locals>.get_keyc                 S   s   || t ||< d S r   r,  )r  r*  r+  r   r#   r#   r$   set_key]  s    z6TestJitClass.test_getitem_complex_key.<locals>.set_keyrq   rt   )r   r   r3   r-  r	   r=   )r"   r@   r  r  r.  r/  r#   r#   r$   test_getitem_complex_keyG  s    


z%TestJitClass.test_getitem_complex_keyc                 C   s   dt d d d d f fg}t|G dd dt}| }d|d< tdd }tdd	 }| ||d ||d
 | |d d
 d S )Nr   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )z6TestJitClass.test_getitem_tuple_key.<locals>.TestClassc                 S   s   t jdt jd| _d S r(  r  r1   r#   r#   r$   r%   j  s    z?TestJitClass.test_getitem_tuple_key.<locals>.TestClass.__init__c                 S   s   || j |d |d f< d S Nr   r   r   r  r#   r#   r$   r  m  s    zBTestJitClass.test_getitem_tuple_key.<locals>.TestClass.__setitem__c                 S   s   | j |d |d f S r1  r   r  r#   r#   r$   r  p  s    zBTestJitClass.test_getitem_tuple_key.<locals>.TestClass.__getitem__Nr  r#   r#   r#   r$   r  h  s   r     r   r   c                 S   s   | d S )Nr3  r#   r  r#   r#   r$   get11v  s    z2TestJitClass.test_getitem_tuple_key.<locals>.get11c                 S   s   || d< d S )Nrq   rq   r#   r  r   r#   r#   r$   set22z  s    z2TestJitClass.test_getitem_tuple_key.<locals>.set22   r5  r#  )r"   r@   r  r  r4  r7  r#   r#   r$   test_getitem_tuple_keye  s    



z#TestJitClass.test_getitem_tuple_keyc                 C   s   dt d d  fg}t|G dd dt}| }d|ddd< | |ddd d | |ddd d tdd }| ||d td	d
 }||d | |ddd d | |ddd d d S )Nr   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )z6TestJitClass.test_getitem_slice_key.<locals>.TestClassc                 S   s   t jdt jd| _d S r  r  r1   r#   r#   r$   r%     s    z?TestJitClass.test_getitem_slice_key.<locals>.TestClass.__init__c                 S   s"   || j |j< ||j | j |j< d S r   )r   startstepstop)r"   slcr   r#   r#   r$   r    s    zBTestJitClass.test_getitem_slice_key.<locals>.TestClass.__setitem__c                 S   s   | j |j S r   )r   r:  )r"   r=  r#   r#   r$   r    s    zBTestJitClass.test_getitem_slice_key.<locals>.TestClass.__getitem__Nr  r#   r#   r#   r$   r    s   r  r   r   rq   c                 S   s   | ddd S )Nr      r   r#   r  r#   r#   r$   get5  s    z1TestJitClass.test_getitem_slice_key.<locals>.get5c                 S   s   || ddd< d S )Nrq   r>  r   r#   r6  r#   r#   r$   set26  s    z2TestJitClass.test_getitem_slice_key.<locals>.set26r>  rs   )r   r   r3   r=   r	   )r"   r@   r  r  r?  r@  r#   r#   r$   test_getitem_slice_key  s    


z#TestJitClass.test_getitem_slice_keyc                 C   sZ   dd t dD }dd |D }|dd |D  t|G dd dt}|   d S )Nc                 S   s   g | ]}t td | qS r   )chrord).0r   r#   r#   r$   
<listcomp>  s     zFTestJitClass.test_jitclass_longlabel_not_truncated.<locals>.<listcomp>   c                 S   s   g | ]}|d  t fqS rx   )r   rD  letterr#   r#   r$   rE    s     c                 S   s   g | ]}|  d  tfqS rG  )upperr   rH  r#   r#   r$   rE    s     c                   @   s$   e Zd Zdd Zdd Zdd ZdS )zJTestJitClass.test_jitclass_longlabel_not_truncated.<locals>.TruncatedLabelc                 S   s
   d| _ d S )Ng      $@)
aaaaaaaaaar1   r#   r#   r$   r%     s    zSTestJitClass.test_jitclass_longlabel_not_truncated.<locals>.TruncatedLabel.__init__c                 S   s   t | j| j| _d S r   )randomgaussrK  Z
bbbbbbbbbbr1   r#   r#   r$   meth1  s    zPTestJitClass.test_jitclass_longlabel_not_truncated.<locals>.TruncatedLabel.meth1c                 S   s   |    d S r   )rN  r1   r#   r#   r$   meth2  s    zPTestJitClass.test_jitclass_longlabel_not_truncated.<locals>.TruncatedLabel.meth2N)r'   r(   r)   r%   rN  rO  r#   r#   r#   r$   TruncatedLabel  s   rP  )r  extendr   r3   rO  )r"   alphabetr@   rP  r#   r#   r$   %test_jitclass_longlabel_not_truncated  s    z2TestJitClass.test_jitclass_longlabel_not_truncatedc                 C   sP   t G dd dt}| }t|}| |tj t|}| t	|| d S )Nc                   @   s   e Zd Zdd ZdS )z5TestJitClass.test_pickling.<locals>.PickleTestSubjectc                 S   s   d S r   r#   r1   r#   r#   r$   r%     s    z>TestJitClass.test_pickling.<locals>.PickleTestSubject.__init__Nr&   r#   r#   r#   r$   PickleTestSubject  s   rT  )
r   r3   r   r   r   ZClassInstanceTypepickledumpsr   loads)r"   rT  r   tyZpickledr#   r#   r$   test_pickling  s    
zTestJitClass.test_picklingc              	      s  t dtfgG dd d}t dtfgG dd d}| |jt | |jt | |jt | |j|j | d|dd | d	|dd | d
|dd |d}|d}| d|d | d	|d | d|dd | d|dd | d|dd | d|dd | d|dd | d|dd | 	t
}|dd W 5 Q R X | dt|j | 	t}|d W 5 Q R X | dt|j t g G  fddd   }| 	tj}|  W 5 Q R X | dt|j d S )Nr   c                   @   s4   e Zd Zdd Zdd Zedd Zedd Zd	S )
z/TestJitClass.test_static_methods.<locals>.Test1c                 S   s
   || _ d S r   r   r   r#   r#   r$   r%     s    z8TestJitClass.test_static_methods.<locals>.Test1.__init__c                 S   s   |  | j|| _| jS r   ri   r   r"   r    r#   r#   r$   increase  s    z8TestJitClass.test_static_methods.<locals>.Test1.increasec                 S   s   | | S r   r#   r   r#   r#   r$   ri     s    z3TestJitClass.test_static_methods.<locals>.Test1.addc                 S   s   | | S r   r#   r   r#   r#   r$   sub  s    z3TestJitClass.test_static_methods.<locals>.Test1.subN)r'   r(   r)   r%   r\  staticmethodri   r]  r#   r#   r#   r$   rP     s   
rP   c                   @   s(   e Zd Zdd Zdd Zedd ZdS )z/TestJitClass.test_static_methods.<locals>.Test2c                 S   s
   || _ d S r   r   r   r#   r#   r$   r%     s    z8TestJitClass.test_static_methods.<locals>.Test2.__init__c                 S   s   |  | j|| _| jS r   rZ  r[  r#   r#   r$   r\    s    z8TestJitClass.test_static_methods.<locals>.Test2.increasec                 S   s   | | S r   r#   r   r#   r#   r$   ri     s    z3TestJitClass.test_static_methods.<locals>.Test2.addN)r'   r(   r)   r%   r\  r^  ri   r#   r#   r#   r$   Test2  s   r_  rs   r   rq   rt   r>  r   y               @y              ?Zfoobarrw   rp   zhas no attribute 'sub'z'not enough arguments: expected 2, got 1c                       s,   e Zd Zdd Zedd Z fddZdS )z/TestJitClass.test_static_methods.<locals>.Test3c                 S   s   d S r   r#   r1   r#   r#   r$   r%     s    z8TestJitClass.test_static_methods.<locals>.Test3.__init__c                 S   s   d S r   r#   r   r#   r#   r$   a_static_method  s    z?TestJitClass.test_static_methods.<locals>.Test3.a_static_methodc                    s     ddS r   )ra  r1   Test3r#   r$   call_static  s    z;TestJitClass.test_static_methods.<locals>.Test3.call_staticN)r'   r(   r)   r%   r^  ra  rd  r#   rb  r#   r$   rc  
  s   
rc  z#Unknown attribute 'a_static_method')r   r   r   ri   r   r]  ZassertNotEqualr=   r\  rZ   r   r\   r]   r^   r[   r   r   rd  )r"   rP   r_  t1t2r_   invalidr#   rb  r$   test_static_methods  sN    z TestJitClass.test_static_methodsc                 C   s   t td}t G dd d}| |t | |jj| t|dG dd d}| |t | |jj| tG dd d}| |t | |jj| t|G d	d
 d
}| |t | |jj| d S )Nr   c                   @   s   e Zd ZU eed< dd ZdS )z<TestJitClass.test_jitclass_decorator_usecases.<locals>.Test1r   c                 S   s
   d| _ d S Nr   r   r1   r#   r#   r$   r%   $  s    zETestJitClass.test_jitclass_decorator_usecases.<locals>.Test1.__init__NrV   r#   r#   r#   r$   rP      s   
rP   r@   c                   @   s   e Zd Zdd ZdS )z<TestJitClass.test_jitclass_decorator_usecases.<locals>.Test2c                 S   s
   d| _ d S ri  r   r1   r#   r#   r$   r%   -  s    zETestJitClass.test_jitclass_decorator_usecases.<locals>.Test2.__init__Nr&   r#   r#   r#   r$   r_  *  s   r_  c                   @   s   e Zd ZU eed< dd ZdS )z<TestJitClass.test_jitclass_decorator_usecases.<locals>.Test3r   c                 S   s
   d| _ d S ri  r   r1   r#   r#   r$   r%   7  s    zETestJitClass.test_jitclass_decorator_usecases.<locals>.Test3.__init__NrV   r#   r#   r#   r$   rc  3  s   
rc  c                   @   s   e Zd Zdd ZdS )z<TestJitClass.test_jitclass_decorator_usecases.<locals>.Test4c                 S   s
   d| _ d S ri  r   r1   r#   r#   r$   r%   @  s    zETestJitClass.test_jitclass_decorator_usecases.<locals>.Test4.__init__Nr&   r#   r#   r#   r$   Test4=  s   rk  r   r   r   r   r   ZassertDictEqualr4   r7   )r"   r@   rP   r_  rc  rk  r#   r#   r$    test_jitclass_decorator_usecases  s"    
z-TestJitClass.test_jitclass_decorator_usecasesc                 C   st   t td}G dd d}t|}| |t | |jj| G dd d}t||}| |t | |jj| d S )Nr   c                   @   s   e Zd ZU eed< dd ZdS )zCTestJitClass.test_jitclass_function_usecases.<locals>.AnnotatedTestr   c                 S   s
   d| _ d S ri  r   r1   r#   r#   r$   r%   L  s    zLTestJitClass.test_jitclass_function_usecases.<locals>.AnnotatedTest.__init__NrV   r#   r#   r#   r$   AnnotatedTestI  s   
rn  c                   @   s   e Zd Zdd ZdS )zETestJitClass.test_jitclass_function_usecases.<locals>.UnannotatedTestc                 S   s
   d| _ d S ri  r   r1   r#   r#   r$   r%   U  s    zNTestJitClass.test_jitclass_function_usecases.<locals>.UnannotatedTest.__init__Nr&   r#   r#   r#   r$   UnannotatedTestS  s   ro  rl  )r"   r@   rn  ZJitTest1ro  ZJitTest2r#   r#   r$   test_jitclass_function_usecasesF  s    

z,TestJitClass.test_jitclass_function_usecasesc                    s   t td}t|G dd dtt|G dd dt  fdd}|}t|}| t | |d|d | | d	| d	 | |d
|d
 d S )Nr   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )z2TestJitClass.test_jitclass_isinstance.<locals>.Fooc                 S   s
   || _ d S r   r   rU   r#   r#   r$   r%   a  s    z;TestJitClass.test_jitclass_isinstance.<locals>.Foo.__init__c                 S   s   | j S r   r   r1   r#   r#   r$   getValued  s    z;TestJitClass.test_jitclass_isinstance.<locals>.Foo.getValuec                 S   s
   | j d S r   r   r1   r#   r#   r$   getValueIncrg  s    z?TestJitClass.test_jitclass_isinstance.<locals>.Foo.getValueIncrN)r'   r(   r)   r%   rq  rr  r#   r#   r#   r$   rR   _  s   rR   c                   @   s   e Zd Zdd Zdd ZdS )z2TestJitClass.test_jitclass_isinstance.<locals>.Barc                 S   s
   || _ d S r   r   rU   r#   r#   r$   r%   l  s    z;TestJitClass.test_jitclass_isinstance.<locals>.Bar.__init__c                 S   s   | j S r   r   r1   r#   r#   r$   rq  o  s    z;TestJitClass.test_jitclass_isinstance.<locals>.Bar.getValueN)r'   r(   r)   r%   rq  r#   r#   r#   r$   rW   j  s   rW   c                    sJ   t |  frB|  }t | r0|  | dfS |  | dfS ndS d S )NrR   rW   zno match)r:   rq  rr  )ro   r   rW   rR   r#   r$   test_jitclass_isinstancer  s    
zGTestJitClass.test_jitclass_isinstance.<locals>.test_jitclass_isinstancers   rr   r   )r   r   r   r3   r	   r   r   r=   )r"   r@   rt  ZpyfuncZcfuncr#   rs  r$   rt  \  s    

z%TestJitClass.test_jitclass_isinstancec              	   C   sF   |  t }tG dd dt}|  W 5 Q R X | dt|j d S )Nc                   @   s   e Zd Zdd Zdd ZdS )z:TestJitClass.test_jitclass_unsupported_dunder.<locals>.Fooc                 S   s   d S r   r#   r1   r#   r#   r$   r%     s    zCTestJitClass.test_jitclass_unsupported_dunder.<locals>.Foo.__init__c                 S   s   d S r   r#   r1   r#   r#   r$   	__enter__  s    zDTestJitClass.test_jitclass_unsupported_dunder.<locals>.Foo.__enter__N)r'   r(   r)   r%   ru  r#   r#   r#   r$   rR     s   rR   z$Method '__enter__' is not supported.)rZ   r[   r   r3   r\   r]   r^   )r"   erR   r#   r#   r$    test_jitclass_unsupported_dunder  s
    z-TestJitClass.test_jitclass_unsupported_dunderc                 C   s.   t G dd dt}t}|j}| || d S )Nc                   @   s   e Zd Zdd ZdS )z1TestJitClass.test_modulename.<locals>.TestModnamec                 S   s
   d| _ d S )N   r   r1   r#   r#   r$   r%     s    z:TestJitClass.test_modulename.<locals>.TestModname.__init__Nr&   r#   r#   r#   r$   TestModname  s   ry  )r   r3   r'   r(   r=   )r"   ry  Z
thisModuleZclassModuler#   r#   r$   test_modulename  s
    zTestJitClass.test_modulename)NNN)1r'   r(   r)   rF   rI   rJ   rQ   rY   r`   rc   rk   rm   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r	  r  r  r$  r'  r0  r9  rA  rS  rY  rh  rm  rp  rt  rw  rz  r#   r#   r#   r$   r0   0   s\   
6>&X
 %S))r0   c                   @   s   e Zd ZG dd dZedd Zedd Zd"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dd Zdd Zd d! ZdS )#TestJitClassOverloadsc                   @   sd   e Z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S )zTestJitClassOverloads.PyListc                 C   s   dg| _ d S ri  r   r1   r#   r#   r$   r%     s    z%TestJitClassOverloads.PyList.__init__c                 C   s   | j | d S r   r   appendr[  r#   r#   r$   r}    s    z#TestJitClassOverloads.PyList.appendc                 C   s   | j   d S r   )r   clearr1   r#   r#   r$   r~    s    z"TestJitClassOverloads.PyList.clearc                 C   s   t | jd S ra   r>   r   r1   r#   r#   r$   __abs__  s    z$TestJitClassOverloads.PyList.__abs__c                 C   s   t | jd dkS )Nrs   r   r  r1   r#   r#   r$   __bool__  s    z%TestJitClassOverloads.PyList.__bool__c                 C   s    t d}| jr|| jd 7 }|S )Nrq   r   )r-  r   )r"   r   r#   r#   r$   __complex__  s    z(TestJitClassOverloads.PyList.__complex__c                 C   s
   || j kS r   r   r[  r#   r#   r$   __contains__  s    z)TestJitClassOverloads.PyList.__contains__c                 C   s   d}| j r|| j d 7 }|S )Nr   r   r   )r"   fr#   r#   r$   	__float__  s    z&TestJitClassOverloads.PyList.__float__c                 C   s   d}| j r|| j d 7 }|S )Nr   r   r   )r"   r  r#   r#   r$   __int__  s    z$TestJitClassOverloads.PyList.__int__c                 C   s   t | jd S r   r  r1   r#   r#   r$   __len__  s    z$TestJitClassOverloads.PyList.__len__c                 C   s   t | jdkrdS dS d S )Nr   zPyList emptyzPyList non-emptyr  r1   r#   r#   r$   __str__  s    z$TestJitClassOverloads.PyList.__str__N)r'   r(   r)   r%   r}  r~  r  r  r  r  r  r  r  r  r#   r#   r#   r$   PyList  s   r  c                      s&   t dtjfgG  fddd  S )Nr   c                       s`   e Zd Zdd Zdd Zdd Z fddZ fd	d
Z fddZ fddZ	 fddZ
dS )z9TestJitClassOverloads.get_int_wrapper.<locals>.IntWrapperc                 S   s
   || _ d S r   r   rU   r#   r#   r$   r%     s    zBTestJitClassOverloads.get_int_wrapper.<locals>.IntWrapper.__init__c                 S   s   | j |j kS r   r   r"   r   r#   r#   r$   __eq__  s    z@TestJitClassOverloads.get_int_wrapper.<locals>.IntWrapper.__eq__c                 S   s   | j S r   r   r1   r#   r#   r$   __hash__  s    zBTestJitClassOverloads.get_int_wrapper.<locals>.IntWrapper.__hash__c                    s    | j |j > S r   r   r  
IntWrapperr#   r$   
__lshift__  s    zDTestJitClassOverloads.get_int_wrapper.<locals>.IntWrapper.__lshift__c                    s    | j |j ? S r   r   r  r  r#   r$   
__rshift__  s    zDTestJitClassOverloads.get_int_wrapper.<locals>.IntWrapper.__rshift__c                    s    | j |j @ S r   r   r  r  r#   r$   __and__  s    zATestJitClassOverloads.get_int_wrapper.<locals>.IntWrapper.__and__c                    s    | j |j B S r   r   r  r  r#   r$   __or__  s    z@TestJitClassOverloads.get_int_wrapper.<locals>.IntWrapper.__or__c                    s    | j |j A S r   r   r  r  r#   r$   __xor__  s    zATestJitClassOverloads.get_int_wrapper.<locals>.IntWrapper.__xor__N)r'   r(   r)   r%   r  r  r  r  r  r  r  r#   r  r#   r$   r    s   r  )r   r   intpr#   r#   r  r$   get_int_wrapper  s    z%TestJitClassOverloads.get_int_wrapperc                      s&   t dtjfgG  fddd  S )Nr   c                       s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	 fddZ
 fddZ fddZ fddZ fddZ fddZ fddZ fddZ fdd Zd!S )"z=TestJitClassOverloads.get_float_wrapper.<locals>.FloatWrapperc                 S   s
   || _ d S r   r   rU   r#   r#   r$   r%     s    zFTestJitClassOverloads.get_float_wrapper.<locals>.FloatWrapper.__init__c                 S   s   | j |j kS r   r   r  r#   r#   r$   r    s    zDTestJitClassOverloads.get_float_wrapper.<locals>.FloatWrapper.__eq__c                 S   s   | j S r   r   r1   r#   r#   r$   r    s    zFTestJitClassOverloads.get_float_wrapper.<locals>.FloatWrapper.__hash__c                 S   s   | j |j kS r   r   r  r#   r#   r$   __ge__  s    zDTestJitClassOverloads.get_float_wrapper.<locals>.FloatWrapper.__ge__c                 S   s   | j |j kS r   r   r  r#   r#   r$   __gt__  s    zDTestJitClassOverloads.get_float_wrapper.<locals>.FloatWrapper.__gt__c                 S   s   | j |j kS r   r   r  r#   r#   r$   __le__  s    zDTestJitClassOverloads.get_float_wrapper.<locals>.FloatWrapper.__le__c                 S   s   | j |j k S r   r   r  r#   r#   r$   __lt__  s    zDTestJitClassOverloads.get_float_wrapper.<locals>.FloatWrapper.__lt__c                    s    | j |j  S r   r   r  FloatWrapperr#   r$   __add__  s    zETestJitClassOverloads.get_float_wrapper.<locals>.FloatWrapper.__add__c                    s    | j |j  S r   r   r  r  r#   r$   __floordiv__  s    zJTestJitClassOverloads.get_float_wrapper.<locals>.FloatWrapper.__floordiv__c                    s    | j |j  S r   r   r  r  r#   r$   __mod__
  s    zETestJitClassOverloads.get_float_wrapper.<locals>.FloatWrapper.__mod__c                    s    | j |j  S r   r   r  r  r#   r$   __mul__  s    zETestJitClassOverloads.get_float_wrapper.<locals>.FloatWrapper.__mul__c                    s    | j  S r   r   r  r  r#   r$   __neg__  s    zETestJitClassOverloads.get_float_wrapper.<locals>.FloatWrapper.__neg__c                    s    | j 
 S r   r   r  r  r#   r$   __pos__  s    zETestJitClassOverloads.get_float_wrapper.<locals>.FloatWrapper.__pos__c                    s    | j |j  S r   r   r  r  r#   r$   __pow__  s    zETestJitClassOverloads.get_float_wrapper.<locals>.FloatWrapper.__pow__c                    s    | j |j  S r   r   r  r  r#   r$   __sub__  s    zETestJitClassOverloads.get_float_wrapper.<locals>.FloatWrapper.__sub__c                    s    | j |j  S r   r   r  r  r#   r$   __truediv__  s    zITestJitClassOverloads.get_float_wrapper.<locals>.FloatWrapper.__truediv__N)r'   r(   r)   r%   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r#   r  r#   r$   r    s    r  )r   r   r   r#   r#   r  r$   get_float_wrapper  s    2z'TestJitClassOverloads.get_float_wrapperNc                 C   s,   | j t|t||d | j |||d d S )N)r
  )r=   type)r"   r   r   r
  r#   r#   r$   
assertSame!  s    z TestJitClassOverloads.assertSamec                 C   s  t dttji| j}dd dd dd dd dd dd d	d d
d dd dd dd dd dd dd dd dd dd g}dd |D }|  }| }t||D ]0\}}| |||| | |||| q|d |d t||D ]0\}}| |||| | |||| q|d |d t||D ]2\}}| |||| | |||| qJ|  |  t||D ]2\}}| |||| | |||| qd S )Nr   c                 S   s   t | S r   )absr   r#   r#   r$   <lambda>+      z6TestJitClassOverloads.test_overloads.<locals>.<lambda>c                 S   s   |   S r   )r  r   r#   r#   r$   r  ,  r  c                 S   s   t | S r   boolr   r#   r#   r$   r  -  r  c                 S   s   |   S r   )r  r   r#   r#   r$   r  .  r  c                 S   s   t | S r   r,  r   r#   r#   r$   r  /  r  c                 S   s   |   S r   )r  r   r#   r#   r$   r  0  r  c                 S   s   d| kS ri  r#   r   r#   r#   r$   r  1  r  c                 S   s
   |  dS ri  )r  r   r#   r#   r$   r  2  r  c                 S   s   t | S r   rO   r   r#   r#   r$   r  3  r  c                 S   s   |   S r   )r  r   r#   r#   r$   r  4  r  c                 S   s   t | S r   rK   r   r#   r#   r$   r  5  r  c                 S   s   |   S r   )r  r   r#   r#   r$   r  6  r  c                 S   s   t | S r   )r>   r   r#   r#   r$   r  7  r  c                 S   s   |   S r   )r  r   r#   r#   r$   r  8  r  c                 S   s   t | S r   )r]   r   r#   r#   r$   r  9  r  c                 S   s   |   S r   )r  r   r#   r#   r$   r  :  r  c                 S   s   | rdS dS )Nr   r   r#   r   r#   r#   r$   r  ;  r  c                 S   s   g | ]}t |qS r#   )r	   )rD  r  r#   r#   r$   rE  =  s     z8TestJitClassOverloads.test_overloads.<locals>.<listcomp>rq   )	r   r   rN   r  r  r?   r  r}  r~  )r"   ZJitListZpy_funcsZ	jit_funcsZpy_listZjit_listpy_fjit_fr#   r#   r$   test_overloads%  sP    



z$TestJitClassOverloads.test_overloadsc                 C   s   dd }t |}tdttjfgG dd d}|dddg}| || | || |d	 | || | || |  | || | || td
tj	fgG dd d}|d}| || | || d S )Nc                 S   s   t | S r   r  r   r#   r#   r$   py_bY  s    z6TestJitClassOverloads.test_bool_fallback.<locals>.py_br   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
z:TestJitClassOverloads.test_bool_fallback.<locals>.LenClassc                 S   s
   || _ d S r   r   r   r#   r#   r$   r%   `  s    zCTestJitClassOverloads.test_bool_fallback.<locals>.LenClass.__init__c                 S   s   t | jd S )Nrt   r  r1   r#   r#   r$   r  c  s    zBTestJitClassOverloads.test_bool_fallback.<locals>.LenClass.__len__c                 S   s   | j | d S r   r|  r[  r#   r#   r$   r}  f  s    zATestJitClassOverloads.test_bool_fallback.<locals>.LenClass.appendc                 S   s   | j d d S ri  )r   popr1   r#   r#   r$   r  i  s    z>TestJitClassOverloads.test_bool_fallback.<locals>.LenClass.popN)r'   r(   r)   r%   r  r}  r  r#   r#   r#   r$   LenClass^  s   r  r   rq   rs   rt   r    c                   @   s   e Zd Zdd ZdS )z=TestJitClassOverloads.test_bool_fallback.<locals>.NormalClassc                 S   s
   || _ d S r   )r    r[  r#   r#   r$   r%   z  s    zFTestJitClassOverloads.test_bool_fallback.<locals>.NormalClass.__init__Nr&   r#   r#   r#   r$   NormalClassx  s   r  r   )
r	   r   r   rN   r  r   r}  r   r  r   )r"   r  Zjit_br  ro   r  r#   r#   r$   test_bool_fallbackW  s$    
z(TestJitClassOverloads.test_bool_fallbackc              	   C   s  dd }dd }dd }t |}t |}t |}tg G dd d}| }| ||td	 | ||td	 | ||d	 | ||d	 | t}	|| W 5 Q R X | d
t|	j | t	}	|| W 5 Q R X | d
t|	j tg G dd d}
|
 }| ||d | ||d | t}	|| W 5 Q R X | dt|	j | t	}	|| W 5 Q R X | dt|	j | t}	|| W 5 Q R X | dt|	j | t	}	|| W 5 Q R X | dt|	j tg G dd d}| }| ||td | ||td | ||d | ||d | ||d | ||d tg G dd d}| }| ||td	 | ||td	 | ||d	 | ||d	 | ||d | ||d d S )Nc                 S   s   t | S r   r,  r   r#   r#   r$   py_c  s    z9TestJitClassOverloads.test_numeric_fallback.<locals>.py_cc                 S   s   t | S r   r  r   r#   r#   r$   r    s    z9TestJitClassOverloads.test_numeric_fallback.<locals>.py_fc                 S   s   t | S r   r  r   r#   r#   r$   py_i  s    z9TestJitClassOverloads.test_numeric_fallback.<locals>.py_ic                   @   s   e Zd Zdd Zdd ZdS )z?TestJitClassOverloads.test_numeric_fallback.<locals>.FloatClassc                 S   s   d S r   r#   r1   r#   r#   r$   r%     s    zHTestJitClassOverloads.test_numeric_fallback.<locals>.FloatClass.__init__c                 S   s   dS Nr   r#   r1   r#   r#   r$   r    s    zITestJitClassOverloads.test_numeric_fallback.<locals>.FloatClass.__float__N)r'   r(   r)   r%   r  r#   r#   r#   r$   
FloatClass  s   r  r   rK   c                   @   s   e Zd Zdd Zdd ZdS )z=TestJitClassOverloads.test_numeric_fallback.<locals>.IntClassc                 S   s   d S r   r#   r1   r#   r#   r$   r%     s    zFTestJitClassOverloads.test_numeric_fallback.<locals>.IntClass.__init__c                 S   s   dS ra   r#   r1   r#   r#   r$   r    s    zETestJitClassOverloads.test_numeric_fallback.<locals>.IntClass.__int__N)r'   r(   r)   r%   r  r#   r#   r#   r$   IntClass  s   r  rb   r-  rO   c                   @   s   e Zd Zdd Zdd ZdS )z?TestJitClassOverloads.test_numeric_fallback.<locals>.IndexClassc                 S   s   d S r   r#   r1   r#   r#   r$   r%     s    zHTestJitClassOverloads.test_numeric_fallback.<locals>.IndexClass.__init__c                 S   s   dS r   r#   r1   r#   r#   r$   	__index__  s    zITestJitClassOverloads.test_numeric_fallback.<locals>.IndexClass.__index__N)r'   r(   r)   r%   r  r#   r#   r#   r$   
IndexClass  s   r  r         ?c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
zGTestJitClassOverloads.test_numeric_fallback.<locals>.FloatIntIndexClassc                 S   s   d S r   r#   r1   r#   r#   r$   r%     s    zPTestJitClassOverloads.test_numeric_fallback.<locals>.FloatIntIndexClass.__init__c                 S   s   dS r  r#   r1   r#   r#   r$   r    s    zQTestJitClassOverloads.test_numeric_fallback.<locals>.FloatIntIndexClass.__float__c                 S   s   dS ra   r#   r1   r#   r#   r$   r    s    zOTestJitClassOverloads.test_numeric_fallback.<locals>.FloatIntIndexClass.__int__c                 S   s   dS r   r#   r1   r#   r#   r$   r    s    zQTestJitClassOverloads.test_numeric_fallback.<locals>.FloatIntIndexClass.__index__N)r'   r(   r)   r%   r  r  r  r#   r#   r#   r$   FloatIntIndexClass  s   r  )
r	   r   r  r-  rZ   r[   r\   r]   r^   r   )r"   r  r  r  Zjit_cr  Zjit_ir  ro   rv  r  r  r  r#   r#   r$   test_numeric_fallback  sl    z+TestJitClassOverloads.test_numeric_fallbackc                 C   s  |   }|  }dd dd dd dd dd dd dd d	d d
d dd dd dd dd g}dd dd dd dd dd dd dd g}dddg}dd }ttt||D ]|\}\}}	|j}
|
||	}||}||	}t|tk	r| j	n| j
}|||||	 ||||
|| |||||| qttt||D ]~\}\}}	|j}
t|t|	 }}	|
||	}||}||	}| 	||||	 | 	|||
|| | 	||||| qDd S )Nc                 S   s   | |kS r   r#   rf   r#   r#   r$   r    r  z?TestJitClassOverloads.test_arithmetic_logical.<locals>.<lambda>c                 S   s   | |kS r   r#   rf   r#   r#   r$   r    r  c                 S   s   | |kS r   r#   rf   r#   r#   r$   r    r  c                 S   s   | |kS r   r#   rf   r#   r#   r$   r    r  c                 S   s   | |kS r   r#   rf   r#   r#   r$   r    r  c                 S   s   | |k S r   r#   rf   r#   r#   r$   r    r  c                 S   s   | | S r   r#   rf   r#   r#   r$   r    r  c                 S   s   | | S r   r#   rf   r#   r#   r$   r    r  c                 S   s   | | S r   r#   rf   r#   r#   r$   r    r  c                 S   s   | | S r   r#   rf   r#   r#   r$   r    r  c                 S   s   | | S r   r#   rf   r#   r#   r$   r    r  c                 S   s   | | S r   r#   rf   r#   r#   r$   r    r  c                 S   s   | | S r   r#   rf   r#   r#   r$   r    r  c                 S   s   | |kS r   r#   rf   r#   r#   r$   r    r  c                 S   s   | |kS r   r#   rf   r#   r#   r$   r    r  c                 S   s   | |> S r   r#   rf   r#   r#   r$   r    r  c                 S   s   | |? S r   r#   rf   r#   r#   r$   r    r  c                 S   s   | |@ S r   r#   rf   r#   r#   r$   r    r  c                 S   s   | |B S r   r#   rf   r#   r#   r$   r    r  c                 S   s   | |A S r   r#   rf   r#   r#   r$   r    r  rX          @gX9v?r   g333333*@g)\(?c                 S   s   t | d| S )Nr   )getattrr   r#   r#   r$   unwrap  s    z=TestJitClassOverloads.test_arithmetic_logical.<locals>.unwrap)r  r  	itertoolsproductmapr	   r   r  rO   r=   assertAlmostEqualrK   )r"   r  r  float_py_funcsint_py_funcstest_valuesr  r  r   r    r  rE   Zjit_xZjit_ycheckr#   r#   r$   test_arithmetic_logical  sp     

 
z-TestJitClassOverloads.test_arithmetic_logicalc                    s  |   }|  }| d }| d }tdtjfgG fddd|tdtjiG  fddd|  d }  d }dd fd	d
dD }fdd
dD }dddg}	tt	t
|||f| fg|	D ]d\}
\}}\}}|
j}|||||j}| ||||||j | ||
||||j qtt	t
|||f|fg|	D ]x\}
\}}\}}t|t| }}|
j}|||||j}| ||||||j | ||
||||j qbd S )Nr   r   c                       sP   e Zd Zdd Z fddZ fddZ fddZ fd	d
Z fddZdS )zRTestJitClassOverloads.test_arithmetic_logical_inplace.<locals>.JitIntUpdateWrapperc                 S   s
   || _ d S r   r   rU   r#   r#   r$   r%   5  s    z[TestJitClassOverloads.test_arithmetic_logical_inplace.<locals>.JitIntUpdateWrapper.__init__c                    s    | j |j > S r   r   r  JitIntUpdateWrapperr#   r$   __ilshift__8  s    z^TestJitClassOverloads.test_arithmetic_logical_inplace.<locals>.JitIntUpdateWrapper.__ilshift__c                    s    | j |j ? S r   r   r  r  r#   r$   __irshift__;  s    z^TestJitClassOverloads.test_arithmetic_logical_inplace.<locals>.JitIntUpdateWrapper.__irshift__c                    s    | j |j @ S r   r   r  r  r#   r$   __iand__>  s    z[TestJitClassOverloads.test_arithmetic_logical_inplace.<locals>.JitIntUpdateWrapper.__iand__c                    s    | j |j B S r   r   r  r  r#   r$   __ior__A  s    zZTestJitClassOverloads.test_arithmetic_logical_inplace.<locals>.JitIntUpdateWrapper.__ior__c                    s    | j |j A S r   r   r  r  r#   r$   __ixor__D  s    z[TestJitClassOverloads.test_arithmetic_logical_inplace.<locals>.JitIntUpdateWrapper.__ixor__N)	r'   r(   r)   r%   r  r  r  r  r  r#   r  r#   r$   r  3  s   r  c                       sh   e Zd Zdd Z fddZ fddZ fddZ fd	d
Z fddZ fddZ	 fddZ
dS )zTTestJitClassOverloads.test_arithmetic_logical_inplace.<locals>.JitFloatUpdateWrapperc                 S   s
   || _ d S r   r   rU   r#   r#   r$   r%   J  s    z]TestJitClassOverloads.test_arithmetic_logical_inplace.<locals>.JitFloatUpdateWrapper.__init__c                    s    | j d|j   S NgX9v@r   r  JitFloatUpdateWrapperr#   r$   __iadd__M  s    z]TestJitClassOverloads.test_arithmetic_logical_inplace.<locals>.JitFloatUpdateWrapper.__iadd__c                    s    | j d |j  S r  r   r  r  r#   r$   __ifloordiv__P  s    zbTestJitClassOverloads.test_arithmetic_logical_inplace.<locals>.JitFloatUpdateWrapper.__ifloordiv__c                    s    | j |j d  S r   r   r  r  r#   r$   __imod__S  s    z]TestJitClassOverloads.test_arithmetic_logical_inplace.<locals>.JitFloatUpdateWrapper.__imod__c                    s    | j |j  d S r   r   r  r  r#   r$   __imul__V  s    z]TestJitClassOverloads.test_arithmetic_logical_inplace.<locals>.JitFloatUpdateWrapper.__imul__c                    s    | j |j  d S r   r   r  r  r#   r$   __ipow__Y  s    z]TestJitClassOverloads.test_arithmetic_logical_inplace.<locals>.JitFloatUpdateWrapper.__ipow__c                    s    | j d|j   S r  r   r  r  r#   r$   __isub__\  s    z]TestJitClassOverloads.test_arithmetic_logical_inplace.<locals>.JitFloatUpdateWrapper.__isub__c                    s    | j d |j  S r   r   r  r  r#   r$   __itruediv___  s    zaTestJitClassOverloads.test_arithmetic_logical_inplace.<locals>.JitFloatUpdateWrapper.__itruediv__N)r'   r(   r)   r%   r  r  r  r  r  r  r  r#   r  r#   r$   r  G  s   r  c                 S   s"   d|  d}i }t || |d S )Nz
def f(x, y):
    x z= y
    return x
r  )exec)optemplate	namespacer#   r#   r$   get_update_funce  s    
zNTestJitClassOverloads.test_arithmetic_logical_inplace.<locals>.get_update_funcc                    s   g | ]} |qS r#   r#   rD  r  r  r#   r$   rE  o  s     zITestJitClassOverloads.test_arithmetic_logical_inplace.<locals>.<listcomp>)+//%***-/c                    s   g | ]} |qS r#   r#   r  r  r#   r$   rE  r  s     )<<>>&|^r  r  r  )r  r  mror   r   r  r   r  r  r  r	   r   r   r  rK   r=   )r"   ZJitIntWrapperZJitFloatWrapperZPyIntWrapperZPyFloatWrapperZPyIntUpdateWrapperZPyFloatUpdateWrapperr  r  r  r  Zpy_clsjit_clsr   r    r  rE   r#   )r  r  r  r$   test_arithmetic_logical_inplace*  sP    
z5TestJitClassOverloads.test_arithmetic_logical_inplacec                 C   s  G dd d}G dd d|}dd }dd }d	d
 }dd }ddddg}t ||gddgD ]\}}	|	rntn|}
|
|}|
|}|
|}t|}dD ]}| ||||d  q|D ]T\}}| |||||||||k | |||||||||k qq^d S )Nc                   @   s.   e Zd ZU eed< dd Zdd Zdd ZdS )	z9TestJitClassOverloads.test_hash_eq_ne.<locals>.HashEqTestr   c                 S   s
   || _ d S r   r   r   r#   r#   r$   r%     s    zBTestJitClassOverloads.test_hash_eq_ne.<locals>.HashEqTest.__init__c                 S   s
   | j d S )Nrx   r   r1   r#   r#   r$   r    s    zBTestJitClassOverloads.test_hash_eq_ne.<locals>.HashEqTest.__hash__c                 S   s   | j |j  d dkS )Nr%  r   r   r"   or#   r#   r$   r    s    z@TestJitClassOverloads.test_hash_eq_ne.<locals>.HashEqTest.__eq__N)r'   r(   r)   rK   rL   r%   r  r  r#   r#   r#   r$   
HashEqTest  s   
r  c                   @   s   e Zd Zdd ZdS )z;TestJitClassOverloads.test_hash_eq_ne.<locals>.HashEqNeTestc                 S   s   | j |j  d dkS )Nr%  r   r   r  r#   r#   r$   __ne__  s    zBTestJitClassOverloads.test_hash_eq_ne.<locals>.HashEqNeTest.__ne__N)r'   r(   r)   r  r#   r#   r#   r$   HashEqNeTest  s   r  c                 S   s   t | S r   )hashr   r#   r#   r$   py_hash  s    z6TestJitClassOverloads.test_hash_eq_ne.<locals>.py_hashc                 S   s   | |kS r   r#   rf   r#   r#   r$   py_eq  s    z4TestJitClassOverloads.test_hash_eq_ne.<locals>.py_eqc                 S   s   | |kS r   r#   rf   r#   r#   r$   py_ne  s    z4TestJitClassOverloads.test_hash_eq_ne.<locals>.py_nec                 S   s   | S r   r#   )r  r#   r#   r$   identity_decorator  s    zATestJitClassOverloads.test_hash_eq_ne.<locals>.identity_decorator)r   r   )rq   r8  )rb   rx   )rs   rs   FT)r   rq   rx      irx   )r  r  r	   r   r=   )r"   r  r  r  r  r   r  ZcomparisonsZbase_clsZuse_jit	decoratorZ	hash_funcZeq_funcZne_funcr  r   r   r    r#   r#   r$   test_hash_eq_ne  s>     z%TestJitClassOverloads.test_hash_eq_nec                 C   s   G dd d}|}t dtjfg|}|d }|d }|d }|d }| || | || | t|t| | t|t| d S )Nc                   @   s$   e Zd Zdd Zdd Zdd ZdS )zBTestJitClassOverloads.test_bool_fallback_len.<locals>.NoBoolHasLenc                 S   s
   || _ d S r   r   rg   r#   r#   r$   r%     s    zKTestJitClassOverloads.test_bool_fallback_len.<locals>.NoBoolHasLen.__init__c                 S   s   | j S r   r   r1   r#   r#   r$   r    s    zJTestJitClassOverloads.test_bool_fallback_len.<locals>.NoBoolHasLen.__len__c                 S   s   t | S r   r  r1   r#   r#   r$   get_bool  s    zKTestJitClassOverloads.test_bool_fallback_len.<locals>.NoBoolHasLen.get_boolN)r'   r(   r)   r%   r  r  r#   r#   r#   r$   NoBoolHasLen  s   r  rh   r   rq   )r   r   Zint64r  r=   r  )r"   r  py_classjitted_classZpy_class_0_boolZpy_class_2_boolZjitted_class_0_boolZjitted_class_2_boolr#   r#   r$   test_bool_fallback_len  s    
z,TestJitClassOverloads.test_bool_fallback_lenc                 C   sV   G dd d}|}t g |}|  }|  }| || | t|t| d S )Nc                   @   s   e Zd Zdd Zdd ZdS )zETestJitClassOverloads.test_bool_fallback_default.<locals>.NoBoolNoLenc                 S   s   d S r   r#   r1   r#   r#   r$   r%     s    zNTestJitClassOverloads.test_bool_fallback_default.<locals>.NoBoolNoLen.__init__c                 S   s   t | S r   r  r1   r#   r#   r$   r    s    zNTestJitClassOverloads.test_bool_fallback_default.<locals>.NoBoolNoLen.get_boolN)r'   r(   r)   r%   r  r#   r#   r#   r$   NoBoolNoLen  s   r
  )r   r  r=   r  )r"   r
  r  r  Zpy_class_boolZjitted_class_boolr#   r#   r$   test_bool_fallback_default  s    

z0TestJitClassOverloads.test_bool_fallback_defaultc           
      C   s   G dd d}G dd d}dt jfg}t||}t||}|d}|d}|d}|d}	| ||k|	|k | ||k|	|k | ||k |	|k  | ||k|	|k | ||k|	|k d S )Nc                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )zHTestJitClassOverloads.test_operator_reflection.<locals>.OperatorsDefinedc                 S   s
   || _ d S r   r   r   r#   r#   r$   r%     s    zQTestJitClassOverloads.test_operator_reflection.<locals>.OperatorsDefined.__init__c                 S   s   | j |j kS r   r   r  r#   r#   r$   r    s    zOTestJitClassOverloads.test_operator_reflection.<locals>.OperatorsDefined.__eq__c                 S   s   | j |j kS r   r   r  r#   r#   r$   r    s    zOTestJitClassOverloads.test_operator_reflection.<locals>.OperatorsDefined.__le__c                 S   s   | j |j k S r   r   r  r#   r#   r$   r     s    zOTestJitClassOverloads.test_operator_reflection.<locals>.OperatorsDefined.__lt__c                 S   s   | j |j kS r   r   r  r#   r#   r$   r  #  s    zOTestJitClassOverloads.test_operator_reflection.<locals>.OperatorsDefined.__ge__c                 S   s   | j |j kS r   r   r  r#   r#   r$   r  &  s    zOTestJitClassOverloads.test_operator_reflection.<locals>.OperatorsDefined.__gt__N)	r'   r(   r)   r%   r  r  r  r  r  r#   r#   r#   r$   OperatorsDefined  s   r  c                   @   s   e Zd Zdd ZdS )zJTestJitClassOverloads.test_operator_reflection.<locals>.NoOperatorsDefinedc                 S   s
   || _ d S r   r   r   r#   r#   r$   r%   *  s    zSTestJitClassOverloads.test_operator_reflection.<locals>.NoOperatorsDefined.__init__Nr&   r#   r#   r#   r$   NoOperatorsDefined)  s   r  r   rq   rs   )r   r   r   r=   )
r"   r  r  r@   JitOperatorsDefinedJitNoOperatorsDefinedpy_ops_definedpy_ops_not_definedjit_ops_definedjit_ops_not_definedr#   r#   r$   test_operator_reflection  s0    




z.TestJitClassOverloads.test_operator_reflectionc                 C   s  G dd d}G dd d}d}t jd t jj|fd}t jj||fd}||}||}t|dtd d d id	|}t|dtd d d id	|}	||}
||}t|dtd d d d df id	|}t|dtd d d d df id	|}t j|| |	|  t j||
 |	|  t j|| ||  t j||
 ||  t j|| ||	  t j|| ||  t j|
| ||	  t j|
| ||  ||
 }||
 }|	| }	|| }t j|j|	j t j|j|j d S )
Nc                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
z;TestJitClassOverloads.test_matmul_operator.<locals>.ArrayAtc                 S   s
   || _ d S r   rd   r"   r   r#   r#   r$   r%   I  s    zDTestJitClassOverloads.test_matmul_operator.<locals>.ArrayAt.__init__c                 S   s   | j |j  S r   r  r  r#   r#   r$   
__matmul__L  s    zFTestJitClassOverloads.test_matmul_operator.<locals>.ArrayAt.__matmul__c                 S   s   |j | j  S r   r  r  r#   r#   r$   __rmatmul__O  s    zGTestJitClassOverloads.test_matmul_operator.<locals>.ArrayAt.__rmatmul__c                 S   s   | j |j  | _ | S r   r  r  r#   r#   r$   __imatmul__R  s    zGTestJitClassOverloads.test_matmul_operator.<locals>.ArrayAt.__imatmul__N)r'   r(   r)   r%   r  r  r  r#   r#   r#   r$   ArrayAtH  s   r  c                   @   s   e Zd Zdd ZdS )z=TestJitClassOverloads.test_matmul_operator.<locals>.ArrayNoAtc                 S   s
   || _ d S r   r  r  r#   r#   r$   r%   W  s    zFTestJitClassOverloads.test_matmul_operator.<locals>.ArrayNoAt.__init__Nr&   r#   r#   r#   r$   	ArrayNoAtV  s   r  rs   r   )sizerd   rj  )r{   rL  seedr   r   r   Zassert_allcloserd   )r"   r  r  r!  ru   matZvector_noatZ	vector_atZjit_vector_noatZjit_vector_atZmatrix_noatZ	matrix_atZjit_matrix_noatZjit_matrix_atr#   r#   r$   test_matmul_operatorF  sX    &&z*TestJitClassOverloads.test_matmul_operatorc              
   C   s>  G dd d}G dd d}ddddd	d
dg}|d }t |dft|dftd d d |tdddgtdddgfffD ]\}}}d|i}t||}	t||}
||d }||d }|	|d }|
|d }|D ]d}dt|kr
| td| dtd| d q| t	td| dt	td| d qqxd S )!Nc                   @   st   e Z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S )zRTestJitClassOverloads.test_arithmetic_logical_reflection.<locals>.OperatorsDefinedc                 S   s
   || _ d S r   r   r   r#   r#   r$   r%     s    z[TestJitClassOverloads.test_arithmetic_logical_reflection.<locals>.OperatorsDefined.__init__c                 S   s   |j | j  S r   r   r  r#   r#   r$   __radd__  s    z[TestJitClassOverloads.test_arithmetic_logical_reflection.<locals>.OperatorsDefined.__radd__c                 S   s   |j | j  S r   r   r  r#   r#   r$   __rsub__  s    z[TestJitClassOverloads.test_arithmetic_logical_reflection.<locals>.OperatorsDefined.__rsub__c                 S   s   |j | j  S r   r   r  r#   r#   r$   __rmul__  s    z[TestJitClassOverloads.test_arithmetic_logical_reflection.<locals>.OperatorsDefined.__rmul__c                 S   s   |j | j  S r   r   r  r#   r#   r$   __rtruediv__  s    z_TestJitClassOverloads.test_arithmetic_logical_reflection.<locals>.OperatorsDefined.__rtruediv__c                 S   s   |j | j  S r   r   r  r#   r#   r$   __rfloordiv__  s    z`TestJitClassOverloads.test_arithmetic_logical_reflection.<locals>.OperatorsDefined.__rfloordiv__c                 S   s   |j | j  S r   r   r  r#   r#   r$   __rmod__  s    z[TestJitClassOverloads.test_arithmetic_logical_reflection.<locals>.OperatorsDefined.__rmod__c                 S   s   |j | j  S r   r   r  r#   r#   r$   __rpow__  s    z[TestJitClassOverloads.test_arithmetic_logical_reflection.<locals>.OperatorsDefined.__rpow__c                 S   s   |j | j > S r   r   r  r#   r#   r$   __rlshift__  s    z^TestJitClassOverloads.test_arithmetic_logical_reflection.<locals>.OperatorsDefined.__rlshift__c                 S   s   |j | j ? S r   r   r  r#   r#   r$   __rrshift__  s    z^TestJitClassOverloads.test_arithmetic_logical_reflection.<locals>.OperatorsDefined.__rrshift__c                 S   s   |j | j @ S r   r   r  r#   r#   r$   __rand__  s    z[TestJitClassOverloads.test_arithmetic_logical_reflection.<locals>.OperatorsDefined.__rand__c                 S   s   |j | j A S r   r   r  r#   r#   r$   __rxor__  s    z[TestJitClassOverloads.test_arithmetic_logical_reflection.<locals>.OperatorsDefined.__rxor__c                 S   s   |j | j B S r   r   r  r#   r#   r$   __ror__  s    zZTestJitClassOverloads.test_arithmetic_logical_reflection.<locals>.OperatorsDefined.__ror__N)r'   r(   r)   r%   r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r#   r#   r#   r$   r    s   r  c                   @   s   e Zd Zdd ZdS )zTTestJitClassOverloads.test_arithmetic_logical_reflection.<locals>.NoOperatorsDefinedc                 S   s
   || _ d S r   r   r   r#   r#   r$   r%     s    z]TestJitClassOverloads.test_arithmetic_logical_reflection.<locals>.NoOperatorsDefined.__init__Nr&   r#   r#   r#   r$   r    s   r  r  r  r  r  r  r  r  r  r  r  r  r  )rq   rt   )r        @r   r  r  r,  g      4@g      8r   r   r   zpy_ops_not_defined z py_ops_definedzjit_ops_not_defined z jit_ops_defined)r  r  r  r  r  )
r   r   r{   r   r   r]   r=   evalZassertTupleEqualtuple)r"   r  r  Zfloat_opZint_opZ	test_typeZtest_opZ
test_valuer@   r  r  r  r  r  r  r  r#   r#   r$   "test_arithmetic_logical_reflection  s6    (

z8TestJitClassOverloads.test_arithmetic_logical_reflectionc                 C   s2   G dd d}t g |}| }| ||k d S )Nc                   @   s   e Zd Zdd Zdd ZdS )zGTestJitClassOverloads.test_implicit_hash_compiles.<locals>.ImplicitHashc                 S   s   d S r   r#   r1   r#   r#   r$   r%     s    zPTestJitClassOverloads.test_implicit_hash_compiles.<locals>.ImplicitHash.__init__c                 S   s   dS )NFr#   r  r#   r#   r$   r    s    zNTestJitClassOverloads.test_implicit_hash_compiles.<locals>.ImplicitHash.__eq__N)r'   r(   r)   r%   r  r#   r#   r#   r$   ImplicitHash  s   r0  )r   r   )r"   r0  Zjittedinstancer#   r#   r$   test_implicit_hash_compiles  s    z1TestJitClassOverloads.test_implicit_hash_compiles)N)r'   r(   r)   r  r^  r  r  r  r  r  r  r  r  r  r	  r  r  r   r  r/  r2  r#   r#   r#   r$   r{    s&   .

6
2*cFm<+1
?Lr{  __main__)2r   r  rU  rL  typingrM   Zunittestcollectionsr   Znumpyr{   Znumbar   r   r   r   r   r   r	   r
   r   Z
numba.corer   r   Znumba.core.dispatcherr   Znumba.core.errorsr   r   Znumba.core.runtime.nrtr   Znumba.experimentalr   Znumba.experimental.jitclassr   Z numba.experimental.jitclass.baser   Znumba.tests.supportr   r   r   r   r3   r   r*   r/   r0   r{  r'   mainr#   r#   r#   r$   <module>   sL   ,	        t      M
