o
    8ήc!                     @   sx   d dl Z d dlZd dlmZ d dlmZmZ d dlmZ d dl	Z	G dd deZ
G dd deZed	kr:e	  dS dS )
    N)jit)TypingErrorNumbaWarning)TestCasec                   @   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	dd Z
dd Zdd ZdS )TestSelfRecursionc                 C      ddl m} || _d S Nr   )recursion_usecasesnumba.testsr	   modselfr	    r   A/tmp/pip-target-vg8gfxp4/lib/python/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_fibc                 C      |  | jj d S N)r   r   fib1r   r   r   r   test_global_explicit_sig      z*TestSelfRecursion.test_global_explicit_sigc                 C   r   r   )r   r   fib2r   r   r   r   test_inner_explicit_sig   r   z)TestSelfRecursion.test_inner_explicit_sigc                 C   r   r   )r   r   fib3r   r   r   r   test_global_implicit_sig   r   z*TestSelfRecursion.test_global_implicit_sigc                 C   L   |  t}| jd W d    n1 sw   Y  | dt|j d S N{   z#cannot type infer runaway recursion)assertRaisesr   r   runaway_selfassertInstr	exceptionr   raisesr   r   r   test_runaway      zTestSelfRecursion.test_runawayc                 C   8   | j  }| j tdd}d}| || ||  d S NTnopython)   g      ?)r   make_type_change_selfr   r   r   pfuncr   argsr   r   r   test_type_change$      
z"TestSelfRecursion.test_type_changec                 C   sL   |  t}| jd W d    n1 sw   Y  | t|jd d S )N   
raise_self)r$   
ValueErrorr   r9   assertEqualr'   r(   r)   r   r   r   
test_raise*   s   zTestSelfRecursion.test_raisec                 C   s>   | j  }| j tdd}dD ]}| |||| qd S )NTr/   )r      r      )r   make_optional_return_caser   r;   r   r4   r   argr   r   r   test_optional_return0   s
   
z&TestSelfRecursion.test_optional_returnc                 C   sZ   | j tdd}| t}|d W d    n1 sw   Y  | dt|j d S )NTr/   d   z3Return type of recursive function does not converge)r   make_growing_tuple_caser   r$   r   r&   r'   r(   r   r   r*   r   r   r   test_growing_return_tuple6   s   
z+TestSelfRecursion.test_growing_return_tupleN)__name__
__module____qualname__r   r   r   r   r    r+   r6   r<   rB   rF   r   r   r   r   r   
   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 )TestMutualRecursionc                 C   r   r   r
   r   r   r   r   r   B   s   
zTestMutualRecursion.setUpc                 C   s"   t d}| | jd| d S )Nr   )math	factorialr   r   	outer_fac)r   expectr   r   r   test_mutual_1F   s   
z!TestMutualRecursion.test_mutual_1c                 C   sf   | j  \}}| j tdd\}}dD ]}| ||d||d | ||dd||dd qd S )NTr/   )r      r8   )xrQ   )yz)r   make_mutual2r   r   )r   pfoopbarcfoocbarrR   r   r   r   test_mutual_2J   s   z!TestMutualRecursion.test_mutual_2c                 C   r!   r"   )r$   r   r   runaway_mutualr&   r'   r(   r)   r   r   r   r+   Q   r,   z TestMutualRecursion.test_runawayc                 C   r-   r.   )r   make_type_change_mutualr   r   r3   r   r   r   r6   W   r7   z$TestMutualRecursion.test_type_changec                 C   s8   | j  }| j tdd}d}| |||| d S )NTr/      )r   make_four_levelr   r   r@   r   r   r   test_four_level]   r7   z#TestMutualRecursion.test_four_levelc                 C   s   | j tdd}| t}|d W d    n1 sw   Y  d}| |t|j | j t}| j  }t	  tj
dtd |d}W d    n1 sRw   Y  | ||d d S )NTr/      zUnknown attribute 'ndim'ignore)category   )r   make_inner_errorr   r$   r   r&   r'   r(   warningscatch_warningsfilterwarningsr   r;   )r   r   r*   errmsgr4   gotr   r   r   test_inner_errorc   s   



z$TestMutualRecursion.test_inner_errorc                 C   sR   | j  }| t}|d W d    n1 sw   Y  | t|jd d S )Nr`   raise_mutual)r   make_raise_mutualr$   r:   r;   r'   r(   rE   r   r   r   r<   s   s
   

zTestMutualRecursion.test_raiseN)rG   rH   rI   r   rO   rZ   r+   r6   r_   rj   r<   r   r   r   r   rJ   @   s    rJ   __main__)rK   re   numbar   numba.core.errorsr   r   numba.tests.supportr   unittestr   rJ   rG   mainr   r   r   r   <module>   s    6;