U
    e»{jª¥  ã                   @   s¨  d Z ddlZddlmZ ddlmZ ddlmZ ddlZ	ddl
Z
ddlmZ ddlmZ ddlmZmZmZmZmZ ddlmZ dd	lmZ dd
lmZ G dd„ deƒZG dd„ dƒZG dd„ dƒZdd„ Z dd„ Z!dd„ Z"e
j#dd„ ƒZ$e
j#dd„ ƒZ%e
j#ddgd�dd„ ƒZ&e
j#d d!„ ƒZ'd"d#„ Z(d$d%„ Z)G d&d'„ d'ƒZ*G d(d)„ d)e*ƒZ+G d*d+„ d+e*ƒZ,G d,d-„ d-e+e,ƒZ-G d.d/„ d/e-ƒZ.d0d1„ Z/d2d3„ Z0d4d5„ Z1G d6d7„ d7ƒZ2dS )8zQ
Test :mod:`astropy.io.registry`.

.. todo::

    Don't rely on Table for tests

é    N)ÚCounter)Údeepcopy)ÚStringIO©Úregistry)ÚIORegistryErrorÚUnifiedInputRegistryÚUnifiedIORegistryÚUnifiedOutputRegistryÚcompat)Ú_UnifiedIORegistryBase©Údefault_registry©ÚTablec                   @   s   e Zd ZdZddd„ZdS )ÚUnifiedIORegistryBaseSubClassz;Non-abstract subclass of UnifiedIORegistryBase for testing.Nc                 C   s   d S ©N© )ÚselfÚ
data_classr   r   úh/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/io/registry/tests/test_registries.pyÚget_formats(   s    z)UnifiedIORegistryBaseSubClass.get_formats)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   %   s   r   c                   @   s    e Zd ZdZeejƒZejZdS )Ú	EmptyDataa  
    Thing that can read and write.
    Note that the read/write are the compatibility methods, which allow for the
    kwarg ``registry``. This allows us to not subclass ``EmptyData`` for each
    of the types of registry (read-only, ...) and use this class everywhere.
    N©r   r   r   r   ÚclassmethodÚio_registryÚreadÚwriter   r   r   r   r   ,   s   
r   c                   @   s    e Zd ZdZeejƒZejZdS )ÚOtherEmptyDataz$A different class with different I/ONr   r   r   r   r   r"   8   s   
r"   c                  O   s   t ƒ S r   ©r   ©ÚargsÚkwargsr   r   r   Úempty_reader?   s    r'   c                 O   s   dS )Nústatus: successr   )Útabler%   r&   r   r   r   Úempty_writerC   s    r*   c                  O   s   dS ©NTr   r$   r   r   r   Úempty_identifierG   s    r,   c                   C   s   dt fS )NÚtest1r#   r   r   r   r   Úfmtcls1K   s    r.   c                   C   s   dt fS )NÚtest2r#   r   r   r   r   Úfmtcls2P   s    r0   r-   r/   )Úparamsc                 c   s   | j tfV  d S r   )Úparamr   )Úrequestr   r   r   ÚfmtclsU   s    r4   c                  C   s2   i } t tjƒ| d< t tjƒ| d< t tjƒ| d< | S )NÚreadersÚwritersÚidentifiers)r   r   Ú_readersÚ_writersÚ_identifiers)ÚORIGINALr   r   r   ÚoriginalZ   s
    r<   c                 C   s   | d |d kst ‚dS )z1Just check a fact that we rely on in other tests.é   N©ÚAssertionError)r.   r0   r   r   r   Útest_fmcls1_fmtcls2f   s    r@   c                	   C   s&   t jtdd�� tdƒ‚W 5 Q R X d S )Nzjust checking©Úmatch)ÚpytestÚraisesr   r   r   r   r   Útest_IORegistryErrork   s    rE   c                   @   s¦   e Zd ZdZdd„ Zejdd„ ƒZdd„ Zdd	„ Z	d
d„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zej d¡dd„ ƒZej d¡dd „ ƒZd!S )"ÚTestUnifiedIORegistryBasez8Test :class:`astropy.io.registry.UnifiedIORegistryBase`.c                 C   s
   t | _dS ©ú*Setup class. This is called 1st by pytest.N)r   Ú_cls©r   r   r   r   Úsetup_classs   s    z%TestUnifiedIORegistryBase.setup_classc                 c   sÐ   |   ¡ }t|dƒ}t|dƒ}i }t|jƒ|d< |j ¡  |rTt|jƒ|d< |j ¡  |rpt|jƒ|d< |j ¡  |V  |j ¡  |j |d ¡ |r®|j ¡  |j |d ¡ |rÌ|j ¡  |j |d ¡ dS )z5I/O registry. Cleaned before and after each function.r8   r9   r7   r5   r6   N)rI   Úhasattrr   r:   Úclearr8   r9   Úupdate)r   r   ZHAS_READERSZHAS_WRITERSr;   r   r   r   r   w   s*    







z"TestUnifiedIORegistryBase.registryc                 C   s(   |  ¡ dkst‚|j dd�dks$t‚dS )ú Test ``registry.get_formats()``.Né   )r   )r   r?   ©r   r   r   r   r   Útest_get_formats—   s    z*TestUnifiedIORegistryBase.test_get_formatsc              	   C   s*   |  t¡� |j|tfžŽ  W 5 Q R X dS ©ú&Test ``registry.delay_doc_updates()``.N)Údelay_doc_updatesr   Úregister_identifierr,   ©r   r   r.   r   r   r   Útest_delay_doc_updatesž   s    z0TestUnifiedIORegistryBase.test_delay_doc_updatesc                 C   s\   ||j kst‚||j kst‚|j|tfžŽ  |j|tfžŽ  ||j ksJt‚||j ksXt‚dS )z(Test ``registry.register_identifier()``.N)r:   r?   rV   r,   ©r   r   r.   r0   r   r   r   Útest_register_identifier¤   s    z2TestUnifiedIORegistryBase.test_register_identifierc              	   C   s`   |\}}|  ||t¡ t t¡�}|  ||t¡ W 5 Q R X t|jƒd|› d|j› d�ks\t‚dS )z6Test calling ``registry.register_identifier()`` twice.zIdentifier for format 'ú' and class 'ú' is already definedN)	rV   r,   rC   rD   r   ÚstrÚvaluer   r?   ©r   r   r4   ÚfmtÚclsÚexcr   r   r   Ú test_register_identifier_invalid°   s    ÿz:TestUnifiedIORegistryBase.test_register_identifier_invalidc                 C   s8   |j |tfžŽ  |j |tfžddiŽ ||jks4t‚d S ©NÚforceT)rV   r,   r:   r?   rW   r   r   r   Útest_register_identifier_force»   s    z8TestUnifiedIORegistryBase.test_register_identifier_forcec                 C   s:   |j |tfžŽ  ||jkst‚|j|Ž  ||jks6t‚dS )ú*Test ``registry.unregister_identifier()``.N)rV   r,   r:   r?   Úunregister_identifierrW   r   r   r   Útest_unregister_identifierÂ   s    
z4TestUnifiedIORegistryBase.test_unregister_identifierc              	   C   sP   |\}}t  t¡�}| ||¡ W 5 Q R X t|jƒd|› d|j› d�ksLt‚dS )rg   z"No identifier defined for format 'r[   ú'N)rC   rD   r   rh   r]   r^   r   r?   r_   r   r   r   Ú"test_unregister_identifier_invalidÊ   s    ÿÿz<TestUnifiedIORegistryBase.test_unregister_identifier_invalidc                 C   sV   |\}}d|dddi f}|j |Ž }|g ks.t‚| ||t¡ |j |Ž }||ksRt‚dS )ú$Test ``registry.identify_format()``.Nr   ©Úidentify_formatr?   rV   r,   ©r   r   r.   r`   ra   r%   Úformatsr   r   r   Útest_identify_formatÔ   s    

z.TestUnifiedIORegistryBase.test_identify_formatc              	   C   s˜   ||j kst‚tj|tfžd|iŽ ||j ks2t‚|tk	r”|tj ksHt‚z<ztj|tfžŽ  W n tk
rr   Y nX |tj ks‚t‚W 5 tj  |¡ X d S ©Nr   )r:   r?   r   rV   r,   r   ÚpopÚ	ExceptionrW   r   r   r   Útest_compat_register_identifierå   s    z9TestUnifiedIORegistryBase.test_compat_register_identifierc                 C   sŒ   |j |tfžŽ  ||jkst‚tj|d|iŽ ||jks<t‚|tk	rˆ|tjksRt‚tj |tfžŽ  |tjkspt‚tj|Ž  ||jksˆt‚d S rr   )rV   r,   r:   r?   r   rh   r   rW   r   r   r   Ú!test_compat_unregister_identifier÷   s    
z;TestUnifiedIORegistryBase.test_compat_unregister_identifierc                 C   s¤   |\}}d |d d dt ƒ f}|j|tfžŽ  tj|d|iŽ}||ksFt‚|tk	r zDztj|tfžŽ  W n tk
rx   Y nX tj|Ž }||ks�t‚W 5 tj|Ž  X d S )Nr   r   )	ÚdictrV   r,   r   rn   r?   r   rh   rt   ro   r   r   r   Útest_compat_identify_format  s    
z5TestUnifiedIORegistryBase.test_compat_identify_formatúTODO!c                 C   s   dst ‚d S ©NFr>   rW   r   r   r   Útest_compat_get_formats  s    z1TestUnifiedIORegistryBase.test_compat_get_formatsc                 C   s   dst ‚d S rz   r>   rW   r   r   r   Útest_compat_delay_doc_updates  s    z7TestUnifiedIORegistryBase.test_compat_delay_doc_updatesN)r   r   r   r   rK   rC   Úfixturer   rR   rX   rZ   rc   rf   ri   rk   rq   ru   rv   rx   ÚmarkÚskipr{   r|   r   r   r   r   rF   p   s&   




rF   c                       sü   e Zd ZdZdd„ Zdd„ Zej d¡dd„ ƒZ	‡ fd	d
„Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Z d7d8„ Z!‡  Z"S )9ÚTestUnifiedInputRegistryz7Test :class:`astropy.io.registry.UnifiedInputRegistry`.c                 C   s
   t | _dS rG   )r   rI   rJ   r   r   r   rK   '  s    z$TestUnifiedInputRegistry.setup_classc                    s|   G dd„ dt ƒ‰ G dd„ dˆ ƒ}dd„ }‡ fdd„}| d	t |¡ | d	|¡|ksVt‚| d	ˆ |¡ | d	|¡|ksxt‚d S )
Nc                   @   s   e Zd ZdS )zITestUnifiedInputRegistry.test_inherited_read_registration.<locals>.Child1N©r   r   r   r   r   r   r   ÚChild12  s   r‚   c                   @   s   e Zd ZdS )zITestUnifiedInputRegistry.test_inherited_read_registration.<locals>.Child2Nr�   r   r   r   r   ÚChild25  s   rƒ   c                   S   s   t ƒ S r   r#   r   r   r   r   Ú_read8  s    zHTestUnifiedInputRegistry.test_inherited_read_registration.<locals>._readc                      s   ˆ ƒ S r   r   r   ©r‚   r   r   Ú_read1;  s    zITestUnifiedInputRegistry.test_inherited_read_registration.<locals>._read1Útest)r   Úregister_readerÚ
get_readerr?   )r   r   rƒ   r„   r†   r   r…   r   Ú test_inherited_read_registration-  s    z9TestUnifiedInputRegistry.test_inherited_read_registrationry   c                 C   s   dst ‚dS ©rO   FNr>   rQ   r   r   r   rR   J  s    z)TestUnifiedInputRegistry.test_get_formatsc              	      s@  t ƒ  ||¡ | t¡�° | dtt¡ dtjjkrÄtjj d¡}dd„ t	|ƒD ƒd }||  
d¡d }||  
d¡d }|d	 |d
 krÄ|d
 ||d … dks¨t‚|d
 ||d … dksÄt‚W 5 Q R X tjj d¡}||  
d¡d }||  
d¡d }|d	 ||d … dk�st‚|d	 ||d … dk�s<t‚dS )rT   r‡   ÚFormatÚ
c                 S   s   g | ]\}}d |kr|‘qS ©rŒ   r   ©Ú.0ÚiÚsr   r   r   Ú
<listcomp>[  s      zCTestUnifiedInputRegistry.test_delay_doc_updates.<locals>.<listcomp>r   r=   ZReadéþÿÿÿéÿÿÿÿé   é   ÚYesé   é   N)ÚsuperrX   rU   r   rˆ   r'   r    r   ÚsplitÚ	enumerateÚindexr?   )r   r   r.   ÚdocsÚihdÚifmtZiread©Ú	__class__r   r   rX   O  s     &z/TestUnifiedInputRegistry.test_delay_doc_updatesc                 C   sP   dt dddtƒ f}|j|Ž }|g ks(t‚| dt t¡ |j|Ž }d|ksLt‚dS )rl   r    Nr   r‡   )r   rw   rn   r?   rV   r,   )r   r   r%   rp   r   r   r   Útest_identify_read_formati  s    

z2TestUnifiedInputRegistry.test_identify_read_formatc                 C   sˆ   ||j kst‚||j kst‚|j|tfžŽ  |j|tfžŽ  ||j ksJt‚||j ksXt‚|j | tdfksnt‚|j | tdfks„t‚dS )z$Test ``registry.register_reader()``.r   N)r8   r?   rˆ   r'   rY   r   r   r   Útest_register_readery  s    z-TestUnifiedInputRegistry.test_register_readerc              	   C   s`   |\}}|  ||t¡ t t¡�}|  ||t¡ W 5 Q R X t|jƒd|› d|j› d�ks\t‚d S )NzReader for format 'r[   r\   )	rˆ   r'   rC   rD   r   r]   r^   r   r?   ©r   r   r.   r`   ra   rb   r   r   r   Útest_register_reader_invalid‡  s    ÿz5TestUnifiedInputRegistry.test_register_reader_invalidc                 C   s8   |j |tfžŽ  |j |tfžddiŽ ||jks4t‚d S rd   )rˆ   r'   r8   r?   rW   r   r   r   Útest_register_reader_force‘  s    z3TestUnifiedInputRegistry.test_register_reader_forcec                 C   s`   |  dtdd„ ¡ |  dtdd„ ¡ tjd|d�}t|tƒs@t‚tjd|d�}t|tƒs\t‚d S )Nr‡   c                   S   s   t ƒ S r   r#   r   r   r   r   Ú<lambda>™  ó    zdTestUnifiedInputRegistry.test_register_readers_with_same_name_on_different_classes.<locals>.<lambda>c                   S   s   t ƒ S r   )r"   r   r   r   r   r©   š  rª   ©Úformatr   )rˆ   r   r"   r    Ú
isinstancer?   )r   r   ÚtZtblr   r   r   Ú9test_register_readers_with_same_name_on_different_classes–  s    zRTestUnifiedInputRegistry.test_register_readers_with_same_name_on_different_classesc                 C   s:   |j |tfžŽ  ||jkst‚|j|Ž  ||jks6t‚dS )z&Test ``registry.unregister_reader()``.N)rˆ   r'   r8   r?   Úunregister_readerrW   r   r   r   Útest_unregister_reader¢  s    
z/TestUnifiedInputRegistry.test_unregister_readerc              	   C   sN   |\}}t  t¡�}|j|Ž  W 5 Q R X t|jƒd|› d|j› d�ksJt‚d S ©NúNo reader defined for format 'r[   rj   )rC   rD   r   r°   r]   r^   r   r?   r¦   r   r   r   Útest_unregister_reader_invalidª  s    ÿÿz7TestUnifiedInputRegistry.test_unregister_reader_invalidc              	   C   sT   |\}}t  t¡� | ||¡ W 5 Q R X | ||t¡ | ||¡}|tksPt‚dS )zTest ``registry.get_reader()``.N)rC   rD   r   r‰   rˆ   r'   r?   )r   r   r4   r`   ra   Úreaderr   r   r   Útest_get_readerµ  s    z(TestUnifiedInputRegistry.test_get_readerc              	   C   sR   |\}}t  t¡�}| ||¡ W 5 Q R X t|jƒ d|› d|j› d�¡sNt‚d S r²   )	rC   rD   r   r‰   r]   r^   Ú
startswithr   r?   r_   r   r   r   Útest_get_reader_invalid¿  s    
ÿz0TestUnifiedInputRegistry.test_get_reader_invalidc              	   C   s>   t  t¡�}|d j|d� W 5 Q R X t|jƒ d¡s:t‚dS )z3Test ``registry.read()`` when there isn't a reader.r=   r   úfFormat could not be identified based on the file name or contents, please provide a 'format' argument.N)rC   rD   r   r    r]   r^   r·   r?   ©r   r   r.   rb   r   r   r   Útest_read_noformatÉ  s
    
ÿz+TestUnifiedInputRegistry.test_read_noformatc              	   C   sR   |j  |d ¡ t t¡�}|d jtƒ |d� W 5 Q R X t|jƒ 	d¡sNt
‚dS ©z=Test that all identifier functions can accept arbitrary inputr7   r=   r   r¹   N)r:   rN   rC   rD   r   r    Úobjectr]   r^   r·   r?   ©r   r   r<   r.   rb   r   r   r   Útest_read_noformat_arbitraryÓ  s    
ÿz5TestUnifiedInputRegistry.test_read_noformat_arbitraryc              	   C   sp   |j  |d ¡ |d }t|dƒ�}| d¡ W 5 Q R X t t¡�}t |¡ W 5 Q R X t	|j
ƒ d¡slt‚dS )ú>Tests that all identifier functions can accept arbitrary filesr5   úfoo.exampleÚwzHello worldr¹   N)r8   rN   Úopenr!   rC   rD   r   r   r    r]   r^   r·   r?   )r   Útmp_pathr   r<   ÚtestfileÚfrb   r   r   r   Ú!test_read_noformat_arbitrary_fileÞ  s    
ÿz:TestUnifiedInputRegistry.test_read_noformat_arbitrary_filec           	   	   C   sx   |\}}|\}}|  ||dd„ ¡ |  ||dd„ ¡ t t¡�}|j|d� W 5 Q R X t|jƒd|› d|› �kstt‚d S )Nc                 _   s   dS r+   r   ©ÚoÚxÚyr   r   r   r©   ñ  rª   zCTestUnifiedInputRegistry.test_read_toomanyformats.<locals>.<lambda>c                 _   s   dS r+   r   rÈ   r   r   r   r©   ò  rª   r   ú#Format is ambiguous - options are: ú, )rV   rC   rD   r   r    r]   r^   r?   ©	r   r   r.   r0   Úfmt1ra   Úfmt2Ú_rb   r   r   r   Útest_read_toomanyformatsí  s    z1TestUnifiedInputRegistry.test_read_toomanyformatsc                    s®   |\‰‰ |\‰}t ƒ ‰‡ ‡‡fdd„}‡ ‡‡fdd„}|jˆˆ |dd� |jˆˆ |dd� | ˆˆ dd	„ ¡ | ˆˆ d
d	„ ¡ ˆ j|d� ˆˆ dksšt‚ˆˆ dksªt‚d S )Nc                     s   ˆˆ  d7  < ˆ ƒ S ©Nr=   r   r$   )ra   ÚcounterrÏ   r   r   Úcounting_reader1ü  s    zJTestUnifiedInputRegistry.test_read_uses_priority.<locals>.counting_reader1c                     s   ˆˆ  d7  < ˆ ƒ S rÓ   r   r$   )ra   rÔ   rÐ   r   r   Úcounting_reader2   s    zJTestUnifiedInputRegistry.test_read_uses_priority.<locals>.counting_reader2r=   ©Úpriorityr™   c                 _   s   dS r+   r   rÈ   r   r   r   r©     rª   zBTestUnifiedInputRegistry.test_read_uses_priority.<locals>.<lambda>c                 _   s   dS r+   r   rÈ   r   r   r   r©     rª   r   r   )r   rˆ   rV   r    r?   )r   r   r.   r0   rÑ   rÕ   rÖ   r   )ra   rÔ   rÏ   rÐ   r   Útest_read_uses_priority÷  s    z0TestUnifiedInputRegistry.test_read_uses_priorityc              	   C   sT   |\}}t  t¡�}|j||d� W 5 Q R X t|jƒ d|› d|j› d�¡sPt‚d S )Nr«   r³   r[   rj   )	rC   rD   r   r    r]   r^   r·   r   r?   r¦   r   r   r   Útest_read_format_noreader  s    
ÿz2TestUnifiedInputRegistry.test_read_format_noreaderc              	   C   sô   |\}}|\}}|  ||dd„ ¡ |  ||dd„ ¡ |d }	t|	dƒ ¡  t t¡�}
|j|	|d� W 5 Q R X t|
jƒ 	d|› d|j
› d	�¡s’t‚|d
 }	t|	dƒ ¡  t t¡�}
|j|	|d� W 5 Q R X t|
jƒ 	d|› d|j
› d	�¡sðt‚d S )Nc                 _   s
   |  d¡S )NÚa©Úendswith©rÉ   ÚpathÚfileobjrÊ   rË   r   r   r   r©     rª   z?TestUnifiedInputRegistry.test_read_identifier.<locals>.<lambda>c                 _   s
   |  d¡S )NÚbrÜ   rÞ   r   r   r   r©     rª   z
testfile.arÂ   r   r³   r[   rj   z
testfile.b)rV   rÃ   ÚcloserC   rD   r   r    r]   r^   r·   r   r?   )r   rÄ   r   r.   r0   rÏ   ra   rÐ   rÑ   Úfilenamerb   r   r   r   Útest_read_identifier  s4      ÿ  ÿ
ÿ
ÿz-TestUnifiedInputRegistry.test_read_identifierc                 C   s6   |\}}|  ||t¡ |j||d�}t||ƒs2t‚d S )Nr«   )rˆ   r'   r    r­   r?   )r   r   r4   r`   ra   r®   r   r   r   Útest_read_valid_return4  s    z/TestUnifiedInputRegistry.test_read_valid_returnc              	   C   s(   t  t¡� |d  d¡}W 5 Q R X dS )zfRaise the correct error when attempting to read a non-existing
        file with an unknown extension.r=   z"non-existing-file-with-unknown.extN)rC   rD   ÚOSErrorr    )r   r.   Údatar   r   r   Ú"test_read_non_existing_unknown_ext:  s    z;TestUnifiedInputRegistry.test_read_non_existing_unknown_extc                 C   sv   |\}}|  d|dd„ ¡ | d|t¡ |d }| ¡  |j|d|d�}t||ƒsVt‚|j||d�}t||ƒsrt‚dS )zõ
        Regression test for a bug that caused the I/O registry infrastructure to
        not work correctly for datasets that are represented by folders as
        opposed to files, when using the descriptors to add read/write methods.
        Ztest_folder_formatc                 _   s   | dkS ©Nr    r   rÈ   r   r   r   r©   H  rª   z>TestUnifiedInputRegistry.test_read_directory.<locals>.<lambda>Zfolder_datasetr«   r   N)rV   rˆ   r'   Úmkdirr    r­   r?   )r   rÄ   r   r.   rÑ   ra   rã   Zdatasetr   r   r   Útest_read_directory@  s      ÿz,TestUnifiedInputRegistry.test_read_directoryc              	   C   s˜   ||j kst‚tj|tfžd|iŽ ||j ks2t‚|tk	r”|tj ksHt‚z<ztj|tfžŽ  W n tk
rr   Y nX |tj ks‚t‚W 5 tj  |¡ X d S rr   )	r8   r?   r   rˆ   r'   r   rs   r,   rt   rW   r   r   r   Útest_compat_register_readerZ  s    z4TestUnifiedInputRegistry.test_compat_register_readerc                 C   sŒ   |j |tfžŽ  ||jkst‚tj|d|iŽ ||jks<t‚|tk	rˆ|tjksRt‚tj |tfžŽ  |tjkspt‚tj|Ž  ||jksˆt‚d S rr   )rˆ   r'   r8   r?   r   r°   r   rW   r   r   r   Útest_compat_unregister_readerl  s    
z6TestUnifiedInputRegistry.test_compat_unregister_readerc                 C   sr   |j |tfžŽ  tj|d|iŽ}|tks,t‚|j|Ž  |tk	rntj |tfžŽ  tj|Ž }|tksdt‚tj|Ž  d S rr   )rˆ   r'   r   r‰   r?   r°   r   )r   r   r.   rµ   r   r   r   Útest_compat_get_reader{  s    

z/TestUnifiedInputRegistry.test_compat_get_readerc                 C   s‚   |\}}|j |tfžŽ  tj|||d�}t||ƒs6t‚|j|Ž  |tk	r~tj |tfžŽ  tj||d�}t||ƒstt‚tj|Ž  d S )Nr«   ©r¬   )rˆ   r'   r   r    r­   r?   r°   r   )r   r   r.   r`   ra   r®   r   r   r   Útest_compat_read‰  s    
z)TestUnifiedInputRegistry.test_compat_read)#r   r   r   r   rK   rŠ   rC   r~   r   rR   rX   r¤   r¥   r§   r¨   r¯   r±   r´   r¶   r¸   r»   r¿   rÇ   rÒ   rÙ   rÚ   rä   rå   rè   rë   rì   rí   rî   rð   Ú__classcell__r   r   r¢   r   r€   $  s:   






r€   c                       sä   e Zd ZdZdd„ Zdd„ Z‡ fdd„Zej 	d¡d	d
„ ƒZ
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Z‡  ZS )3ÚTestUnifiedOutputRegistryz8Test :class:`astropy.io.registry.UnifiedOutputRegistry`.c                 C   s
   t | _dS rG   )r
   rI   rJ   r   r   r   rK   œ  s    z%TestUnifiedOutputRegistry.setup_classc                    s|   G dd„ dt ƒ‰ G dd„ dˆ ƒ}dd„ }‡ fdd„}| d	t |¡ | d	|¡|ksVt‚| d	ˆ |¡ | d	|¡|ksxt‚d S )
Nc                   @   s   e Zd ZdS )zKTestUnifiedOutputRegistry.test_inherited_write_registration.<locals>.Child1Nr�   r   r   r   r   r‚   §  s   r‚   c                   @   s   e Zd ZdS )zKTestUnifiedOutputRegistry.test_inherited_write_registration.<locals>.Child2Nr�   r   r   r   r   rƒ   ª  s   rƒ   c                   S   s   t ƒ S r   r#   r   r   r   r   Ú_write­  s    zKTestUnifiedOutputRegistry.test_inherited_write_registration.<locals>._writec                      s   ˆ ƒ S r   r   r   r…   r   r   Ú_write1°  s    zLTestUnifiedOutputRegistry.test_inherited_write_registration.<locals>._write1r‡   )r   Úregister_writerÚ
get_writerr?   )r   r   rƒ   ró   rô   r   r…   r   Ú!test_inherited_write_registration¢  s    z;TestUnifiedOutputRegistry.test_inherited_write_registrationc           	   	      sV  t ƒ  ||¡ |\}}| t¡�¶ |j|tfžŽ  dtjjkrÒtjj 	d¡}dd„ t
|ƒD ƒd }||  d¡}||  d¡d }|d |d	 krÒ||d	 ||t|ƒ d … ks¶t‚|d	 ||d
 … dksÒt‚W 5 Q R X tjj 	d¡}||  d¡d }||  d¡d }||d ||t|ƒ d … k�s4t‚|d ||d
 … dk�sRt‚dS )rT   rŒ   r�   c                 S   s   g | ]\}}d |kr|‘qS rŽ   r   r�   r   r   r   r“   Ì  s      zDTestUnifiedOutputRegistry.test_delay_doc_updates.<locals>.<listcomp>r   ZWriter=   r”   r•   r—   r˜   r™   N)r›   rX   rU   r   rõ   r*   r    r   r!   rœ   r�   rž   Úlenr?   )	r   r   r.   r`   ra   rŸ   r    r¡   Ziwriter¢   r   r   rX   ¿  s"    $&&z0TestUnifiedOutputRegistry.test_delay_doc_updatesry   c                 C   s   dst ‚dS r‹   r>   rQ   r   r   r   rR   Ú  s    z*TestUnifiedOutputRegistry.test_get_formatsc                 C   sV   |\}}d|dddi f}|j |Ž }|g ks.t‚| ||t¡ |j |Ž }||ksRt‚dS )rl   r!   Nr   rm   ro   r   r   r   Útest_identify_write_formatß  s    

z4TestUnifiedOutputRegistry.test_identify_write_formatc                 C   s\   ||j kst‚||j kst‚|j|tfžŽ  |j|tfžŽ  ||j ksJt‚||j ksXt‚dS )z$Test ``registry.register_writer()``.N)r9   r?   rõ   r*   rY   r   r   r   Útest_register_writerð  s    z.TestUnifiedOutputRegistry.test_register_writerc              	   C   s`   |\}}|  ||t¡ t t¡�}|  ||t¡ W 5 Q R X t|jƒd|› d|j› d�ks\t‚dS )z2Test calling ``registry.register_writer()`` twice.zWriter for format 'r[   r\   N)	rõ   r*   rC   rD   r   r]   r^   r   r?   r_   r   r   r   Útest_register_writer_invalidü  s    ÿz6TestUnifiedOutputRegistry.test_register_writer_invalidc                 C   s8   |j |tfžŽ  |j |tfžddiŽ ||jks4t‚d S rd   )rõ   r*   r9   r?   rW   r   r   r   Útest_register_writer_force  s    z4TestUnifiedOutputRegistry.test_register_writer_forcec                 C   s:   |j |tfžŽ  ||jkst‚|j|Ž  ||jks6t‚dS )ú&Test ``registry.unregister_writer()``.N)rõ   r*   r9   r?   Úunregister_writerrW   r   r   r   Útest_unregister_writer  s    
z0TestUnifiedOutputRegistry.test_unregister_writerc              	   C   sP   |\}}t  t¡�}| ||¡ W 5 Q R X t|jƒd|› d|j› d�ksLt‚dS )rý   úNo writer defined for format 'r[   rj   N)rC   rD   r   rþ   r]   r^   r   r?   r_   r   r   r   Útest_unregister_writer_invalid  s    ÿÿz8TestUnifiedOutputRegistry.test_unregister_writer_invalidc              	   C   sJ   t  t¡� |j|Ž  W 5 Q R X |j|tfžŽ  |j|Ž }|tksFt‚dS )zTest ``registry.get_writer()``.N)rC   rD   r   rö   rõ   r*   r?   ©r   r   r.   Úwriterr   r   r   Útest_get_writer"  s
    
z)TestUnifiedOutputRegistry.test_get_writerc              	   C   sR   |\}}t  t¡�}| ||¡ W 5 Q R X t|jƒ d|› d|j› d�¡sNt‚dS )z'Test invalid ``registry.get_writer()``.r   r[   rj   N)	rC   rD   r   rö   r]   r^   r·   r   r?   r¦   r   r   r   Útest_get_writer_invalid+  s    
ÿz1TestUnifiedOutputRegistry.test_get_writer_invalidc              	   C   s@   t  t¡�}|d ƒ j|d� W 5 Q R X t|jƒ d¡s<t‚dS )z4Test ``registry.write()`` when there isn't a writer.r=   r   r¹   N)rC   rD   r   r!   r]   r^   r·   r?   rº   r   r   r   Útest_write_noformat6  s
    
ÿz-TestUnifiedOutputRegistry.test_write_noformatc              	   C   sT   |j  |d ¡ t t¡�}|d ƒ jtƒ |d� W 5 Q R X t|jƒ 	d¡sPt
‚dS r¼   )r:   rN   rC   rD   r   r!   r½   r]   r^   r·   r?   r¾   r   r   r   Útest_write_noformat_arbitrary@  s     
ÿz7TestUnifiedOutputRegistry.test_write_noformat_arbitraryc              	   C   sV   |j  |d ¡ |d }t t¡�}tƒ j||d� W 5 Q R X t|jƒ 	d¡sRt
‚dS )rÀ   r6   rÁ   r   r¹   N)r9   rN   rC   rD   r   r   r!   r]   r^   r·   r?   )r   rÄ   r   r<   rÅ   rb   r   r   r   Ú"test_write_noformat_arbitrary_fileL  s    
ÿz<TestUnifiedOutputRegistry.test_write_noformat_arbitrary_filec              	   C   sz   |j |dd„ fžŽ  |j |dd„ fžŽ  t t¡�}|d ƒ j|d� W 5 Q R X t|jƒd|d › d|d › �ksvt‚d S )	Nc                 _   s   dS r+   r   rÈ   r   r   r   r©   Z  rª   zETestUnifiedOutputRegistry.test_write_toomanyformats.<locals>.<lambda>c                 _   s   dS r+   r   rÈ   r   r   r   r©   [  rª   r=   r   rÌ   r   rÍ   )rV   rC   rD   r   r!   r]   r^   r?   )r   r   r.   r0   rb   r   r   r   Útest_write_toomanyformatsY  s    ÿÿz3TestUnifiedOutputRegistry.test_write_toomanyformatsc                    s¬   |\‰}|\‰}t ƒ ‰ ‡ ‡fdd„}‡ ‡fdd„}|jˆ||dd� |jˆ||dd� | ˆ|dd	„ ¡ | ˆ|d
d	„ ¡ |ƒ j|d� ˆ ˆ dks˜t‚ˆ ˆ dks¨t‚d S )Nc                     s   ˆ ˆ  d7  < d S rÓ   r   r$   )rÔ   rÏ   r   r   Úcounting_writer1h  s    zLTestUnifiedOutputRegistry.test_write_uses_priority.<locals>.counting_writer1c                     s   ˆ ˆ  d7  < d S rÓ   r   r$   )rÔ   rÐ   r   r   Úcounting_writer2k  s    zLTestUnifiedOutputRegistry.test_write_uses_priority.<locals>.counting_writer2r=   r×   r™   c                 _   s   dS r+   r   rÈ   r   r   r   r©   p  rª   zDTestUnifiedOutputRegistry.test_write_uses_priority.<locals>.<lambda>c                 _   s   dS r+   r   rÈ   r   r   r   r©   q  rª   r   r   )r   rõ   rV   r!   r?   )r   r   r.   r0   Zcls1Zcls2r
  r  r   )rÔ   rÏ   rÐ   r   Útest_write_uses_priorityc  s    z2TestUnifiedOutputRegistry.test_write_uses_priorityc              	   C   sV   |\}}t  t¡�}|ƒ j||d� W 5 Q R X t|jƒ d|› d|j› d�¡sRt‚d S )Nr«   r   r[   rj   )	rC   rD   r   r!   r]   r^   r·   r   r?   r¦   r   r   r   Útest_write_format_nowriterw  s    
ÿz4TestUnifiedOutputRegistry.test_write_format_nowriterc           	   	   C   sÌ   |\}}|\}}|  ||dd„ ¡ |  ||dd„ ¡ t t¡�}|ƒ jd|d� W 5 Q R X t|jƒ d|› d|j› d�¡s~t	‚t t¡�}|ƒ jd	|d� W 5 Q R X t|jƒ d|› d|j› d�¡sÈt	‚d S )
Nc                 _   s   |d   d¡S )Nr   rÛ   ©r·   rÈ   r   r   r   r©   ƒ  rª   zATestUnifiedOutputRegistry.test_write_identifier.<locals>.<lambda>c                 _   s   |d   d¡S )Nr   rá   r  rÈ   r   r   r   r©   „  rª   Úabcr   r   r[   rj   Zbac)
rV   rC   rD   r   r!   r]   r^   r·   r   r?   rÎ   r   r   r   Útest_write_identifier  s    
ÿ
ÿz/TestUnifiedOutputRegistry.test_write_identifierc                 C   s8   |\}}|  ||t¡ |j|ƒ ||d�}|dks4t‚dS )zBMost writers will return None, but other values are not forbidden.r«   r(   N)rõ   r*   r!   r?   ©r   r   r.   r`   ra   Úresr   r   r   Útest_write_return•  s    z+TestUnifiedOutputRegistry.test_write_returnc              	   C   s¢   ||j kst‚tj|tfžd|iŽ ||j ks2t‚|j|Ž  |tk	rž|tj ksRt‚z<ztj|tfžŽ  W n tk
r|   Y nX |tj ksŒt‚W 5 tj  |¡ X d S rr   )	r9   r?   r   rõ   r*   rþ   r   rs   rt   rW   r   r   r   Útest_compat_register_writerŸ  s    
z5TestUnifiedOutputRegistry.test_compat_register_writerc                 C   sŒ   |j |tfžŽ  ||jkst‚tj|d|iŽ ||jks<t‚|tk	rˆ|tjksRt‚tj |tfžŽ  |tjkspt‚tj|Ž  |tjksˆt‚d S rr   )rõ   r*   r9   r?   r   rþ   r   rW   r   r   r   Útest_compat_unregister_writer²  s    
z7TestUnifiedOutputRegistry.test_compat_unregister_writerc                 C   s’   |j |tfžŽ  tj|d|iŽ}|tks,t‚|tk	rŽ|tjksBt‚tj |tfžŽ  |tjks`t‚tj|Ž }|tksvt‚tj|Ž  |tjksŽt‚d S rr   )rõ   r*   r   rö   r?   r   r9   rþ   r  r   r   r   Útest_compat_get_writerÁ  s    

z0TestUnifiedOutputRegistry.test_compat_get_writerc                 C   s¢   |\}}|j |tfžŽ  tj|ƒ ||d�}|dks6t‚|tk	rž|tjksLt‚tj |tfžŽ  |tjksjt‚tj|ƒ |d�}|dks†t‚tj|Ž  |tjksžt‚d S )Nr«   r(   rï   )rõ   r*   r   r!   r?   r   r9   rþ   r  r   r   r   Útest_compat_writeÑ  s    
z+TestUnifiedOutputRegistry.test_compat_write) r   r   r   r   rK   r÷   rX   rC   r~   r   rR   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ò   ™  s4   

	


rò   c                       s@   e Zd Zdd„ Zej d¡dd„ ƒZ‡ fdd„Zdd	„ Z	‡  Z
S )
ÚTestUnifiedIORegistryc                 C   s
   t | _dS rG   )r	   rI   rJ   r   r   r   rK   å  s    z!TestUnifiedIORegistry.setup_classry   c                 C   s   dst ‚dS r‹   r>   rQ   r   r   r   rR   ë  s    z&TestUnifiedIORegistry.test_get_formatsc                    s   t ƒ  ||¡ dS rS   )r›   rX   rW   r¢   r   r   rX   ð  s    z,TestUnifiedIORegistry.test_delay_doc_updatesc           	   	   C   s   |\}}|\}}|  ||dd„ ¡ |  ||dd„ ¡ | ||t¡ | ||t¡ |j|d� |ƒ j|d� t t	¡�}|j||d� W 5 Q R X t
|jƒ d|› d|j› d�¡s²t‚t t	¡�}|ƒ j||d� W 5 Q R X t
|jƒ d	|› d|j› d�¡süt‚d S )
Nc                 _   s   | dkS ré   r   rÈ   r   r   r   r©   ú  rª   z>TestUnifiedIORegistry.test_identifier_origin.<locals>.<lambda>c                 _   s   | dkS )Nr!   r   rÈ   r   r   r   r©   û  rª   r   r«   r³   r[   rj   r   )rV   rˆ   r'   rõ   r*   r    r!   rC   rD   r   r]   r^   r·   r   r?   rÎ   r   r   r   Útest_identifier_originö  s$    
ÿ
ÿz,TestUnifiedIORegistry.test_identifier_origin)r   r   r   rK   rC   r~   r   rR   rX   r  rñ   r   r   r¢   r   r  ä  s
   

r  c                   @   s   e Zd Zdd„ ZdS )ÚTestDefaultRegistryc                 C   s   dd„ | _ dS )rH   c                  W   s   t S r   r   )r%   r   r   r   r©     rª   z1TestDefaultRegistry.setup_class.<locals>.<lambda>N)rI   rJ   r   r   r   rK     s    zTestDefaultRegistry.setup_classN)r   r   r   rK   r   r   r   r   r    s   r  c                  C   s$   t tƒ} tjD ]}|| kst‚qdS )z0Test all the compat methods are in the directoryN)Údirr   Ú__all__r?   )ZdcÚnr   r   r   Útest_dir  s    
r  c               	   C   s>   t jD ]} tt | ƒst‚qtjtdd�� t j W 5 Q R X d S )Nz#module 'astropy.io.registry.compat'rA   )r   r  rL   r?   rC   rD   ÚAttributeErrorZ%this_is_definitely_not_in_this_module)r  r   r   r   Útest_getattr#  s    
r   c               
   C   sâ   t jj} tjttdddgdddgƒƒdtfdgd	�}z˜z|  
d
t dd„ ¡ W n tk
r`   Y njX t j|d
d�}| ¡ ddgks„t‚tdƒD ]<}|d | |d | ks¬t‚|d | |d | ksŒt‚qŒW 5 | j 	d
d ¡ X d S )Nr=   r™   r—   rÛ   rá   ÚcÚA)ÚBz|U1)Zdtyper‡   c                 S   s   t | ƒS r   r   )rÊ   r   r   r   r©   5  rª   z'test_read_basic_table.<locals>.<lambda>rï   r#  )r   r    Ú	_registryÚnpÚarrayÚlistÚzipÚintr8   rs   rˆ   rt   Úkeysr?   Úrange)r   rç   r®   r‘   r   r   r   Útest_read_basic_table/  s     
ÿ"r,  c                   @   s<   e Zd ZdZejdd�dd„ ƒZdd„ Zdd	„ Zd
d„ Z	dS )ÚTestSubclassz4
    Test using registry with a Table sub-class
    T)Zautousec                 c   s
   dV  dS )zI/O registry. Not cleaned.Nr   rJ   r   r   r   r   G  s    zTestSubclass.registryc                 C   sj   G dd„ dt ƒ}ddg}|j|dd�}t j|dd�}t ||k¡sFt‚|j|jksVt‚t|ƒ|ksft‚d S )Nc                   @   s   e Zd ZdS )z6TestSubclass.test_read_table_subclass.<locals>.MyTableNr�   r   r   r   r   ÚMyTableM  s   r.  úa bú1 2Úasciirï   )r   r    r%  Úallr?   ÚcolnamesÚtype)r   r.  rç   Úmtr®   r   r   r   Útest_read_table_subclassL  s    z%TestSubclass.test_read_table_subclassc                 C   s^   t ƒ }G dd„ dtƒ}|dgdggddgd�}|j|dd	� | ¡ tj d
ddg¡ksZt‚d S )Nc                   @   s   e Zd ZdS )z7TestSubclass.test_write_table_subclass.<locals>.MyTableNr�   r   r   r   r   r.  Z  s   r.  r=   r™   rÛ   rá   ©Únamesr1  rï   r/  r0  Ú )r   r   r!   ÚgetvalueÚosÚlinesepÚjoinr?   )r   Úbufferr.  r5  r   r   r   Útest_write_table_subclassW  s
    z&TestSubclass.test_write_table_subclassc                 C   sÒ   G dd„ dt ƒ}|ddggdgd�}tj|d _d|d _d|d _|d	 }|j|d
d� | |¡}t 	||k¡svt
‚|j|jks†t
‚t|ƒ|ks–t
‚|d jtjksªt
‚|d jdks¼t
‚|d jdksÎt
‚dS )zBRegression test for https://github.com/astropy/astropy/issues/7181c                   @   s   e Zd ZdS )zMTestSubclass.test_read_table_subclass_with_columns_attributes.<locals>.MTableNr�   r   r   r   r   ÚMTabled  s   r@  r=   g      @rÛ   r7  z.4fZhelloz	junk.fitsT)Ú	overwritez{:13.4f}N)r   ÚuÚmÚunitr¬   Údescriptionr!   r    r%  r2  r?   r3  r4  )r   rÄ   r@  r5  rÅ   r®   r   r   r   Ú0test_read_table_subclass_with_columns_attributesa  s    


z=TestSubclass.test_read_table_subclass_with_columns_attributesN)
r   r   r   r   rC   r}   r   r6  r?  rF  r   r   r   r   r-  B  s   


r-  )3r   r;  Úcollectionsr   Úcopyr   Úior   Únumpyr%  rC   Zastropy.unitsZunitsrB  Z
astropy.ior   r   Zastropy.io.registryr   r   r	   r
   r   Zastropy.io.registry.baser   Zastropy.io.registry.compatr   Zastropy.tabler   r   r   r"   r'   r*   r,   r}   r.   r0   r4   r<   r@   rE   rF   r€   rò   r  r  r  r   r,  r-  r   r   r   r   Ú<module>   sT   	



 5  w  M,