U
    ,dO.                     @   s^  d Z ddl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ZmZmZmZ ejG dd	 d	e	jZed
e	jdd fde	jfgdZeeej G dd dejZejG dd de	jZeeed
dg edd Zedd Zedd Z edd Z!edd Z"edd Z#edd Z$edd  Z%G d!d" d"eeZ&eed#d$d% Z'eed&d'd( Z(G d)d* d*eeZ)d+d, Z*d-d. Z+G d/d0 d0eeZ,ejG d1d2 d2e	jZ-e-d3e	j.fd4e	j.ffdZ/G d5d6 d6ejZ0ed7d8 Z1ed9d: Z2ee0e-d3d4g ee-d;d<d= Z3ee-d&d>d? Z4G d@dA dAeeZ5dS )Bz%
Test mutable struct, aka, structref
    N)typednjiterrors)types)	structref)overload_methodoverload_attribute)MemoryLeakMixinTestCasetemp_directoryoverride_configc                   @   s   e Zd ZdZdS )MySimplerStructTypezV
    Test associated with this type represent the lowest level uses of structref.
    N__name__
__module____qualname____doc__ r   r   ?/tmp/pip-unpacked-wheel-eu7e0c37/numba/tests/test_struct_ref.pyr      s   r   valuescounter)fieldsc                   @   sN   e Zd Zdd Zedd Zejdd Zedd Zdd	 Zed
d Z	dS )MyStructc                 C   s   t j| ||S Nr   StructRefProxy__new__)clsr   r   r   r   r   r   "   s    zMyStruct.__new__c                 C   s   t | S r   )
get_valuesselfr   r   r   r   *   s    zMyStruct.valuesc                 C   s
   t | |S r   )
set_values)r    valr   r   r   r   .   s    c                 C   s   t | S r   )get_counterr   r   r   r   r   2   s    zMyStruct.counterc                 C   s   | j | | j S r   r   r   r    argr   r   r   testme6   s    zMyStruct.testmec                 C   s   | j | jfS r   r$   r   r   r   r   prop9   s    zMyStruct.propN)
r   r   r   r   propertyr   setterr   r'   r(   r   r   r   r   r       s   


r   c                   @   s   e Zd ZdZdS )MyStructTypezTTest associated with this type represent the higher-level uses of
    structef.
    Nr   r   r   r   r   r+   >   s   r+   c                 C   s   t t}t|| | |S r   )r   newmy_struct_tymy_struct_init)r   r   str   r   r   	my_structP   s    
r0   c                 C   s   || _ || _d S r   r$   )r    r   r   r   r   r   r.   W   s    r.   c                 C   s.   t | |d}| j|j7  _| j|9  _|S )Nr   )r0   r   r   )vsctrr/   r   r   r   ctor_by_intrinsic]   s    r4   c                 C   s   t | |dS Nr$   r   )r2   r3   r   r   r   ctor_by_classe   s    r7   c                 C   s   | j S r   r   r/   r   r   r   r   j   s    r   c                 C   s
   || _ d S r   r8   )r/   r"   r   r   r   r!   o   s    r!   c                 C   s   | j S r   r1   r9   r   r   r   r#   t   s    r#   c                 C   s   | j | j S r   r$   r9   r   r   r   compute_fieldsy   s    r:   c                   @   sL   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S )TestStructRefBasicc              	   C   s   t dt jfg}| |jd t j t dt jfdt jfg}| |jd t j | |jd t j | td t dt jfg W 5 Q R X | td t dg W 5 Q R X d S )Nabzexpecting a str for field name   z%expecting a Numba Type for field type)r<   {   )r   	StructRefint64assertEqualZ
field_dictfloat64assertRaisesRegex
ValueError)r    srr   r   r   test_structref_type   s    z&TestStructRefBasic.test_structref_typec              	   C   sN   |  td ttj W 5 Q R X |  td ttjt W 5 Q R X d S )Nzcannot register)rD   rE   r   registerr   r@   define_boxingr   r   r   r   r   test_invalid_uses   s    z$TestStructRefBasic.test_invalid_usesc                 C   sf   t jdt jd}d}|| }t||}| |t | |t| |||  }t|}| || d S )N
   Zdtype   )	nparangeintpr4   ZassertNotIsInstancer   assertPreciseEqualr   r:   )r    r2   r3   Zfirst_expected	first_gotsecond_expected
second_gotr   r   r   test_MySimplerStructType   s    
z+TestStructRefBasic.test_MySimplerStructTypec              	   C   sl   t jdt jd}d}t||}| |tj | td |j	 W 5 Q R X | td |j
 W 5 Q R X d S )NrK   rL   rM   r   r   )rN   rO   rP   r4   assertIsInstancer   r   rD   AttributeErrorr   r   )r    r2   r3   wrapperr   r   r   -test_MySimplerStructType_wrapper_has_no_attrs   s    
z@TestStructRefBasic.test_MySimplerStructType_wrapper_has_no_attrsc                 C   sn   t jdt jd}d}| }t||}| |t | ||j || }t	|}| || | 
|j| d S NrK   rL      )rN   rO   rC   copyr7   rV   r   rQ   r   r:   rB   r   )r    r2   r3   Zfirst_expected_arrrR   rS   rT   r   r   r   test_MyStructType   s    
z$TestStructRefBasic.test_MyStructTypec                 C   sZ   t dd }|dddd\}}| |jd | |jd | |jd | |jd d S )Nc                 S   s   t | |t ||fS r   r6   )xymnr   r   r   
mixed_type   s    zDTestStructRefBasic.test_MyStructType_mixed_types.<locals>.mixed_typer>   ffffff@y        333333@)   )r   rB   r   r   )r    rb   r<   r=   r   r   r   test_MyStructType_mixed_types   s    
z0TestStructRefBasic.test_MyStructType_mixed_typesc                 C   s   t  }tdd|d< | |d jd | |d jd tdd|d< | |d jd | |d jd |d  jd7  _| |d jd | |d jd tdd	|d
< d S )Nr>   rc   r<      gffffff
@rK      rd   gffffff@r=   )r   Dictr   rB   r   r   r    tdr   r   r   test_MyStructType_in_dict   s    z,TestStructRefBasic.test_MyStructType_in_dictc              	   C   sn   |    t }tdd|d< | |d jd | |d jd | tj	d tdd|d< W 5 Q R X d S )Nr>   rc   r<   zCannot cast numba.MyStructTyper=   )
Zdisable_leak_checkr   rh   r   rB   r   r   rD   r   ZTypingErrorri   r   r   r   *test_MyStructType_in_dict_mixed_type_error   s    z=TestStructRefBasic.test_MyStructType_in_dict_mixed_type_errorN)r   r   r   rG   rJ   rU   rY   r]   re   rk   rl   r   r   r   r   r;   ~   s   
r;   r'   c                 C   s   dd }|S )Nc                 S   s   | j | | j S r   r$   r%   r   r   r   impl   s    z%_ol_mystructtype_testme.<locals>.implr   )r    r&   rm   r   r   r   _ol_mystructtype_testme   s    rn   r(   c                 C   s   dd }|S )Nc                 S   s   | j | jfS r   r$   r   r   r   r   get   s    z"_ol_mystructtype_prop.<locals>.getr   r    ro   r   r   r   _ol_mystructtype_prop   s    rq   c                   @   s   e Zd Zdd Zdd ZdS )TestStructRefExtendingc                 C   s2   t dd }d}||}||}| || d S )Nc                 S   s(   t jdt jd}d}t||}|| S rZ   )rN   rO   rC   r   r'   )r^   r2   r3   objr   r   r   check   s    
z:TestStructRefExtending.test_overload_method.<locals>.check   r   Zpy_funcrQ   r    rt   r^   gotexpectr   r   r   test_overload_method   s    

z+TestStructRefExtending.test_overload_methodc                 C   s*   t dd }| }| }| || d S )Nc                  S   s$   t jdt jd} d}t| |}|jS rZ   )rN   rO   rC   r   r(   )r2   r3   rs   r   r   r   rt     s    
z=TestStructRefExtending.test_overload_attribute.<locals>.checkrv   r    rt   rx   ry   r   r   r   test_overload_attribute  s
    
z.TestStructRefExtending.test_overload_attributeN)r   r   r   rz   r|   r   r   r   r   rr      s   rr   c                 C   s   t | |d}|S r5   r6   )r^   r_   structr   r   r   caching_test_make  s    r~   c                 C   s
   |  |S r   )r'   )r}   zr   r   r   caching_test_use  s    r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestStructRefCachingc                 C   s@   t tj| _td| j| _| j  td tj	ddd d S )NZ	CACHE_DIRerrorignoreZ	typeguard)actionmodule)
r   r   r   Z
_cache_dirr   _cache_override	__enter__warningssimplefilterfilterwarningsr   r   r   r   setUp  s
    

zTestStructRefCaching.setUpc                 C   s   | j d d d  t  d S r   )r   __exit__r   resetwarningsr   r   r   r   tearDown   s    zTestStructRefCaching.tearDownc                    s@   fdd fdd fdd}|dd |d	d d S )
Nc                    s(     t| jd   t| jd d S )Nr>   r   rB   lenZ
cache_hitsZcache_missesstatsr   r   r   assert_cached%  s    zBTestStructRefCaching.test_structref_caching.<locals>.assert_cachedc                    s(     t| jd   t| jd d S )Nr   r>   r   r   r   r   r   assert_not_cached)  s    zFTestStructRefCaching.test_structref_caching.<locals>.assert_not_cachedc           	         s   t ddt}t ddt}tjd}d}d}|||}|||}|| | }|| | rv |j  |j n|j |j d S )NT)cacheru      )r   r~   r   rN   randomrQ   r   )	cachedZ
check_makeZ	check_user2   r3   Zfactorr/   rx   ry   r   r   r    r   r   rt   -  s    



z:TestStructRefCaching.test_structref_caching.<locals>.checkF)r   Tr   )r    rt   r   r   r   test_structref_caching$  s
    
z+TestStructRefCaching.test_structref_cachingN)r   r   r   r   r   r   r   r   r   r   r     s   r   c                   @   s   e Zd Zdd ZdS )PolygonStructTypec                 C   s6   dt |  | _tdttjfdt| fg}|S )Nznumba.PolygonStructType#valueparent)idnametupler   OptionalrA   )r    r   r   r   r   preprocess_fieldsF  s    z#PolygonStructType.preprocess_fieldsN)r   r   r   r   r   r   r   r   r   C  s   r   r   r   c                   @   s,   e Zd Zdd Zedd Zedd ZdS )PolygonStructc                 C   s   t j| ||S r   r   )r   r   r   r   r   r   r   X  s    zPolygonStruct.__new__c                 C   s   t | S r   )PolygonStruct_get_valuer   r   r   r   r   [  s    zPolygonStruct.valuec                 C   s   t | S r   )PolygonStruct_get_parentr   r   r   r   r   _  s    zPolygonStruct.parentN)r   r   r   r   r)   r   r   r   r   r   r   r   W  s
   
r   c                 C   s   | j S r   r   r   r   r   r   r   d  s    r   c                 C   s   | j S r   )r   r   r   r   r   r   i  s    r   flipc                 C   s   dd }|S )Nc                 S   s   | j d k	r| j  | _ d S r   r   r   r   r   r   rm   w  s    
z%_ol_polygon_struct_flip.<locals>.implr   )r    rm   r   r   r   _ol_polygon_struct_flipu  s    r   c                 C   s   dd }|S )Nc                 S   s   | j | jfS r   )r   r   r   r   r   r   ro     s    z$_ol_polygon_struct_prop.<locals>.getr   rp   r   r   r   _ol_polygon_struct_prop}  s    r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestStructRefForwardTypingc                 C   s,   t dd }d}||}|}| || d S )Nc                 S   s.   t d d }t d d }| |_||_| |_|jjS r   )r   r   r   r^   ZpolyZp_polyr   r   r   rt     s    

zCTestStructRefForwardTyping.test_same_type_assignment.<locals>.checkr[   r   rQ   rw   r   r   r   test_same_type_assignment  s    
z4TestStructRefForwardTyping.test_same_type_assignmentc                 C   s.   t dd }d}||}| }| || d S )Nc                 S   s@   t d d }t d d }| |_||_| |_|  |j  |jjS r   )r   r   r   r   r   r   r   r   rt     s    


z>TestStructRefForwardTyping.test_overload_method.<locals>.checkru   r   rw   r   r   r   rz     s    

z/TestStructRefForwardTyping.test_overload_methodc                 C   s&   t dd }| }d}| || d S )Nc                  S   s   t dd } | jd S )N   r   )r   r(   )rs   r   r   r   rt     s    
zATestStructRefForwardTyping.test_overload_attribute.<locals>.checkr   r   r{   r   r   r   r|     s
    
z2TestStructRefForwardTyping.test_overload_attributeN)r   r   r   r   rz   r|   r   r   r   r   r     s   r   )6r   r   ZnumpyrN   Znumbar   r   r   Z
numba.corer   Znumba.experimentalr   Znumba.extendingr   r   Znumba.tests.supportr	   r
   r   r   rH   r@   r   rP   r-   rI   r   r   r+   Zdefine_proxyr0   r.   r4   r7   r   r!   r#   r:   r;   rn   rq   rr   r~   r   r   r   AnyZpolygon_struct_typer   r   r   r   r   r   r   r   r   r   <module>   s   








h

+



