o
    ¯b›  ã                   @   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 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 )é    N©Úrebuild)ÚTestCaseé   )Úcrash_test_dummyc                   @   ó   e Zd ZdS )ÚFooN©Ú__name__Ú
__module__Ú__qualname__© r   r   ú;/usr/lib/python3/dist-packages/twisted/test/test_rebuild.pyr      ó    r   c                   @   r   )ÚBarNr	   r   r   r   r   r      r   r   c                   @   r   )ÚBazNr	   r   r   r   r   r      r   r   c                   @   r   )ÚBuzNr	   r   r   r   r   r      r   r   c                   @   s    e Zd ZdZdd„ Z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.
    c                 C   s
   d| _ d S )NF)Ú
hashCalled©Úselfr   r   r   Ú__init__(   s   
zHashRaisesRuntimeError.__init__c                 C   s   d| _ tdƒ‚)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                   @   sX   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S )ÚRebuildTestszH
    Simple testcase for rebuilding, to at least exercise the code.
    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   ÚsetUp9   s   
zRebuildTests.setUpc                 C   s   t j | j¡ d S ©N)r'   r"   Úremover   r   r   r   r   ÚtearDownA   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ÚtimeÚtwisted.python.utilr-   ÚcopyfileÚ__file__r    r"   r#   r$   r   r.   ÚAÚBÚInheritÚassertEqualr/   Úsleepr   r2   )	r   r3   r4   r-   r.   r/   r2   ÚiÚb2r   r   r   Útest_FileRebuildD   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.
        r/   F)ÚdoLogN)r   ÚXr   Údor;   Ú	__class__ÚfÚfoo)r   Úxr   r   r   Útest_Rebuildc   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   Ú
XComponentÚ
setAdapterÚIXÚXAÚgetComponentr   Úmethodr;   rC   Útwisted.pythonrH   ÚassertRaisesÚ
ValueErrorÚregisterAdapterrA   )r   rF   ÚnewComponentrH   r   r   r   Útest_ComponentInteractiont   s   ûz&RebuildTests.test_ComponentInteractionc                 C   sX   t ƒ }G dd„ dƒaG dd„ dttƒa t |¡ t|dƒs!J dƒ‚t|dƒs*J dƒ‚d S )	Nc                   @   ó   e Zd Zdd„ ZdS )r   c                 S   ó   dS ©z.
                Dummy method
                Nr   r   r   r   r   rE   �   ó    zFoo.fooN)r
   r   r   rE   r   r   r   r   r   �   ó    r   c                   @   s   e Zd ZdZdS )r   é
   N)r
   r   r   rF   r   r   r   r   r   •   s    r   rE   z"Missing method on rebuilt instancerF   z+Missing class attribute on rebuilt instance)r   r   r   r   r   ÚupdateInstanceÚhasattr)r   r2   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)rO   r   Útwisted.spreadr^   ÚlatestClassÚBanana)r   r   r^   r   r   r   Útest_BananaInteractionœ   s   z#RebuildTests.test_BananaInteractionc                 C   s2   t ƒ a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.
        c                   S   s   d a d S r*   )ÚunhashableObjectr   r   r   r   Ú_cleanupª   s   z1RebuildTests.test_hashException.<locals>._cleanupN)r   rc   Ú
addCleanupr   Ú
assertTruer   )r   rd   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S )	z5
        L{twisted.python.rebuild.Sensitive}
        r   r   )Ú	Sensitivec                   @   rU   )z2RebuildTests.test_Sensitive.<locals>.TestSensitivec                 S   rV   rW   r   r   r   r   r   Útest_methodº   rX   z>RebuildTests.test_Sensitive.<locals>.TestSensitive.test_methodN)r
   r   r   ri   r   r   r   r   ÚTestSensitive¹   rY   rj   c                   S   rV   )z&
            Dummy method
            Nr   r   r   r   r   Ú
myFunctionÕ   rX   z/RebuildTests.test_Sensitive.<locals>.myFunctionN)rO   r   Útwisted.python.rebuildrh   ÚrebuildUpToDateÚassertFalseÚneedRebuildUpdater`   Ú	Exceptionr;   ÚreprÚlatestVersionOfri   )r   r   rh   rj   ÚtestSensitiveÚnewExceptionrk   r   r   r   Útest_Sensitive²   s(   

þ
þzRebuildTests.test_SensitiveN)r
   r   r   r   r)   r,   r?   rG   rT   r]   rb   rg   ru   r   r   r   r   r   4   s    r   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚNewStyleTestszB
    Tests for rebuilding new-style classes of various sorts.
    c                 C   s   t  d¡| _| jtjd< d S ©NÚwhipping)ÚtypesÚ
ModuleTypeÚmr'   Úmodulesr   r   r   r   r)   ã   s   zNewStyleTests.setUpc                 C   s   t jd= | `d S rw   )r'   r|   r{   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)
Úexecr{   Ú__dict__ÚSlottedClassr/   r   r[   r;   ÚassertIsÚtype©r   Ú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)
r~   r{   r   ÚListSubclassÚappendr   r[   r;   r�   r‚   rƒ   r   r   r   Útest_typeSubclassù   s   


zNewStyleTests.test_typeSubclassN)r
   r   r   r   r)   r,   r†   rŠ   r   r   r   r   rv   Þ   s    rv   )r    r'   ry   rO   r   Útwisted.trial.unittestr   Ú r   rE   rD   r   r   r   r   r   rc   r   rv   r   r   r   r   Ú<module>   s     +