U
    ª€lj¥  ã                   @  sÎ   d dl m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
 ddlmZ ejZG dd	„ d	ƒaG d
d„ dtƒZG dd„ dƒZG dd„ deeƒaG dd„ dƒZdaG dd„ de
ƒZG dd„ de
ƒZdS )é    )ÚannotationsN)ÚNoReturn©Úrebuild)ÚTestCaseé   )Úcrash_test_dummyc                   @  s   e Zd ZdS )ÚFooN©Ú__name__Ú
__module__Ú__qualname__© r   r   ú=/tmp/pip-unpacked-wheel-aghyhbke/twisted/test/test_rebuild.pyr	      s   r	   c                   @  s   e Zd ZdS )ÚBarNr
   r   r   r   r   r      s   r   c                   @  s   e Zd ZdS )ÚBazNr
   r   r   r   r   r      s   r   c                   @  s   e Zd ZdS )ÚBuzNr
   r   r   r   r   r      s   r   c                   @  s,   e Zd ZdZddœdd„Zddœdd„Zd	S )
ÚHashRaisesRuntimeErrorz¡
    Things that don't hash (raise an Exception) should be ignored by the
    rebuilder.

    @ivar hashCalled: C{bool} set to True when __hash__ is called.
    ÚNone©Úreturnc                 C  s
   d| _ d S )NF)Ú
hashCalled©Úselfr   r   r   Ú__init__+   s    zHashRaisesRuntimeError.__init__r   c                 C  s   d| _ tdƒ‚d S )NTznot a TypeError!)r   ÚRuntimeErrorr   r   r   r   Ú__hash__.   s    zHashRaisesRuntimeError.__hash__N)r   r   r   Ú__doc__r   r   r   r   r   r   r   #   s   r   c                   @  sŽ   e Zd ZdZddœdd„Zddœdd„Zddœdd	„Zddœd
d„Zddœdd„Zddœdd„Z	ddœdd„Z
ddœdd„Zddœdd„ZdS )ÚRebuildTestszH
    Simple testcase for rebuilding, to at least exercise the code.
    r   r   c                 C  sb   |   ¡ | _t | j¡ tj | jd¡| _t | j¡ ttj | jd¡dƒ ¡  t	j 
d| j¡ d S )NÚtwisted_rebuild_fakelibz__init__.pyÚwr   )ÚmktempÚlibPathÚosÚmkdirÚpathÚjoinÚfakelibPathÚopenÚcloseÚsysÚinsertr   r   r   r   ÚsetUp<   s    
zRebuildTests.setUpc                 C  s   t j | j¡ d S ©N)r*   r%   Úremover"   r   r   r   r   ÚtearDownD   s    zRebuildTests.tearDownc           	      C  sì   dd l }dd l}ddlm} | |tdƒtj | j	d¡¡ ddl
m} | ¡ }| ¡ }| ¡ }|  | ¡ d¡ | d¡ | |tdƒtj | j	d¡¡ t |¡ | ¡ }|  | ¡ d	¡ |  | ¡ d	¡ |  | ¡ d
¡ |  | ¡ d¡ d S )Nr   )Úsibpathzmyrebuilder1.pyzmyrebuilder.py)ÚmyrebuilderÚagš™™™™™ñ?zmyrebuilder2.pyÚcÚdÚb)ÚshutilÚtimeZtwisted.python.utilr0   ÚcopyfileÚ__file__r#   r%   r&   r'   r   r1   ÚAÚBZInheritÚassertEqualr2   Úsleepr   r5   )	r   r6   r7   r0   r1   r2   r5   ÚiZb2r   r   r   Útest_FileRebuildG   s.    þ
þ
zRebuildTests.test_FileRebuildc                 C  sB   t  d¡}tjt dd� | ¡  |  |jt j¡ |  tt j¡ dS )z1
        Rebuilding an unchanged module.
        r2   F)ZdoLogN)r   ÚXr   Zdor<   Ú	__class__ÚfÚfoo)r   Úxr   r   r   Útest_Rebuildh   s
    
zRebuildTests.test_Rebuildc                 C  s~   t  ¡ }| t jt j¡ | t j¡ t t d¡ | t j¡}| ¡  |  |j	t j¡ ddl
m} |  t|jt jt jt j¡ d S )Nr   )Ú
components)r   Z
XComponentZ
setAdapterZIXZXAZgetComponentr   Úmethodr<   rA   Útwisted.pythonrF   ÚassertRaisesÚ
ValueErrorZregisterAdapterr@   )r   rD   ZnewComponentrF   r   r   r   Útest_ComponentInteractiony   s    ûz&RebuildTests.test_ComponentInteractionc                 C  sX   t ƒ }G dd„ dƒaG dd„ dttƒa t |¡ t|dƒsBtdƒ‚t|dƒsTtdƒ‚d S )	Nc                   @  s   e Zd Zddœdd„ZdS )r	   r   r   c                 S  s   dS ©z.
                Dummy method
                Nr   r   r   r   r   rC   •   s    zFoo.fooN)r   r   r   rC   r   r   r   r   r	   ”   s   r	   c                   @  s   e Zd ZdZdS )r   é
   N)r   r   r   rD   r   r   r   r   r   š   s   r   rC   z"Missing method on rebuilt instancerD   z+Missing class attribute on rebuilt instance)r   r	   r   r   r   ÚupdateInstanceÚhasattrÚAssertionError)r   r5   r   r   r   Útest_UpdateInstance�   s    
z RebuildTests.test_UpdateInstancec                 C  s(   ddl m} ddlm} | |j¡ d S )Nr   r   )Úbanana)rH   r   Ztwisted.spreadrR   ÚlatestClassZBanana)r   r   rR   r   r   r   Útest_BananaInteraction¡   s    z#RebuildTests.test_BananaInteractionc                 C  s8   t ƒ addœdd„}|  |¡ t t¡ |  tj¡ dS )z~
        Rebuilding something that has a __hash__ that raises a non-TypeError
        shouldn't cause rebuild to die.
        r   r   c                   S  s   d a d S r-   )ÚunhashableObjectr   r   r   r   Ú_cleanup¯   s    z1RebuildTests.test_hashException.<locals>._cleanupN)r   rU   Z
addCleanupr   Ú
assertTruer   )r   rV   r   r   r   Útest_hashException§   s
    

zRebuildTests.test_hashExceptionc                 C  sÖ   ddl m} ddlm} G dd„ d|ƒ}|ƒ }| ¡  |  | ¡ ¡ | t¡}|  	t
tƒt
|ƒ¡ |  	|| |¡¡ |  	|j| |j¡¡ |  	|j| |j¡¡ |  	|| |¡¡ ddœdd	„}|  	|| |¡¡ d
S )z5
        L{twisted.python.rebuild.Sensitive}
        r   r   )Ú	Sensitivec                   @  s   e Zd Zddœdd„ZdS )z2RebuildTests.test_Sensitive.<locals>.TestSensitiver   r   c                 S  s   dS rL   r   r   r   r   r   Útest_method¿   s    z>RebuildTests.test_Sensitive.<locals>.TestSensitive.test_methodN)r   r   r   rZ   r   r   r   r   ÚTestSensitive¾   s   r[   r   r   c                   S  s   dS )z&
            Dummy method
            Nr   r   r   r   r   Ú
myFunctionÚ   s    z/RebuildTests.test_Sensitive.<locals>.myFunctionN)rH   r   Ztwisted.python.rebuildrY   ZrebuildUpToDateZassertFalseZneedRebuildUpdaterS   Ú	Exceptionr<   ÚreprZlatestVersionOfrZ   )r   r   rY   r[   ZtestSensitiveZnewExceptionr\   r   r   r   Útest_Sensitive·   s(    

þ
þzRebuildTests.test_SensitiveN)r   r   r   r   r,   r/   r?   rE   rK   rQ   rT   rX   r_   r   r   r   r   r   7   s   !r   c                   @  sH   e Zd ZdZddœdd„Zddœdd„Zddœdd	„Zddœd
d„ZdS )ÚNewStyleTestszB
    Tests for rebuilding new-style classes of various sorts.
    r   r   c                 C  s   t  d¡| _| jtjd< d S ©NZwhipping)ÚtypesÚ
ModuleTypeÚmr*   Úmodulesr   r   r   r   r,   è   s    zNewStyleTests.setUpc                 C  s   t jd= | `d S ra   )r*   re   rd   r   r   r   r   r/   ì   s    zNewStyleTests.tearDownc                 C  s`   d}t || jjƒ | j ¡ }d|_t || jjƒ t |¡ |  |jd¡ |  t	|ƒ| jj¡ dS )zF
        Try to rebuild a new style class with slots defined.
        z*class SlottedClass:
    __slots__ = ['a']
é   N)
Úexecrd   Ú__dict__ZSlottedClassr2   r   rN   r<   ÚassertIsÚtype©r   ZclassDefinitionÚinstr   r   r   Ú
test_slotsð   s    

zNewStyleTests.test_slotsc                 C  sf   d}t || jjƒ | j ¡ }| d¡ t || jjƒ t |¡ |  |d d¡ |  t	|ƒ| jj¡ dS )z6
        Try to rebuild a base type subclass.
        z#class ListSubclass(list):
    pass
é   r   N)
rg   rd   rh   ZListSubclassÚappendr   rN   r<   ri   rj   rk   r   r   r   Útest_typeSubclassþ   s    


zNewStyleTests.test_typeSubclassN)r   r   r   r   r,   r/   rm   rp   r   r   r   r   r`   ã   s
   r`   )Ú
__future__r   r#   r*   rb   Ztyping_extensionsr   rH   r   Ztwisted.trial.unittestr   Ú r   rC   rB   r	   r   r   r   r   rU   r   r`   r   r   r   r   Ú<module>   s"    -