U
    
W[/!                     @   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 ddl	m
Z
 e
jZG dd daG d	d
 d
tZG dd deZG dd deeaG dd dZdaG dd dejZG dd dejZdS )    N)unittestrebuild)_PY3   )crash_test_dummyc                   @   s   e Zd ZdS )FooN__name__
__module____qualname__ r   r   ;/usr/lib/python3/dist-packages/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 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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                   @   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   )Z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   tearDown8   s    zRebuildTests.tearDownc           	      C   s   ddl m} dd l}dd l}||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)Ztwisted.python.utilr+   shutiltimeZcopyfile__file__r   r    r!   r"   r   r,   ABZInheritassertEqualr-   sleepr   r0   )	r   r+   r1   r2   r,   r-   r0   iZb2r   r   r   test_FileRebuild<   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)ZdoLogN)r   Xr   Zdor6   	__class__ffoo)r   xr   r   r   test_RebuildT   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   methodr6   r;   twisted.pythonr@   assertRaises
ValueErrorZregisterAdapterr:   )r   r>   ZnewComponentr@   r   r   r   test_ComponentInteractionf   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 ZdS )r   c                 S   s   dS z.
                Dummy method
                Nr   r   r   r   r   r=   ~   s    zFoo.fooN)r
   r   r   r=   r   r   r   r   r   }   s   r   c                   @   s   e Zd ZdZdS )r   
   N)r
   r   r   r>   r   r   r   r   r      s   r   r=   z"Missing method on rebuilt instancer>   z+Missing class attribute on rebuilt instance)r   r   r   r   r   updateInstancehasattrAssertionError)r   r0   r   r   r   test_UpdateInstancex   s    
z RebuildTests.test_UpdateInstancec                 C   s(   ddl m} ddlm} ||j d S )Nr   r   )banana)rB   r   Ztwisted.spreadrL   latestClassZBanana)r   r   rL   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   rO   Z
addCleanupr   Z
assertTruer   )r   rP   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	rh| 
ttt| n| dt| | 
||| | 
|j||j | 
|j||j | 
||| G dd d}| }| 
||| d	d
 }| 
||| dS )z5
        L{twisted.python.rebuild.Sensitive}
        r   r   )	Sensitivec                   @   s   e Zd Zdd ZdS )z2RebuildTests.test_Sensitive.<locals>.TestSensitivec                 S   s   dS rF   r   r   r   r   r   test_method   s    z>RebuildTests.test_Sensitive.<locals>.TestSensitive.test_methodN)r
   r   r   rS   r   r   r   r   TestSensitive   s   rT   z twisted.python.rebuild.Exceptionc                   @   s   e Zd ZdZdS )z(RebuildTests.test_Sensitive.<locals>.Fooz%
            Dummy class
            N)r
   r   r   r   r   r   r   r   r      s   r   c                   S   s   dS )z&
            Dummy method
            Nr   r   r   r   r   
myFunction   s    z/RebuildTests.test_Sensitive.<locals>.myFunctionN)rB   r   Ztwisted.python.rebuildrR   ZrebuildUpToDateZassertFalseZneedRebuildUpdaterM   	Exceptionr   r6   reprZassertInZlatestVersionOfrS   )	r   r   rR   rT   ZtestSensitiveZnewExceptionr   r=   rU   r   r   r   test_Sensitive   s2    


zRebuildTests.test_SensitiveN)r
   r   r   r   r'   r*   r9   r?   rE   rK   rN   rQ   rX   r   r   r   r   r   *   s   
r   c                   @   sN   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Ze	e
dddkrJde_dS )NewStyleTestszB
    Tests for rebuilding new-style classes of various sorts.
    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 rZ   )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.
        z2class SlottedClass(object):
    __slots__ = ['a']
   N)
execr]   __dict__ZSlottedClassr-   r   rH   r6   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)
r`   r]   ra   ZListSubclassappendr   rH   r6   rb   rc   rd   r   r   r   test_typeSubclass   s    


zNewStyleTests.test_typeSubclassc                 C   sJ   d}t || jj | j }dg|_d}t || jj | ttj| dS )z
        Test that when rebuilding an instance with a __slots__ attribute, it
        fails accurately instead of giving a L{rebuild.RebuildError}.
        z(class NotSlottedClass(object):
    pass
r-   z class NotSlottedClass:
    pass
N)	r`   r]   ra   ZNotSlottedClass	__slots__rC   	TypeErrorr   rH   rd   r   r   r   test_instanceSlots  s    
z NewStyleTests.test_instanceSlotsZ	ClassTypeNz+Old-style classes not supported on Python 3)r
   r   r   r   r'   r*   rf   ri   rl   getattrr[   skipr   r   r   r   rY      s   rY   )r%   r   r[   Ztwisted.trialr   rB   r   Ztwisted.python.compatr    r   r=   r<   r   r   objectr   r   r   rO   ZTestCaser   rY   r   r   r   r   <module>   s    .