o
    ¦¸¢i¯  ã                   @   sl   d dl Z 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	 G dd„ deƒZ
edkr4e  ¡  dS dS )é    N©Únjit)ÚTestCase)Úget_func_body_first_linenoc                   @   s˜   e Zd 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d„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$S )%ÚTestFirstLineFinderz‚
    The following methods contains tests that are sensitive to the source
    locations w.r.t. the beginning of each method.
    c                 C   s   t  ¡ }t  |¡}|d jjS )Né   )ÚinspectÚcurrentframeÚgetouterframesÚframeÚf_code)Úselfr   Úcaller_frame© r   ú^/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/numba/tests/test_firstlinefinder.pyÚ_get_grandparent_caller_code   s   
z0TestFirstLineFinder._get_grandparent_caller_codec                 C   s"   |   ¡ }|j}|  ||| ¡ d S ©N)r   Úco_firstlinenoÚassertEqual)r   ÚexpectedÚoffset_from_callerÚgrandparent_coÚlnor   r   r   Úassert_line_location   s   z(TestFirstLineFinder.assert_line_locationc                 C   ó$   t dd„ ƒ}t|ƒ}|  |d¡ d S )Nc                   S   ó   dS ©Né   r   r   r   r   r   Úfoo   ó   zBTestFirstLineFinder.test_decorated_odd_comment_indent.<locals>.fooé   ©r   r   r   ©r   r   Úfirst_def_liner   r   r   Ú!test_decorated_odd_comment_indent   s   
z5TestFirstLineFinder.test_decorated_odd_comment_indentc                 C   s$   dd„ }t t|ƒƒ}|  |d¡ d S )Nc                   S   r   r   r   r   r   r   r   r   %   ó   zDTestFirstLineFinder.test_undecorated_odd_comment_indent.<locals>.fooé   )r   r   r   r"   r   r   r   Ú#test_undecorated_odd_comment_indent$   s   z7TestFirstLineFinder.test_undecorated_odd_comment_indentc                 C   s"   dd„ }t t|ƒƒ}|  |¡ d S )Nc                   S   r   r   r   r   r   r   r   Ú<lambda>-   s    z9TestFirstLineFinder.test_unnamed_lambda.<locals>.<lambda>)r   r   ÚassertIsNoner"   r   r   r   Útest_unnamed_lambda,   s   z'TestFirstLineFinder.test_unnamed_lambdac                 C   s&   dd„ }|ƒ }t |ƒ}|  |d¡ d S )Nc                  S   s   t dd„ ƒ} | S )Nc                   S   r   r   r   r   r   r   r   r   4   r   zBTestFirstLineFinder.test_nested_function.<locals>.foo.<locals>.foor   )r   r   r   r   r   3   s   
z5TestFirstLineFinder.test_nested_function.<locals>.fooé   )r   r   )r   r   Úinnerr#   r   r   r   Útest_nested_function2   s   z(TestFirstLineFinder.test_nested_functionc                 C   r   )Nc                   S   ó   d S r   r   r   r   r   r   r   @   r%   z4TestFirstLineFinder.test_pass_statement.<locals>.foor&   r!   r"   r   r   r   Útest_pass_statement?   s   
z'TestFirstLineFinder.test_pass_statementc                 C   s0   d}i }t ||ƒ |d }t|ƒ}|  |¡ d S )Nú$def foo():
            pass
        r   )Úexecr   r)   )r   ÚsourceÚglobalnsr   r#   r   r   r   Útest_string_evalG   s   
z$TestFirstLineFinder.test_string_evalc                 C   s^   d }t |ƒ|| d¡|f}|tj|< t||dƒ}i }t||ƒ || }	t|	ƒ}
|  |
|¡ d S )NTr1   )ÚlenÚ
splitlinesÚ	linecacheÚcacheÚcompiler1   r   r   )r   Úfilenamer2   Úfunction_nameÚexpected_first_lineÚ	timestampÚentryÚcoder3   Úfunctionr#   r   r   r   Ú_test_with_patched_linecacheT   s   

z0TestFirstLineFinder._test_with_patched_linecachec                 C   ó$   d}d}d}d}|   ||||¡ d S )Nr0   z<foo-basic>r   r   ©rA   ©r   r2   r:   r;   r<   r   r   r   Ú test_string_eval_linecache_basicj   s   
ÿz4TestFirstLineFinder.test_string_eval_linecache_basicc                 C   rB   )Nz„if True:
        # indent designed to test against potential indent error in ast.parse

        def foo():
            pass
        z<foo-indent>r   r+   rC   rD   r   r   r   Ú!test_string_eval_linecache_indentu   s   
ÿz5TestFirstLineFinder.test_string_eval_linecache_indentc                 C   ó*   t  d¡}d}d}d}|  ||||¡ d S )Nz†
        def foo_gen():
            def foo():
                pass
            return foo

        generated_foo = foo_gen()
        z	<foo-gen>Úgenerated_foor    ©ÚtextwrapÚdedentrA   rD   r   r   r   Ú"test_string_eval_linecache_closureƒ   s   
	
ÿz6TestFirstLineFinder.test_string_eval_linecache_closurec                 C   rG   )Nzª
        def decorator(function):
            return function

        @decorator
        @decorator
        @decorator
        def decorated():
            pass
        z<foo-stacked-decorator>Ú	decoratedé	   rI   rD   r   r   r   Ú-test_string_eval_linecache_stacked_decorators“   s   

ÿzATestFirstLineFinder.test_string_eval_linecache_stacked_decoratorsc                 C   rB   )Na  if 1:
        def decorator(function):
            return function

        def gen_decorated_foo():
            @decorator
            @decorator
            @decorator
            def _foo():
                pass

            return _foo

        foo_all = gen_decorated_foo()
        z	<foo-all>Úfoo_allé
   rC   rD   r   r   r   Útest_string_eval_linecache_all¥   s   
ÿz2TestFirstLineFinder.test_string_eval_linecache_allc                 C   r   )Nc                   S   r.   r   r   r   r   r   r   r   ¾   s   z:TestFirstLineFinder.test_single_line_function.<locals>.foor   r!   r"   r   r   r   Útest_single_line_function½   s   
z-TestFirstLineFinder.test_single_line_functionc                 C   r   )Nc                   S   r   ©zDocstring
            Nr   r   r   r   r   r   Å   s   z/TestFirstLineFinder.test_docstring.<locals>.foor+   r!   r"   r   r   r   Útest_docstringÄ   s   
z"TestFirstLineFinder.test_docstringc                 C   r   )Nc                   S   s   	 dS rT   r   r   r   r   r   r   Ï   s   z1TestFirstLineFinder.test_docstring_2.<locals>.foor+   r!   r"   r   r   r   Útest_docstring_2Î   s   
z$TestFirstLineFinder.test_docstring_2N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r$   r'   r*   r-   r/   r4   rA   rE   rF   rL   rO   rR   rS   rU   rV   r   r   r   r   r      s&    	
r   Ú__main__)Úunittestr7   r   rJ   Únumbar   Únumba.tests.supportr   Únumba.misc.firstlinefinderr   r   rW   Úmainr   r   r   r   Ú<module>   s     Rÿ