a
    äze‡M  ã                   @   sl   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rhe ¡  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   s   d S ©N© ©Úselfr   r   ú#/usr/lib/python3.9/test/test_abc.pyÚfoo   s    zMtest_factory.<locals>.TestLegacyAPI.test_abstractproperty_basics.<locals>.fooc                 S   s   d S r   r   r   r   r   r   Úbar   ó    zMtest_factory.<locals>.TestLegacyAPI.test_abstractproperty_basics.<locals>.barÚ__isabstractmethod__c                   @   s   e Zd Zejdd„ ƒZdS )zKtest_factory.<locals>.TestLegacyAPI.test_abstractproperty_basics.<locals>.Cc                 S   s   dS ©Né   r   r   r   r   r   r      s    zOtest_factory.<locals>.TestLegacyAPI.test_abstractproperty_basics.<locals>.C.fooN)Ú__name__Ú
__module__Ú__qualname__ÚabcÚabstractpropertyr   r   r   r   r   ÚC   s   r   ©Ú	metaclassc                       s    e Zd Ze‡ fdd„ƒZ‡  ZS )zKtest_factory.<locals>.TestLegacyAPI.test_abstractproperty_basics.<locals>.Dc                    s   t ƒ jS r   ©Úsuperr   r   ©Ú	__class__r   r   r      s    zOtest_factory.<locals>.TestLegacyAPI.test_abstractproperty_basics.<locals>.D.foo)r   r   r   Úpropertyr   Ú__classcell__r   r   r   r   ÚD   s   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   s   d S r   r   ©Úclsr   r   r   r   $   s    zPtest_factory.<locals>.TestLegacyAPI.test_abstractclassmethod_basics.<locals>.fooc                 S   s   d S r   r   r(   r   r   r   r	   '   s    zPtest_factory.<locals>.TestLegacyAPI.test_abstractclassmethod_basics.<locals>.barr   Fc                   @   s   e Zd Zejdd„ ƒZdS )zNtest_factory.<locals>.TestLegacyAPI.test_abstractclassmethod_basics.<locals>.Cc                 S   s   | j S r   ©r   r(   r   r   r   r   ,   s    zRtest_factory.<locals>.TestLegacyAPI.test_abstractclassmethod_basics.<locals>.C.fooN)r   r   r   r   Úabstractclassmethodr   r   r   r   r   r   +   s   r   r   c                       s    e Zd Ze‡ fdd„ƒZ‡  ZS )zNtest_factory.<locals>.TestLegacyAPI.test_abstractclassmethod_basics.<locals>.Dc                    s
   t ƒ  ¡ S r   r   r(   r   r   r   r   0   s    zRtest_factory.<locals>.TestLegacyAPI.test_abstractclassmethod_basics.<locals>.D.foo©r   r   r   Úclassmethodr   r   r   r   r   r   r   /   s   r   )r   r+   r   r   r-   r   r#   r    r!   r"   r   r$   r%   r   r   Útest_abstractclassmethod_basics#   s    

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   s   d S r   r   r   r   r   r   r   6   s    zQtest_factory.<locals>.TestLegacyAPI.test_abstractstaticmethod_basics.<locals>.fooc                   S   s   d S r   r   r   r   r   r   r	   9   s    zQtest_factory.<locals>.TestLegacyAPI.test_abstractstaticmethod_basics.<locals>.barr   Fc                   @   s   e Zd Zejdd„ ƒZdS )zOtest_factory.<locals>.TestLegacyAPI.test_abstractstaticmethod_basics.<locals>.Cc                   S   s   dS r   r   r   r   r   r   r   >   s    zStest_factory.<locals>.TestLegacyAPI.test_abstractstaticmethod_basics.<locals>.C.fooN)r   r   r   r   Úabstractstaticmethodr   r   r   r   r   r   =   s   r   r   c                   @   s   e Zd Zedd„ ƒZdS )zOtest_factory.<locals>.TestLegacyAPI.test_abstractstaticmethod_basics.<locals>.Dc                   S   s   dS ©Né   r   r   r   r   r   r   B   s    zStest_factory.<locals>.TestLegacyAPI.test_abstractstaticmethod_basics.<locals>.D.fooN©r   r   r   Ústaticmethodr   r   r   r   r   r   A   s   r   r1   )r   r/   r   r   r3   r   r#   r    r!   r"   r   r$   r%   r   r   Ú test_abstractstaticmethod_basics5   s    

zDtest_factory.<locals>.TestLegacyAPI.test_abstractstaticmethod_basicsN)r   r   r   r'   r.   r4   r   r%   r   r   ÚTestLegacyAPI   s   r5   c                       s  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d/S )0ztest_factory.<locals>.TestABCc                 S   sT   G dd„ dt jƒ}|  t|ƒt j¡ |  t|¡ G dd„ d|ƒ}|  | ¡ d¡ d S )Nc                   @   s   e Zd Zeejdd„ ƒƒZdS )z8test_factory.<locals>.TestABC.test_ABC_helper.<locals>.Cc                 S   s   | j S r   r*   r(   r   r   r   r   M   s    z<test_factory.<locals>.TestABC.test_ABC_helper.<locals>.C.fooN©r   r   r   r-   r   Úabstractmethodr   r   r   r   r   r   L   s   r   c                       s    e Zd Ze‡ fdd„ƒZ‡  ZS )z8test_factory.<locals>.TestABC.test_ABC_helper.<locals>.Dc                    s
   t ƒ  ¡ S r   r   r(   r   r   r   r   S   s    z<test_factory.<locals>.TestABC.test_ABC_helper.<locals>.D.foor,   r   r   r   r   r   R   s   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   s   d S r   r   r   r   r   r   r   X   s    zEtest_factory.<locals>.TestABC.test_abstractmethod_basics.<locals>.fooc                 S   s   d S r   r   r   r   r   r   r	   [   r
   zEtest_factory.<locals>.TestABC.test_abstractmethod_basics.<locals>.barr   )r   r7   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   s   d S r   r   r   r   r   r   r   _   s    zGtest_factory.<locals>.TestABC.test_abstractproperty_basics.<locals>.fooc                 S   s   d S r   r   r   r   r   r   r	   c   r
   zGtest_factory.<locals>.TestABC.test_abstractproperty_basics.<locals>.barr   Fc                   @   s   e Zd Zeejdd„ ƒƒZdS )zEtest_factory.<locals>.TestABC.test_abstractproperty_basics.<locals>.Cc                 S   s   dS r   r   r   r   r   r   r   g   s    zItest_factory.<locals>.TestABC.test_abstractproperty_basics.<locals>.C.fooN)r   r   r   r   r   r7   r   r   r   r   r   r   f   s   r   r   c                       s$   e Zd Z”jj‡ fdd„ƒZ‡  ZS )zEtest_factory.<locals>.TestABC.test_abstractproperty_basics.<locals>.Dc                    s   t ƒ jS r   r   r   r   r   r   r   l   s    zItest_factory.<locals>.TestABC.test_abstractproperty_basics.<locals>.D.foo©r   r   r   r   Úgetterr   r   ©r   r   r   r   k   s   r   r   )r   r   r7   r   r   r   r#   r    r!   r"   r   )r   r   r	   r   r%   r?   r   r'   ^   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   s   d S r   r   r(   r   r   r   r   q   s    zJtest_factory.<locals>.TestABC.test_abstractclassmethod_basics.<locals>.fooc                 S   s   d S r   r   r(   r   r   r   r	   u   s    zJtest_factory.<locals>.TestABC.test_abstractclassmethod_basics.<locals>.barr   Fc                   @   s   e Zd Zeejdd„ ƒƒZdS )zHtest_factory.<locals>.TestABC.test_abstractclassmethod_basics.<locals>.Cc                 S   s   | j S r   r*   r(   r   r   r   r   z   s    zLtest_factory.<locals>.TestABC.test_abstractclassmethod_basics.<locals>.C.fooNr6   r   r   r   r   r   y   s   r   r   c                       s    e Zd Ze‡ fdd„ƒZ‡  ZS )zHtest_factory.<locals>.TestABC.test_abstractclassmethod_basics.<locals>.Dc                    s
   t ƒ  ¡ S r   r   r(   r   r   r   r      s    zLtest_factory.<locals>.TestABC.test_abstractclassmethod_basics.<locals>.D.foor,   r   r   r   r   r   ~   s   r   )r-   r   r7   r   r   r   r#   r    r!   r"   r   r$   r%   r   r   r.   p   s    
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   s   d S r   r   r   r   r   r   r   …   s    zKtest_factory.<locals>.TestABC.test_abstractstaticmethod_basics.<locals>.fooc                   S   s   d S r   r   r   r   r   r   r	   ‰   s    zKtest_factory.<locals>.TestABC.test_abstractstaticmethod_basics.<locals>.barr   Fc                   @   s   e Zd Zeejdd„ ƒƒZdS )zItest_factory.<locals>.TestABC.test_abstractstaticmethod_basics.<locals>.Cc                   S   s   dS r   r   r   r   r   r   r   Ž   s    zMtest_factory.<locals>.TestABC.test_abstractstaticmethod_basics.<locals>.C.fooN)r   r   r   r3   r   r7   r   r   r   r   r   r      s   r   r   c                   @   s   e Zd Zedd„ ƒZdS )zItest_factory.<locals>.TestABC.test_abstractstaticmethod_basics.<locals>.Dc                   S   s   dS r0   r   r   r   r   r   r   “   s    zMtest_factory.<locals>.TestABC.test_abstractstaticmethod_basics.<locals>.D.fooNr2   r   r   r   r   r   ’   s   r   r1   )r3   r   r7   r   r   r   r#   r    r!   r"   r   r$   r%   r   r   r4   „   s    
z>test_factory.<locals>.TestABC.test_abstractstaticmethod_basicsc                    s(   G dd„ dˆ d}d}|   t||¡ d S )Nc                   @   s   e Zd Zejdd„ ƒZdS )zPtest_factory.<locals>.TestABC.test_object_new_with_one_abstractmethod.<locals>.Cc                 S   s   d S r   r   r   r   r   r   Ú
method_oneš   s    z[test_factory.<locals>.TestABC.test_object_new_with_one_abstractmethod.<locals>.C.method_oneN)r   r   r   r   r7   r@   r   r   r   r   r   ™   s   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                    s(   G dd„ dˆ d}d}|   t||¡ d S )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   s   d S r   r   r   r   r   r   r@   ¢   s    z]test_factory.<locals>.TestABC.test_object_new_with_many_abstractmethods.<locals>.C.method_onec                 S   s   d S r   r   r   r   r   r   Ú
method_two¥   s    z]test_factory.<locals>.TestABC.test_object_new_with_many_abstractmethods.<locals>.C.method_twoN)r   r   r   r   r7   r@   rF   r   r   r   r   r   ¡   s   
r   r   z4class C with abstract methods method_one, method_tworA   rC   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 ]ð‰ 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   s   d S r   r   r   r   r   r   r   °   s    zLtest_factory.<locals>.TestABC.test_abstractmethod_integration.<locals>.C.fooc                 S   s   d S 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                   @   s   e Zd Zdd„ ZdS )zHtest_factory.<locals>.TestABC.test_abstractmethod_integration.<locals>.Dc                 S   s   d S 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   ¶   s   r   c                   @   s   e Zd Zdd„ ZdS )zHtest_factory.<locals>.TestABC.test_abstractmethod_integration.<locals>.Ec                 S   s   d S 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»   s   rK   c                       s   e Zd Z” dd„ ƒZdS )zHtest_factory.<locals>.TestABC.test_abstractmethod_integration.<locals>.Fc                 S   s   d S r   r   r   r   r   r   r	   Á   s    zLtest_factory.<locals>.TestABC.test_abstractmethod_integration.<locals>.F.barNrI   r   rH   r   r   ÚFÀ   s   rL   r	   )r   r7   r   r+   r/   r"   Ú__abstractmethods__r    r!   r   r   Úsetr   )r   r   r   rK   rL   r%   rH   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   ƒ n1 s¦0    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   s   dS r   r   r   r   r   r   r   É   s    zQtest_factory.<locals>.TestABC.test_descriptors_with_abstractmethod.<locals>.C.fooc                 S   s   d S r   r   ©r   Úvalr   r   r   r   Ì   s    N)r   r   r   r   r   r7   r   Úsetterr   r   r   r   r   È   s   r   r   c                       s$   e Zd Z”jj‡ fdd„ƒZ‡  ZS )zMtest_factory.<locals>.TestABC.test_descriptors_with_abstractmethod.<locals>.Dc                    s   t ƒ jS r   r   r   r   r   r   r   Ñ   s    zQtest_factory.<locals>.TestABC.test_descriptors_with_abstractmethod.<locals>.D.foor=   r   r?   r   r   r   Ð   s   r   c                       s   e Zd Z” jjdd„ ƒZdS )zMtest_factory.<locals>.TestABC.test_descriptors_with_abstractmethod.<locals>.Ec                 S   s   d S r   r   rP   r   r   r   r   Õ   s    zQtest_factory.<locals>.TestABC.test_descriptors_with_abstractmethod.<locals>.E.fooN©r   r   r   r   rR   r   ©r   r   r   rK   Ô   s   rK   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 ƒ ‚d S r   )Ú
ValueErrorr   r   r   r   Ú__bool__Û   s    z\test_factory.<locals>.TestABC.test_descriptors_with_abstractmethod.<locals>.NotBool.__bool__N)r   r   r   rV   Ú__len__r   r   r   r   ÚNotBoolÚ   s   rX   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   s   d S r   r   r   r   r   r   r	   à   s    zQtest_factory.<locals>.TestABC.test_descriptors_with_abstractmethod.<locals>.F.barN)r   r   r   r	   r   r   r   r   )rX   r   r   rL   ß   s   rL   )r    r!   r"   r   ÚobjectrU   )r   rK   rL   r%   )r   r   rX   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   ©r[   ©r   Úcallable©Ú
Descriptorr   r   r>   ë   s    zctest_factory.<locals>.TestABC.test_customdescriptors_with_abstractmethod.<locals>.Descriptor.getterc                    s   ˆ | j |ƒS r   r`   ra   rc   r   r   rR   í   s    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#   r[   r\   r   r   r   r   r   ï   s    ÿzqtest_factory.<locals>.TestABC.test_customdescriptors_with_abstractmethod.<locals>.Descriptor.__isabstractmethod__)N)r   r   r   r_   r>   rR   r   r   r   rc   r   r   rd   ç   s
   
rd   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   s   dS r   r   r   r   r   r   r   ô   s    zWtest_factory.<locals>.TestABC.test_customdescriptors_with_abstractmethod.<locals>.C.fooc                 S   s   d S r   r   rP   r   r   r   r   ÷   s    N)r   r   r   r   r7   r   rR   r   rc   r   r   r   ó   s   r   r   c                       s$   e Zd Z”jj‡ fdd„ƒZ‡  ZS )zStest_factory.<locals>.TestABC.test_customdescriptors_with_abstractmethod.<locals>.Dc                    s   t ƒ jS r   r   r   r   r   r   r   ü   s    zWtest_factory.<locals>.TestABC.test_customdescriptors_with_abstractmethod.<locals>.D.foor=   r   r?   r   r   r   û   s   r   c                       s   e Zd Z” jjdd„ ƒZdS )zStest_factory.<locals>.TestABC.test_customdescriptors_with_abstractmethod.<locals>.Ec                 S   s   d S r   r   rP   r   r   r   r      s    zWtest_factory.<locals>.TestABC.test_customdescriptors_with_abstractmethod.<locals>.E.fooNrS   r   rT   r   r   rK   ÿ   s   rK   )r    r!   r   r   r   )r   rK   r%   )r   r   rd   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                   @   s   e Zd Zejdd„ ƒZdS )z;test_factory.<locals>.TestABC.test_metaclass_abc.<locals>.Ac                 S   s   d S r   r   r   r   r   r   Úx  s    z=test_factory.<locals>.TestABC.test_metaclass_abc.<locals>.A.xN)r   r   r   r   r7   rf   r   r   r   r   ÚA  s   rg   r   rf   c                   @   s   e Zd Zdd„ ZdS )z>test_factory.<locals>.TestABC.test_metaclass_abc.<locals>.metac                 S   s   dS ©Né   r   r   r   r   r   rf     s    z@test_factory.<locals>.TestABC.test_metaclass_abc.<locals>.meta.xN)r   r   r   rf   r   r   r   r   Úmeta  s   rj   c                   @   s   e Zd ZdS )z;test_factory.<locals>.TestABC.test_metaclass_abc.<locals>.CN©r   r   r   r   r   r   r   r     s   r   )r"   rM   r9   )r   rg   rj   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                   @   s   e Zd ZdS )zAtest_factory.<locals>.TestABC.test_registration_basics.<locals>.ANrk   r   r   r   r   rg     s   rg   r   c                   @   s   e Zd ZdS )zAtest_factory.<locals>.TestABC.test_registration_basics.<locals>.BNrk   r   r   r   r   ÚB  s   rm   c                   @   s   e Zd ZdS )zAtest_factory.<locals>.TestABC.test_registration_basics.<locals>.CNrk   r   r   r   r   r   !  s   r   )rY   r   Ú
issubclassZassertNotIsInstanceÚregisterr   ÚassertIsInstanceÚassertIs)r   rg   rm   Ú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                   @   s   e Zd ZdS )zDtest_factory.<locals>.TestABC.test_register_as_class_deco.<locals>.ANrk   r   r   r   r   rg   *  s   rg   r   c                   @   s   e Zd ZdS )zDtest_factory.<locals>.TestABC.test_register_as_class_deco.<locals>.BNrk   r   r   r   r   rm   ,  s   rm   c                   @   s   e Zd ZdS )zDtest_factory.<locals>.TestABC.test_register_as_class_deco.<locals>.CNrk   r   r   r   r   r   4  s   r   )ro   rY   r   rn   rp   rq   )r   rg   rm   rr   r   rt   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                   @   s   e Zd ZdS )zEtest_factory.<locals>.TestABC.test_isinstance_invalidation.<locals>.ANrk   r   r   r   r   rg   ?  s   rg   r   c                   @   s   e Zd ZdS )zEtest_factory.<locals>.TestABC.test_isinstance_invalidation.<locals>.BNrk   r   r   r   r   rm   A  s   rm   )r   Ú
isinstancero   ZassertGreaterr   )r   rg   rm   rr   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                   @   s   e Zd ZdS )zCtest_factory.<locals>.TestABC.test_registration_builtins.<locals>.ANrk   r   r   r   r   rg   N  s   rg   r   é*   c                   @   s   e Zd ZdS )zCtest_factory.<locals>.TestABC.test_registration_builtins.<locals>.BNrk   r   r   r   r   rm   U  s   rm   c                   @   s   e Zd ZdS )zCtest_factory.<locals>.TestABC.test_registration_builtins.<locals>.CNrk   r   r   r   r   r   X  r
   r   Ú )ro   Úintrp   r   rn   Ústr)r   rg   rm   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                   @   s   e Zd ZdS )zEtest_factory.<locals>.TestABC.test_registration_edge_cases.<locals>.ANrk   r   r   r   r   rg   a  s   rg   r   c                   @   s   e Zd ZdS )zFtest_factory.<locals>.TestABC.test_registration_edge_cases.<locals>.A1Nrk   r   r   r   r   ÚA1d  s   r€   c                   @   s   e Zd ZdS )zEtest_factory.<locals>.TestABC.test_registration_edge_cases.<locals>.BNrk   r   r   r   r   rm   g  s   rm   c                   @   s   e Zd ZdS )zEtest_factory.<locals>.TestABC.test_registration_edge_cases.<locals>.CNrk   r   r   r   r   r   k  s   r   )ro   r    ÚRuntimeErrorrY   )r   rg   r€   rm   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                   @   s   e Zd ZdS )z@test_factory.<locals>.TestABC.test_register_non_class.<locals>.ANrk   r   r   r   r   rg   r  s   rg   r   zCan only register classesr1   )rB   r!   ro   )r   rg   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                   @   s   e Zd ZdS )zItest_factory.<locals>.TestABC.test_registration_transitiveness.<locals>.ANrk   r   r   r   r   rg   x  s   rg   r   c                   @   s   e Zd ZdS )zItest_factory.<locals>.TestABC.test_registration_transitiveness.<locals>.BNrk   r   r   r   r   rm   |  s   rm   c                   @   s   e Zd ZdS )zItest_factory.<locals>.TestABC.test_registration_transitiveness.<locals>.CNrk   r   r   r   r   r   ‚  s   r   c                   @   s   e Zd ZdS )zJtest_factory.<locals>.TestABC.test_registration_transitiveness.<locals>.B1Nrk   r   r   r   r   rs   …  s   rs   c                   @   s   e Zd ZdS )zJtest_factory.<locals>.TestABC.test_registration_transitiveness.<locals>.C1Nrk   r   r   r   r   ÚC1‰  s   r„   c                   @   s   e Zd ZdS )zMtest_factory.<locals>.TestABC.test_registration_transitiveness.<locals>.MyIntNrk   r   r   r   r   ÚMyInt—  s   r…   r{   )r   rn   r   ro   r}   rp   )r   rg   rm   r   rs   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<0    Y  |   t¡ td|ƒ W d   ƒ n1 sp0    Y  G dd„ dƒ}|   t¡ t|ƒ |ƒ W d   ƒ n1 s´0    Y  d dd„ d	d„ d
d„ g}t|ƒD ]‚\}‰G ‡fdd„dˆd}| j|dF |   t¡ tt|ƒ W d   ƒ n1 s60    Y  W d   ƒ qÞ1 sV0    Y  qÞd‰ ‡ fdd„‰G ‡fdd„dˆd}|  tˆ ¡ tt|ƒ W d   ƒ n1 s¶0    Y  d S )Nc                   @   s   e Zd ZdS )zFtest_factory.<locals>.TestABC.test_issubclass_bad_arguments.<locals>.ANrk   r   r   r   r   rg   Ÿ  s   rg   r   r{   c                   @   s   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   ª  s   r   c                 S   s   g S r   r   )rf   r   r   r   Ú<lambda>´  r
   zMtest_factory.<locals>.TestABC.test_issubclass_bad_arguments.<locals>.<lambda>c                   S   s   dS ©Nr{   r   r   r   r   r   rˆ   µ  r
   c                   S   s   dgS r‰   r   r   r   r   r   rˆ   ¶  r
   c                       s   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º  s   rŽ   )Úizexception from __subclasses__c                      s   t ˆ ƒ‚d S r   )Ú	Exceptionr   )Úexc_msgr   r   Ú	raise_excÅ  s    zNtest_factory.<locals>.TestABC.test_issubclass_bad_arguments.<locals>.raise_excc                       s   e Zd Z” ZdS rŠ   r‹   r   )r’   r   r   rŽ   È  s   )r    r!   rn   Ú	enumerateZsubTestr}   rB   r   )r   rg   r   Zbogus_subclassesr   rŽ   r%   )r‘   r   r’   r   Útest_issubclass_bad_argumentsž  s.    ((*üL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)r)   r   ©rg   r   r   Ú__subclasshook__Ð  s    
zKtest_factory.<locals>.TestABC.test_subclasshook.<locals>.A.__subclasshook__N)r   r   r   r-   r˜   r   r—   r   r   rg   Ï  s   rg   r   c                   @   s   e Zd ZdZdS )z:test_factory.<locals>.TestABC.test_subclasshook.<locals>.Br{   NrJ   r   r   r   r   rm   ×  s   rm   c                   @   s   e Zd ZdZdS )z:test_factory.<locals>.TestABC.test_subclasshook.<locals>.Cr{   N)r   r   r   Zspamr   r   r   r   r   Û  s   r   )r   r:   r   rn   r   )r   rm   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                   @   s   e Zd ZdS )zHtest_factory.<locals>.TestABC.test_all_new_methods_are_called.<locals>.ANrk   r   r   r   r   rg   á  s   rg   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 rh   )Úcounterr   Ú__new__r(   )rm   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   ©rm   r   r   rm   ã  s   rm   c                   @   s   e Zd ZdS )zHtest_factory.<locals>.TestABC.test_all_new_methods_are_called.<locals>.CNrk   r   r   r   r   r   è  s   r   r   ri   )rY   r"   rš   )r   rg   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   r8   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   )r)   ÚnameZ
this_basesÚd©Úbasesrj   r   r   r›   ô  s    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   )r9   r›   )rj   r£   r   r   r¢   r   Úwith_metaclassò  s    zKtest_factory.<locals>.TestABC.test_tricky_new_works.<locals>.with_metaclassc                   @   s   e Zd ZdS )z>test_factory.<locals>.TestABC.test_tricky_new_works.<locals>.ANrk   r   r   r   r   rg   ÷  r
   rg   c                   @   s   e Zd ZdS )z>test_factory.<locals>.TestABC.test_tricky_new_works.<locals>.BNrk   r   r   r   r   rm   ø  r
   rm   c                   @   s   e Zd ZdS )z>test_factory.<locals>.TestABC.test_tricky_new_works.<locals>.CNrk   r   r   r   r   r   ù  s   r   )r"   r   )r   r¤   rg   rm   r   r%   r   r   Útest_tricky_new_worksñ  s
    z3test_factory.<locals>.TestABC.test_tricky_new_worksN)r   r   r   r;   r<   r'   r.   r4   rE   rG   rO   rZ   re   rl   ru   rv   rz   r   r‚   rƒ   r†   r”   r™   r   rŸ   r¥   r   rx   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                   @   s   e Zd ZdZdS )z\test_factory.<locals>.TestABCWithInitSubclass.test_works_with_init_subclass.<locals>.abc_ABCr   N)r   r   r   rž   r   r   r   r   Úabc_ABC   s   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)r)   Ú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                   @   s   e Zd ZdS )z]test_factory.<locals>.TestABCWithInitSubclass.test_works_with_init_subclass.<locals>.ReceiverNrk   r   r   r   r   ÚReceiver  s   r®   ri   é   r   )rf   Ú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&   ry   r5   r¦   r´   r   rx   r   Útest_factory   s    8   9r¶   Ú__main__)Ú__doc__rµ   r   Z_py_abcÚinspectr   r¶   r:   Úget_cache_tokenZTestLegacyAPI_PyZ
TestABC_PyZTestABCWithInitSubclass_PyZTestLegacyAPI_CZ	TestABC_CZTestABCWithInitSubclass_Cr   Úmainr   r   r   r   Ú<module>   s"       ÿ
ÿ
