U
    ,d[                     @   s   d Z ddl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Zeddd	d
 Zdd Zeddd&ddZdd Zeddd'ddZdd Zdd Zedddd Zdd Zeddd(dd Zd!d" ZG d#d$ d$e	Zed%k re  dS ))zd
Test problems in nested calls.
Usually due to invalid type conversion between function boundaries.
    )int32int64)jitgenerated_jit)types)TestCasetagNTZnopythonc                 C   s
   | ||fS N abcr   r   A/tmp/pip-unpacked-wheel-eu7e0c37/numba/tests/test_nested_calls.pyf_inner   s    r   c                 C   s   t | ||dS )N)r   r   )r   xyzr   r   r   f   s    r         c                 C   s
   | ||fS r
   r   r   r   r   r   g_inner   s    r   c                 C   s   t | |dt || dfS )N)r   )r   r   )r   r   r   r   r   g   s    r      c                 G   s   | |fS r
   r   r   r   r   r   r   
star_inner   s    r   c                 C   s   t | dt | ||fS )N)r   r   r   r   r   r   star    s    r   c                 C   s   t | f| t | fS r
   r   r   r   r   r   	star_call#   s    r    c                 C   s   |rt d} | S )Nr   )r   r   r   r   r   argcast_inner&   s    r!   c                 C   s   t t| |S r
   )r!   r   r   r   r   r   argcast-   s    r"      c                 C   s"   t | tjrdd }ndd }|S )Nc                 S   s   | | |fS r
   r   r   r   r   r   impl3   s    zgenerated_inner.<locals>.implc                 S   s   | | |fS r
   r   r   r   r   r   r$   6   s    )
isinstancer   Complex)r   r   r   r$   r   r   r   generated_inner0   s    
r'   c                 C   s   t | |dS )N)r   )r'   r   r   r   r   call_generated:   s    r(   c                   @   sl   e Zd ZdddZdd ZdddZdd	 Zdd
dZdd Zdd Z	dddZ
dd Zdd Zdd ZdS )TestNestedCallFc                    s>    fdd}|rt ddnt dd}tf |  |fS )Nc                     s$   | |} | |} || d S r
   )assertPreciseEqual)argskwargsexpectedresultr   pyfuncselfr   r   checkA   s    

z*TestNestedCall.compile_func.<locals>.checkT)Zforceobjr	   )dictr   )r1   r0   objmoder2   flagsr   r/   r   compile_func@   s    zTestNestedCall.compile_funcc                    sH   t dddd  t dd fdd}| |d | |d d S )NTr	   c                 S   s   |  S r
   r   r   r   r   r   innerJ   s    z1TestNestedCall.test_boolean_return.<locals>.innerc                    s    | rdS dS d S )NTFr   r7   r8   r   r   outerN   s    z1TestNestedCall.test_boolean_return.<locals>.outerF)r   ZassertFalse
assertTrue)r1   r:   r   r9   r   test_boolean_returnI   s    
z"TestNestedCall.test_boolean_returnc                 C   s.   |  t|\}}|ddd |dddd dS )zM
        Test a nested function call with named (keyword) arguments.
           r   r   r   r   N)r6   r   r1   r4   cfuncr2   r   r   r   test_named_argsX   s    zTestNestedCall.test_named_argsc                 C   s   | j dd d S NT)r4   )rA   r1   r   r   r   test_named_args_objmode`   s    z&TestNestedCall.test_named_args_objmodec                 C   s.   |  t|\}}|ddd |dddd dS )zL
        Test a nested function call using default argument values.
        r=   r   r   r>   N)r6   r   r?   r   r   r   test_default_argsc   s    z TestNestedCall.test_default_argsc                 C   s   | j dd d S rB   )rE   rC   r   r   r   test_default_args_objmodek   s    z(TestNestedCall.test_default_args_objmodec                 C   s   |  t\}}|ddd dS )zX
        Test a nested function call to a function with *args in its signature.
        r=   r   r   N)r6   r   r1   r@   r2   r   r   r   test_star_argsn   s    zTestNestedCall.test_star_argsc                 C   s    |  t|\}}|ddd dS )z4
        Test a function call with a *args.
        r=   )r   )r   N)r6   r    r?   r   r   r   test_star_callu   s    zTestNestedCall.test_star_callc                 C   s   | j dd d S rB   )rI   rC   r   r   r   test_star_call_objmode|   s    z%TestNestedCall.test_star_call_objmodec                 C   s&   |  t\}}|dd |dd dS )zm
        Issue #1488: implicitly casting an argument variable should not
        break nested calls.
        r=   r   N)r6   r"   rG   r   r   r   test_argcast   s    
zTestNestedCall.test_argcastc                 C   s6   t ddt}| |ddd | |ddd dS )	zJ
        Test a nested function call to a generated jit function.
        Tr	   r=   r   )r   y              ?)y      @      ?r   N)r   r(   r*   )r1   r@   r   r   r   test_call_generated   s    z"TestNestedCall.test_call_generatedN)F)F)F)F)__name__
__module____qualname__r6   r<   rA   rD   rE   rF   rH   rI   rJ   rK   rM   r   r   r   r   r)   >   s   
	


	r)   __main__)r   r   )r   )r   r#   )__doc__Znumbar   r   r   r   Z
numba.corer   Znumba.tests.supportr   r   Zunittestr   r   r   r   r   r   r    r!   r"   r'   r(   r)   rN   mainr   r   r   r   <module>   s0   

	S
