U
    ,‰dÂ  ã                   @   sî   d dl Z d dlmZ d dlZd dlmZmZ d dlmZ d dlm	Z	 d dl
mZmZ d dlZzd dlZW n ek
r€   dZY nX zd dlZW n ek
r¦   dZY nX e edkd¡G dd	„ d	eƒƒZG d
d„ dejƒZedkrêe ¡  dS )é    N)ÚStringIO)Úcompile_isolatedÚFlags)Útypes)Únjit)Úoverride_configÚTestCasez#please install the 'jinja2' packagec                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Ze edkd¡d	d
„ ƒZ	dS )ÚTestAnnotationc                 C   sP   dd„ }t |tjtjgƒ}|j}tƒ }| |¡ | ¡ }| ¡  |  d|¡ dS )z4
        Ensures template.html is available
        c                 S   s   |}t | ƒD ]}||7 }q|S ©N©Úrange)ÚnÚaÚsÚi© r   ú@/tmp/pip-unpacked-wheel-eu7e0c37/numba/tests/test_annotations.pyÚfoo   s    
z3TestAnnotation.test_exercise_code_path.<locals>.foor   N)	r   r   Zint32Útype_annotationr   Úhtml_annotateÚgetvalueÚcloseÚassertIn)Úselfr   ÚcresÚtaÚbufÚoutputr   r   r   Útest_exercise_code_path   s    
z&TestAnnotation.test_exercise_code_pathc                    s†   dd„ ‰ ‡ fdd„}t ƒ }d|_d|_t|tjg|d}|j}tƒ }| |¡ | 	¡ }| 
¡  |  d|¡ |  d|¡ |  d	|¡ d
S )zM
        Ensures that lifted loops are handled correctly in obj mode
        c                 S   s   | S r
   r   )Úxr   r   r   Úbar2   s    zDTestAnnotation.test_exercise_code_path_with_lifted_loop.<locals>.barc                    sD   d}t | ƒD ]}|| }qt | ƒD ]}|| }q"| r@|ˆ | ƒ }|S )Ng        r   )r   Úhr   Úk©r    r   r   r   5   s    

zDTestAnnotation.test_exercise_code_path_with_lifted_loop.<locals>.fooT)Úflagsr    r   Z
LiftedLoopN)r   Zenable_pyobjectZenable_loopliftr   r   Zintpr   r   r   r   r   r   )r   r   r$   r   r   r   r   r   r#   r   Ú(test_exercise_code_path_with_lifted_loop-   s    
z7TestAnnotation.test_exercise_code_path_with_lifted_loopc           	      C   sH  t jdd„ ƒ}t dtj¡}tjf}| |¡ |j| }tƒ }|j	 
|¡ | ¡ }| ¡  |  | d¡d¡ d}|  | | |¡¡d¡ | jtt ||¡ƒdd||f d tjf}| |¡ |j| }tƒ }|j	 
|¡ | ¡ }| ¡  |  | d¡d	¡ |  | | |¡¡d¡ |  | | |¡¡d¡ |  tt ||¡ƒd	¡ d
S )zW
        Test some format and behavior of the html annotation with lifted loop
        c                 S   s$   t ƒ  d}t| ƒD ]}||7 }q|S )Nr   )Úobjectr   )r   Úzr   r   r   r   ÚudtS   s
    
z=TestAnnotation.test_html_output_with_lifted_loop.<locals>.udtz<td class="lifted_tag">\s*\s*<details>\s*<summary>\s*<code>\s*[0-9]+:\s*[&nbsp;]+for i in range\(x\):  # this line is tagged\s*zFunction name: udté   z!with signature: {} -&gt; pyobjectz%s not found in %s)Úmsgé   N)ÚnumbaZjitÚreÚcompileÚ	MULTILINEr   Zint64Z	overloadsr   r   r   r   r   ÚassertEqualÚcountÚformatÚlenÚfindallZfloat64)	r   r(   Zre_lifted_tagZsig_i64r   r   r   ZsigfmtZsig_f64r   r   r   Ú!test_html_output_with_lifted_loopO   s<    
ù



ÿ

z0TestAnnotation.test_html_output_with_lifted_loopNz%please install the 'pygments' packagec              	   C   s^   t jdd„ ƒ}|ddƒ |jdd |  t¡}|jddd W 5 Q R X |  d	t|jƒ¡ d S )
Nc                 S   s   | |fS r
   r   )r   Úyr   r   r   r   Ž   s    z-TestAnnotation.test_pretty_print.<locals>.foor)   r+   T)Úprettyzshould be None)r7   Úfilez$`file` must be None if `pretty=True`)r,   r   Úinspect_typesÚassertRaisesÚ
ValueErrorr   ÚstrÚ	exception)r   r   Zraisesr   r   r   Útest_pretty_print‹   s    

ÿz TestAnnotation.test_pretty_print)
Ú__name__Ú
__module__Ú__qualname__r   r%   r5   ÚunittestÚskipIfÚpygmentsr>   r   r   r   r   r	      s
   "<r	   c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚTestTypeAnnotationc                 C   s4   t |ƒD ]\}}||kr|  S qtd |¡ƒ‚d S )Nzcan't find {!r})Ú	enumerater;   r2   )r   ÚlinesÚpatr   Úlnr   r   r   Ú
findpatlocŸ   s    
zTestTypeAnnotation.findpatlocc                 C   s   t ƒ }| |¡ | ¡  ¡ S r
   )r   r9   r   Ú
splitlines)r   ÚfuncZstrbufr   r   r   Úgetlines¥   s    
zTestTypeAnnotation.getlinesc                 C   sn   t jdd„ ƒ}|ddƒ |  |¡}|  |d¡}|  |d¡}|  |d¡}|  |d¡}|  ||¡ |  ||¡ d S )	Nc                 S   s   | | S r
   r   )ZappleorangeZberrycherryr   r   r   r   «   s    z+TestTypeAnnotation.test_delete.<locals>.foor)   r+   z&appleorange = arg(0, name=appleorange)z&berrycherry = arg(1, name=berrycherry)zdel appleorangezdel berrycherry)r,   r   rM   rJ   Ú
assertLess)r   r   rG   ÚsaÚsbZeaZebr   r   r   Útest_deleteª   s    


zTestTypeAnnotation.test_deletec              	   C   sŽ   t d|ƒ* tdd„ ƒ}d}||ƒ}|  ||¡ W 5 Q R X |  |¡}|  |d¡}|  |d¡}|  |d¡}|  |d¡}	|  |d	¡}
||||	|
fS )
NZEXTEND_VARIABLE_LIFETIMESc                 S   s   | }|S r
   r   )r   Úbr   r   r   r   ¿   s    z/TestTypeAnnotation._lifetimes_impl.<locals>.fooé
   za = arg(0, name=a)zb = azcast(value=b)zdel azdel b)r   r   r0   rM   rJ   )r   Úextendr   r   rR   rG   rO   rP   Úcast_retÚdelaÚdelbr   r   r   Ú_lifetimes_impl½   s    

z"TestTypeAnnotation._lifetimes_implc                 C   sJ   | j dd\}}}}}|  ||¡ |  ||¡ |  ||¡ |  ||¡ d S )Nr   ©rT   ©rX   rN   ZassertGreater©r   rO   rP   rU   rV   rW   r   r   r   Útest_delete_standard_lifetimesÓ   s
    z1TestTypeAnnotation.test_delete_standard_lifetimesc                 C   sJ   | j dd\}}}}}|  ||¡ |  ||¡ |  ||¡ |  ||¡ d S )Nr)   rY   rZ   r[   r   r   r   Útest_delete_extended_lifetimesæ   s
    z1TestTypeAnnotation.test_delete_extended_lifetimesN)	r?   r@   rA   rJ   rM   rQ   rX   r\   r]   r   r   r   r   rE      s   rE   Ú__main__)r-   Úior   r,   Znumba.core.compilerr   r   Z
numba.corer   r   Znumba.tests.supportr   r   rB   Zjinja2ÚImportErrorrD   rC   r	   rE   r?   Úmainr   r   r   r   Ú<module>   s*   

 ]