a
    zed&                     @   s   d Z ddlZG dd dZG dd deZG dd deZG d	d
 d
eeZG dd deZG dd deZG dd deZG dd dej	Z
edkre  dS )z9Unit tests for zero-argument super() & related machinery.    Nc                   @   s    e Zd Zdd Zedd ZdS )Ac                 C   s   dS Nr    selfr   r   %/usr/lib/python3.9/test/test_super.pyf   s    zA.fc                 C   s   | dfS r   r   clsr   r   r   cm	   s    zA.cmN)__name__
__module____qualname__r   classmethodr   r   r   r   r   r      s   r   c                       s,   e Zd Z fddZe fddZ  ZS )Bc                    s   t   d S Nr   superr   r   	__class__r   r   r      s    zB.fc                    s   | t   dfS r   r   r   r	   r   r   r   r      s    zB.cmr   r   r   r   r   r   __classcell__r   r   r   r   r      s   r   c                       s,   e Zd Z fddZe fddZ  ZS )Cc                    s   t   d S Nr   r   r   r   r   r   r      s    zC.fc                    s   | t   dfS r   r   r	   r   r   r   r      s    zC.cmr   r   r   r   r   r      s   r   c                       s(   e Zd Z fddZ fddZ  ZS )Dc                    s   t   d S Nr   r   r   r   r   r   r      s    zD.fc                    s   | t   dfS r   r   r	   r   r   r   r      s    zD.cm)r   r   r   r   r   r   r   r   r   r   r      s   r   c                   @   s   e Zd ZdS )ENr   r   r   r   r   r   r   r   !   s   r   c                   @   s   e Zd ZejZdS )FN)r   r   r   r   r   r   r   r   r   r   $   s   r   c                   @   s   e Zd ZdS )GNr   r   r   r   r   r    '   s   r    c                       s   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
 f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%d& Z fd'd(Zd)d* Z fd+d,Z  ZS )-	TestSuperc                    s   t  d S N)r!   r   r   r   r   tearDown-   s    zTestSuper.tearDownc                 C   s   |  t  d d S NZABCDassertEqualr   r   r   r   r   r   test_basics_working2   s    zTestSuper.test_basics_workingc                 C   s   |  tt d d S r$   r%   r   r   r   r   test_class_getattr_working5   s    z$TestSuper.test_class_getattr_workingc                 C   s*   |  t  d |  tt d d S r$   )r&   r   r   r   r   r   r   !test_subclass_no_override_working8   s    z+TestSuper.test_subclass_no_override_workingc                 C   s*   |  t  d |  tt d d S r$   )r&   r   r   r   r   r   r   $test_unbound_method_transfer_working<   s    z.TestSuper.test_unbound_method_transfer_workingc                 C   sX   |  t tdf |  t  tdf |  t tdf |  t  tdf d S r   )r&   r   r   r    r   r   r   r    test_class_methods_still_working@   s    z*TestSuper.test_class_methods_still_workingc                 C   s\   t  }| | |t t t dfdfdfdf t }| | |tttdfdfdfdf d S )Nr   r   r   r   )r   r&   r   r   )r   der   r   r   #test_super_in_class_methods_workingF   s    &z-TestSuper.test_super_in_class_methods_workingc                 C   s&   G dd dt }| |  d d S )Nc                       s   e Zd Z fddZ  ZS )z,TestSuper.test_super_with_closure.<locals>.Ec                    s    fdd}t   d S )Nc                      s     d S r"   r   r   r   r   r   nestedQ   s    z>TestSuper.test_super_with_closure.<locals>.E.f.<locals>.nestedr   r   )r   r/   r   r   r   r   P   s    z.TestSuper.test_super_with_closure.<locals>.E.fr   r   r   r   r   r   r   r   r   r   O   s   r   ZAE)r   r&   r   )r   r   r   r   r   test_super_with_closureL   s    z!TestSuper.test_super_with_closurec                    s   G dd dt }| }| | d | |jd G  fddd}| |jt|  | t}t	dt
 i  W d    n1 s0    Y  | t|jt G dd d}| t
 d d	 t
 d= | d|j G  fd
dd}|  d	 d S )Nc                       s    e Zd Z fddZdZ  ZS )7TestSuper.test_various___class___pathologies.<locals>.Xc                    s
   t   S r"   r   r   r   r   r   r   Z   s    9TestSuper.test_various___class___pathologies.<locals>.X.f  )r   r   r   r   r   r   r   r   r   r   XY   s   r5   r   r4   c                       s    e Zd ZZ fddZ  ZS )r2   c                      s     d S r"   r   r   r   r   r   r   b   s    r3   )r   r   r   xr   r   r   r   r   r   r5   `   s   zYclass X:
                __class__
                def f():
                    __class__c                       s    e Zd Zda fddZ  ZS )r2   *   c                      s     d S r"   r   r   r   r   r   r   n   s    r3   )r   r   r   r   r   r   r   r   r   r   r5   k   s   r   r7   c                       s    e Zd Zd fddZ  ZS )r2   r7   c                      s     d S r"   r   r   r   r   r   r   v   s    r3   r0   r   r   r   r   r5   s   s   )r   r&   r   r   assertIsr6   typeassertRaises	NameErrorexecglobals	exceptionassertNotIn__dict__)r   r5   r6   r-   r   r   r   "test_various___class___pathologiesW   s"    "z,TestSuper.test_various___class___pathologiesc                 C   s$   G dd d}|  |  | d S )Nc                       s   e Zd Z fddZ  ZS )z2TestSuper.test___class___instancemethod.<locals>.Xc                    s    S r"   r   r   r   r   r   r   }   s    z4TestSuper.test___class___instancemethod.<locals>.X.fr0   r   r   r   r   r5   |   s   r5   r8   r   r   r5   r   r   r   test___class___instancemethodz   s    z'TestSuper.test___class___instancemethodc                 C   s"   G dd d}|  | | d S )Nc                       s    e Zd Ze fddZ  ZS )z/TestSuper.test___class___classmethod.<locals>.Xc                    s    S r"   r   r	   r   r   r   r      s    z1TestSuper.test___class___classmethod.<locals>.X.f)r   r   r   r   r   r   r   r   r   r   r5      s   r5   rB   rC   r   r   r   test___class___classmethod   s    z$TestSuper.test___class___classmethodc                 C   s"   G dd d}|  | | d S )Nc                       s    e Zd Ze fddZ  ZS )z0TestSuper.test___class___staticmethod.<locals>.Xc                      s    S r"   r   r   r   r   r   r      s    z2TestSuper.test___class___staticmethod.<locals>.X.fr   r   r   staticmethodr   r   r   r   r   r   r5      s   r5   rB   rC   r   r   r   test___class___staticmethod   s    z%TestSuper.test___class___staticmethodc                    s:   d  G  fdddt }G dd d|d}|  | d S )Nc                       s   e Zd Z fddZ  ZS )z*TestSuper.test___class___new.<locals>.Metac                    s   t  | |||}| |S r"   )r   __new__r   )r
   namebases	namespacer   r   
test_classr   r   rI      s    z2TestSuper.test___class___new.<locals>.Meta.__new__r   r   r   rI   r   r   rN   r   r   Meta   s   rQ   c                       s    e Zd Ze fddZ  ZS )z'TestSuper.test___class___new.<locals>.Ac                      s    S r"   r   r   r   r   r   r      s    z)TestSuper.test___class___new.<locals>.A.frF   r   r   r   r   r      s   r   	metaclassr9   r8   r   rQ   r   r   rP   r   test___class___new   s    zTestSuper.test___class___newc                    sV   d  G  fdddt }G dd d|d}| |d  t dd }| | | d S )Nc                       s   e Zd Z fddZdS )z.TestSuper.test___class___delayed.<locals>.Metac                    s   | d S r"   r   r
   rJ   rK   rL   Ztest_namespacer   r   rI      s    z6TestSuper.test___class___delayed.<locals>.Meta.__new__N)r   r   r   rI   r   rX   r   r   rQ      s   rQ   c                       s    e Zd Ze fddZ  ZS )z+TestSuper.test___class___delayed.<locals>.Ac                      s    S r"   r   r   r   r   r   r      s    z-TestSuper.test___class___delayed.<locals>.A.frF   r   r   r   r   r      s   r   rR   r   r   )r9   r8   r   )r   rQ   r   r   r   rX   r   test___class___delayed   s    z TestSuper.test___class___delayedc                    s:   d  G dd dt }G  fddd|d}|  | d S )Nc                       s   e Zd Z fddZ  ZS )z*TestSuper.test___class___mro.<locals>.Metac                    s   | j d   t  S )Nr   )r@   r   mror   r   r   r   rZ      s    z.TestSuper.test___class___mro.<locals>.Meta.mro)r   r   r   rZ   r   r   r   r   r   rQ      s   rQ   c                       s   e Zd Z fddZ  ZS )z'TestSuper.test___class___mro.<locals>.Ac                      s    d S r"   r   r   rM   r   r   r      s    z)TestSuper.test___class___mro.<locals>.A.fr0   r   rP   r   r   r      s   r   rR   rT   rU   r   rP   r   test___class___mro   s    zTestSuper.test___class___mroc                    s   G  fdddt }d  G dd d|d}| d  d  G dd d|d} d }|jj}| t|d	 | ||d
  | t |j	 W d    n1 s0    Y  d S )Nc                       s   e Zd Z fddZ  ZS )z=TestSuper.test___classcell___expected_behaviour.<locals>.Metac                    s   |  t | |||S r"   )copyr   rI   rW   )r   namespace_snapshotr   r   rI      s    zETestSuper.test___classcell___expected_behaviour.<locals>.Meta.__new__rO   r   r]   r   r   rQ      s   rQ   c                   @   s   e Zd ZdS )zHTestSuper.test___classcell___expected_behaviour.<locals>.WithoutClassRefNr   r   r   r   r   WithoutClassRef   s   r_   rR   r   c                       s   e Zd Z fddZ  ZS )zETestSuper.test___classcell___expected_behaviour.<locals>.WithClassRefc                    s    S r"   r   r   r   r   r   r      s    zGTestSuper.test___classcell___expected_behaviour.<locals>.WithClassRef.fr0   r   r   r   r   WithClassRef   s   r`      r   )
r9   r?   r   __closure__r&   lenr8   r:   AttributeErrorr   )r   rQ   r_   r`   Z
class_cellZmethod_closurer   r^   r   %test___classcell___expected_behaviour   s    z/TestSuper.test___classcell___expected_behaviourc                 C   sh   G dd dt }G dd d|d}d}| t|" G dd d|d}W d    n1 sZ0    Y  d S )	Nc                       s   e Zd Z fddZ  ZS )z2TestSuper.test___classcell___missing.<locals>.Metac                    s   | dd  t | |||S Nr   )popr   rI   rW   r   r   r   rI      s    z:TestSuper.test___classcell___missing.<locals>.Meta.__new__rO   r   r   r   r   rQ      s   rQ   c                   @   s   e Zd ZdS )z=TestSuper.test___classcell___missing.<locals>.WithoutClassRefNr   r   r   r   r   r_      s   r_   rR   z+__class__ not set.*__classcell__ propagatedc                       s   e Zd Z fddZ  ZS )z:TestSuper.test___classcell___missing.<locals>.WithClassRefc                    s    S r"   r   r   r   r   r   r      s    z<TestSuper.test___classcell___missing.<locals>.WithClassRef.fr0   r   r   r   r   r`      s   r`   )r9   ZassertRaisesRegexRuntimeError)r   rQ   r_   Zexpected_errorr`   r   r   r   test___classcell___missing   s
    z$TestSuper.test___classcell___missingc              
   C   s   G dd dt }d ddt fD ]n}| j|dN | t$ G dd d||d}W d    n1 sd0    Y  W d    q1 s0    Y  qd S )	Nc                       s   e Zd Z fddZ  ZS )z4TestSuper.test___classcell___overwrite.<locals>.Metac                    s   ||d< t  | |||S rf   )r   rI   )r
   rJ   rK   rL   cellr   r   r   rI     s    z<TestSuper.test___classcell___overwrite.<locals>.Meta.__new__rO   r   r   r   r   rQ     s   rQ   r    )bad_cellc                   @   s   e Zd ZdS )z1TestSuper.test___classcell___overwrite.<locals>.ANr   r   r   r   r   r   
  s   r   )rS   rj   )r9   objectZsubTestr:   	TypeError)r   rQ   rl   r   r   r   r   test___classcell___overwrite   s
    z&TestSuper.test___classcell___overwritec                 C   sP   G dd dt }| t" G dd d|d}W d    n1 sB0    Y  d S )Nc                       s   e Zd Z fddZ  ZS )z5TestSuper.test___classcell___wrong_cell.<locals>.Metac                    s"   t  | |||} tdd|}| S )Nr   r   )r   rI   r9   )r
   rJ   rK   rL   r   r   r   r   rI     s    z=TestSuper.test___classcell___wrong_cell.<locals>.Meta.__new__rO   r   r   r   r   rQ     s   rQ   c                       s   e Zd Z fddZ  ZS )z2TestSuper.test___classcell___wrong_cell.<locals>.Ac                    s    S r"   r   r   r   r   r   r     s    z4TestSuper.test___classcell___wrong_cell.<locals>.A.fr0   r   r   r   r   r     s   r   rR   )r9   r:   rn   rU   r   r   r   test___classcell___wrong_cell  s    z'TestSuper.test___classcell___wrong_cellc                    sT    fdd}|  t|  fdd}|  t|d  G dd d}|  t| j d S )Nc                      s
   t   d S r"   r   r   r   r   r   r     s    z.TestSuper.test_obscure_super_errors.<locals>.fc                    s   ~ t   d S r"   rq   r6   r   r   r   r     s    c                       s   e Zd Z fddZ  ZS )z.TestSuper.test_obscure_super_errors.<locals>.Xc                    s    t   d S r"   rq   rr   r   r   r   r   $  s    z0TestSuper.test_obscure_super_errors.<locals>.X.fr0   r   r   r   r   r5   #  s   r5   )r:   rh   r   )r   r   r5   r   r   r   test_obscure_super_errors  s    z#TestSuper.test_obscure_super_errorsc                    s:   G dd d  fdd}| j d }| t j| d S )Nc                       s   e Zd Z fddZ  ZS )z&TestSuper.test_cell_as_self.<locals>.Xc                    s
   t   d S r"   rq   r   r   r   r   meth,  s    z+TestSuper.test_cell_as_self.<locals>.X.meth)r   r   r   rt   r   r   r   r   r   r5   +  s   r5   c                     s      fdd} | S )Nc                      s    S r"   r   r   kr   r   g1  s    z1TestSuper.test_cell_as_self.<locals>.f.<locals>.gr   )rw   r5   ru   r   r   /  s    z&TestSuper.test_cell_as_self.<locals>.fr   )rb   r:   rn   rt   )r   r   cr   rx   r   test_cell_as_self*  s    zTestSuper.test_cell_as_selfc                    s*   t td}tdD ]}t |t| qd S )Ng      ?i  )r   floatrange__init__int)r   spir   r   r   test_super_init_leaks7  s    
zTestSuper.test_super_init_leaks)r   r   r   r#   r'   r(   r)   r*   r+   r.   r1   rA   rD   rE   rH   rV   rY   r[   re   ri   ro   rp   rs   rz   r   r   r   r   r   r   r!   +   s,   #r!   __main__)__doc__Zunittestr   r   r   r   r   r   r    ZTestCaser!   r   mainr   r   r   r   <module>   s     