B
      ›\a  ã               @   s   d dl mZmZmZ d dlZd dl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 G dd	„ d	eƒZG d
d„ deƒZedkrŒe	 ¡  dS )é    )Úprint_functionÚdivisionÚabsolute_importN)Újit)Úunittest_support)ÚTypingErrorÚNumbaWarningé   )ÚTestCaseÚtagc               @   sd   e Zd Zdd„ Zdd„ Zedƒdd„ ƒZdd	„ Zedƒd
d„ ƒZdd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚTestSelfRecursionc             C   s   ddl m} || _d S )Nr	   )Úrecursion_usecases)Ú r   Úmod)Úselfr   © r   ú9lib/python3.7/site-packages/numba/tests/test_recursion.pyÚsetUp   s    zTestSelfRecursion.setUpc             C   s   |   |dƒd¡ d S )Né
   é7   )ÚassertPreciseEqual)r   Úcfuncr   r   r   Ú	check_fib   s    zTestSelfRecursion.check_fibÚ	importantc             C   s   |   | jj¡ d S )N)r   r   Zfib1)r   r   r   r   Útest_global_explicit_sig   s    z*TestSelfRecursion.test_global_explicit_sigc             C   s   |   | jj¡ d S )N)r   r   Zfib2)r   r   r   r   Útest_inner_explicit_sig   s    z)TestSelfRecursion.test_inner_explicit_sigc             C   s   |   | jj¡ d S )N)r   r   Zfib3)r   r   r   r   Útest_global_implicit_sig   s    z*TestSelfRecursion.test_global_implicit_sigc          	   C   s8   |   t¡}| j d¡ W d Q R X |  dt|jƒ¡ d S )Né{   z#cannot type infer runaway recursion)ÚassertRaisesr   r   Zrunaway_selfÚassertInÚstrÚ	exception)r   Úraisesr   r   r   Útest_runaway"   s    zTestSelfRecursion.test_runawayc             C   s8   | j  ¡ }| j  tdd¡}d}|  ||Ž ||Ž ¡ d S )NT)Únopython)é   g      À?)r   Zmake_type_change_selfr   r   )r   Úpfuncr   Úargsr   r   r   Útest_type_change(   s    
z"TestSelfRecursion.test_type_changec          	   C   s8   |   t¡}| j d¡ W d Q R X |  t|jƒd¡ d S )Né   Ú
raise_self)r   Ú
ValueErrorr   r*   ÚassertEqualr    r!   )r   r"   r   r   r   Ú
test_raise.   s    zTestSelfRecursion.test_raisec             C   sB   | j  ¡ }| j  tdd¡}x dD ]}|  ||ƒ||ƒ¡ q"W d S )NT)r$   )r   é   r   é   )r   Zmake_optional_return_caser   r,   )r   r&   r   Úargr   r   r   Útest_optional_return4   s    

z&TestSelfRecursion.test_optional_returnN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r#   r(   r-   r1   r   r   r   r   r      s   r   c               @   sT   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zed	ƒd
d„ ƒZdd„ Z	dd„ Z
dd„ ZdS )ÚTestMutualRecursionc             C   s   ddl m} || _d S )Nr	   )r   )r   r   r   )r   r   r   r   r   r   =   s    zTestMutualRecursion.setUpc             C   s"   t  d¡}|  | j d¡|¡ d S )Nr   )ÚmathZ	factorialr   r   Z	outer_fac)r   Zexpectr   r   r   Útest_mutual_1A   s    
z!TestMutualRecursion.test_mutual_1c             C   sj   | j  ¡ \}}| j  tdd¡\}}x@dD ]8}|  ||d||d¡ |  ||dd||dd¡ q*W d S )NT)r$   )éÿÿÿÿr   r	   r)   )Úxr	   )ÚyÚz)r   Zmake_mutual2r   r   )r   ZpfooZpbarZcfooZcbarr9   r   r   r   Útest_mutual_2E   s
    
z!TestMutualRecursion.test_mutual_2c          	   C   s8   |   t¡}| j d¡ W d Q R X |  dt|jƒ¡ d S )Nr   z#cannot type infer runaway recursion)r   r   r   Zrunaway_mutualr   r    r!   )r   r"   r   r   r   r#   L   s    z TestMutualRecursion.test_runawayr   c             C   s8   | j  ¡ }| j  tdd¡}d}|  ||Ž ||Ž ¡ d S )NT)r$   )r%   g      À?)r   Zmake_type_change_mutualr   r   )r   r&   r   r'   r   r   r   r(   R   s    
z$TestMutualRecursion.test_type_changec             C   s8   | j  ¡ }| j  tdd¡}d}|  ||ƒ||ƒ¡ d S )NT)r$   é   )r   Zmake_four_levelr   r   )r   r&   r   r0   r   r   r   Útest_four_levelY   s    
z#TestMutualRecursion.test_four_levelc          	   C   sš   | j  tdd¡}|  t¡}|dƒ W d Q R X d}|  |t|jƒ¡ | j  t¡}| j  ¡ }t 	¡  tj
dtd |dƒ}W d Q R X |  ||dƒ¡ d S )NT)r$   é   zUnknown attribute 'ndim'Úignore)Úcategoryé   )r   Zmake_inner_errorr   r   r   r   r    r!   ÚwarningsÚcatch_warningsÚfilterwarningsr   r,   )r   r   r"   Úerrmsgr&   Zgotr   r   r   Útest_inner_error_   s    

z$TestMutualRecursion.test_inner_errorc          	   C   s>   | j  ¡ }|  t¡}|dƒ W d Q R X |  t|jƒd¡ d S )Nr?   Zraise_mutual)r   Zmake_raise_mutualr   r+   r,   r    r!   )r   r   r"   r   r   r   r-   o   s    
zTestMutualRecursion.test_raiseN)r2   r3   r4   r   r7   r<   r#   r   r(   r>   rG   r-   r   r   r   r   r5   ;   s   r5   Ú__main__)Z
__future__r   r   r   r6   rC   Znumbar   r   ZunittestZnumba.errorsr   r   Zsupportr
   r   r   r5   r2   Úmainr   r   r   r   Ú<module>   s   /<