B
    u9aH  ã               @   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.7/test_abc.pyÚfoo   s    zMtest_factory.<locals>.TestLegacyAPI.test_abstractproperty_basics.<locals>.fooc             S   s   d S )Nr   )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 )N)Ú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 )Nr   )Úclsr   r   r   r   $   s    zPtest_factory.<locals>.TestLegacyAPI.test_abstractclassmethod_basics.<locals>.fooc             S   s   d S )Nr   )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 )N)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 )N)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   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 )Nr   r   r   r   r   r   6   s    zQtest_factory.<locals>.TestLegacyAPI.test_abstractstaticmethod_basics.<locals>.fooc               S   s   d S )Nr   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 )Nr
   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   r%   )r   r$   r   r	   r&   r   r   r   r   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#   r'   r   )r   r   r   ÚTestLegacyAPI   s   r(   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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               @   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 )N)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 )N)r   r   )r    )r   r   r   r   S   s    z<test_factory.<locals>.TestABC.test_ABC_helper.<locals>.D.foo)r   r   r   r"   r   r   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 )Nr   )r   r   r   r   r   X   s    zEtest_factory.<locals>.TestABC.test_abstractmethod_basics.<locals>.fooc             S   s   d S )Nr   )r   r   r   r   r   [   r   zEtest_factory.<locals>.TestABC.test_abstractmethod_basics.<locals>.barr	   )r   r)   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 )Nr   )r   r   r   r   r   _   s    zGtest_factory.<locals>.TestABC.test_abstractproperty_basics.<locals>.fooc             S   s   d S )Nr   )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 )Nr
   r   )r   r   r   r   r   g   s    zItest_factory.<locals>.TestABC.test_abstractproperty_basics.<locals>.C.fooN)r   r   r   r   r   r)   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 )N)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   r)   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 )Nr   )r    r   r   r   r   q   s    zJtest_factory.<locals>.TestABC.test_abstractclassmethod_basics.<locals>.fooc             S   s   d S )Nr   )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 )N)r   )r    r   r   r   r   z   s    zLtest_factory.<locals>.TestABC.test_abstractclassmethod_basics.<locals>.C.fooN)r   r   r   r"   r   r)   r   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 )N)r   r   )r    )r   r   r   r      s    zLtest_factory.<locals>.TestABC.test_abstractclassmethod_basics.<locals>.D.foo)r   r   r   r"   r   r   r   r   )r   r   r   ~   s   r   )r"   r   r)   r   r	   r   r   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 )Nr   r   r   r   r   r   …   s    zKtest_factory.<locals>.TestABC.test_abstractstaticmethod_basics.<locals>.fooc               S   s   d S )Nr   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 )Nr
   r   r   r   r   r   r   Ž   s    zMtest_factory.<locals>.TestABC.test_abstractstaticmethod_basics.<locals>.C.fooN)r   r   r   r&   r   r)   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 )Nr%   r   r   r   r   r   r   “   s    zMtest_factory.<locals>.TestABC.test_abstractstaticmethod_basics.<locals>.D.fooN)r   r   r   r&   r   r   r   r   r   r   ’   s   r   r%   )r&   r   r)   r   r	   r   r   r   r   r   r   )r   r   r   r   r   )r   r   r   r'   „   s    z>test_factory.<locals>.TestABC.test_abstractstaticmethod_basicsc                s  xt jt jt jt jg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W 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 )Nr   )r   r   r   r   r      s    zLtest_factory.<locals>.TestABC.test_abstractmethod_integration.<locals>.C.fooc             S   s   d S )Nr   )r   r   r   r   r   Ÿ   r   zLtest_factory.<locals>.TestABC.test_abstractmethod_integration.<locals>.C.barN)r   r   r   r   r   r   )Ú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 )Nr   )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 )Nr   )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   r1   c                   s   e Zd Z” dd„ ƒZdS )zHtest_factory.<locals>.TestABC.test_abstractmethod_integration.<locals>.Fc             S   s   d S )Nr   )r   r   r   r   r   ®   s    zLtest_factory.<locals>.TestABC.test_abstractmethod_integration.<locals>.F.barN)r   r   r   r   r   )r0   r   r   ÚF­   s   r2   r   )r   r)   r   r!   r$   r   Ú__abstractmethods__r   r   r   r   Úsetr   )r   r   r   r1   r2   )r   )r0   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 Q R X 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 )Nr
   r   )r   r   r   r   r   ¶   s    zQtest_factory.<locals>.TestABC.test_descriptors_with_abstractmethod.<locals>.C.fooc             S   s   d S )Nr   )r   Úvalr   r   r   r   ¹   s    N)r   r   r   r   r   r)   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 )N)r   r   )r   )r   r   r   r   ¾   s    zQtest_factory.<locals>.TestABC.test_descriptors_with_abstractmethod.<locals>.D.foo)r   r   r   r   r/   r   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 )Nr   )r   r6   r   r   r   r   Â   s    zQtest_factory.<locals>.TestABC.test_descriptors_with_abstractmethod.<locals>.E.fooN)r   r   r   r   r7   r   )r   r   r   r1   Á   s   r1   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 )N)Ú
ValueError)r   r   r   r   Ú__bool__È   s    z\test_factory.<locals>.TestABC.test_descriptors_with_abstractmethod.<locals>.NotBool.__bool__N)r   r   r   r9   Ú__len__r   r   r   r   ÚNotBoolÇ   s   r;   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 )Nr   )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   )r;   r   r   r2   Ì   s   r2   )r   r   r   r   Úobjectr8   )r   r1   r2   )r   )r   r   r;   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 )N)Ú_fgetÚ_fset)r   ÚfgetÚfsetr   r   r   Ú__init__Õ   s    zetest_factory.<locals>.TestABC.test_customdescriptors_with_abstractmethod.<locals>.Descriptor.__init__c                s   ˆ || j ƒS )N)r>   )r   Úcallable)Ú
Descriptorr   r   r/   Ø   s    zctest_factory.<locals>.TestABC.test_customdescriptors_with_abstractmethod.<locals>.Descriptor.getterc                s   ˆ | j |ƒS )N)r>   )r   rC   )rD   r   r   r7   Ú   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   rB   r/   r7   r   r	   r   )rD   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 )Nr
   r   )r   r   r   r   r   á   s    zWtest_factory.<locals>.TestABC.test_customdescriptors_with_abstractmethod.<locals>.C.fooc             S   s   d S )Nr   )r   r6   r   r   r   r   ä   s    N)r   r   r   r   r)   r   r7   r   )rD   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 )N)r   r   )r   )r   r   r   r   é   s    zWtest_factory.<locals>.TestABC.test_customdescriptors_with_abstractmethod.<locals>.D.foo)r   r   r   r   r/   r   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 )Nr   )r   r6   r   r   r   r   í   s    zWtest_factory.<locals>.TestABC.test_customdescriptors_with_abstractmethod.<locals>.E.fooN)r   r   r   r   r7   r   )r   r   r   r1   ì   s   r1   )r   r   r   r   r	   )r   r1   )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 )Nr   )r   r   r   r   Úxô   s    z=test_factory.<locals>.TestABC.test_metaclass_abc.<locals>.A.xN)r   r   r   r   r)   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   rI   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   r3   r+   )r   rG   rI   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>.AN)r   r   r   r   r   r   r   rG   ÿ   s   rG   )r   c               @   s   e Zd ZdS )zAtest_factory.<locals>.TestABC.test_registration_basics.<locals>.BN)r   r   r   r   r   r   r   ÚB  s   rK   c               @   s   e Zd ZdS )zAtest_factory.<locals>.TestABC.test_registration_basics.<locals>.CN)r   r   r   r   r   r   r   r     s   r   )r<   r   Ú
issubclassZassertNotIsInstanceÚregisterr   ÚassertIsInstanceÚassertIs)r   rG   rK   ÚbÚB1r   Úc)r   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>.AN)r   r   r   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>.BN)r   r   r   r   r   r   r   rK     s   rK   c               @   s   e Zd ZdS )zDtest_factory.<locals>.TestABC.test_register_as_class_deco.<locals>.CN)r   r   r   r   r   r   r   r   !  s   r   )rM   r<   r   rL   rN   rO   )r   rG   rK   rP   r   rR   )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>.AN)r   r   r   r   r   r   r   rG   ,  s   rG   )r   c               @   s   e Zd ZdS )zEtest_factory.<locals>.TestABC.test_isinstance_invalidation.<locals>.BN)r   r   r   r   r   r   r   rK   .  s   rK   )r   Ú
isinstancerM   ZassertNotEqualr   )r   rG   rK   rP   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>.AN)r   r   r   r   r   r   r   rG   ;  s   rG   )r   é*   c               @   s   e Zd ZdS )zCtest_factory.<locals>.TestABC.test_registration_builtins.<locals>.BN)r   r   r   r   r   r   r   rK   B  s   rK   c               @   s   e Zd ZdS )zCtest_factory.<locals>.TestABC.test_registration_builtins.<locals>.CN)r   r   r   r   r   r   r   r   E  s    r   Ú )rM   ÚintrN   r   rL   Ústr)r   rG   rK   r   )r   r   r   Útest_registration_builtins:  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>.AN)r   r   r   r   r   r   r   rG   N  s   rG   )r   c               @   s   e Zd ZdS )zFtest_factory.<locals>.TestABC.test_registration_edge_cases.<locals>.A1N)r   r   r   r   r   r   r   ÚA1Q  s   r]   c               @   s   e Zd ZdS )zEtest_factory.<locals>.TestABC.test_registration_edge_cases.<locals>.BN)r   r   r   r   r   r   r   rK   T  s   rK   c               @   s   e Zd ZdS )zEtest_factory.<locals>.TestABC.test_registration_edge_cases.<locals>.CN)r   r   r   r   r   r   r   r   X  s   r   )rM   r   ÚRuntimeErrorr<   )r   rG   r]   rK   r   )r   r   r   Útest_registration_edge_casesM  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>.AN)r   r   r   r   r   r   r   rG   _  s   rG   )r   zCan only register classesr%   )ÚassertRaisesRegexr   rM   )r   rG   )r   r   r   Útest_register_non_class^  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>.AN)r   r   r   r   r   r   r   rG   e  s   rG   )r   c               @   s   e Zd ZdS )zItest_factory.<locals>.TestABC.test_registration_transitiveness.<locals>.BN)r   r   r   r   r   r   r   rK   i  s   rK   c               @   s   e Zd ZdS )zItest_factory.<locals>.TestABC.test_registration_transitiveness.<locals>.CN)r   r   r   r   r   r   r   r   o  s   r   c               @   s   e Zd ZdS )zJtest_factory.<locals>.TestABC.test_registration_transitiveness.<locals>.B1N)r   r   r   r   r   r   r   rQ   r  s   rQ   c               @   s   e Zd ZdS )zJtest_factory.<locals>.TestABC.test_registration_transitiveness.<locals>.C1N)r   r   r   r   r   r   r   ÚC1v  s   rb   c               @   s   e Zd ZdS )zMtest_factory.<locals>.TestABC.test_registration_transitiveness.<locals>.MyIntN)r   r   r   r   r   r   r   ÚMyInt„  s   rc   rX   )r   rL   r   rM   rZ   rN   )r   rG   rK   r   rQ   rb   rc   )r   r   r   Ú test_registration_transitivenessd  s>    


z>test_factory.<locals>.TestABC.test_registration_transitivenessc                sJ  G dd„ dˆd}|   t¡ ti |ƒ W d Q R X |   t¡ td|ƒ W d Q R X G dd„ dƒ}|   t¡ t|ƒ |ƒ W d Q R X d dd„ d	d„ d
d„ g}xbt|ƒD ]V\}‰G ‡fdd„dˆd}| j|d& |   t¡ tt|ƒ W d Q R X W d Q R X q¤W d‰ ‡ fdd„‰G ‡fdd„dˆd}|  tˆ ¡ tt|ƒ W d Q R X d S )Nc               @   s   e Zd ZdS )zFtest_factory.<locals>.TestABC.test_issubclass_bad_arguments.<locals>.AN)r   r   r   r   r   r   r   rG   Œ  s   rG   )r   rX   c               @   s   e Zd ZdZdS )zFtest_factory.<locals>.TestABC.test_issubclass_bad_arguments.<locals>.CrX   N)r   r   r   Ú__mro__r   r   r   r   r   —  s   r   c             S   s   g S )Nr   )rF   r   r   r   Ú<lambda>¡  r   zMtest_factory.<locals>.TestABC.test_issubclass_bad_arguments.<locals>.<lambda>c               S   s   dS )NrX   r   r   r   r   r   rf   ¢  r   c               S   s   dgS )NrX   r   r   r   r   r   rf   £  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   ri   )Úizexception from __subclasses__c                  s   t ˆ ƒ‚d S )N)Ú	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 )zFtest_factory.<locals>.TestABC.test_issubclass_bad_arguments.<locals>.SN)r   r   r   rg   r   )rm   r   r   ri   µ  s   )r   r   rL   Ú	enumerateZsubTestrZ   r`   rk   )r   rG   r   Zbogus_subclassesrj   ri   )r   )rl   rh   rm   r   Útest_issubclass_bad_arguments‹  s,    
"z;test_factory.<locals>.TestABC.test_issubclass_bad_argumentsc                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>.AN)r   r   r   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 )NrH   )Úcounterr   Ú__new__)r    )rK   r   r   r   rq   À  s    zPtest_factory.<locals>.TestABC.test_all_new_methods_are_called.<locals>.B.__new__)r   r   r   rp   rq   r   r   )rK   )r   r   rK   ¾  s   rK   c               @   s   e Zd ZdS )zHtest_factory.<locals>.TestABC.test_all_new_methods_are_called.<locals>.CN)r   r   r   r   r   r   r   r   Ã  s   r   r   rH   )r<   r   rp   )r   rG   r   )r   )rK   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   r*   )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 )Nr   )r    ÚnameZ
this_basesÚd)ÚbasesrI   r   r   rq   Ï  s    zftest_factory.<locals>.TestABC.test_tricky_new_works.<locals>.with_metaclass.<locals>.metaclass.__new__N)r   r   r   rq   r   )rw   rI   r   r   r   Î  s   r   Ztemporary_classr   )r+   rq   )rI   rw   r   r   )rw   rI   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>.AN)r   r   r   r   r   r   r   rG   Ò  s    rG   c               @   s   e Zd ZdS )z>test_factory.<locals>.TestABC.test_tricky_new_works.<locals>.BN)r   r   r   r   r   r   r   rK   Ó  s    rK   c               @   s   e Zd ZdS )z>test_factory.<locals>.TestABC.test_tricky_new_works.<locals>.CN)r   r   r   r   r   r   r   r   Ô  s   r   )r   r   )r   rx   rG   rK   r   )r   r   r   Útest_tricky_new_worksÌ  s
    z3test_factory.<locals>.TestABC.test_tricky_new_worksN)r   r   r   r-   r.   r   r#   r'   r5   r=   rE   rJ   rS   rT   rW   r\   r_   ra   rd   ro   rr   rt   ry   r   )r   rV   r   r   ÚTestABCH   s(   '0rz   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   rs   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 )N)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>.ReceiverN)r   r   r   r   r   r   r   ÚReceiverâ  s   r   rH   é   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   rV   r(   rz   r‡   r   )r   rV   r   Útest_factory   s    8   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      [