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     +