o
    GXh\                     @   sp   d Z ddlZddlZddlZddlmZ dd Zeejej\Z	Z
Zeejej\ZZZedkr6e  dS dS )zUnit tests for abc.py.    N)
isabstractc                    sN   G  fdddt j}G  fdddt j}G  fdddt j}|||fS )Nc                       s0   e Zd Z fddZ fddZ fddZdS )z#test_factory.<locals>.TestLegacyAPIc                    s   t jdd }| |j dd }| t|d G dd d d}| t| G d	d
 d
|}| | j	d | t
|j	dd d S )Nc                 S      d S N selfr   r   7/opt/python-3.10.19/usr/lib/python3.10/test/test_abc.pyfoo      zMtest_factory.<locals>.TestLegacyAPI.test_abstractproperty_basics.<locals>.fooc                 S   r   r   r   r   r   r   r   bar       zMtest_factory.<locals>.TestLegacyAPI.test_abstractproperty_basics.<locals>.bar__isabstractmethod__c                   @      e Zd Zejdd ZdS )zKtest_factory.<locals>.TestLegacyAPI.test_abstractproperty_basics.<locals>.Cc                 S      dS N   r   r   r   r   r   r	      r
   zOtest_factory.<locals>.TestLegacyAPI.test_abstractproperty_basics.<locals>.C.fooN)__name__
__module____qualname__abcabstractpropertyr	   r   r   r   r   C       r   	metaclassc                           e Zd Ze fddZ  ZS )zKtest_factory.<locals>.TestLegacyAPI.test_abstractproperty_basics.<locals>.Dc                       t  jS r   superr	   r   	__class__r   r   r	         zOtest_factory.<locals>.TestLegacyAPI.test_abstractproperty_basics.<locals>.D.foo)r   r   r   propertyr	   __classcell__r   r   r   r   D       r$   r   F)r   r   
assertTruer   assertFalsehasattrassertRaises	TypeErrorassertEqualr	   getattrr   r	   r   r   r$   abc_ABCMetar   r   test_abstractproperty_basics   s   
z@test_factory.<locals>.TestLegacyAPI.test_abstractproperty_basicsc                    s   t jdd }| |j tdd }| t|dd G dd d d	}| t| G d
d d|}| 	|
 d | 	| 
 d d S )Nc                 S   r   r   r   clsr   r   r   r	   $   r
   zPtest_factory.<locals>.TestLegacyAPI.test_abstractclassmethod_basics.<locals>.fooc                 S   r   r   r   r1   r   r   r   r   '   r
   zPtest_factory.<locals>.TestLegacyAPI.test_abstractclassmethod_basics.<locals>.barr   Fc                   @   r   )zNtest_factory.<locals>.TestLegacyAPI.test_abstractclassmethod_basics.<locals>.Cc                 S      | j S r   r   r1   r   r   r   r	   ,      zRtest_factory.<locals>.TestLegacyAPI.test_abstractclassmethod_basics.<locals>.C.fooN)r   r   r   r   abstractclassmethodr	   r   r   r   r   r   +   r   r   r   c                       r   )zNtest_factory.<locals>.TestLegacyAPI.test_abstractclassmethod_basics.<locals>.Dc                    
   t   S r   r   r1   r   r   r   r	   0      
zRtest_factory.<locals>.TestLegacyAPI.test_abstractclassmethod_basics.<locals>.D.foor   r   r   classmethodr	   r#   r   r   r   r   r$   /   r%   r$   )r   r6   r&   r   r:   r'   r,   r)   r*   r+   r	   r-   r.   r   r   test_abstractclassmethod_basics#      

zCtest_factory.<locals>.TestLegacyAPI.test_abstractclassmethod_basicsc                    s   t jdd }| |j tdd }| t|dd G dd d d	}| t| G d
d d|}| 	|
 d | 	| 
 d d S )Nc                   S   r   r   r   r   r   r   r   r	   6   r
   zQtest_factory.<locals>.TestLegacyAPI.test_abstractstaticmethod_basics.<locals>.fooc                   S   r   r   r   r   r   r   r   r   9   r
   zQtest_factory.<locals>.TestLegacyAPI.test_abstractstaticmethod_basics.<locals>.barr   Fc                   @   r   )zOtest_factory.<locals>.TestLegacyAPI.test_abstractstaticmethod_basics.<locals>.Cc                   S   r   r   r   r   r   r   r   r	   >   r
   zStest_factory.<locals>.TestLegacyAPI.test_abstractstaticmethod_basics.<locals>.C.fooN)r   r   r   r   abstractstaticmethodr	   r   r   r   r   r   =   r   r   r   c                   @      e Zd Zedd ZdS )zOtest_factory.<locals>.TestLegacyAPI.test_abstractstaticmethod_basics.<locals>.Dc                   S   r   N   r   r   r   r   r   r	   B   r
   zStest_factory.<locals>.TestLegacyAPI.test_abstractstaticmethod_basics.<locals>.D.fooNr   r   r   staticmethodr	   r   r   r   r   r$   A       r$   r@   )r   r=   r&   r   rB   r'   r,   r)   r*   r+   r	   r-   r.   r   r    test_abstractstaticmethod_basics5   r<   zDtest_factory.<locals>.TestLegacyAPI.test_abstractstaticmethod_basicsN)r   r   r   r0   r;   rD   r   r.   r   r   TestLegacyAPI   s    rE   c                       sn  e Zd Zdd Zdd Z fddZ fddZ fd	d
Z fddZ fddZ	 fddZ
 fddZ fddZ fddZ fddZ fddZ fddZ fddZ fdd Z fd!d"Z fd#d$Z fd%d&Zd'd( Z fd)d*Zd+d, Z fd-d.Z fd/d0Z fd1d2Z fd3d4Z fd5d6Zd7d8 Z fd9d:Z fd;d<Z  fd=d>Z!d?S )@ztest_factory.<locals>.TestABCc                 S   sT   G dd dt j}| t|t j | t| G dd d|}| | d d S )Nc                   @      e Zd Zeejdd ZdS )z8test_factory.<locals>.TestABC.test_ABC_helper.<locals>.Cc                 S   r3   r   r4   r1   r   r   r   r	   M      z<test_factory.<locals>.TestABC.test_ABC_helper.<locals>.C.fooNr   r   r   r:   r   abstractmethodr	   r   r   r   r   r   L       r   c                       r   )z8test_factory.<locals>.TestABC.test_ABC_helper.<locals>.Dc                    r7   r   r   r1   r   r   r   r	   S   r8   z<test_factory.<locals>.TestABC.test_ABC_helper.<locals>.D.foor9   r   r   r   r   r$   R   r%   r$   )r   ABCr+   typeABCMetar)   r*   r	   )r   r   r$   r   r   r   test_ABC_helperJ   s
   z-test_factory.<locals>.TestABC.test_ABC_helperc                 S   s6   t jdd }| |j dd }| t|d d S )Nc                 S   r   r   r   r   r   r   r   r	   X   r
   zEtest_factory.<locals>.TestABC.test_abstractmethod_basics.<locals>.fooc                 S   r   r   r   r   r   r   r   r   [   r   zEtest_factory.<locals>.TestABC.test_abstractmethod_basics.<locals>.barr   )r   rI   r&   r   r'   r(   )r   r	   r   r   r   r   test_abstractmethod_basicsW   s
   
z8test_factory.<locals>.TestABC.test_abstractmethod_basicsc                    s~   t tjdd }| |j dd }| t|dd G dd dd	 | t  G  fd
dd }| 	| j
d d S )Nc                 S   r   r   r   r   r   r   r   r	   _      zGtest_factory.<locals>.TestABC.test_abstractproperty_basics.<locals>.fooc                 S   r   r   r   r   r   r   r   r   c   r   zGtest_factory.<locals>.TestABC.test_abstractproperty_basics.<locals>.barr   Fc                   @   rF   )zEtest_factory.<locals>.TestABC.test_abstractproperty_basics.<locals>.Cc                 S   r   r   r   r   r   r   r   r	   g   rP   zItest_factory.<locals>.TestABC.test_abstractproperty_basics.<locals>.C.fooN)r   r   r   r"   r   rI   r	   r   r   r   r   r   f   rJ   r   r   c                       $   e Zd Zjj fddZ  ZS )zEtest_factory.<locals>.TestABC.test_abstractproperty_basics.<locals>.Dc                    r   r   r   r   r   r   r   r	   l   r!   zItest_factory.<locals>.TestABC.test_abstractproperty_basics.<locals>.D.foor   r   r   r	   getterr#   r   r   r   r   r$   k       r$   r   )r"   r   rI   r&   r   r'   r,   r)   r*   r+   r	   )r   r	   r   r$   r.   rT   r   r0   ^   s   z:test_factory.<locals>.TestABC.test_abstractproperty_basicsc                    s   t tjdd }| |j t dd }| t|dd G dd d d	}| t| G d
d d|}| 	|
 d | 	| 
 d d S )Nc                 S   r   r   r   r1   r   r   r   r	   q   rP   zJtest_factory.<locals>.TestABC.test_abstractclassmethod_basics.<locals>.fooc                 S   r   r   r   r1   r   r   r   r   u   r
   zJtest_factory.<locals>.TestABC.test_abstractclassmethod_basics.<locals>.barr   Fc                   @   rF   )zHtest_factory.<locals>.TestABC.test_abstractclassmethod_basics.<locals>.Cc                 S   r3   r   r4   r1   r   r   r   r	   z   rG   zLtest_factory.<locals>.TestABC.test_abstractclassmethod_basics.<locals>.C.fooNrH   r   r   r   r   r   y   rJ   r   r   c                       r   )zHtest_factory.<locals>.TestABC.test_abstractclassmethod_basics.<locals>.Dc                    r7   r   r   r1   r   r   r   r	      r8   zLtest_factory.<locals>.TestABC.test_abstractclassmethod_basics.<locals>.D.foor9   r   r   r   r   r$   ~   r%   r$   )r:   r   rI   r&   r   r'   r,   r)   r*   r+   r	   r-   r.   r   r   r;   p      
z=test_factory.<locals>.TestABC.test_abstractclassmethod_basicsc                    s   t tjdd }| |j t dd }| t|dd G dd d d	}| t| G d
d d|}| 	|
 d | 	| 
 d d S )Nc                   S   r   r   r   r   r   r   r   r	      rP   zKtest_factory.<locals>.TestABC.test_abstractstaticmethod_basics.<locals>.fooc                   S   r   r   r   r   r   r   r   r      r
   zKtest_factory.<locals>.TestABC.test_abstractstaticmethod_basics.<locals>.barr   Fc                   @   rF   )zItest_factory.<locals>.TestABC.test_abstractstaticmethod_basics.<locals>.Cc                   S   r   r   r   r   r   r   r   r	      rP   zMtest_factory.<locals>.TestABC.test_abstractstaticmethod_basics.<locals>.C.fooN)r   r   r   rB   r   rI   r	   r   r   r   r   r      rJ   r   r   c                   @   r>   )zItest_factory.<locals>.TestABC.test_abstractstaticmethod_basics.<locals>.Dc                   S   r   r?   r   r   r   r   r   r	      r
   zMtest_factory.<locals>.TestABC.test_abstractstaticmethod_basics.<locals>.D.fooNrA   r   r   r   r   r$      rC   r$   r@   )rB   r   rI   r&   r   r'   r,   r)   r*   r+   r	   r-   r.   r   r   rD      rV   z>test_factory.<locals>.TestABC.test_abstractstaticmethod_basicsc                    (   G dd d d}d}|  t|| d S )Nc                   @   r   )zPtest_factory.<locals>.TestABC.test_object_new_with_one_abstractmethod.<locals>.Cc                 S   r   r   r   r   r   r   r   
method_one   rP   z[test_factory.<locals>.TestABC.test_object_new_with_one_abstractmethod.<locals>.C.method_oneN)r   r   r   r   rI   rX   r   r   r   r   r      r   r   r   z'class C with abstract method method_oneassertRaisesRegexr*   r   r   msgr.   r   r   'test_object_new_with_one_abstractmethod   s   zEtest_factory.<locals>.TestABC.test_object_new_with_one_abstractmethodc                    rW   )Nc                   @   s(   e Zd Zejdd Zejdd ZdS )zRtest_factory.<locals>.TestABC.test_object_new_with_many_abstractmethods.<locals>.Cc                 S   r   r   r   r   r   r   r   rX      rP   z]test_factory.<locals>.TestABC.test_object_new_with_many_abstractmethods.<locals>.C.method_onec                 S   r   r   r   r   r   r   r   
method_two   rP   z]test_factory.<locals>.TestABC.test_object_new_with_many_abstractmethods.<locals>.C.method_twoN)r   r   r   r   rI   rX   r^   r   r   r   r   r      s
    
r   r   z4class C with abstract methods method_one, method_tworY   r[   r.   r   r   )test_object_new_with_many_abstractmethods   s   zGtest_factory.<locals>.TestABC.test_object_new_with_many_abstractmethodsc                    s
  t jt jt jt jfD ]x G  fdddd}| |jdh | t| | 	t
| G dd d|}| |jdh | t| | 	t
| G dd d|}| |jt  |  | t
| G  fd	d
d
|}| |jdh | t| | 	t
| q
d S )Nc                       s    e Zd Z dd Zdd ZdS )zHtest_factory.<locals>.TestABC.test_abstractmethod_integration.<locals>.Cc                 S   r   r   r   r   r   r   r   r	      r
   zLtest_factory.<locals>.TestABC.test_abstractmethod_integration.<locals>.C.fooc                 S   r   r   r   r   r   r   r   r      r   zLtest_factory.<locals>.TestABC.test_abstractmethod_integration.<locals>.C.barN)r   r   r   r	   r   r   Zabstractthingr   r   r      s    
r   r   r	   c                   @      e Zd Zdd ZdS )zHtest_factory.<locals>.TestABC.test_abstractmethod_integration.<locals>.Dc                 S   r   r   r   r   r   r   r   r      r   zLtest_factory.<locals>.TestABC.test_abstractmethod_integration.<locals>.D.barNr   r   r   r   r   r   r   r   r$          r$   c                   @   ra   )zHtest_factory.<locals>.TestABC.test_abstractmethod_integration.<locals>.Ec                 S   r   r   r   r   r   r   r   r	      r   zLtest_factory.<locals>.TestABC.test_abstractmethod_integration.<locals>.E.fooNr   r   r   r	   r   r   r   r   E   rc   re   c                       s   e Zd Z dd ZdS )zHtest_factory.<locals>.TestABC.test_abstractmethod_integration.<locals>.Fc                 S   r   r   r   r   r   r   r   r      r
   zLtest_factory.<locals>.TestABC.test_abstractmethod_integration.<locals>.F.barNrb   r   r`   r   r   F   rC   rf   r   )r   rI   r   r6   r=   r+   __abstractmethods__r)   r*   r&   r   setr'   )r   r   r$   re   rf   r.   r`   r   test_abstractmethod_integration   s*   z=test_factory.<locals>.TestABC.test_abstractmethod_integrationc                    s   G dd dd |  t  G  fddd |  t G fddd}| | jd G d	d
 d
t|  t G fddd }W d    d S 1 sTw   Y  d S )Nc                   @   s2   e Zd Zeejdd Zejejdd ZdS )zMtest_factory.<locals>.TestABC.test_descriptors_with_abstractmethod.<locals>.Cc                 S   r   r   r   r   r   r   r   r	      rP   zQtest_factory.<locals>.TestABC.test_descriptors_with_abstractmethod.<locals>.C.fooc                 S   r   r   r   r   valr   r   r   r	      rP   N)r   r   r   r"   r   rI   r	   setterr   r   r   r   r          r   r   c                       rQ   )zMtest_factory.<locals>.TestABC.test_descriptors_with_abstractmethod.<locals>.Dc                    r   r   r   r   r   r   r   r	      r!   zQtest_factory.<locals>.TestABC.test_descriptors_with_abstractmethod.<locals>.D.foorR   r   rT   r   r   r$      rU   r$   c                          e Zd Z jjdd ZdS )zMtest_factory.<locals>.TestABC.test_descriptors_with_abstractmethod.<locals>.Ec                 S   r   r   r   rj   r   r   r   r	      r
   zQtest_factory.<locals>.TestABC.test_descriptors_with_abstractmethod.<locals>.E.fooNr   r   r   r	   rl   r   r$   r   r   re          re   r   c                   @   s   e Zd Zdd ZeZdS )zStest_factory.<locals>.TestABC.test_descriptors_with_abstractmethod.<locals>.NotBoolc                 S   s   t  r   )
ValueErrorr   r   r   r   __bool__   r5   z\test_factory.<locals>.TestABC.test_descriptors_with_abstractmethod.<locals>.NotBool.__bool__N)r   r   r   rs   __len__r   r   r   r   NotBool   s    ru   c                       s$   e Zd Zdd Z  e_eeZdS )zMtest_factory.<locals>.TestABC.test_descriptors_with_abstractmethod.<locals>.Fc                 S   r   r   r   r   r   r   r   r      r
   zQtest_factory.<locals>.TestABC.test_descriptors_with_abstractmethod.<locals>.F.barN)r   r   r   r   r   r"   r	   r   )ru   r   r   rf      s    rf   )r)   r*   r+   r	   objectrr   )r   re   rf   r.   )r   r$   ru   r   $test_descriptors_with_abstractmethod   s   "zBtest_factory.<locals>.TestABC.test_descriptors_with_abstractmethodc                    sz   G fdddG fdddd |  t  G  fddd |  t G fdd	d	}| |jj d S )
Nc                       s:   e Zd Zd
ddZ fddZ fddZedd	 ZdS )z\test_factory.<locals>.TestABC.test_customdescriptors_with_abstractmethod.<locals>.DescriptorNc                 S   s   || _ || _d S r   )_fget_fset)r   fgetfsetr   r   r   __init__   s   
zetest_factory.<locals>.TestABC.test_customdescriptors_with_abstractmethod.<locals>.Descriptor.__init__c                    s    || j S r   rx   r   callable
Descriptorr   r   rS         zctest_factory.<locals>.TestABC.test_customdescriptors_with_abstractmethod.<locals>.Descriptor.getterc                    s    | j |S r   r}   r~   r   r   r   rl      r   zctest_factory.<locals>.TestABC.test_customdescriptors_with_abstractmethod.<locals>.Descriptor.setterc                 S   s   t | jddpt | jddS )Nr   F)r,   rx   ry   r   r   r   r   r      s   zqtest_factory.<locals>.TestABC.test_customdescriptors_with_abstractmethod.<locals>.Descriptor.__isabstractmethod__r   )r   r   r   r|   rS   rl   r"   r   r   r   r   r   r      s    
r   c                       s2   e Zd Z ejdd Zejejdd ZdS )zStest_factory.<locals>.TestABC.test_customdescriptors_with_abstractmethod.<locals>.Cc                 S   r   r   r   r   r   r   r   r	      rP   zWtest_factory.<locals>.TestABC.test_customdescriptors_with_abstractmethod.<locals>.C.fooc                 S   r   r   r   rj   r   r   r   r	      rP   N)r   r   r   r   rI   r	   rl   r   r   r   r   r      rm   r   r   c                       rQ   )zStest_factory.<locals>.TestABC.test_customdescriptors_with_abstractmethod.<locals>.Dc                    r   r   r   r   r   r   r   r	      r!   zWtest_factory.<locals>.TestABC.test_customdescriptors_with_abstractmethod.<locals>.D.foorR   r   rT   r   r   r$      rU   r$   c                       rn   )zStest_factory.<locals>.TestABC.test_customdescriptors_with_abstractmethod.<locals>.Ec                 S   r   r   r   rj   r   r   r   r	      r
   zWtest_factory.<locals>.TestABC.test_customdescriptors_with_abstractmethod.<locals>.E.fooNro   r   rp   r   r   re      rq   re   )r)   r*   r'   r	   r   )r   re   r.   )r   r$   r   r   *test_customdescriptors_with_abstractmethod   s   zHtest_factory.<locals>.TestABC.test_customdescriptors_with_abstractmethodc                    sJ   G dd d d}|  |jdh G dd dt|}G dd d|d}d S )	Nc                   @   r   )z;test_factory.<locals>.TestABC.test_metaclass_abc.<locals>.Ac                 S   r   r   r   r   r   r   r   x  rP   z=test_factory.<locals>.TestABC.test_metaclass_abc.<locals>.A.xN)r   r   r   r   rI   r   r   r   r   r   A  r   r   r   r   c                   @   ra   )z>test_factory.<locals>.TestABC.test_metaclass_abc.<locals>.metac                 S   r   N   r   r   r   r   r   r     r
   z@test_factory.<locals>.TestABC.test_metaclass_abc.<locals>.meta.xN)r   r   r   r   r   r   r   r   meta  rc   r   c                   @      e Zd ZdS )z;test_factory.<locals>.TestABC.test_metaclass_abc.<locals>.CNr   r   r   r   r   r   r   r         r   )r+   rg   rL   )r   r   r   r   r.   r   r   test_metaclass_abc  s   z0test_factory.<locals>.TestABC.test_metaclass_abcc                    s  G dd d d}G dd dt }| }| t|| | t||f | || | ||f ||}| t|| | t||f | || | ||f | || G dd d|}| }| t|| | t||f | || | ||f d S )Nc                   @   r   )zAtest_factory.<locals>.TestABC.test_registration_basics.<locals>.ANr   r   r   r   r   r     r   r   r   c                   @   r   )zAtest_factory.<locals>.TestABC.test_registration_basics.<locals>.BNr   r   r   r   r   B  r   r   c                   @   r   )zAtest_factory.<locals>.TestABC.test_registration_basics.<locals>.CNr   r   r   r   r   r   !  r   r   )rv   r'   
issubclassZassertNotIsInstanceregisterr&   assertIsInstanceassertIs)r   r   r   bB1r   cr.   r   r   test_registration_basics  s&   
z6test_factory.<locals>.TestABC.test_registration_basicsc                    s   G dd d d}|j G dd dt}| }| t|| | t||f | || | ||f |j G dd d|}| }| t|| | t||f | || | ||f | || | d S )Nc                   @   r   )zDtest_factory.<locals>.TestABC.test_register_as_class_deco.<locals>.ANr   r   r   r   r   r   *  r   r   r   c                   @   r   )zDtest_factory.<locals>.TestABC.test_register_as_class_deco.<locals>.BNr   r   r   r   r   r   ,      r   c                   @   r   )zDtest_factory.<locals>.TestABC.test_register_as_class_deco.<locals>.CNr   r   r   r   r   r   4  r   r   )r   rv   r&   r   r   r   )r   r   r   r   r   r   r.   r   r   test_register_as_class_deco)  s    z9test_factory.<locals>.TestABC.test_register_as_class_decoc                    s   G dd d d}G dd d}| }|  t|| |  t||f  }||  }| || | t|| | t||f d S )Nc                   @   r   )zEtest_factory.<locals>.TestABC.test_isinstance_invalidation.<locals>.ANr   r   r   r   r   r   ?  r   r   r   c                   @   r   )zEtest_factory.<locals>.TestABC.test_isinstance_invalidation.<locals>.BNr   r   r   r   r   r   A  r   r   )r'   
isinstancer   ZassertGreaterr&   )r   r   r   r   Z	token_oldZ	token_newr/   abc_get_cache_tokenr   r   test_isinstance_invalidation>  s   
z:test_factory.<locals>.TestABC.test_isinstance_invalidationc                    s   G dd d d}| t | d| | d|f | tt| | tt|f G dd d|}| t G dd dt}| d	| | d	|f | tt| | tt|f | t|| | t||f d S )
Nc                   @   r   )zCtest_factory.<locals>.TestABC.test_registration_builtins.<locals>.ANr   r   r   r   r   r   N  r   r   r   *   c                   @   r   )zCtest_factory.<locals>.TestABC.test_registration_builtins.<locals>.BNr   r   r   r   r   r   U  r   r   c                   @   r   )zCtest_factory.<locals>.TestABC.test_registration_builtins.<locals>.CNr   r   r   r   r   r   X      r    )r   intr   r&   r   strr   r   r   r   r.   r   r   test_registration_builtinsM  s   

z8test_factory.<locals>.TestABC.test_registration_builtinsc                    s   G dd d d}| | G dd d|}| t|j | G dd dt}| | | | G dd	 d	|}| | | t|j | | | d S )
Nc                   @   r   )zEtest_factory.<locals>.TestABC.test_registration_edge_cases.<locals>.ANr   r   r   r   r   r   a  r   r   r   c                   @   r   )zFtest_factory.<locals>.TestABC.test_registration_edge_cases.<locals>.A1Nr   r   r   r   r   A1d  r   r   c                   @   r   )zEtest_factory.<locals>.TestABC.test_registration_edge_cases.<locals>.BNr   r   r   r   r   r   g  r   r   c                   @   r   )zEtest_factory.<locals>.TestABC.test_registration_edge_cases.<locals>.CNr   r   r   r   r   r   k  r   r   )r   r)   RuntimeErrorrv   )r   r   r   r   r   r.   r   r   test_registration_edge_cases`  s   



z:test_factory.<locals>.TestABC.test_registration_edge_casesc                    s(   G dd d d}|  td|jd d S )Nc                   @   r   )z@test_factory.<locals>.TestABC.test_register_non_class.<locals>.ANr   r   r   r   r   r   r  r   r   r   zCan only register classesr@   )rZ   r*   r   r   r   r.   r   r   test_register_non_classq  s   z5test_factory.<locals>.TestABC.test_register_non_classc                    s  G dd d d}|  t|| |  t||f G dd d d}| t|| | t||f | t|| | t||f G dd d d}|| G dd	 d	|}|  t|| |  t||f G d
d d|}|| | t|| | t||f | t|| | t||f |  t|| |  t||f |  t|| |  t||f |  t|| |  t||f |t G dd dt}|  t|| |  t||f | d| | d|f d S )Nc                   @   r   )zItest_factory.<locals>.TestABC.test_registration_transitiveness.<locals>.ANr   r   r   r   r   r   x  r   r   r   c                   @   r   )zItest_factory.<locals>.TestABC.test_registration_transitiveness.<locals>.BNr   r   r   r   r   r   |  r   r   c                   @   r   )zItest_factory.<locals>.TestABC.test_registration_transitiveness.<locals>.CNr   r   r   r   r   r     r   r   c                   @   r   )zJtest_factory.<locals>.TestABC.test_registration_transitiveness.<locals>.B1Nr   r   r   r   r   r     r   r   c                   @   r   )zJtest_factory.<locals>.TestABC.test_registration_transitiveness.<locals>.C1Nr   r   r   r   r   C1  r   r   c                   @   r   )zMtest_factory.<locals>.TestABC.test_registration_transitiveness.<locals>.MyIntNr   r   r   r   r   MyInt  r   r   r   )r&   r   r'   r   r   r   )r   r   r   r   r   r   r   r.   r   r    test_registration_transitivenessw  s>   


z>test_factory.<locals>.TestABC.test_registration_transitivenessc              
      s  G dd dd}|  t ti | W d    n1 sw   Y  |  t td| W d    n1 s8w   Y  G dd d}|  t t| | W d    n1 sZw   Y  d dd d	d d
d g}t|D ]?\}G fdddd}| j|d" |  t tt| W d    n1 sw   Y  W d    n1 sw   Y  qod  fddG fdddd}| t  tt| W d    d S 1 sw   Y  d S )Nc                   @   r   )zFtest_factory.<locals>.TestABC.test_issubclass_bad_arguments.<locals>.ANr   r   r   r   r   r     r   r   r   r   c                   @      e Zd ZdZdS )zFtest_factory.<locals>.TestABC.test_issubclass_bad_arguments.<locals>.Cr   N)r   r   r   __mro__r   r   r   r   r         r   c                 S   s   g S r   r   )r   r   r   r   <lambda>  r   zMtest_factory.<locals>.TestABC.test_issubclass_bad_arguments.<locals>.<lambda>c                   S   r   Nr   r   r   r   r   r   r     r   c                   S   s   dgS r   r   r   r   r   r   r     s    c                          e Zd Z ZdS zFtest_factory.<locals>.TestABC.test_issubclass_bad_arguments.<locals>.SNr   r   r   __subclasses__r   )funcr   r   S  r   r   )izexception from __subclasses__c                      s   t  r   )	Exceptionr   )exc_msgr   r   	raise_exc  r!   zNtest_factory.<locals>.TestABC.test_issubclass_bad_arguments.<locals>.raise_excc                       r   r   r   r   )r   r   r   r     r   )r)   r*   r   	enumerateZsubTestr   rZ   r   )r   r   r   Zbogus_subclassesr   r   r.   )r   r   r   r   test_issubclass_bad_arguments  s>   "z;test_factory.<locals>.TestABC.test_issubclass_bad_argumentsc                    s   G  fdddt jd | t   | t  f G dd d}| t|  | t| f G dd d}| t|  | t| f d S )Nc                       s   e Zd Ze fddZdS )z:test_factory.<locals>.TestABC.test_subclasshook.<locals>.Ac                    s   |  u r	d|j v S tS )Nr	   )__dict__NotImplemented)r2   r   r   r   r   __subclasshook__  s   
zKtest_factory.<locals>.TestABC.test_subclasshook.<locals>.A.__subclasshook__N)r   r   r   r:   r   r   r   r   r   r     s    r   r   c                   @   r   )z:test_factory.<locals>.TestABC.test_subclasshook.<locals>.Br   Nrd   r   r   r   r   r     r   r   c                   @   r   )z:test_factory.<locals>.TestABC.test_subclasshook.<locals>.Cr   N)r   r   r   Zspamr   r   r   r   r     r   r   )r   rM   r'   r   r&   )r   r   r   r   r   r   test_subclasshook  s   z/test_factory.<locals>.TestABC.test_subclasshookc                    s^   G dd dd}G  fdddt  G dd d| }|  jd |  |  jd	 d S )
Nc                   @   r   )zHtest_factory.<locals>.TestABC.test_all_new_methods_are_called.<locals>.ANr   r   r   r   r   r     r   r   r   c                       s"   e Zd ZdZ fddZ  ZS )zHtest_factory.<locals>.TestABC.test_all_new_methods_are_called.<locals>.Br   c                    s     j d7  _ t | S r   )counterr   __new__r1   )r   r    r   r   r     s   zPtest_factory.<locals>.TestABC.test_all_new_methods_are_called.<locals>.B.__new__)r   r   r   r   r   r#   r   r   r   r   r     s    r   c                   @   r   )zHtest_factory.<locals>.TestABC.test_all_new_methods_are_called.<locals>.CNr   r   r   r   r   r     r   r   r   r   )rv   r+   r   )r   r   r   r.   r   r   test_all_new_methods_are_called  s   z=test_factory.<locals>.TestABC.test_all_new_methods_are_calledc                 S   s   |  ttjd d S )N	__slots__)r&   r(   r   rK   r   r   r   r   test_ABC_has___slots__  s   z4test_factory.<locals>.TestABC.test_ABC_has___slots__c                    sN   dd }G dd d}G dd d}G dd d| ||}|  |j  d S )	Nc                    s&   G  fdddt }t |ddi S )Nc                       s   e Zd Z fddZdS )z^test_factory.<locals>.TestABC.test_tricky_new_works.<locals>.with_metaclass.<locals>.metaclassc                    s   | |S r   r   )r2   nameZ
this_basesdbasesr   r   r   r     r   zftest_factory.<locals>.TestABC.test_tricky_new_works.<locals>.with_metaclass.<locals>.metaclass.__new__N)r   r   r   r   r   r   r   r   r     s    r   Ztemporary_classr   )rL   r   )r   r   r   r   r   r   with_metaclass  s   zKtest_factory.<locals>.TestABC.test_tricky_new_works.<locals>.with_metaclassc                   @   r   )z>test_factory.<locals>.TestABC.test_tricky_new_works.<locals>.ANr   r   r   r   r   r     r   r   c                   @   r   )z>test_factory.<locals>.TestABC.test_tricky_new_works.<locals>.BNr   r   r   r   r   r     r   r   c                   @   r   )z>test_factory.<locals>.TestABC.test_tricky_new_works.<locals>.CNr   r   r   r   r   r     r   r   )r+   r    )r   r   r   r   r   r.   r   r   test_tricky_new_works  s
   z3test_factory.<locals>.TestABC.test_tricky_new_worksc                    sZ   G dd d d}|` | |jdh | t|d t| | |jt  |  d S )Nc                   @   r   )z8test_factory.<locals>.TestABC.test_update_del.<locals>.Ac                 S   r   r   r   r   r   r   r   r	     rP   z<test_factory.<locals>.TestABC.test_update_del.<locals>.A.fooNr   r   r   r   rI   r	   r   r   r   r   r     r   r   r   r	   )r	   r+   rg   r'   r(   r   update_abstractmethodsrh   r   r.   r   r   test_update_del  s   

z-test_factory.<locals>.TestABC.test_update_delc                    sX   G dd d d}t jdd }||_t | | |jddh d}| t|| d S )	Nc                   @   r   )zHtest_factory.<locals>.TestABC.test_update_new_abstractmethods.<locals>.Ac                 S   r   r   r   r   r   r   r   r     rP   zLtest_factory.<locals>.TestABC.test_update_new_abstractmethods.<locals>.A.barN)r   r   r   r   rI   r   r   r   r   r   r     r   r   r   c                 S   r   r   r   r   r   r   r   updated_foo  rP   zRtest_factory.<locals>.TestABC.test_update_new_abstractmethods.<locals>.updated_foor	   r   z&class A with abstract methods bar, foo)r   rI   r	   r   r+   rg   rZ   r*   )r   r   r   r\   r.   r   r   test_update_new_abstractmethods  s   

z=test_factory.<locals>.TestABC.test_update_new_abstractmethodsc                    sr   G dd d d}G dd d|}d}|  t|| | |jdh dd	 |_t| |  | |jt  d S )
Nc                   @   r   )zCtest_factory.<locals>.TestABC.test_update_implementation.<locals>.Ac                 S   r   r   r   r   r   r   r   r	     rP   zGtest_factory.<locals>.TestABC.test_update_implementation.<locals>.A.fooNr   r   r   r   r   r     r   r   r   c                   @   r   )zCtest_factory.<locals>.TestABC.test_update_implementation.<locals>.BNr   r   r   r   r   r   #  r   r    class B with abstract method foor	   c                 S   r   r   r   r   r   r   r   r   *  r   zJtest_factory.<locals>.TestABC.test_update_implementation.<locals>.<lambda>)rZ   r*   r+   rg   r	   r   r   rh   r   r   r   r\   r.   r   r   test_update_implementation  s   

z8test_factory.<locals>.TestABC.test_update_implementationc                    sN   G dd d d}dd }t j|G dd d|}|  | |jt  d S )Nc                   @   r   )zAtest_factory.<locals>.TestABC.test_update_as_decorator.<locals>.Ac                 S   r   r   r   r   r   r   r   r	   3  rP   zEtest_factory.<locals>.TestABC.test_update_as_decorator.<locals>.A.fooNr   r   r   r   r   r   2  r   r   r   c                 S   s   dd | _ | S )Nc                 S   r   r   r   r   r   r   r   r   8  r   zatest_factory.<locals>.TestABC.test_update_as_decorator.<locals>.class_decorator.<locals>.<lambda>)r	   r1   r   r   r   class_decorator7  s   
zOtest_factory.<locals>.TestABC.test_update_as_decorator.<locals>.class_decoratorc                   @   r   )zAtest_factory.<locals>.TestABC.test_update_as_decorator.<locals>.BNr   r   r   r   r   r   ;  s    r   )r   r   r+   rg   rh   )r   r   r   r   r.   r   r   test_update_as_decorator1  s   z6test_factory.<locals>.TestABC.test_update_as_decoratorc                 S   sF   G dd d}t jdd }||_t | |  | t|d d S )Nc                   @   r   )z<test_factory.<locals>.TestABC.test_update_non_abc.<locals>.ANr   r   r   r   r   r   D  r   r   c                 S   r   r   r   r   r   r   r   r   G  rP   zFtest_factory.<locals>.TestABC.test_update_non_abc.<locals>.updated_foorg   )r   rI   r	   r   r'   r(   )r   r   r   r   r   r   test_update_non_abcC  s   

z1test_factory.<locals>.TestABC.test_update_non_abcc                    sL   G dd d d}G dd d|}|  |` t| d}| t|| d S )Nc                   @   r   )zGtest_factory.<locals>.TestABC.test_update_del_implementation.<locals>.Ac                 S   r   r   r   r   r   r   r   r	   R  rP   zKtest_factory.<locals>.TestABC.test_update_del_implementation.<locals>.A.fooNr   r   r   r   r   r   Q  r   r   r   c                   @   ra   )zGtest_factory.<locals>.TestABC.test_update_del_implementation.<locals>.Bc                 S   r   r   r   r   r   r   r   r	   W  r
   zKtest_factory.<locals>.TestABC.test_update_del_implementation.<locals>.B.fooNrd   r   r   r   r   r   V  rc   r   r   r	   r   r   rZ   r*   r   r.   r   r   test_update_del_implementationP  s   
z<test_factory.<locals>.TestABC.test_update_del_implementationc                    s\   G dd d d}G dd d|}G dd d|}|  |` t| d}| t|| d S )	Nc                   @   r   )zKtest_factory.<locals>.TestABC.test_update_layered_implementation.<locals>.Ac                 S   r   r   r   r   r   r   r   r	   e  rP   zOtest_factory.<locals>.TestABC.test_update_layered_implementation.<locals>.A.fooNr   r   r   r   r   r   d  r   r   r   c                   @   r   )zKtest_factory.<locals>.TestABC.test_update_layered_implementation.<locals>.BNr   r   r   r   r   r   i  r   r   c                   @   ra   )zKtest_factory.<locals>.TestABC.test_update_layered_implementation.<locals>.Cc                 S   r   r   r   r   r   r   r   r	   m  r
   zOtest_factory.<locals>.TestABC.test_update_layered_implementation.<locals>.C.fooNrd   r   r   r   r   r   l  rc   r   z class C with abstract method foor   )r   r   r   r   r\   r.   r   r   "test_update_layered_implementationc  s   
z@test_factory.<locals>.TestABC.test_update_layered_implementationc                    sn   G dd d d}G dd d d}G dd d||}|  |jdh |`t| |  |jt  |  d S )	Nc                   @   r   )zFtest_factory.<locals>.TestABC.test_update_multi_inheritance.<locals>.Ac                 S   r   r   r   r   r   r   r   r	   {  rP   zJtest_factory.<locals>.TestABC.test_update_multi_inheritance.<locals>.A.fooNr   r   r   r   r   r   z  r   r   r   c                   @   ra   )zFtest_factory.<locals>.TestABC.test_update_multi_inheritance.<locals>.Bc                 S   r   r   r   r   r   r   r   r	     r
   zJtest_factory.<locals>.TestABC.test_update_multi_inheritance.<locals>.B.fooNrd   r   r   r   r   r     rc   r   c                   @   r   )zFtest_factory.<locals>.TestABC.test_update_multi_inheritance.<locals>.Cc                 S   r   r   r   r   r   r   r   r	     rP   zJtest_factory.<locals>.TestABC.test_update_multi_inheritance.<locals>.C.fooNr   r   r   r   r   r     r   r   r	   )r+   rg   r	   r   r   rh   r   r.   r   r   test_update_multi_inheritancey  s   

z;test_factory.<locals>.TestABC.test_update_multi_inheritanceN)"r   r   r   rN   rO   r0   r;   rD   r]   r_   ri   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   TestABCH   s@    '0r   c                       s   e Zd Z fddZdS )z-test_factory.<locals>.TestABCWithInitSubclassc              	      s\   G dd dd}i  G  fddd}G dd d||dd	d
d}|   tdd	d
d d S )Nc                   @   r   )z\test_factory.<locals>.TestABCWithInitSubclass.test_works_with_init_subclass.<locals>.abc_ABCr   N)r   r   r   r   r   r   r   r   abc_ABC  r   r   r   c                       s   e Zd Z fddZ  ZS )zhtest_factory.<locals>.TestABCWithInitSubclass.test_works_with_init_subclass.<locals>.ReceivesClassKwargsc                    s   t    | d S r   )r   __init_subclass__update)r2   kwargs)r    saved_kwargsr   r   r     s   
zztest_factory.<locals>.TestABCWithInitSubclass.test_works_with_init_subclass.<locals>.ReceivesClassKwargs.__init_subclass__)r   r   r   r   r#   r   r   r   r   ReceivesClassKwargs  s    r   c                   @   r   )z]test_factory.<locals>.TestABCWithInitSubclass.test_works_with_init_subclass.<locals>.ReceiverNr   r   r   r   r   Receiver  r   r   r      r   )r   yz)r+   dict)r   r   r   r   r.   r   r   test_works_with_init_subclass  s
   zKtest_factory.<locals>.TestABCWithInitSubclass.test_works_with_init_subclassN)r   r   r   r   r   r.   r   r   TestABCWithInitSubclass  s    r   )unittestZTestCase)r/   r   rE   r   r   r   r   r   test_factory   s   8    O
r   __main__)__doc__r   r   Z_py_abcinspectr   r   rM   get_cache_tokenZTestLegacyAPI_PyZ
TestABC_PyZTestABCWithInitSubclass_PyZTestLegacyAPI_CZ	TestABC_CZTestABCWithInitSubclass_Cr   mainr   r   r   r   <module>   s(        

