U
    iâËdÔ-  ã                   @   s¸   d dl 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	m
Z
 d dlmZ d dlmZ d dlmZmZmZmZmZ d dlmZ G d	d
„ d
eƒZG dd„ deƒZedkr´e ¡  dS )é    N)ÚTestCase©Únjit)ÚtypesÚerrorsÚcgutils©Ú	signature)Úmodels)ÚoverloadÚSentryLiteralArgsÚoverload_methodÚregister_modelÚ	intrinsic©Ú	literallyc                   @   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ejdd„ ƒZej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 )&ÚTestLiteralDispatchc                 C   sR   t dd„ ƒ}|D ]}|  ||ƒ|¡ qt||jƒD ]\}}|  |d j|¡ q2d S )Nc                 S   s   t | ƒS ©Nr   ©Úx© r   úZ/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/tests/test_literal_dispatch.pyÚfoo   s    z4TestLiteralDispatch.check_literal_basic.<locals>.foor   )r   ÚassertEqualÚzipÚ
signaturesÚliteral_value)ÚselfZliteral_argsr   ÚlitÚsigr   r   r   Úcheck_literal_basic   s    
z'TestLiteralDispatch.check_literal_basicc                 C   s    |   ddg¡ |   ddg¡ d S )Né{   éA  ÚabcZcb123)r    ©r   r   r   r   Útest_literal_basic   s    z&TestLiteralDispatch.test_literal_basicc                    s�   t dd„ ƒ‰ t ‡ fdd„ƒ}d\}}|  |||ƒ|d | ¡ ˆ j\}|  |d t |¡¡ |j\}|  |d t |¡¡ |  |d tj¡ d S )	Nc                 S   s   t | ƒd S )Né   r   r   r   r   r   r   "   s    z4TestLiteralDispatch.test_literal_nested.<locals>.fooc                    s   ˆ | ƒ| S r   r   )Úyr   ©r   r   r   Úbar&   s    z4TestLiteralDispatch.test_literal_nested.<locals>.bar)é   é   r&   r   é   )r   r   r   r   ÚliteralÚassertNotIsInstanceÚLiteral)r   r)   r'   r   Úfoo_sigZbar_sigr   r(   r   Útest_literal_nested!   s    
z'TestLiteralDispatch.test_literal_nestedc                    sH   dd l ‰ t‡ fdd„ƒ}|  |dƒd¡ |  |jd d t d¡¡ d S )Nr   c                    s
   ˆ   | ¡S r   r   r   ©Únumbar   r   r   6   s    z7TestLiteralDispatch.test_literally_freevar.<locals>.foor!   )r3   r   r   r   r   r-   ©r   r   r   r2   r   Útest_literally_freevar2   s
    z*TestLiteralDispatch.test_literally_freevarc                 C   s¸   dd„ }|dd„ ƒ\}}|t ƒ\}}|  |ddƒ|ddƒ¡ |  |jd d jd¡ |  |jd d jd¡ |  |d	d
ƒ|d	d
ƒ¡ |  |jd d jd
¡ |  |jd d jd
¡ d S )Nc                    s(   | ‡ fdd„ƒ‰| ‡fdd„ƒ‰ ˆˆ fS )Nc                    s   | dk r|S | ˆ | d |ƒ S ©Nr,   r   ©ÚnÚvalue)Ú	inner_facr   r   Ú	outer_fac?   s    z[TestLiteralDispatch.test_mutual_recursion_literal.<locals>.get_functions.<locals>.outer_facc                    s"   | dk rt |ƒS | ˆ | d |ƒ S r6   r   r7   )r;   r   r   r:   E   s    z[TestLiteralDispatch.test_mutual_recursion_literal.<locals>.get_functions.<locals>.inner_facr   )Zdecorr   )r:   r;   r   Úget_functions>   s
    zHTestLiteralDispatch.test_mutual_recursion_literal.<locals>.get_functionsc                 S   s   | S r   r   r   r   r   r   Ú<lambda>M   ó    zCTestLiteralDispatch.test_mutual_recursion_literal.<locals>.<lambda>é
   é   r   r,   é   é   )r   r   r   r   )r   r<   Zref_outer_facZref_inner_facr;   r:   r   r   r   Útest_mutual_recursion_literal=   s    z1TestLiteralDispatch.test_mutual_recursion_literalc                    sp   t ‡ fdd„ƒ}t dd„ ƒ‰ tdddd�}|f |Ž}d	d
„ f |Ž}|  ||¡ |j\}|  |d t d¡¡ d S )Nc                    s
   ˆ | |ƒS r   r   ©ÚaÚbÚc©Úinnerr   r   r   Y   s    z>TestLiteralDispatch.test_literal_nested_multi_arg.<locals>.fooc                 S   s   | t |ƒ S r   r   ©r   r'   r   r   r   rI   ]   s    z@TestLiteralDispatch.test_literal_nested_multi_arg.<locals>.innerr,   r&   r*   rD   c                 S   s   | | S r   r   rD   r   r   r   r=   c   r>   zCTestLiteralDispatch.test_literal_nested_multi_arg.<locals>.<lambda>)r   Údictr   r   r   r-   )r   r   ÚkwargsÚgotÚexpectr0   r   rH   r   Útest_literal_nested_multi_argX   s    

z1TestLiteralDispatch.test_literal_nested_multi_argc              	      sb   t ‡ fdd„ƒ}t dd„ ƒ‰ t d¡}|  tj¡�}|dd|d� W 5 Q R X |  d	t|jƒ¡ d S )
Nc                    s
   ˆ | |ƒS r   r   rD   rH   r   r   r   i   s    z>TestLiteralDispatch.test_unsupported_literal_type.<locals>.fooc                 S   s   | t |ƒ S r   r   rJ   r   r   r   rI   m   s    z@TestLiteralDispatch.test_unsupported_literal_type.<locals>.innerr?   r,   r&   rD   znumpy.ndarray)	r   ÚnpZarangeÚassertRaisesr   ÚLiteralTypingErrorÚassertInÚstrÚ	exception)r   r   ZarrÚraisesr   rH   r   Útest_unsupported_literal_typeh   s    

z1TestLiteralDispatch.test_unsupported_literal_typec                    s¦   t ‡ fdd„ƒ}t dd„ ƒ‰ tdddd�}|f |Ž}d	d
„ f |Ž}|  ||¡ |j\\}}}|  |tj¡ |  |tj¡ |  |jd¡ |  |tj¡ |  |jd¡ d S )Nc                    s   ˆ | |ƒˆ ||ƒ S r   r   rD   rH   r   r   r   x   s    z/TestLiteralDispatch.test_biliteral.<locals>.fooc                 S   s   | t |ƒ S r   r   rJ   r   r   r   rI   |   s    z1TestLiteralDispatch.test_biliteral.<locals>.innerr,   r&   r*   rD   c                 S   s   | | | | S r   r   rD   r   r   r   r=   ‚   r>   z4TestLiteralDispatch.test_biliteral.<locals>.<lambda>©	r   rK   r   r   r.   r   r/   ÚassertIsInstancer   ©r   r   rL   rM   rN   Útype_aÚtype_bZtype_cr   rH   r   Útest_biliteralv   s    

z"TestLiteralDispatch.test_biliteralc              	      sx   t dd„ ƒ‰ |  tj¡� ˆ dddƒ W 5 Q R X t ‡ fdd„ƒ}|  tj¡�}|ddƒ W 5 Q R X |  dt|jƒ¡ d S )	Nc                 W   s   t |ƒS r   r   )rE   Úargsr   r   r   r   Œ   s    z7TestLiteralDispatch.test_literally_varargs.<locals>.foor,   r&   r*   c                    s   ˆ | |ƒ d S r   r   ©rE   rF   r(   r   r   r)   “   s    z7TestLiteralDispatch.test_literally_varargs.<locals>.barzCannot request literal type)r   rQ   r   rR   ÚTypingErrorrS   rT   rU   )r   r)   rV   r   r(   r   Útest_literally_varargs‹   s    
þz*TestLiteralDispatch.test_literally_varargsc                 C   s   t ddd„ƒ}|dd� d S )Nr,   c                 S   s   | t |ƒfS r   r   r_   r   r   r   r   ¡   s    z8TestLiteralDispatch.test_literally_defaults.<locals>.foo©rE   )r,   r   r4   r   r   r   Útest_literally_defaultsž   s    z+TestLiteralDispatch.test_literally_defaultsc                    s*   t ddd„ƒ‰ t ‡ fdd„ƒ}|dƒ d S )Nr,   c                 S   s   | t |ƒfS r   r   r_   r   r   r   r   ©   s    z>TestLiteralDispatch.test_literally_defaults_inner.<locals>.fooc                    s   ˆ | ƒd S r6   r   rb   r(   r   r   r)   ­   s    z>TestLiteralDispatch.test_literally_defaults_inner.<locals>.bar)r,   r   )r   r)   r   r(   r   Útest_literally_defaults_inner¦   s
    z1TestLiteralDispatch.test_literally_defaults_innerc                 C   sB   t dd„ ƒ}|dƒ}|  || d¡¡ |  |jd d tj¡ d S )Nc                 S   s
   t  | ¡S r   )r3   r   r   r   r   r   r   µ   s    z;TestLiteralDispatch.test_literally_from_module.<locals>.foor!   r   )r   r   Úpy_funcrY   r   r   r/   )r   r   rM   r   r   r   Útest_literally_from_module³   s
    
z.TestLiteralDispatch.test_literally_from_modulec              	   C   sD   t dd„ ƒ}|  tj¡�}|ddƒ W 5 Q R X |  dt|jƒ¡ d S )Nc                 S   s   t d|  ƒS r6   r   r_   r   r   r   r   ¾   s    z1TestLiteralDispatch.test_non_literal.<locals>.foor,   r&   zInvalid use of non-Literal type)r   rQ   r   r`   rS   rT   rU   )r   r   rV   r   r   r   Útest_non_literal½   s    
þz$TestLiteralDispatch.test_non_literalc                    sT   t dd„ ƒ‰ ˆ ddƒ}|  |ˆ  dd¡¡ t ‡ fdd„ƒ}|ƒ }|  || ¡ ¡ d S )Nc                 S   s   d}| t |ƒ t |ƒ S )Niè  r   )rE   rF   Úvr   r   r   r   Ë   s    z5TestLiteralDispatch.test_inlined_literal.<locals>.foor,   r&   c                     s   d} d}ˆ || d�S )Néd   é	   r_   r   r_   r(   r   r   r)   Ó   s    z5TestLiteralDispatch.test_inlined_literal.<locals>.bar)r   r   re   )r   rM   r)   r   r(   r   Útest_inlined_literalÉ   s    

z(TestLiteralDispatch.test_inlined_literalc                    s¦   t ‡ fdd„ƒ}t dd„ ƒ‰ tdddd�}|f |Ž}d	d
„ f |Ž}|  ||¡ |j\\}}}|  |tj¡ |  |tj¡ |  |jd¡ |  |tj¡ |  |jd¡ d S )Nc                    s   ‡ ‡‡fdd„}||ƒS )Nc                    s   t | ƒdˆˆ ˆƒ  S ©Nr?   r   )Úd)rE   rF   rI   r   r   Úclosureß   s    zGTestLiteralDispatch.test_aliased_variable.<locals>.foo.<locals>.closurer   )rE   rF   rG   rn   rH   r_   r   r   Ý   s    z6TestLiteralDispatch.test_aliased_variable.<locals>.fooc                 S   s   | t |ƒ S r   r   rJ   r   r   r   rI   ä   s    z8TestLiteralDispatch.test_aliased_variable.<locals>.innerr,   r&   r*   rD   c                 S   s   |d| |   S rl   r   rD   r   r   r   r=   ê   r>   z;TestLiteralDispatch.test_aliased_variable.<locals>.<lambda>rX   rZ   r   rH   r   Útest_aliased_variableÜ   s    

z)TestLiteralDispatch.test_aliased_variablec                    sŠ   dd„ ‰ t ˆ ƒ‡fdd„ƒ‰t‡ fdd„ƒ}d}d}|||ƒ}|  ||| ¡ |jd	 \}}|  |tj¡ |  |j|¡ |  |tj¡ d S )
Nc                 S   s   | | S r   r   rJ   r   r   r   Údo_thisö   s    z;TestLiteralDispatch.test_overload_explicit.<locals>.do_thisc                    s    t dgƒ ˆ ¡ | |¡ dd„ S )Nr   c                 S   s   | | S r   r   rJ   r   r   r   r=   ü   r>   zPTestLiteralDispatch.test_overload_explicit.<locals>.ov_do_this.<locals>.<lambda>)r   Zfor_functionÚbindrJ   )Ú
ov_do_thisr   r   rr   ù   s    z>TestLiteralDispatch.test_overload_explicit.<locals>.ov_do_thisc                    s
   ˆ | |ƒS r   r   r_   ©rp   r   r   r   þ   s    z7TestLiteralDispatch.test_overload_explicit.<locals>.foor!   r"   r   )	r   r   r   r   rY   r   r/   r   r.   )r   r   rE   rF   Úrr[   r\   r   )rp   rr   r   Útest_overload_explicitó   s    
z*TestLiteralDispatch.test_overload_explicitc                    s–   dd„ ‰ t dd„ ƒ‰tˆ ƒ‡fdd„ƒ}t ‡ fdd„ƒ}d	}d
}|||ƒ}|  ||| ¡ |jd \}}|  |tj¡ |  |j|¡ |  |tj¡ d S )Nc                 S   s   | | S r   r   rJ   r   r   r   rp     s    z;TestLiteralDispatch.test_overload_implicit.<locals>.do_thisc                 S   s   t | ƒ| S r   r   rJ   r   r   r   Úhidden  s    z:TestLiteralDispatch.test_overload_implicit.<locals>.hiddenc                    s   t | tjƒr‡ fdd„S d S )Nc                    s
   ˆ | |ƒS r   r   rJ   ©rv   r   r   r=     r>   zPTestLiteralDispatch.test_overload_implicit.<locals>.ov_do_this.<locals>.<lambda>)Ú
isinstancer   ÚIntegerrJ   rw   r   r   rr     s    z>TestLiteralDispatch.test_overload_implicit.<locals>.ov_do_thisc                    s
   ˆ | |ƒS r   r   r_   rs   r   r   r     s    z7TestLiteralDispatch.test_overload_implicit.<locals>.foor!   r"   r   )	r   r   r   r   rY   r   r/   r   r.   )r   rr   r   rE   rF   rt   r[   r\   r   ©rp   rv   r   Útest_overload_implicit  s    

z*TestLiteralDispatch.test_overload_implicitc              	      sr   dd„ ‰ t dd„ ƒ‰tˆ ƒ‡fdd„ƒ}t ‡ fdd„ƒ}|  tj¡�}|d	d
d� W 5 Q R X |  dt|jƒ¡ d S )Nc                 S   s   | | S r   r   rJ   r   r   r   rp   .  s    z=TestLiteralDispatch.test_overload_error_loop.<locals>.do_thisc                 S   s   t | ƒ| S r   r   rJ   r   r   r   rv   1  s    z<TestLiteralDispatch.test_overload_error_loop.<locals>.hiddenc                    s,   t |tjƒrt d¡‚n‡ fdd„}|S d S )NZoopsc                    s
   ˆ | |ƒS r   r   rJ   rw   r   r   Úimpl<  s    zNTestLiteralDispatch.test_overload_error_loop.<locals>.ov_do_this.<locals>.impl)rx   r   ZIntegerLiteralr   ZNumbaValueError)r   r'   r|   rw   r   r   rr   5  s    z@TestLiteralDispatch.test_overload_error_loop.<locals>.ov_do_thisc                    s   ˆ | t |ƒƒS r   r   r_   rs   r   r   r   @  s    z9TestLiteralDispatch.test_overload_error_loop.<locals>.foor!   r"   r_   zRepeated literal typing request)r   r   rQ   r   ZCompilerErrorrS   rT   rU   )r   rr   r   rV   r   rz   r   Útest_overload_error_loop)  s    

ÿz,TestLiteralDispatch.test_overload_error_loopN)Ú__name__Ú
__module__Ú__qualname__r    r%   r1   r5   rC   rO   rW   r]   ra   ÚunittestZexpectedFailurerc   rd   rf   rg   rk   ro   ru   r{   r}   r   r   r   r   r      s(   


r   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú!TestLiteralDispatchWithCustomTypec                    sp   G dd„ dt ƒ}G ‡ fdd„dtjƒ‰ tˆ ƒG ‡fdd„dtjƒƒ‰t‡ fdd„ƒ‰t|ƒ‡fd	d
„ƒ}ˆ |fS )Nc                   @   s   e Zd Zdd„ ZdS )z@TestLiteralDispatchWithCustomType.make_dummy_type.<locals>.Dummyc                 S   s   |S r   r   ©r   rE   r   r   r   r   O  s    zDTestLiteralDispatchWithCustomType.make_dummy_type.<locals>.Dummy.litN)r~   r   r€   r   r   r   r   r   ÚDummyN  s   r„   c                       s   e Zd Z‡‡ fdd„Z‡  ZS )zDTestLiteralDispatchWithCustomType.make_dummy_type.<locals>.DummyTypec                    s   t ˆ | ƒjdd� d S )NÚdummy)Úname©ÚsuperÚ__init__r$   )Ú	DummyTypeÚ	__class__r   r   r‰   S  s    zMTestLiteralDispatchWithCustomType.make_dummy_type.<locals>.DummyType.__init__©r~   r   r€   r‰   Ú__classcell__r   ©rŠ   ©r‹   r   rŠ   R  s   rŠ   c                       s   e Zd Z‡‡ fdd„Z‡  ZS )zITestLiteralDispatchWithCustomType.make_dummy_type.<locals>.DummyTypeModelc                    s   g }t ˆ | ƒ |||¡ d S r   r‡   )r   ZdmmZfe_typeÚmembers)ÚDummyTypeModelr‹   r   r   r‰   X  s    zRTestLiteralDispatchWithCustomType.make_dummy_type.<locals>.DummyTypeModel.__init__rŒ   r   )r‘   r�   r   r‘   V  s   r‘   c                    s   dd„ }t ˆ ƒ ƒ}||fS )Nc                 S   s   t  |j¡| |ƒ}| ¡ S r   )r   Zcreate_struct_proxyÚreturn_typeZ	_getvalue)ÚcontextZbuilderr	   r^   r…   r   r   r   Úcodegen^  s    ÿ ÿzVTestLiteralDispatchWithCustomType.make_dummy_type.<locals>.init_dummy.<locals>.codegenr   )Z	typingctxr”   r   rŽ   r   r   Ú
init_dummy\  s    
zETestLiteralDispatchWithCustomType.make_dummy_type.<locals>.init_dummyc                     s   ‡ fdd„} | S )Nc                      s   ˆ ƒ S r   r   r   ©r•   r   r   Úctori  s    zWTestLiteralDispatchWithCustomType.make_dummy_type.<locals>.dummy_overload.<locals>.ctorr   )r—   r–   r   r   Údummy_overloadg  s    zITestLiteralDispatchWithCustomType.make_dummy_type.<locals>.dummy_overload)Úobjectr   ÚTyper   r
   ZStructModelr   r   )r   r„   r˜   r   )rŠ   r‘   r•   r   Úmake_dummy_typeM  s    
z1TestLiteralDispatchWithCustomType.make_dummy_typec              	      s„   |   ¡ \}‰ t|dƒdd„ ƒ}t‡ fdd„ƒ‰|  ˆdƒd¡ t‡fdd„ƒ}|  tj¡�}|d	ƒ W 5 Q R X |  d
t|j	ƒ¡ d S )Nr   c                 S   s   dd„ }|S )Nc                 S   s   t |ƒS r   r   rƒ   r   r   r   r|   v  s    zZTestLiteralDispatchWithCustomType.test_overload_method.<locals>.lit_overload.<locals>.implr   )r   rE   r|   r   r   r   Úlit_overloadt  s    zLTestLiteralDispatchWithCustomType.test_overload_method.<locals>.lit_overloadc                    s   ˆ ƒ }|  | ¡S r   )r   )rE   rm   )r„   r   r   Ú	test_impl{  s    zITestLiteralDispatchWithCustomType.test_overload_method.<locals>.test_implé   c                    s   ˆ | d ƒS r6   r   rb   )r�   r   r   Úinside…  s    zFTestLiteralDispatchWithCustomType.test_overload_method.<locals>.insideé   zCannot request literal type.)
r›   r   r   r   rQ   r   r`   rS   rT   rU   )r   rŠ   rœ   rŸ   rV   r   )r„   r�   r   Útest_overload_methodp  s    
z6TestLiteralDispatchWithCustomType.test_overload_methodN)r~   r   r€   r›   r¡   r   r   r   r   r‚   L  s   #r‚   Ú__main__)ÚnumpyrP   r3   r�   Znumba.tests.supportr   r   Z
numba.corer   r   r   Znumba.core.typingr	   Znumba.core.datamodelr
   Znumba.core.extendingr   r   r   r   r   Znumba.misc.specialr   r   r‚   r~   Úmainr   r   r   r   Ú<module>   s     >C