U
    ½mœdo  ã                   @   s6  d Z ddlZddl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 ddlZddlmZmZmZmZmZ ddlmZmZ dd	lmZ dd
lmZ zedƒ W n ek
r¼   dZY nX dZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZ G dd„ deƒZ!G dd„ deƒZ"G d d!„ d!e"ƒZ#G d"d#„ d#eƒZ$G d$d%„ d%e"ƒZ%G d&d'„ d'eƒZ&G d(d)„ d)e"ƒZ'G d*d+„ d+e"ƒZ(G d,d-„ d-eƒZ)G d.d/„ d/eƒZ*G d0d1„ d1eƒZ+G d2d3„ d3eƒZ,G d4d5„ d5eƒZ-G d6d7„ d7eƒZ.G d8d9„ d9eƒZ/G d:d;„ d;eƒZ0dS )<z²
    Group test module.

    Tests all methods and properties of Group objects, with the following
    exceptions:

    1. Method create_dataset is tested in module test_dataset
é    N)Úmkdtemp)ÚMutableMappingé   )ÚutÚTestCase)ÚFileÚGroupÚSoftLinkÚHardLinkÚExternalLink)ÚDatasetÚDatatype)Úh5t)Úfilename_encodeõ   Î±TFc                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú	BaseGroupc                 C   s   t |  ¡ dƒ| _d S ©NÚw)r   ÚmktempÚf©Úself© r   úN/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/h5py/tests/test_group.pyÚsetUp/   s    zBaseGroup.setUpc                 C   s   | j r| j  ¡  d S ©N©r   Úcloser   r   r   r   ÚtearDown2   s    zBaseGroup.tearDownN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   -   s   r   c                   @   sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )Ú
TestCreatezI
        Feature: New groups can be created via .create_group method
    c                 C   s4   | j  d¡}|  |t¡ | j  d¡}|  |t¡ dS )z Simple .create_group call Úfoos   barN)r   Úcreate_groupÚassertIsInstancer   ©r   ÚgrpÚgrp2r   r   r   Útest_create<   s    zTestCreate.test_createc                 C   s8   | j  d¡}|  |jd¡ | j  d¡}|  |jd¡ dS )z2 Intermediate groups can be created automatically úfoo/bar/bazz/foo/bar/bazs   boo/bar/bazz/boo/bar/bazN)r   r$   ÚassertEqualÚnamer&   r   r   r   Útest_create_intermediateD   s    z#TestCreate.test_create_intermediatec              	   C   s2   | j  d¡ |  t¡ | j  d¡ W 5 Q R X dS )z= Name conflict causes group creation to fail with ValueError r#   N)r   r$   ÚassertRaisesÚ
ValueErrorr   r   r   r   Útest_create_exceptionL   s    z TestCreate.test_create_exceptionc                 C   sJ   dt dƒ }| j |¡}|  |j|¡ |  |jj | d¡¡j	t
j¡ dS )z$ Unicode names are correctly stored z/Namei E  Úutf8N)Úchrr   r$   r+   r,   ÚidÚlinksÚget_infoÚencodeÚcsetr   Z	CSET_UTF8©r   r,   Úgroupr   r   r   Útest_unicodeR   s    zTestCreate.test_unicodec                 C   sB   d}| j  |¡}|  |j|¡ |  |jj | d¡¡jt	j
¡ dS )zL Unicode names convertible to ASCII are stored as ASCII (issue 239)
        z/Hello, this is a namer1   N)r   r$   r+   r,   r3   r4   r5   r6   r7   r   Z
CSET_ASCIIr8   r   r   r   Útest_unicode_defaultY   s    zTestCreate.test_unicode_defaultc              	   C   s&   |   t¡ | j d¡ W 5 Q R X dS )z" Names should be strings or bytes g      ð?N)r.   Ú	TypeErrorr   r$   r   r   r   r   Ú	test_typea   s    zTestCreate.test_typec              	   C   s4   | j  ddg¡}|  t¡ t|jƒ W 5 Q R X dS )zA Binding a group to a non-group identifier fails with ValueError r#   r   N)r   Úcreate_datasetr.   r/   r   r3   )r   Údsetr   r   r   Útest_appropriate_low_level_idf   s    z(TestCreate.test_appropriate_low_level_idN)r   r    r!   Ú__doc__r)   r-   r0   r:   r;   r=   r@   r   r   r   r   r"   6   s   r"   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚTestDatasetAssignmentzK
        Feature: Datasets can be created by direct assignment of data
    c                 C   sD   t jddd}|| jd< |  | jd t¡ |  | jd d |¡ dS )z, Dataset auto-creation by direct assignment ©é   rD   r   ©ÚdtypeÚa.N)ÚnpÚonesr   r%   r   ÚassertArrayEqual©r   Údatar   r   r   Útest_ndarrayr   s    
z"TestDatasetAssignment.test_ndarrayc                 C   s.   t jddd}|| jd< |  | jd t¡ d S )NrC   r   rE   ó   b)rH   rI   r   r%   r   rK   r   r   r   Útest_name_bytesy   s    
z%TestDatasetAssignment.test_name_bytesN)r   r    r!   rA   rM   rO   r   r   r   r   rB   l   s   rB   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚTestDtypeAssignmentzP
        Feature: Named types can be created by direct assignment of dtypes
    c                 C   s>   t  d¡}|| jd< |  | jd t¡ |  | jd j|¡ dS )ú Named type creation ú|S10rG   N)rH   rF   r   r%   r   r+   ©r   rF   r   r   r   Ú
test_dtype„   s    

zTestDtypeAssignment.test_dtypec                 C   s*   t  d¡}|| jd< |  | jd t¡ dS )rQ   rR   rN   N)rH   rF   r   r%   r   rS   r   r   r   rO   ‹   s    

z#TestDtypeAssignment.test_name_bytesN)r   r    r!   rA   rT   rO   r   r   r   r   rP   ~   s   rP   c                   @   s@   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )ÚTestRequirezO
        Feature: Groups can be auto-created, or opened via .require_group
    c                 C   s@   | j  d¡}| j  d¡}|  ||¡ | j  d¡}|  ||¡ dS )z' Existing group is opened and returned r#   s   fooN)r   r$   Úrequire_groupr+   ©r   r'   r(   Zgrp3r   r   r   Útest_open_existing˜   s
    zTestRequire.test_open_existingc                 C   s*   | j  d¡}|  |t¡ |  |jd¡ dS )z& Group is created if it doesn't exist r#   ú/fooN)r   rV   r%   r   r+   r,   ©r   r'   r   r   r   r)   ¡   s    zTestRequire.test_createc              	   C   s6   | j  ddd¡ |  t¡ | j  d¡ W 5 Q R X dS )z1 Opening conflicting object results in TypeError r#   ©r   r   N)r   r>   r.   r<   rV   r   r   r   r   Útest_require_exception§   s    z"TestRequire.test_require_exceptionc                 C   sR   t  ¡ }| jjdd|d | j d¡}t|tƒs4t‚| j d¡}t|tƒsNt‚dS )z- Intermediate is created if it doesn't exist r*   r[   rE   r#   úfoo/barN)Úh5pyÚstring_dtyper   Úrequire_datasetÚgetÚ
isinstancer   ÚAssertionError©r   Údtr9   r   r   r   Ú test_intermediate_create_dataset­   s    z,TestRequire.test_intermediate_create_datasetc                 C   sf   t  ¡ }| j d¡ | j d¡}t|tƒs.t‚| j d¡}t|tƒsHt‚| j d¡}t|tƒsbt‚d S )Nr*   r#   r]   )r^   r_   r   rV   ra   rb   r   rc   rd   r   r   r   Útest_intermediate_create_group¶   s    z*TestRequire.test_intermediate_create_groupc              	   C   sò   | j jdddtd}|jddd | j jdddtd | j jddtd	 |  t¡ | j jdd
dtd W 5 Q R X |  t¡ | j jdd
dtd W 5 Q R X |  t¡ | j jdd
dtd W 5 Q R X |  t¡ | j jddtd	 W 5 Q R X d S )Nzfoo/resizable)r   é   )Nrh   )ÚshapeZmaxshaperF   é   r   )Zaxis)rj   rh   )ri   rF   )r   r   )rh   N)Né   )Nrk   é   )é
   rh   )r   r`   ÚintÚresizer.   r<   )r   Zdsr   r   r   Útest_require_shapeÀ   s    zTestRequire.test_require_shapeN)
r   r    r!   rA   rX   r)   r\   rf   rg   rp   r   r   r   r   rU   ’   s   		
rU   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	Ú
TestDeletezA
        Feature: Objects can be unlinked via "del" operator
    c                 C   s4   | j  d¡ |  d| j ¡ | j d= |  d| j ¡ dS )z Object deletion via "del" r#   N©r   r$   ÚassertInÚassertNotInr   r   r   r   Útest_deleteÕ   s    zTestDelete.test_deletec              	   C   s"   |   t¡ | jd= W 5 Q R X dS )z. Deleting non-existent object raises KeyError r#   N©r.   ÚKeyErrorr   r   r   r   r   Útest_nonexistingÜ   s    zTestDelete.test_nonexistingc              	   C   sf   |   ¡ }t|dƒ}z| d¡ W 5 | ¡  X t|dƒ}z |  t¡ |d= W 5 Q R X W 5 | ¡  X dS )z2 Deleting object in readonly file raises KeyError r   r#   ÚrN)r   r   r   r$   r.   rw   )r   ÚfnameÚhfiler   r   r   Útest_readonly_delete_exceptioná   s    


z)TestDelete.test_readonly_delete_exceptionN)r   r    r!   rA   ru   rx   r|   r   r   r   r   rq   Ï   s   rq   c                   @   s@   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )ÚTestOpenzJ
        Feature: Objects can be opened via indexing syntax obj[name]
    c                 C   s<   | j  d¡}| j d }| j d }|  ||¡ |  ||¡ dS )z Simple obj[name] opening r#   rY   N)r   r$   r+   rW   r   r   r   Ú	test_openù   s
    

zTestOpen.test_openc              	   C   s$   |   t¡ | jd  W 5 Q R X dS )z) Opening missing objects raises KeyError r#   Nrv   r   r   r   r   Útest_nonexistent  s    zTestOpen.test_nonexistentc                 C   s(   | j  d¡}| j |j }|  ||¡ dS )z0 Objects can be opened by HDF5 object reference r#   N)r   r$   Úrefr+   r&   r   r   r   Útest_reference  s    zTestOpen.test_referencec                 C   s`   | j  d¡}t ddtjfg¡}| j  dd|¡}d|jf|d< |d }|  | j |d  |¡ d	S )
zm Object can be opened by numpy.object_ containing object ref

        Test for issue 181, issue 202.
        Útest)rG   ÚiÚbZ	test_dsetr[   é*   r   r   N)	r   r$   rH   rF   r^   Z	ref_dtyper>   r€   r+   )r   Úgre   r?   rL   r   r   r   Útest_reference_numpyobj  s    z TestOpen.test_reference_numpyobjc              	   C   sn   t j ¡ }|  t¡ | j|  W 5 Q R X | j d¡ | jd j}| jd= |  t¡ | j|  W 5 Q R X dS )z5 Invalid region references should raise an exception ÚxN)	r^   Zh5rZ	Referencer.   r/   r   r$   r€   Ú	Exception)r   r€   r   r   r   Útest_invalid_ref  s    
zTestOpen.test_invalid_refc              	   C   sP   | j  d¡ |  t¡ | j d  W 5 Q R X |  t¡ | j d  W 5 Q R X dS )z> Access with non bytes or str types should raise an exception r9   r   .N)r   r$   r.   r<   r   r   r   r   Útest_path_type_validation)  s
    z"TestOpen.test_path_type_validationN)
r   r    r!   rA   r~   r   r   r‡   rŠ   r‹   r   r   r   r   r}   ó   s   r}   c                   @   s   e Zd ZdZdd„ ZdS )ÚTestReprz9Opened and closed groups provide a useful __repr__ stringc                 C   s^   | j  d¡}|  t|ƒt¡ |j ¡  |  t|ƒt¡ | j d }| j  ¡  |  t|ƒt¡ dS )z; Opened and closed groups provide a useful __repr__ string r#   N)r   r$   r%   ÚreprÚstrr3   Ú_closer   )r   r†   r   r   r   Ú	test_repr8  s    


zTestRepr.test_reprN)r   r    r!   rA   r   r   r   r   r   rŒ   5  s   rŒ   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚBaseMappingz*
        Base class for mapping tests
    c                 C   sN   t |  ¡ dƒ| _d| _| jD ]}| j |¡ qt d¡| jd< | jd | _d S )Nr   )rG   r„   ÚcÚdú	/mongooserˆ   ©rˆ   )r   r   r   Úgroupsr$   r^   r	   ©r   rˆ   r   r   r   r   H  s    
zBaseMapping.setUpc                 C   s   | j r| j  ¡  d S r   r   r   r   r   r   r   P  s    zBaseMapping.tearDownN)r   r    r!   rA   r   r   r   r   r   r   r‘   C  s   r‘   c                   @   s   e Zd ZdZdd„ ZdS )ÚTestLenzM
        Feature: The Python len() function returns the number of groups
    c                 C   sD   |   t| jƒt| jƒ¡ | j d¡ |   t| jƒt| jƒd ¡ dS )z' len() returns number of group members Úer   N)r+   Úlenr   r–   r$   r   r   r   r   Útest_lenZ  s    zTestLen.test_lenN)r   r    r!   rA   r›   r   r   r   r   r˜   T  s   r˜   c                   @   sP   e Zd Z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S )ÚTestContainszC
        Feature: The Python "in" builtin tests for membership
    c                 C   sd   | j  d¡ |  d| j ¡ |  d| j ¡ |  d| j ¡ |  d| j ¡ |  d| j ¡ |  d| j ¡ dS )z6 "in" builtin works for membership (byte and Unicode) rG   ó   as   /az/as   mongooseÚmongooseNrr   r   r   r   r   Útest_containsg  s    zTestContains.test_containsc                 C   s:   | j  d¡ | j  ¡  |  d| j k¡ |  d| j k¡ dS )z9 "in" on closed group returns False (see also issue 174) rG   r   N)r   r$   r   ÚassertFalser   r   r   r   Útest_excq  s    
zTestContains.test_excc                 C   s    |   d| j¡ |   d| j¡ dS )z2 Empty strings work properly and aren't contained Ú ó    N)rt   r   r   r   r   r   Ú
test_emptyx  s    zTestContains.test_emptyc                 C   s    |   d| j¡ |   d| j¡ dS )z' Current group "." is always contained ó   .Ú.N©rs   r   r   r   r   r   Útest_dot}  s    zTestContains.test_dotc                 C   s    |   d| j¡ |   d| j¡ dS )z% Root group (by itself) is contained ó   /ú/Nr§   r   r   r   r   Ú	test_root‚  s    zTestContains.test_rootc                 C   sR   | j  d¡ d| j d< |  d| j ¡ |  d| j ¡ |  d| j ¡ |  d| j ¡ dS )	z. Trailing slashes are unconditionally ignored r9   r…   Zdatasetz/group/zgroup/z	/dataset/zdataset/N)r   r$   rs   r   r   r   r   Útest_trailing_slash‡  s    
z TestContains.test_trailing_slashc                 C   sj   | j  d¡ t d¡| j d< t dd¡| j d< |  d| j ¡ |  d| j ¡ |  d| j ¡ |  d| j ¡ dS )	z; Broken softlinks are contained, but their members are not r'   r”   z	/grp/softúmongoose.hdf5z/grp/externalz/grp/soft/somethingz/grp/external/somethingN)r   r$   r^   r	   r   rs   rt   r   r   r   r   Útest_softlinks  s    zTestContains.test_softlinksc                 C   s¼   | j  d¡ d| j d< |  d| j ¡ |  d| j ¡ |  d| j ¡ |  d| j ¡ |  d| j ¡ | j d	 }|  d
| j ¡ |  d
|¡ |  d| j ¡ |  d| j ¡ |  d| j ¡ |  d| j ¡ dS )z0 Technically legitimate (but odd-looking) paths zx/y/zr…   r?   rª   z//z///z.///z././/rˆ   z.//x/y/zzx///z./x///zdset///z/dset//Nrr   rZ   r   r   r   Útest_oddball_pathsš  s    

zTestContains.test_oddball_pathsN)r   r    r!   rA   rŸ   r¡   r¤   r¨   r«   r¬   r®   r¯   r   r   r   r   rœ   a  s   
	
rœ   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚTestIterzP
        Feature: You can iterate over group members via "for x in y", etc.
    c                 C   s"   dd„ | j D ƒ}|  || j¡ dS )z "for x in y" iteration c                 S   s   g | ]}|‘qS r   r   ©Ú.0rˆ   r   r   r   Ú
<listcomp>³  s     z&TestIter.test_iter.<locals>.<listcomp>N)r   ÚassertSameElementsr–   )r   Úlstr   r   r   Ú	test_iter±  s    zTestIter.test_iterc                 C   s<   t |  ¡ dƒ}zdd„ |D ƒ}|  |g ¡ W 5 | ¡  X dS )z= Iteration works properly for the case with no group members r   c                 S   s   g | ]}|‘qS r   r   r±   r   r   r   r³   º  s     z+TestIter.test_iter_zero.<locals>.<listcomp>N)r   r   r   r+   )r   r{   rµ   r   r   r   Útest_iter_zero¶  s
    zTestIter.test_iter_zeroN)r   r    r!   rA   r¶   r·   r   r   r   r   r°   «  s   r°   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestTrackOrderc                 C   s<   t dƒD ].}|d dkr(| t|ƒ¡ q|g|t|ƒ< qd S )Néd   rm   r   )Úranger$   rŽ   )r   r†   rƒ   r   r   r   ÚpopulateÀ  s    zTestTrackOrder.populatec                 C   s\   | j jddd}|  |¡ dd„ tdƒD ƒ}|  t|ƒ|¡ |  tt|ƒƒtt|ƒƒ¡ d S )NÚorderT©Ztrack_orderc                 S   s   g | ]}t |ƒ‘qS r   ©rŽ   ©r²   rƒ   r   r   r   r³   Ì  s     z3TestTrackOrder.test_track_order.<locals>.<listcomp>r¹   )r   r$   r»   rº   r+   ÚlistÚreversed©r   r†   r€   r   r   r   Útest_track_orderÈ  s
    
zTestTrackOrder.test_track_orderc                 C   s`   | j jddd}|  |¡ tdd„ tdƒD ƒƒ}|  t|ƒ|¡ |  tt|ƒƒtt|ƒƒ¡ d S )Nr¼   Fr½   c                 S   s   g | ]}t |ƒ‘qS r   r¾   r¿   r   r   r   r³   Ô  s     z6TestTrackOrder.test_no_track_order.<locals>.<listcomp>r¹   )r   r$   r»   Úsortedrº   r+   rÀ   rÁ   rÂ   r   r   r   Útest_no_track_orderÐ  s
    
z"TestTrackOrder.test_no_track_orderN)r   r    r!   r»   rÃ   rÅ   r   r   r   r   r¸   ¿  s   r¸   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestPy3Dictc                 C   sr   t | jdƒƒ }| j}|  t|ƒ|¡ |  tt|ƒƒtt|ƒƒ¡ | jD ]}|  ||¡ qF|  t|ƒt| jƒ¡ dS )z .keys provides a key view ÚkeysN)	Úgetattrr   r–   r´   rÀ   rÁ   rs   r+   rš   )r   Úkvr€   rˆ   r   r   r   Ú	test_keysÚ  s    
zTestPy3Dict.test_keysc                    sˆ   t ˆ jdƒƒ }‡ fdd„ˆ jD ƒ}ˆ  t|ƒ|¡ ˆ  tt|ƒƒtt|ƒƒ¡ ˆ  t|ƒtˆ jƒ¡ ˆ jD ]}ˆ  ˆ j 	|¡|¡ qjdS )z .values provides a value view Úvaluesc                    s   g | ]}ˆ j  |¡‘qS r   ©r   ra   r±   r   r   r   r³   è  s     z+TestPy3Dict.test_values.<locals>.<listcomp>N©
rÈ   r   r–   r´   rÀ   rÁ   r+   rš   rs   ra   )r   Úvvr€   rˆ   r   r   r   Útest_valueså  s    
zTestPy3Dict.test_valuesc                    sŒ   t ˆ jdƒƒ }‡ fdd„ˆ jD ƒ}ˆ  t|ƒ|¡ ˆ  tt|ƒƒtt|ƒƒ¡ ˆ  t|ƒtˆ jƒ¡ ˆ jD ]}ˆ  |ˆ j 	|¡f|¡ qjdS )z .items provides an item view Úitemsc                    s   g | ]}|ˆ j  |¡f‘qS r   rÌ   r±   r   r   r   r³   ó  s     z*TestPy3Dict.test_items.<locals>.<listcomp>NrÍ   )r   Zivr€   rˆ   r   r   r   Ú
test_itemsð  s    
zTestPy3Dict.test_itemsN)r   r    r!   rÊ   rÏ   rÑ   r   r   r   r   rÆ   Ø  s   rÆ   c                   @   sx   e Zd Z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S )ÚTestAdditionalMappingFuncszc
    Feature: Other dict methods (pop, pop_item, clear, update, setdefault) are
    available.
    c                 C   s6   t |  ¡ dƒ| _dD ]}| j |¡ q| jd | _d S )Nr   )z/test/az/test/bz/test/cz/test/dr‚   )r   r   r   r$   r9   r—   r   r   r   r      s    z TestAdditionalMappingFuncs.setUpc                 C   s   | j r| j  ¡  d S r   r   r   r   r   r   r     s    z#TestAdditionalMappingFuncs.tearDownc                 C   s    | j  ¡ \}}|  || j ¡ dS )z!.pop_item exists and removes itemN)r9   Úpopitemrt   )r   ÚkeyÚvalr   r   r   Útest_pop_item
  s    z(TestAdditionalMappingFuncs.test_pop_itemc                 C   s   | j  d¡ |  d| j ¡ dS )z&.pop exists and removes specified itemrG   N)r9   Úpoprt   r   r   r   r   Útest_pop  s    z#TestAdditionalMappingFuncs.test_popc                 C   s   | j  dd¡}|  |d¡ dS )z.pop falls back to defaultr™   N)r9   r×   r+   ©r   Úvaluer   r   r   Útest_pop_default  s    z+TestAdditionalMappingFuncs.test_pop_defaultc              	   C   s&   |   t¡ | j d¡}W 5 Q R X dS )z&.pop raises KeyError for non-existencer™   N)r.   rw   r9   r×   )r   rÔ   r   r   r   Útest_pop_raises  s    z*TestAdditionalMappingFuncs.test_pop_raisesc                 C   s    | j  ¡  |  t| j ƒd¡ dS )z.clear removes groupsr   N)r9   Úclearr+   rš   r   r   r   r   Ú
test_clear   s    
z%TestAdditionalMappingFuncs.test_clearc                 C   s.   dt  dg¡i}| j |¡ |  d| j¡ dS )z.update works with dictr™   r…   N©rH   Úarrayr9   Úupdaters   ©r   Z	new_itemsr   r   r   Útest_update_dict%  s    z+TestAdditionalMappingFuncs.test_update_dictc                 C   s>   dt  dg¡fdt  dg¡fg}| j |¡ |  d| j¡ dS )z.update works with listr™   r…   r   Nrß   râ   r   r   r   Útest_update_iter+  s
    þz+TestAdditionalMappingFuncs.test_update_iterc                 C   s0   dt  dg¡i}| jjf |Ž |  d| j¡ dS )z.update works with kwargsr™   r…   Nrß   râ   r   r   r   Útest_update_kwargs4  s    z-TestAdditionalMappingFuncs.test_update_kwargsc                 C   s$   | j  d¡}|  || j  d¡¡ dS )z#.setdefault gets group if it existsrG   N)r9   Ú
setdefaultr+   ra   rÙ   r   r   r   Útest_setdefault:  s    z*TestAdditionalMappingFuncs.test_setdefaultc                 C   s&   | j  dt dg¡¡}|  |d¡ dS )z/.setdefault gets default if group doesn't existr™   r…   N)r9   ræ   rH   rà   r+   rÙ   r   r   r   Útest_setdefault_with_default?  s    z7TestAdditionalMappingFuncs.test_setdefault_with_defaultc              	   C   s&   |   t¡ | j d¡ W 5 Q R X dS )z—
        .setdefault gets None if group doesn't exist, but as None isn't defined
        as data for a dataset, this should raise a TypeError.
        r™   N)r.   r<   r9   ræ   r   r   r   r   Útest_setdefault_no_defaultF  s    z5TestAdditionalMappingFuncs.test_setdefault_no_defaultN)r   r    r!   rA   r   r   rÖ   rØ   rÛ   rÜ   rÞ   rã   rä   rå   rç   rè   ré   r   r   r   r   rÒ   û  s   	rÒ   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚTestGetzL
        Feature: The .get method allows access to objects and metadata
    c                 C   sH   t ƒ }| j d|¡}|  ||¡ | j d¡}| j d¡}|  ||¡ dS )z4 Object is returned, or default if it doesn't exist rž   rG   r   N)Úobjectr   ra   ZassertIsr$   r+   )r   ÚdefaultÚoutr'   r   r   r   Útest_get_defaultV  s    zTestGet.test_get_defaultc                 C   s‚   | j  d¡ | j jddd}|  |t¡ | j  dd¡ | j jddd}|  |t¡ t d¡| j d< | j jddd}|  |t	¡ dS )	z/ Object class is returned with getclass option r#   T)ÚgetclassÚbar)rD   rR   ÚbazN)
r   r$   ra   r+   r   r>   r   rH   rF   r   )r   rí   r   r   r   Útest_get_class`  s    zTestGet.test_get_classc                 C   sœ   t ƒ }tdƒ}tddƒ}| j d¡ || jd< || jd< | jjd|ddd}| jjd|ddd}| jjd|ddd}|  |t¡ |  |t¡ |  |t¡ d	S )
z Get link classes r”   úsomewhere.hdf5rž   ÚhardÚsoftÚexternalT)Úgetlinkrï   N)rë   r	   r   r   r$   ra   r+   r
   )r   rì   ÚslÚelÚout_hlÚout_slÚout_elr   r   r   Útest_get_link_classn  s    


zTestGet.test_get_link_classc                 C   sº   t dƒ}tddƒ}| j d¡ || jd< || jd< | jjddd}| jjddd}| jjddd}|  |t¡ |  |t ¡ |  |j|j¡ |  |t¡ |  |j|j¡ |  |j	|j	¡ d	S )
z Get link values r”   ró   rž   rô   rõ   rö   T©r÷   N)
r	   r   r   r$   ra   r%   r
   r+   Ú_pathÚ	_filename)r   rø   rù   rú   rû   rü   r   r   r   Útest_get_link  s    


zTestGet.test_get_linkN)r   r    r!   rA   rî   rò   rý   r  r   r   r   r   rê   P  s
   
rê   c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )Ú	TestVisitzv
        Feature: The .visit and .visititems methods allow iterative access to
        group and subgroup members
    c                 C   s>   t |  ¡ dƒ| _ddddddg| _| jD ]}| j |¡ q(d S )Nr   Zgrp1zgrp1/sg1zgrp1/sg2r(   zgrp2/sg1zgrp2/sg1/ssg1)r   r   r   r–   r$   r—   r   r   r   r     s         ÿ
zTestVisit.setUpc                 C   s   | j  ¡  d S r   r   r   r   r   r   r   ¥  s    zTestVisit.tearDownc                 C   s$   g }| j  |j¡ |  || j¡ dS )z All subgroups are visited N)r   ÚvisitÚappendr´   r–   )r   Úlr   r   r   Ú
test_visit¨  s    zTestVisit.test_visitc                    s<   g ‰ ‡fdd„ˆj D ƒ}ˆj ‡ fdd„¡ ˆ |ˆ ¡ dS )z( All subgroups and contents are visited c                    s   g | ]}|ˆ j | f‘qS r   )r   r±   r   r   r   r³   ±  s     z-TestVisit.test_visititems.<locals>.<listcomp>c                    s   ˆ   | |f¡S r   )r  ©rˆ   Úy)r  r   r   Ú<lambda>²  r£   z+TestVisit.test_visititems.<locals>.<lambda>N)r–   r   Ú
visititemsr´   )r   Úcompr   )r  r   r   Útest_visititems®  s    zTestVisit.test_visititemsc                 C   sX   | j  dd„ ¡}|  || jd ¡ | j  dd„ ¡}|  || jd | j | jd  f¡ dS )z9 Returning a non-None value immediately aborts iteration c                 S   s   | S r   r   r•   r   r   r   r	  ·  r£   z(TestVisit.test_bailout.<locals>.<lambda>r   c                 S   s   | |fS r   r   r  r   r   r   r	  ¹  r£   N)r   r  r+   r–   r
  r—   r   r   r   Útest_bailoutµ  s    zTestVisit.test_bailoutN)	r   r    r!   rA   r   r   r  r  r  r   r   r   r   r  –  s   r  c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚTestSoftLinkszQ
        Feature: Create and manage soft links with the high-level interface
    c                 C   s   t dƒ}|  |jd¡ dS )z SoftLink path attribute rY   N)r	   r+   Úpath©r   rø   r   r   r   Ú
test_spathÂ  s    zTestSoftLinks.test_spathc                 C   s   t dƒ}|  t|ƒt¡ dS )z SoftLink path repr rY   N)r	   r%   r   rŽ   r  r   r   r   Ú
test_sreprÇ  s    zTestSoftLinks.test_sreprc                 C   s8   | j  d¡}tdƒ}|| j d< | j d }|  ||¡ dS )z$ Create new soft link by assignment Únewz/newÚaliasN)r   r$   r	   r+   )r   r†   rø   Úg2r   r   r   r)   Ì  s
    

zTestSoftLinks.test_createc              	   C   s2   t dƒ| jd< |  t¡ | jd  W 5 Q R X dS )z0 Opening dangling soft link results in KeyError r  r  N)r	   r   r.   rw   r   r   r   r   r¡   Ô  s    zTestSoftLinks.test_excN)r   r    r!   rA   r  r  r)   r¡   r   r   r   r   r  ¼  s
   r  c                   @   s€   e Zd Z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 ed¡dd„ ƒZe ed¡dd„ ƒZdd„ ZdS )ÚTestExternalLinksz7
        Feature: Create and manage external links
    c                 C   sB   t |  ¡ dƒ| _|  ¡ | _t | jdƒ| _| j d¡ | j ¡  d S )Nr   rö   )r   r   r   ÚenameÚefr$   r   r   r   r   r   r   à  s
    
zTestExternalLinks.setUpc                 C   s$   | j r| j  ¡  | jr | j ¡  d S r   )r   r   r  r   r   r   r   r   ç  s    
zTestExternalLinks.tearDownc                 C   s*   t ddƒ}|  |jd¡ |  |jd¡ dS )z  External link paths attributes úfoo.hdf5rY   N)r   r+   Úfilenamer  ©r   rù   r   r   r   Ú
test_epathí  s    
zTestExternalLinks.test_epathc                 C   s   t ddƒ}|  t|ƒt¡ dS )z External link repr r  rY   N)r   r%   r   rŽ   r  r   r   r   Ú
test_erepró  s    
zTestExternalLinks.test_ereprc                 C   sF   t | jdƒ| jd< | jd }|j| _|  | j| j¡ |  |jd¡ dS )z Creating external links ú	/externalÚextN)r   r  r   Úfiler  ÚassertNotEqualr+   r,   rZ   r   r   r   r)   ø  s
    
zTestExternalLinks.test_createc              	   C   s6   t | jdƒ| jd< |  t¡ | jd  W 5 Q R X dS )z5 KeyError raised when attempting to open broken link z/missingr  N)r   r  r   r.   rw   r   r   r   r   r¡      s    zTestExternalLinks.test_excc              	   C   s4   t ddƒ| jd< |  t¡ | jd  W 5 Q R X dS )z6 KeyError raised when attempting to open missing file r­   rY   r  N)r   r   r.   rw   r   r   r   r   Útest_exc_missingfile  s    z&TestExternalLinks.test_exc_missingfilec                 C   s8   t | jdƒ| jd< | jd }|j}| ¡  |  |¡ dS )zT Files opened by accessing external links can be closed

        Issue 189.
        rª   r  N)r   r  r   r   r   r    )r   r'   Úf2r   r   r   Útest_close_file  s
    
z!TestExternalLinks.test_close_filezNo unicode filename supportc              	   C   sD   t j tƒ d¡}t|dƒ}| d¡ W 5 Q R X t|dƒ| jd< dS )zh
        Check that external links encode unicode filenames properly
        Testing issue #732
        õ   Î±.hdf5r   rö   r  r  N)Úosr  Újoinr   r   r$   r   r   ©r   Zext_filenameZext_filer   r   r   Útest_unicode_encode  s    z%TestExternalLinks.test_unicode_encodec              	   C   sj   t j tƒ d¡}t|dƒ}| d¡ d|d jd< W 5 Q R X t|dƒ| jd< |  	| jd jd d¡ dS )	zh
        Check that external links decode unicode filenames properly
        Testing issue #732
        r%  r   rö   r‚   Úext_attrr  r  N©
r&  r  r'  r   r   r$   Úattrsr   r   r+   r(  r   r   r   Útest_unicode_decode$  s    
z%TestExternalLinks.test_unicode_decodec              	   C   sj   t j tƒ d¡}t|dƒ}| d¡ d|d jd< W 5 Q R X t|dƒ| jd< |  	| jd jd d¡ dS )	zi
        Check that external links handle unicode hdf5 paths properly
        Testing issue #333
        zexternal.hdf5r   r   r‚   r*  u   /Î±r  Nr+  r(  r   r   r   Útest_unicode_hdf5_path1  s    
z(TestExternalLinks.test_unicode_hdf5_pathN)r   r    r!   rA   r   r   r  r  r)   r¡   r"  r$  r   ÚskipIfÚNO_FS_UNICODEr)  r-  r.  r   r   r   r   r  Ú  s   




r  c                   @   s   e Zd ZdZdd„ ZdS )ÚTestExtLinkBugsz;
        Bugs: Specific regressions for external links
    c                 C   s    dd„ }|   ¡ }|   ¡ }t|dƒ}|  ||ƒ¡ | d¡ | ¡  t|dƒ}|  ||ƒ¡ t|dƒ|d< | ¡  t|dƒ}|  ||ƒ¡ |  |d d t¡ dS )	zo Issue 212

        Fails with:

        AttributeError: 'SharedConfig' object has no attribute 'lapl'
        c                    s   ‡ fdd„}|S )Nc                      s*   zˆ rˆ   ¡  W n tk
r$   Y nX d S r   )r   ÚIOErrorr   r•   r   r   r   K  s
    z9TestExtLinkBugs.test_issue_212.<locals>.closer.<locals>.wr   )rˆ   r   r   r•   r   ÚcloserJ  s    z.TestExtLinkBugs.test_issue_212.<locals>.closerr   rG   rª   Úlinkry   N)r   r   Z
addCleanupr$   r   r   r%   r   )r   r3  Ú	orig_nameÚnew_namer   r†   Úhr   r   r   Útest_issue_212C  s    



zTestExtLinkBugs.test_issue_212N)r   r    r!   rA   r8  r   r   r   r   r1  =  s   r1  c                   @   s4  e Zd Zdd„ Zdd„ Ze ejj	dk d¡dd„ ƒZ
e ejj	dk d¡d	d
„ ƒZe ejj	dk d¡dd„ ƒZe ejj	dk d¡dd„ ƒZe ejj	dk d¡dd„ ƒZe ejj	dk d¡dd„ ƒZe ejj	dk d¡dd„ ƒZe ejj	dk d¡dd„ ƒZe ejj	dk d¡dd„ ƒZe ejj	dk d¡dd„ ƒZdS )ÚTestCopyc                 C   s$   t |  ¡ dƒ| _t |  ¡ dƒ| _d S r   )r   r   Úf1r#  r   r   r   r   r   e  s    zTestCopy.setUpc                 C   s$   | j r| j  ¡  | jr | j ¡  d S r   )r:  r   r#  r   r   r   r   r   i  s    
zTestCopy.tearDown)r   é   é	   z/Bug in HDF5<1.8.8 prevents copying open datasetc                 C   s^   | j  d¡}dddg|d< | j  dd¡ | j d }|  |t¡ |  |d t dddg¡¡ d S )Nr#   r   rl   rh   rð   rñ   )r:  r$   Úcopyr%   r   rJ   rH   rà   ©r   r#   rñ   r   r   r   Útest_copy_path_to_patho  s    
zTestCopy.test_copy_path_to_pathc                 C   s®   | j  d¡}dddg|d< | j  d¡}| j  d|¡ | j d }|  |t¡ |  |d t dddg¡¡ | j  d| jd ¡ |  | jd	 t¡ |  | jd t dddg¡¡ d S ©
Nr#   r   rl   rh   rð   rñ   r]   rª   rY   ©	r:  r$   r=  r%   r   rJ   rH   rà   r#  r>  r   r   r   Útest_copy_path_to_groupz  s    
z TestCopy.test_copy_path_to_groupc                 C   sœ   | j  d¡}dddg|d< | j  |d¡ | j d }|  |t¡ |  |d t dddg¡¡ | j |d¡ |  | jd t¡ |  | jd t dddg¡¡ d S )	Nr#   r   rl   rh   rð   rñ   rY   r]   rA  r>  r   r   r   Útest_copy_group_to_pathŠ  s    
z TestCopy.test_copy_group_to_pathc                 C   s®   | j  d¡}dddg|d< | j  d¡}| j  ||¡ | j d }|  |t¡ |  |d t dddg¡¡ | j  || jd ¡ |  | jd	 t¡ |  | jd t dddg¡¡ d S r@  rA  r>  r   r   r   Útest_copy_group_to_groupš  s    
z!TestCopy.test_copy_group_to_groupc                 C   s  dddg| j d< | j d }| j  d¡}| j  |d¡ |  | j d t dddg¡¡ | j  dd¡ |  | j d t dddg¡¡ | j  ||¡ |  | j d t dddg¡¡ | j  d| j¡ |  | jd t dddg¡¡ | j | j d | jd¡ |  | jd t dddg¡¡ d S )	Nr   rl   rh   r#   r'   rð   rñ   z/grp/foo)r:  r$   r=  rJ   rH   rà   r#  )r   r#   r'   r   r   r   Útest_copy_dataset«  s    
zTestCopy.test_copy_datasetc                 C   s  | j  d¡}| d¡}dddg|d< ddd	g|d
< | j j|ddd | j d }|  |t¡ |  |d t¡ |  t|d ƒd¡ |  |d t 	dddg¡¡ | j
j|ddd |  | j
d t¡ |  | j
d t¡ |  t| j
d ƒd¡ |  | j
d t 	dddg¡¡ d S )Nr#   rð   r   rl   rh   ÚquxrD   rk   é   Zquuxrñ   T)Zshallowr   rY   r]   zfoo/qux)r:  r$   r=  r%   r   r+   rš   rJ   rH   rà   r#  )r   r#   rð   rñ   r   r   r   Útest_copy_shallowÁ  s    

zTestCopy.test_copy_shallowc                 C   s¶   dddg| j d< | j d }dddg|jd< | j j|d	d
d |  | j d	 t dddg¡¡ d| j d	 jksnt‚| jj|d	d
d |  | jd	 t dddg¡¡ d| jd	 jks²t‚d S )Nr   rl   rh   r#   rD   rk   rG  rð   rñ   T)Zwithout_attrs)r:  r,  r=  rJ   rH   rà   rc   r#  ©r   r#   r   r   r   Útest_copy_without_attributes×  s    
z%TestCopy.test_copy_without_attributesc                 C   s¸   dddg| j d< | j  d¡}tdƒ|d< | j j|dd	d
 | jj|dd	d
 | j d= |  | j d t¡ |  | j d t 	dddg¡¡ |  | jd t¡ |  | jd t 	dddg¡¡ d S )Nr   rl   rh   rð   r#   z/barrñ   rF  T)Zexpand_softzqux/bazrY   zfoo/baz)
r:  r$   r	   r=  r#  r%   r   rJ   rH   rà   rI  r   r   r   Útest_copy_soft_linksç  s    zTestCopy.test_copy_soft_linksc                 C   s”   | j j}dddg| j d< t|dƒ| jd< | j  ¡  d | _ |  | jd t dddg¡¡ | jjdddd t	 
|¡ |  | jd t dddg¡¡ d S )	Nr   rl   rh   r#   rð   rñ   T)Zexpand_external)r:  r  r   r#  r   rJ   rH   rà   r=  r&  Úunlink)r   r  r   r   r   Útest_copy_external_linksù  s    

z!TestCopy.test_copy_external_linksc                 C   s²  dddg| j d< dddg| j d< | j d }| j d }|j|jd< | j j|d	d
d |  | j d	 t dddg¡¡ | j d	 jd }|  | j | t dddg¡¡ |  | j | j|j¡ | j jd| j	d	d
d |  | j	d	 t dddg¡¡ | j	d	 jd }|  | j	| t dddg¡¡ | j jd| j	dd
d |  | j	d t dddg¡¡ |  | j	d t dddg¡¡ | j	d jd }|  | j	| t dddg¡¡ |  
| j	| | j	d ¡ d S )Nr   rl   rh   r#   rD   rk   rG  rð   rñ   T)Zexpand_refsrª   Úrootzroot/foozroot/bar)r:  r€   r,  r=  rJ   rH   rà   r!  r,   r#  r+   )r   r#   rð   Zbaz_barZfoo_barr   r   r   Útest_copy_refs	  s(    

zTestCopy.test_copy_refsN)r   r    r!   r   r   r   r/  r^   ÚversionZhdf5_version_tupler?  rB  rC  rD  rE  rH  rJ  rK  rM  rO  r   r   r   r   r9  c  sT   ÿ
	ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿr9  c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚTestMovez7
        Feature: Group.move moves links in a file
    c                 C   sP   | j  d¡}| j  dd¡ |  | j d |¡ | j  dd¡ |  | j d |¡ dS )z Moving an object ÚXÚYznew/nested/pathN)r   r$   Úmover+   rZ   r   r   r   Útest_move_hardlink.  s
    zTestMove.test_move_hardlinkc                 C   s@   t  d¡| jd< | j dd¡ | jjddd}|  |jd¡ dS )z Moving a soft link zrelative/pathrõ   Znew_softTrþ   N)r^   r	   r   rT  ra   r+   r  )r   Zlnkr   r   r   Útest_move_softlink6  s    zTestMove.test_move_softlinkc              	   C   s@   | j  d¡ | j  d¡ |  t¡ | j  dd¡ W 5 Q R X dS )z! Move conflict raises ValueError rR  rS  N)r   r$   r.   r/   rT  r   r   r   r   Útest_move_conflict=  s    zTestMove.test_move_conflictc                 C   s   | j  d¡ | j  dd¡ dS )z Test that a null-move works rR  N)r   r$   rT  r   r   r   r   Útest_short_circuitD  s    zTestMove.test_short_circuitN)r   r    r!   rA   rU  rV  rW  rX  r   r   r   r   rQ  (  s
   rQ  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚTestMutableMappingzSTests if the registration of Group as a MutableMapping
    behaves as expected
    c                 C   s,   t ttƒst‚| j d¡}t|tƒs(t‚d S )NÚK)Ú
issubclassr   r   rc   r   r$   rb   rZ   r   r   r   Útest_resolutionN  s    z"TestMutableMapping.test_resolutionc                 C   s"   t j t j t j t j t j dS )zC
        Test that the required functions are implemented.
        N)r   Ú__getitem__Ú__setitem__Ú__delitem__Ú__iter__Ú__len__r   r   r   r   Útest_validityS  s
    z TestMutableMapping.test_validityN)r   r    r!   rA   r\  rb  r   r   r   r   rY  J  s   rY  )1rA   ÚnumpyrH   r&  Úos.pathÚsysÚtempfiler   Úcollections.abcr   Úcommonr   r   r^   r   r   r	   r
   r   r   r   r   Zh5py._hl.compatr   ÚUnicodeEncodeErrorr0  r   r"   rB   rP   rU   rq   r}   rŒ   r‘   r˜   rœ   r°   r¸   rÆ   rÒ   rê   r  r  r  r1  r9  rQ  rY  r   r   r   r   Ú<module>   sR   	
	6=$BJ#UF&c& F"