B
    u9a*  ใ               @   sF   d dl Z d dlZd dlmZmZ G dd dejZedkrBe ก  dS )้    N)ฺ	swap_itemฺ	swap_attrc               @   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S )ฺRebindBuiltinsTestsz=Test all the ways that we can change/shadow globals/builtins.c             G   s   dS )aร  Perform TestCase-specific configuration on a function before testing.

        By default, this does nothing. Example usage: spinning a function so
        that a JIT will optimize it. Subclasses should override this as needed.

        Args:
            func: function to configure.
            *args: any arguments that should be passed to func, if calling it.

        Returns:
            Nothing. Work will be performed on func in-place.
        Nฉ )ฺselfฺfuncฺargsr   r   ๚"/usr/lib/python3.7/test_dynamic.pyฺconfigure_func   s    z"RebindBuiltinsTests.configure_funcc          	   C   sP   dd }|   |ก |  | dก tt ddd  |  | dก W d Q R X d S )Nc               S   s   t dddgS )N้   ้   ้   )ฺlenr   r   r   r	   ฺfoo   s    z=RebindBuiltinsTests.test_globals_shadow_builtins.<locals>.foor   r   c             S   s   dS )N้   r   )ฺxr   r   r	   ฺ<lambda>#   ๓    zBRebindBuiltinsTests.test_globals_shadow_builtins.<locals>.<lambda>r   )r
   ฺassertEqualr   ฺglobals)r   r   r   r   r	   ฺtest_globals_shadow_builtins   s
    
z0RebindBuiltinsTests.test_globals_shadow_builtinsc          	   C   sN   dd }|   |ก |  | dก ttddd  |  | dก W d Q R X d S )Nc               S   s   t dddgS )Nr   r   r   )r   r   r   r   r	   r   (   s    z5RebindBuiltinsTests.test_modify_builtins.<locals>.foor   r   c             S   s   dS )Nr   r   )r   r   r   r	   r   -   r   z:RebindBuiltinsTests.test_modify_builtins.<locals>.<lambda>r   )r
   r   r   ฺbuiltins)r   r   r   r   r	   ฺtest_modify_builtins&   s
    
z(RebindBuiltinsTests.test_modify_builtinsc          	   C   sX   dd }|   |ก | }|  t|dก ttddd  |  t|dก W d Q R X d S )Nc              s   s    t d} t| V  t| V  d S )Nr   )ฺranger   )r   r   r   r	   r   2   s    
zLRebindBuiltinsTests.test_modify_builtins_while_generator_active.<locals>.foor   r   c             S   s   dS )Nr   r   )r   r   r   r	   r   :   r   zQRebindBuiltinsTests.test_modify_builtins_while_generator_active.<locals>.<lambda>r   )r
   r   ฺnextr   r   )r   r   ฺgr   r   r	   ฺ+test_modify_builtins_while_generator_active0   s    
z?RebindBuiltinsTests.test_modify_builtins_while_generator_activec          	   C   sP   t tdt: dd }dd }|  |dd ก |  ||dd	gก W d Q R X d S )
Nr   c               S   s   dd t _d S )Nc             S   s   dS )N้   r   )r   r   r   r	   r   B   r   zZRebindBuiltinsTests.test_modify_builtins_from_leaf_function.<locals>.bar.<locals>.<lambda>)r   r   r   r   r   r	   ฺbarA   s    zHRebindBuiltinsTests.test_modify_builtins_from_leaf_function.<locals>.barc             S   s2   g }|  ttdก |   |  ttdก |S )Nr   )ฺappendr   r   )ฺmodifierฺlr   r   r	   r   D   s
    zHRebindBuiltinsTests.test_modify_builtins_from_leaf_function.<locals>.fooc               S   s   d S )Nr   r   r   r   r	   r   J   r   zMRebindBuiltinsTests.test_modify_builtins_from_leaf_function.<locals>.<lambda>r   r   )r   r   r   r
   r   )r   r   r   r   r   r	   ฺ'test_modify_builtins_from_leaf_function=   s
    z;RebindBuiltinsTests.test_modify_builtins_from_leaf_functionc             C   sZ   dd }|   |ก ddd i}||dd d}|  td|d	ก |  tdd
|id	ก d S )Nc               S   s   t dddgS )Nr   r   r   )r   r   r   r   r	   r   O   s    zQRebindBuiltinsTests.test_cannot_change_globals_or_builtins_with_eval.<locals>.foor   c             S   s   dS )Nr   r   )r   r   r   r	   r   T   r   zVRebindBuiltinsTests.test_cannot_change_globals_or_builtins_with_eval.<locals>.<lambda>c             S   s   dS )N้   r   )r   r   r   r	   r   V   r   )r   ฺ__builtins__r   zfoo()r   r   )r
   r   ฺeval)r   r   ฺbuiltins_dictฺglobals_dictr   r   r	   ฺ0test_cannot_change_globals_or_builtins_with_evalN   s    
zDRebindBuiltinsTests.test_cannot_change_globals_or_builtins_with_evalc             C   sn   dd }|   |ก d|i}td| |  |d dก ddd	 i}||d
d	 d}td| |  |d dก d S )Nc               S   s   t dddgS )Nr   r   r   )r   r   r   r   r	   r   \   s    zQRebindBuiltinsTests.test_cannot_change_globals_or_builtins_with_exec.<locals>.foor   z	x = foo()r   r   r   c             S   s   dS )Nr   r   )r   r   r   r	   r   e   r   zVRebindBuiltinsTests.test_cannot_change_globals_or_builtins_with_exec.<locals>.<lambda>c             S   s   dS )Nr#   r   )r   r   r   r	   r   g   r   )r   r$   r   )r
   ฺexecr   )r   r   r'   r&   r   r   r	   ฺ0test_cannot_change_globals_or_builtins_with_exec[   s    


zDRebindBuiltinsTests.test_cannot_change_globals_or_builtins_with_execc          	   C   s^   dd }|   |ก | }|  t|dก tt dddd i |  t|dก W d Q R X d S )Nc              s   s    t d} t| V  t| V  d S )Nr   )r   r   )r   r   r   r	   r   m   s    
zORebindBuiltinsTests.test_cannot_replace_builtins_dict_while_active.<locals>.foor   r$   r   c             S   s   dS )Nr   r   )r   r   r   r	   r   u   r   zTRebindBuiltinsTests.test_cannot_replace_builtins_dict_while_active.<locals>.<lambda>)r
   r   r   r   r   )r   r   r   r   r   r	   ฺ.test_cannot_replace_builtins_dict_while_activel   s    
zBRebindBuiltinsTests.test_cannot_replace_builtins_dict_while_activec          	   C   sT   dd }|   |ก |  | dก tt dddd i |  | dก W d Q R X d S )Nc               S   s   t dddgS )Nr   r   r   )r   r   r   r   r	   r   y   s    zPRebindBuiltinsTests.test_cannot_replace_builtins_dict_between_calls.<locals>.foor   r$   r   c             S   s   dS )Nr   r   )r   r   r   r	   r   ~   r   zURebindBuiltinsTests.test_cannot_replace_builtins_dict_between_calls.<locals>.<lambda>)r
   r   r   r   )r   r   r   r   r	   ฺ/test_cannot_replace_builtins_dict_between_callsx   s
    
zCRebindBuiltinsTests.test_cannot_replace_builtins_dict_between_callsc             C   s2   ddd i}t d|}|  |ก |  | dก d S )Nr   c             S   s   dS )Nr   r   )r   r   r   r	   r      r   zKRebindBuiltinsTests.test_eval_gives_lambda_custom_globals.<locals>.<lambda>zlambda: len([])r   )r%   r
   r   )r   r'   r   r   r   r	   ฺ%test_eval_gives_lambda_custom_globals   s    

z9RebindBuiltinsTests.test_eval_gives_lambda_custom_globalsN)ฺ__name__ฺ
__module__ฺ__qualname__ฺ__doc__r
   r   r   r   r"   r(   r*   r+   r,   r-   r   r   r   r	   r   	   s   

	r   ฺ__main__)	r   ZunittestZtest.supportr   r   ZTestCaser   r.   ฺmainr   r   r   r	   ฺ<module>   s    