a
    v=icj‰  ã                   @   s4  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yº   dZY n0 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   úf/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/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                   @   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 )Ú
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   sF   | j  d¡ |  t¡ | j  d¡ W d  ƒ n1 s80    Y  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   sH   | j  ddg¡}|  t¡ t|jƒ W d  ƒ n1 s:0    Y  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_ida   s    z(TestCreate.test_appropriate_low_level_idN)
r   r    r!   Ú__doc__r)   r-   r0   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 ©é   rB   r   ©ÚdtypeÚa.N)ÚnpÚonesr   r%   r   ÚassertArrayEqual©r   Údatar   r   r   Útest_ndarraym   s    
z"TestDatasetAssignment.test_ndarrayc                 C   s.   t jddd}|| jd< |  | jd t¡ d S )NrA   r   rC   ó   b)rF   rG   r   r%   r   rI   r   r   r   Útest_name_bytest   s    
z%TestDatasetAssignment.test_name_bytesN)r   r    r!   r?   rK   rM   r   r   r   r   r@   g   s   r@   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 ú|S10rE   N)rF   rD   r   r%   r   r+   ©r   rD   r   r   r   Ú
test_dtype   s    

zTestDtypeAssignment.test_dtypec                 C   s*   t  d¡}|| jd< |  | jd t¡ dS )rO   rP   rL   N)rF   rD   r   r%   r   rQ   r   r   r   rM   †   s    

z#TestDtypeAssignment.test_name_bytesN)r   r    r!   r?   rR   rM   r   r   r   r   rN   y   s   rN   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 )Ú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   rT   r%   r   r+   r,   ©r   r'   r   r   r   r)   œ   s    zTestRequire.test_createc                 C   sJ   | j  ddd¡ |  t¡ | j  d¡ W d  ƒ n1 s<0    Y  dS )z1 Opening conflicting object results in TypeError r#   ©r   r   N)r   r<   r.   Ú	TypeErrorrT   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ƒs4J ‚| j d¡}t|tƒsNJ ‚dS )z- Intermediate is created if it doesn't exist r*   rY   rC   r#   úfoo/barN)Úh5pyÚstring_dtyper   Zrequire_datasetÚgetÚ
isinstancer   ©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.J ‚| j d¡}t|tƒsHJ ‚| j d¡}t|tƒsbJ ‚d S )Nr*   r#   r\   )r]   r^   r   rT   r_   r`   r   ra   r   r   r   Útest_intermediate_create_group±   s    z*TestRequire.test_intermediate_create_groupN)	r   r    r!   r?   rV   r)   r[   rc   rd   r   r   r   r   rS      s   		rS   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   s6   |   t¡ | jd= W d  ƒ n1 s(0    Y  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   sŠ   |   ¡ }t|dƒ}z| d¡ W | ¡  n
| ¡  0 t|dƒ}z<|  t¡ |d= W d  ƒ n1 sf0    Y  W | ¡  n
| ¡  0 dS )z2 Deleting object in readonly file raises KeyError r   r#   ÚrN)r   r   r$   r   r.   rk   )r   ÚfnameÚhfiler   r   r   Útest_readonly_delete_exceptionÍ   s    

&z)TestDelete.test_readonly_delete_exceptionN)r   r    r!   r?   ri   rl   rp   r   r   r   r   re   »   s   re   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#   rW   N)r   r$   r+   rU   r   r   r   Ú	test_openå   s
    

zTestOpen.test_openc                 C   s8   |   t¡ | jd  W d  ƒ n1 s*0    Y  dS )z) Opening missing objects raises KeyError r#   Nrj   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)rE   ÚiÚbZ	test_dsetrY   é*   r   r   N)	r   r$   rF   rD   r]   Z	ref_dtyper<   rt   r+   )r   Úgrb   r=   rJ   r   r   r   Útest_reference_numpyobjø   s    z TestOpen.test_reference_numpyobjc                 C   s–   t j ¡ }|  t¡ | j|  W d  ƒ n1 s40    Y  | j d¡ | jd j}| jd= |  t¡ | j|  W d  ƒ n1 sˆ0    Y  dS )z5 Invalid region references should raise an exception NÚx)	r]   Zh5rZ	Referencer.   r/   r   r$   rt   Ú	Exception)r   rt   r   r   r   Útest_invalid_ref  s    
(zTestOpen.test_invalid_refc                 C   sx   | j  d¡ |  t¡ | j d  W d  ƒ n1 s60    Y  |  t¡ | j d  W d  ƒ n1 sj0    Y  dS )z> Access with non bytes or str types should raise an exception r9   r   N.)r   r$   r.   rZ   r   r   r   r   Útest_path_type_validation  s
    (z"TestOpen.test_path_type_validationN)
r   r    r!   r?   rr   rs   ru   r{   r~   r   r   r   r   r   rq   ß   s   rq   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   rz   r   r   r   Ú	test_repr$  s    


zTestRepr.test_reprN)r   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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   )rE   rx   ÚcÚdú	/mongooser|   ©r|   )r   r   r   Úgroupsr$   r]   r	   ©r   r|   r   r   r   r   4  s    
zBaseMapping.setUpc                 C   s   | j r| j  ¡  d S r   r   r   r   r   r   r   <  s    zBaseMapping.tearDownN)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 )Ú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_lenF  s    zTestLen.test_lenN)r   r    r!   r?   r   r   r   r   r   rŒ   @  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) rE   ó   as   /az/as   mongooseÚmongooseNrf   r   r   r   r   Útest_containsS  s    zTestContains.test_containsc                 C   s:   | j  d¡ | j  ¡  |  d| j v ¡ |  d| j v ¡ dS )z9 "in" on closed group returns False (see also issue 174) rE   r‘   N)r   r$   r   ÚassertFalser   r   r   r   Útest_exc]  s    
zTestContains.test_excc                 C   s    |   d| j¡ |   d| j¡ dS )z2 Empty strings work properly and aren't contained Ú ó    N)rh   r   r   r   r   r   Ú
test_emptyd  s    zTestContains.test_emptyc                 C   s    |   d| j¡ |   d| j¡ dS )z' Current group "." is always contained ó   .Ú.N©rg   r   r   r   r   r   Útest_doti  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_rootn  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   ry   Zdatasetz/group/zgroup/z	/dataset/zdataset/N)r   r$   rg   r   r   r   r   Útest_trailing_slashs  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   rg   rh   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/zry   r=   rž   z//z///z.///z././/r|   z.//x/y/zzx///z./x///zdset///z/dset//Nrf   rX   r   r   r   Útest_oddball_paths†  s    

zTestContains.test_oddball_pathsN)r   r    r!   r?   r“   r•   r˜   rœ   rŸ   r    r¢   r£   r   r   r   r   r   M  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>Ÿ  r—   z&TestIter.test_iter.<locals>.<listcomp>N)r   ÚassertSameElementsrŠ   )r   Úlstr   r   r   Ú	test_iter  s    zTestIter.test_iterc                 C   sD   t |  ¡ dƒ}z&dd„ |D ƒ}|  |g ¡ W | ¡  n
| ¡  0 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§   ¦  r—   z+TestIter.test_iter_zero.<locals>.<listcomp>N)r   r   r+   r   )r   ro   r©   r   r   r   Útest_iter_zero¢  s
    zTestIter.test_iter_zeroN)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 )ÚTestTrackOrderc                 C   s<   t dƒD ].}|d dkr(| t|ƒ¡ q|g|t|ƒ< qd S )Néd   é
   r   )Úranger$   r‚   )r   rz   rw   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¦   rw   r   r   r   r§   ¸  r—   z3TestTrackOrder.test_track_order.<locals>.<listcomp>r­   )r   r$   r°   r¯   r+   ÚlistÚreversed©r   rz   rt   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§   À  r—   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¶   rg   r+   rŽ   )r   Úkvrt   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   r_   r¥   r   r   r   r§   Ô  r—   z+TestPy3Dict.test_values.<locals>.<listcomp>N©
r½   r   rŠ   r¨   rµ   r¶   r+   rŽ   rg   r_   )r   Úvvrt   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§   ß  r—   z*TestPy3Dict.test_items.<locals>.<listcomp>NrÂ   )r   Zivrt   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/drv   )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   Úpopitemrh   )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 itemrE   N)r9   Úpoprh   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 d  ƒ n1 s,0    Y  dS )z&.pop raises KeyError for non-existencer   N)r.   rk   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   ry   N©rF   Úarrayr9   Úupdaterg   ©r   Ú	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   ry   r   NrÔ   r×   r   r   r   Útest_update_iter  s
    þz+TestAdditionalMappingFuncs.test_update_iterc                 C   s4   dt  dg¡i}| jjf i |¤Ž |  d| j¡ dS )z.update works with kwargsr   ry   NrÔ   r×   r   r   r   Útest_update_kwargs   s    z-TestAdditionalMappingFuncs.test_update_kwargsc                 C   s$   | j  d¡}|  || j  d¡¡ dS )z#.setdefault gets group if it existsrE   N)r9   Ú
setdefaultr+   r_   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   ry   N)r9   rÜ   rF   rÕ   r+   rÎ   r   r   r   Útest_setdefault_with_default+  s    z7TestAdditionalMappingFuncs.test_setdefault_with_defaultc                 C   s:   |   t¡ | j d¡ W d  ƒ n1 s,0    Y  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.   rZ   r9   rÜ   r   r   r   r   Útest_setdefault_no_default2  s    z5TestAdditionalMappingFuncs.test_setdefault_no_defaultN)r   r    r!   r?   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’   rE   r‘   N)Úobjectr   r_   ZassertIsr$   r+   )r   ÚdefaultÚoutr'   r   r   r   Útest_get_defaultB  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)rB   rP   ÚbazN)
r   r$   r_   r+   r   r<   r   rF   rD   r   )r   rã   r   r   r   Útest_get_classL  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$   r_   r+   r
   )r   râ   ÚslÚelÚout_hlÚout_slÚout_elr   r   r   Útest_get_link_classZ  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$   r_   r%   r
   r+   Ú_pathÚ	_filename)r   rî   rï   rð   rñ   rò   r   r   r   Útest_get_linkm  s    


zTestGet.test_get_linkN)r   r    r!   r?   rä   rè   ró   r÷   r   r   r   r   rà   <  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   s6   t |  ¡ dƒ| _g d¢| _| 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§     r—   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!   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 )Ú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 rW   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 rW   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   rz   rî   Úg2r   r   r   r)   ¸  s
    

zTestSoftLinks.test_createc                 C   sF   t dƒ| jd< |  t¡ | jd  W d  ƒ n1 s80    Y  dS )z0 Opening dangling soft link results in KeyError r	  r
  N)r	   r   r.   rk   r   r   r   r   r•   À  s    zTestSoftLinks.test_excN)r   r    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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.hdf5rW   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  rW   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,   rX   r   r   r   r)   ä  s
    
zTestExternalLinks.test_createc                 C   sJ   t | jdƒ| jd< |  t¡ | jd  W d  ƒ n1 s<0    Y  dS )z5 KeyError raised when attempting to open broken link z/missingr  N)r   r  r   r.   rk   r   r   r   r   r•   ì  s    zTestExternalLinks.test_excc                 C   sH   t ddƒ| jd< |  t¡ | jd  W d  ƒ n1 s:0    Y  dS )z6 KeyError raised when attempting to open missing file r¡   rW   r  N)r   r   r.   rk   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   sX   t j tƒ d¡}t|dƒ}| d¡ W d  ƒ n1 s:0    Y  t|dƒ| jd< dS )zh
        Check that external links encode unicode filenames properly
        Testing issue #732
        õ   Î±.hdf5r   rì   Nr  r  )Úosr  Újoinr   r   r$   r   r   ©r   Zext_filenameZext_filer   r   r   Útest_unicode_encode  s    (z%TestExternalLinks.test_unicode_encodec                 C   s~   t j tƒ d¡}t|dƒ(}| d¡ d|d jd< W d  ƒ n1 sH0    Y  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ì   rv   Úext_attrNr  r  ©
r  r  r  r   r   r$   Úattrsr   r   r+   r  r   r   r   Útest_unicode_decode  s    
,z%TestExternalLinks.test_unicode_decodec                 C   s~   t j tƒ d¡}t|dƒ(}| d¡ d|d jd< W d  ƒ n1 sH0    Y  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   rv   r   Nu   /Î±r  r!  r  r   r   r   Útest_unicode_hdf5_path  s    
,z(TestExternalLinks.test_unicode_hdf5_pathN)r   r    r!   r?   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y"   Y n0 d S r   )r   ÚIOErrorr   r‰   r   r   r   7  s
    z9TestExtLinkBugs.test_issue_212.<locals>.closer.<locals>.wr   )r|   r   r   r‰   r   Úcloser6  s    z.TestExtLinkBugs.test_issue_212.<locals>.closerr   rE   rž   Úlinkrm   N)r   r   Z
addCleanupr$   r   r   r%   r   )r   r)  Z	orig_nameÚnew_namer   rz   Úhr   r   r   Útest_issue_212/  s    



zTestExtLinkBugs.test_issue_212N)r   r    r!   r?   r-  r   r   r   r   r'  )  s   r'  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   Q  s    zTestCopy.setUpc                 C   s$   | j r| j  ¡  | jr | j ¡  d S r   )r/  r   r  r   r   r   r   r   U  s    
zTestCopy.tearDown)r   é   é	   z/Bug in HDF5<1.8.8 prevents copying open datasetc                 C   sZ   | j  d¡}g d¢|d< | j  dd¡ | j d }|  |t¡ |  |d t g d¢¡¡ d S )Nr#   ©r   é   é   ræ   rç   )r/  r$   Úcopyr%   r   rH   rF   rÕ   ©r   r#   rç   r   r   r   Útest_copy_path_to_path[  s    
zTestCopy.test_copy_path_to_pathc                 C   s¨   | j  d¡}g d¢|d< | j  d¡}| j  d|¡ | j d }|  |t¡ |  |d t g d¢¡¡ | j  d| jd ¡ |  | jd t¡ |  | jd t g d¢¡¡ d S ©Nr#   r2  ræ   rç   r\   rž   rW   ©	r/  r$   r5  r%   r   rH   rF   rÕ   r  r6  r   r   r   Útest_copy_path_to_groupf  s    
z TestCopy.test_copy_path_to_groupc                 C   s–   | j  d¡}g d¢|d< | j  |d¡ | j d }|  |t¡ |  |d t g d¢¡¡ | j |d¡ |  | jd t¡ |  | jd t g d¢¡¡ d S )Nr#   r2  ræ   rç   rW   r\   r9  r6  r   r   r   Útest_copy_group_to_pathv  s    
z TestCopy.test_copy_group_to_pathc                 C   s¨   | j  d¡}g d¢|d< | j  d¡}| j  ||¡ | j d }|  |t¡ |  |d t g d¢¡¡ | j  || jd ¡ |  | jd t¡ |  | jd t g d¢¡¡ d S r8  r9  r6  r   r   r   Útest_copy_group_to_group†  s    
z!TestCopy.test_copy_group_to_groupc                 C   s  g d¢| j d< | j d }| j  d¡}| j  |d¡ |  | j d t g d¢¡¡ | j  dd¡ |  | j d t g d¢¡¡ | j  ||¡ |  | j d t g d¢¡¡ | j  d| j¡ |  | jd t g d¢¡¡ | j | j d | jd¡ |  | jd t g d¢¡¡ d S )Nr2  r#   r'   ræ   rç   z/grp/foo)r/  r$   r5  rH   rF   rÕ   r  )r   r#   r'   r   r   r   Útest_copy_dataset—  s    
zTestCopy.test_copy_datasetc                 C   s   | j  d¡}| d¡}g d¢|d< g d¢|d< | j j|ddd	 | j d }|  |t¡ |  |d t¡ |  t|d ƒd
¡ |  |d t 	g d¢¡¡ | j
j|ddd	 |  | j
d t¡ |  | j
d t¡ |  t| j
d ƒd
¡ |  | j
d t 	g d¢¡¡ d S )Nr#   ræ   r2  Úqux©rB   é   é   Zquuxrç   T)Úshallowr   rW   r\   zfoo/qux)r/  r$   r5  r%   r   r+   rŽ   rH   rF   rÕ   r  )r   r#   ræ   rç   r   r   r   Útest_copy_shallow­  s    

zTestCopy.test_copy_shallowc                 C   s®   g d¢| j d< | j d }g d¢|jd< | j j|ddd |  | j d t g d¢¡¡ d| j d jvshJ ‚| jj|ddd |  | jd t g d¢¡¡ d| jd jvsªJ ‚d S )Nr2  r#   r?  ræ   rç   T)Zwithout_attrs)r/  r"  r5  rH   rF   rÕ   r  ©r   r#   r   r   r   Útest_copy_without_attributesÃ  s    
z%TestCopy.test_copy_without_attributesc                 C   s²   g d¢| 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 	g d¢¡¡ |  | jd
 t¡ |  | jd t 	g d¢¡¡ d S )Nr2  ræ   r#   z/barrç   r>  T)Zexpand_softzqux/bazrW   zfoo/baz)
r/  r$   r	   r5  r  r%   r   rH   rF   rÕ   rD  r   r   r   Útest_copy_soft_linksÓ  s    zTestCopy.test_copy_soft_linksc                 C   sŽ   | j j}g d¢| j d< t|dƒ| jd< | j  ¡  d | _ |  | jd t g d¢¡¡ | jjdddd t	 
|¡ |  | jd t g d¢¡¡ d S )Nr2  r#   ræ   rç   T)Zexpand_external)r/  r  r   r  r   rH   rF   rÕ   r5  r  Úunlink)r   r  r   r   r   Útest_copy_external_linkså  s    

z!TestCopy.test_copy_external_linksc                 C   s   g d¢| j d< g d¢| j d< | j d }| j d }|j|jd< | j j|ddd |  | j d t g d¢¡¡ | j d jd }|  | j | t g d¢¡¡ |  | j | j|j¡ | j jd| j	ddd |  | j	d t g d¢¡¡ | j	d jd }|  | j	| t g d¢¡¡ | j jd| j	d	dd |  | j	d
 t g d¢¡¡ |  | j	d t g d¢¡¡ | j	d
 jd }|  | j	| t g d¢¡¡ |  
| j	| | j	d ¡ d S )Nr2  r#   r?  ræ   rç   T)Zexpand_refsrž   Úrootzroot/foozroot/bar)r/  rt   r"  r5  rH   rF   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_tupler7  r:  r;  r<  r=  rC  rE  rF  rH  rJ  r   r   r   r   r.  O  sT   ÿ
	ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿr.  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+   rX   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   rO  r_   r+   r  )r   Zlnkr   r   r   Útest_move_softlink"  s    zTestMove.test_move_softlinkc                 C   sT   | j  d¡ | j  d¡ |  t¡ | j  dd¡ W d  ƒ n1 sF0    Y  dS )z! Move conflict raises ValueError rM  rN  N)r   r$   r.   r/   rO  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 rM  N)r   r$   rO  r   r   r   r   Útest_short_circuit0  s    zTestMove.test_short_circuitN)r   r    r!   r?   rP  rQ  rR  rS  r   r   r   r   rL    s
   rL  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J ‚| j d¡}t|tƒs(J ‚d S )NÚK)Ú
issubclassr   r   r   r$   r`   rX   r   r   r   Útest_resolution:  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_validity?  s
    z TestMutableMapping.test_validityN)r   r    r!   r?   rW  r]  r   r   r   r   rT  6  s   rT  )1r?   ÚnumpyrF   r  Úos.pathÚsysÚtempfiler   Úcollections.abcr   Úcommonr   r   r]   r   r   r	   r
   r   r   r   r   Zh5py._hl.compatr   ÚUnicodeEncodeErrorr&  r   r"   r@   rN   rS   re   rq   r€   r…   rŒ   r   r¤   r¬   r»   rÇ   rà   rø   r  r  r'  r.  rL  rT  r   r   r   r   Ú<module>   sR   	
	1.$BJ#UF&c& F"