o
    8ήcO.                     @   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                   @      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   B/tmp/pip-target-vg8gfxp4/lib/python/numba/tests/test_struct_ref.pyr          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      t j| ||S Nr   StructRefProxy__new__)clsr   r   r   r   r   r   "   s   zMyStruct.__new__c                 C      t | S r   )
get_valuesselfr   r   r   r   *      zMyStruct.valuesc                 C   s
   t | |S r   )
set_values)r$   valr   r   r   r   .      
c                 C   r!   r   )get_counterr#   r   r   r   r   2   r%   zMyStruct.counterc                 C      | j | | j S r   r   r   r$   argr   r   r   testme6      zMyStruct.testmec                 C      | j | jfS r   r+   r#   r   r   r   prop9      zMyStruct.propN)
r   r   r   r   propertyr   setterr   r.   r1   r   r   r   r   r       s    


r   c                   @   r   )MyStructTypezTTest associated with this type represent the higher-level uses of
    structef.
    Nr   r   r   r   r   r5   >   r   r5   c                 C   s   t t}t|| | |S r   )r   newmy_struct_tymy_struct_init)r   r   str   r   r   	my_structP   s   
r:   c                 C   s   || _ || _d S r   r+   )r$   r   r   r   r   r   r8   W   s   
r8   c                 C   s.   t | |d}| j|j7  _| j|9  _|S )Nr   )r:   r   r   )vsctrr9   r   r   r   ctor_by_intrinsic]   s   r>   c                 C   s   t | |dS Nr+   r   )r<   r=   r   r   r   ctor_by_classe   r2   rA   c                 C      | j S r   r   r9   r   r   r   r"   j      r"   c                 C   s
   || _ d S r   rC   )r9   r'   r   r   r   r&   o   r(   r&   c                 C   rB   r   r;   rD   r   r   r   r)   t   rE   r)   c                 C   s   | j | j S r   r+   rD   r   r   r   compute_fieldsy   r2   rF   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 d    n1 sNw   Y  | td t dg W d    d S 1 skw   Y  d S )Nabzexpecting a str for field name   z%expecting a Numba Type for field type)rH   {   )r   	StructRefint64assertEqual
field_dictfloat64assertRaisesRegex
ValueError)r$   srr   r   r   test_structref_type   s   "z&TestStructRefBasic.test_structref_typec                 C   sx   |  td ttj W d    n1 sw   Y  |  td ttjt W d    d S 1 s5w   Y  d S )Nzcannot register)rQ   rR   r   registerr   rL   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
   dtype   )	nparangeintpr>   assertNotIsInstancer   assertPreciseEqualr"   rF   )r$   r<   r=   first_expected	first_gotsecond_expected
second_gotr   r   r   test_MySimplerStructType   s   
z+TestStructRefBasic.test_MySimplerStructTypec                 C   s   t jdt jd}d}t||}| |tj | td |j	 W d    n1 s*w   Y  | td |j
 W d    d S 1 sDw   Y  d S )NrX   rY   r[   r   r   )r\   r]   r^   r>   assertIsInstancer   r   rQ   AttributeErrorr   r   )r$   r<   r=   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 NrX   rY      )r\   r]   rP   copyrA   rf   r   r`   r   rF   rN   r   )r$   r<   r=   first_expected_arrrb   rc   rd   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   r@   )xymnr   r   r   
mixed_type   s   zDTestStructRefBasic.test_MyStructType_mixed_types.<locals>.mixed_typerJ   ffffff@y        333333@)   )r   rN   r   r   )r$   rs   rH   rI   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 )NrJ   rt   rH      gffffff
@rX      ru   gffffff@rI   )r   Dictr   rN   r   r   r$   tdr   r   r   test_MyStructType_in_dict   s   z,TestStructRefBasic.test_MyStructType_in_dictc                 C   s   |    t }tdd|d< | |d jd | |d jd | tj	d tdd|d< W d    d S 1 s;w   Y  d S )NrJ   rt   rH   zCannot cast numba.MyStructTyperI   )
disable_leak_checkr   ry   r   rN   r   r   rQ   r   TypingErrorrz   r   r   r   *test_MyStructType_in_dict_mixed_type_error   s   "z=TestStructRefBasic.test_MyStructType_in_dict_mixed_type_errorN)r   r   r   rT   rW   re   ri   rn   rv   r|   r   r   r   r   r   rG   ~   s    
rG   r.   c                 C   s   dd }|S )Nc                 S   r*   r   r+   r,   r   r   r   impl   r/   z%_ol_mystructtype_testme.<locals>.implr   )r$   r-   r   r   r   r   _ol_mystructtype_testme      r   r1   c                 C      dd }|S )Nc                 S   r0   r   r+   r#   r   r   r   get      z"_ol_mystructtype_prop.<locals>.getr   r$   r   r   r   r   _ol_mystructtype_prop   r   r   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 rj   )r\   r]   rP   r   r.   )ro   r<   r=   objr   r   r   check   s   

z:TestStructRefExtending.test_overload_method.<locals>.check   r   py_funcr`   r$   r   ro   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 rj   )r\   r]   rP   r   r1   )r<   r=   r   r   r   r   r     s   
z=TestStructRefExtending.test_overload_attribute.<locals>.checkr   r$   r   r   r   r   r   r   test_overload_attribute  s
   
z.TestStructRefExtending.test_overload_attributeN)r   r   r   r   r   r   r   r   r   r      s    r   c                 C   s   t | |d}|S r?   r@   )ro   rp   structr   r   r   caching_test_make  s   r   c                 C   s
   |  |S r   )r.   )r   zr   r   r   caching_test_use  s   
r   c                   @   $   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 )N	CACHE_DIRerrorignore	typeguard)actionmodule)
r   r   r   
_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                    (     t| jd   t| jd d S )NrJ   r   rN   len
cache_hitscache_missesstatsr#   r   r   assert_cached%     zBTestStructRefCaching.test_structref_caching.<locals>.assert_cachedc                    r   )Nr   rJ   r   r   r#   r   r   assert_not_cached)  r   zFTestStructRefCaching.test_structref_caching.<locals>.assert_not_cachedc           	         s   t ddt}t ddt}tjd}d}d}|||}|||}|| | }|| | r< |j  |j d S |j |j d S )NT)cacher      )r   r   r   r\   randomr`   r   )	cached
check_make	check_user<   r=   factorr9   r   r   r   r   r$   r   r   r   -  s   



z:TestStructRefCaching.test_structref_caching.<locals>.checkF)r   Tr   )r$   r   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   OptionalrM   )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   r   r   r   )r    r   r   r   r   r   r   X  r/   zPolygonStruct.__new__c                 C   r!   r   )PolygonStruct_get_valuer#   r   r   r   r   [  r%   zPolygonStruct.valuec                 C   r!   r   )PolygonStruct_get_parentr#   r   r   r   r   _  r%   zPolygonStruct.parentN)r   r   r   r   r3   r   r   r   r   r   r   r   W  s    
r   c                 C   rB   r   r   r#   r   r   r   r   d  rE   r   c                 C   rB   r   )r   r#   r   r   r   r   i  rE   r   flipc                 C   r   )Nc                 S   s   | j d ur| j  | _ d S d S r   r   r#   r   r   r   r   w  s   
z%_ol_polygon_struct_flip.<locals>.implr   )r$   r   r   r   r   _ol_polygon_struct_flipu  s   r   c                 C   r   )Nc                 S   r0   r   )r   r   r#   r   r   r   r     r   z$_ol_polygon_struct_prop.<locals>.getr   r   r   r   r   _ol_polygon_struct_prop}  r   r   c                   @   r   )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   ro   polyp_polyr   r   r   r     s   

zCTestStructRefForwardTyping.test_same_type_assignment.<locals>.checkrk   r   r`   r   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   r     s   


z>TestStructRefForwardTyping.test_overload_method.<locals>.checkr   r   r   r   r   r   r     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   r1   )r   r   r   r   r     s   

zATestStructRefForwardTyping.test_overload_attribute.<locals>.checkr   r   r   r   r   r   r     s
   
z2TestStructRefForwardTyping.test_overload_attributeN)r   r   r   r   r   r   r   r   r   r   r     s    r   )6r   r   numpyr\   numbar   r   r   
numba.corer   numba.experimentalr   numba.extendingr   r   numba.tests.supportr	   r
   r   r   rU   rL   r   r^   r7   rV   r   r   r5   define_proxyr:   r8   r>   rA   r"   r&   r)   rF   rG   r   r   r   r   r   r   r   Anypolygon_struct_typer   r   r   r   r   r   r   r   r   r   <module>   s    








h

+



