B
    ¬»ˆdÕŒ  ã               @   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 y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_encodeu   Î±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   úG/var/www/html/venv/lib/python3.7/site-packages/h5py/tests/test_group.pyÚsetUp/   s    zBaseGroup.setUpc             C   s   | j r| j  ¡  d S )N)r   Úclose)r   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 zfoo/bar/bazz/foo/bar/bazs   boo/bar/bazz/boo/bar/bazN)r   r   ÚassertEqualÚname)r   r!   r"   r   r   r   Útest_create_intermediateD   s    z#TestCreate.test_create_intermediatec          	   C   s2   | j  d¡ |  t¡ | j  d¡ W dQ R X dS )z= Name conflict causes group creation to fail with ValueError r   N)r   r   ÚassertRaisesÚ
ValueError)r   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 namer*   N)r   r   r$   r%   r,   r-   r.   r/   r0   r   Z
CSET_ASCII)r   r%   r1   r   r   r   Útest_unicode_defaultY   s    zTestCreate.test_unicode_defaultc          	   C   s4   | j  ddg¡}|  t¡ t|jƒ W d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   r,   )r   Údsetr   r   r   Útest_appropriate_low_level_ida   s    z(TestCreate.test_appropriate_low_level_idN)
r   r   r   Ú__doc__r#   r&   r)   r2   r3   r6   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 )é   r9   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 )N)r9   r9   r   )r:   ó   b)r<   r=   r   r    r   )r   r?   r   r   r   Útest_name_bytest   s    
z%TestDatasetAssignment.test_name_bytesN)r   r   r   r7   r@   rB   r   r   r   r   r8   g   s   r8   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 )z Named type creation z|S10r;   N)r<   r:   r   r    r   r$   )r   r:   r   r   r   Ú
test_dtype   s    

zTestDtypeAssignment.test_dtypec             C   s*   t  d¡}|| jd< |  | jd t¡ dS )z Named type creation z|S10rA   N)r<   r:   r   r    r   )r   r:   r   r   r   rB   †   s    

z#TestDtypeAssignment.test_name_bytesN)r   r   r   r7   rD   rB   r   r   r   r   rC   y   s   rC   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"   Ú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   z/fooN)r   rF   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 dQ R X dS )z1 Opening conflicting object results in TypeError r   )r   r   N)r   r4   r'   Ú	TypeErrorrF   )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 zfoo/bar/baz)r   )r:   r   zfoo/barN)Úh5pyÚstring_dtyper   Úrequire_datasetÚgetÚ
isinstancer   ÚAssertionError)r   Údtr1   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 )Nzfoo/bar/bazr   zfoo/bar)rK   rL   r   rF   rN   rO   r   rP   )r   rQ   r1   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 d Q R X |  t¡ | j jdd
dtd W d Q R X |  t¡ | j jdd
dtd W d Q R X |  t¡ | j jddtd	 W d Q R X d S )Nzfoo/resizable)r   é   )NrT   )ÚshapeZmaxshaper:   é   r   )Zaxis)rV   rT   )rU   r:   )r   r   )rT   N)Né   )NrW   é   )é
   rT   )r   rM   ÚintÚresizer'   rI   )r   Zdsr   r   r   Útest_require_shape»   s    zTestRequire.test_require_shapeN)
r   r   r   r7   rH   r#   rJ   rR   rS   r\   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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ÚassertNotIn)r   r   r   r   Útest_deleteÐ   s    zTestDelete.test_deletec          	   C   s"   |   t¡ | jd= W d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 d| ¡  X t|dƒ}z |  t¡ |d= W dQ R X W d| ¡  X dS )z2 Deleting object in readonly file raises KeyError r   r   NÚr)r   r   r   r   r'   ra   )r   ÚfnameÚhfiler   r   r   Útest_readonly_delete_exceptionÜ   s    


z)TestDelete.test_readonly_delete_exceptionN)r   r   r   r7   r`   rb   rf   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 )Ú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   z/fooN)r   r   r$   )r   r!   r"   rG   r   r   r   Ú	test_openô   s
    

zTestOpen.test_openc          	   C   s$   |   t¡ | jd  W dQ R X dS )z) Opening missing objects raises KeyError r   N)r'   ra   r   )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   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)r;   ÚiÚbZ	test_dset)r   é*   r   r   N)	r   r   r<   r:   rK   Z	ref_dtyper4   rj   r$   )r   ÚgrQ   r5   r?   r   r   r   Útest_reference_numpyobj  s    z TestOpen.test_reference_numpyobjc          	   C   sn   t j ¡ }|  t¡ | j|  W dQ R X | j d¡ | jd j}| jd= |  t¡ | j|  W dQ R X dS )z5 Invalid region references should raise an exception NÚx)	rK   Zh5rZ	Referencer'   r(   r   r   rj   Ú	Exception)r   rj   r   r   r   Útest_invalid_ref  s    
zTestOpen.test_invalid_refc          	   C   sP   | j  d¡ |  t¡ | j d  W dQ R X |  t¡ | j d  W dQ R X dS )z> Access with non bytes or str types should raise an exception r1   r   N.)r   r   r'   rI   )r   r   r   r   Útest_path_type_validation$  s
    z"TestOpen.test_path_type_validationN)
r   r   r   r7   rh   ri   rk   rq   rt   ru   r   r   r   r   rg   î   s   rg   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Ústrr,   Ú_closer   )r   rp   r   r   r   Ú	test_repr3  s    


zTestRepr.test_reprN)r   r   r   r7   rz   r   r   r   r   rv   0  s   rv   c               @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚBaseMappingz*
        Base class for mapping tests
    c             C   sR   t |  ¡ dƒ| _d| _x| jD ]}| j |¡ qW t d¡| jd< | jd | _d S )Nr   )r;   rn   ÚcÚdz	/mongooserr   )rr   )r   r   r   Úgroupsr   rK   r	   )r   rr   r   r   r   r   C  s    zBaseMapping.setUpc             C   s   | j r| j  ¡  d S )N)r   r   )r   r   r   r   r   K  s    zBaseMapping.tearDownN)r   r   r   r7   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_lenU  s    zTestLen.test_lenN)r   r   r   r7   r‚   r   r   r   r   r   O  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) r;   ó   as   /az/as   mongooseÚmongooseN)r   r   r^   r_   )r   r   r   r   Útest_containsb  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) r;   r„   N)r   r   r   ÚassertFalse)r   r   r   r   Útest_excl  s    
zTestContains.test_excc             C   s    |   d| j¡ |   d| j¡ dS )z2 Empty strings work properly and aren't contained Ú ó    N)r_   r   )r   r   r   r   Ú
test_emptys  s    zTestContains.test_emptyc             C   s    |   d| j¡ |   d| j¡ dS )z' Current group "." is always contained ó   .Ú.N)r^   r   )r   r   r   r   Útest_dotx  s    zTestContains.test_dotc             C   s    |   d| j¡ |   d| j¡ dS )z% Root group (by itself) is contained ó   /ú/N)r^   r   )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 r1   ro   Zdatasetz/group/zgroup/z	/dataset/zdataset/N)r   r   r^   )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!   z	/mongoosez	/grp/softzmongoose.hdf5z/grp/externalz/grp/soft/somethingz/grp/external/somethingN)r   r   rK   r	   r   r^   r_   )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/zro   r5   r   z//z///z.///z././/rr   z.//x/y/zzx///z./x///zdset///z/dset//N)r   r   r^   r_   )r   r!   r   r   r   Útest_oddball_paths•  s    

zTestContains.test_oddball_pathsN)r   r   r   r7   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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   )Ú.0rr   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 d| ¡  X dS )z= Iteration works properly for the case with no group members r   c             S   s   g | ]}|‘qS r   r   )r–   rr   r   r   r   r—   µ  s    z+TestIter.test_iter_zero.<locals>.<listcomp>N)r   r   r$   r   )r   re   r™   r   r   r   Útest_iter_zero±  s
    zTestIter.test_iter_zeroN)r   r   r   r7   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@   x:t dƒD ].}|d dkr*| t|ƒ¡ q
|g|t|ƒ< q
W d S )Néd   rY   r   )Úranger   rx   )r   rp   rm   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)Útrack_orderc             S   s   g | ]}t |ƒ‘qS r   )rx   )r–   rm   r   r   r   r—   Ç  s    z3TestTrackOrder.test_track_order.<locals>.<listcomp>r   )r   r   rŸ   rž   r$   ÚlistÚreversed)r   rp   rj   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    F)r¡   c             S   s   g | ]}t |ƒ‘qS r   )rx   )r–   rm   r   r   r   r—   Ï  s    z6TestTrackOrder.test_no_track_order.<locals>.<listcomp>r   )r   r   rŸ   Úsortedrž   r$   r¢   r£   )r   rp   rj   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   sv   t | jdƒƒ }| j}|  t|ƒ|¡ |  tt|ƒƒtt|ƒƒ¡ x| jD ]}|  ||¡ qHW |  t|ƒt| jƒ¡ dS )z .keys provides a key view ÚkeysN)	Úgetattrr   r~   r˜   r¢   r£   r^   r$   r   )r   Úkvrj   rr   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ƒ¡ x"ˆ jD ]}ˆ  ˆ j 	|¡|¡ qlW dS )z .values provides a value view Úvaluesc                s   g | ]}ˆ j  |¡‘qS r   )r   rN   )r–   rr   )r   r   r   r—   ã  s    z+TestPy3Dict.test_values.<locals>.<listcomp>N)
r©   r   r~   r˜   r¢   r£   r$   r   r^   rN   )r   Úvvrj   rr   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ƒ¡ x&ˆ jD ]}ˆ  |ˆ j 	|¡f|¡ qlW dS )z .items provides an item view Úitemsc                s   g | ]}|ˆ j  |¡f‘qS r   )r   rN   )r–   rr   )r   r   r   r—   î  s    z*TestPy3Dict.test_items.<locals>.<listcomp>N)
r©   r   r~   r˜   r¢   r£   r$   r   r^   rN   )r   Zivrj   rr   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   s:   t |  ¡ dƒ| _xdD ]}| j |¡ qW | jd | _d S )Nr   )z/test/az/test/bz/test/cz/test/drl   )r   r   r   r   r1   )r   rr   r   r   r   r   û  s    
z TestAdditionalMappingFuncs.setUpc             C   s   | j r| j  ¡  d S )N)r   r   )r   r   r   r   r     s    z#TestAdditionalMappingFuncs.tearDownc             C   s    | j  ¡ \}}|  || j ¡ dS )z!.pop_item exists and removes itemN)r1   Úpopitemr_   )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 itemr;   N)r1   Úpopr_   )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)r1   r¶   r$   )r   Úvaluer   r   r   Útest_pop_default  s    z+TestAdditionalMappingFuncs.test_pop_defaultc          	   C   s&   |   t¡ | j d¡}W dQ R X dS )z&.pop raises KeyError for non-existencer€   N)r'   ra   r1   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)r1   Ú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€   ro   N)r<   Úarrayr1   Úupdater^   )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€   ro   r   N)r<   r½   r1   r¾   r^   )r   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€   ro   N)r<   r½   r1   r¾   r^   )r   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 existsr;   N)r1   Ú
setdefaultr$   rN   )r   r¸   r   r   r   Útest_setdefault5  s    z*TestAdditionalMappingFuncs.test_setdefaultc             C   s&   | j  dt dg¡¡}|  |d¡ dS )z/.setdefault gets default if group doesn't existr€   ro   N)r1   rÃ   r<   r½   r$   )r   r¸   r   r   r   Útest_setdefault_with_default:  s    z7TestAdditionalMappingFuncs.test_setdefault_with_defaultc          	   C   s&   |   t¡ | j d¡ W d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'   rI   r1   rÃ   )r   r   r   r   Útest_setdefault_no_defaultA  s    z5TestAdditionalMappingFuncs.test_setdefault_no_defaultN)r   r   r   r7   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…   r;   r„   N)Úobjectr   rN   ZassertIsr   r$   )r   ÚdefaultÚoutr!   r   r   r   Útest_get_defaultQ  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)r9   z|S10ÚbazN)
r   r   rN   r$   r   r4   r   r<   r:   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 z	/mongoosezsomewhere.hdf5r…   ÚhardÚsoftÚexternalT)ÚgetlinkrÌ   N)rÈ   r	   r   r   r   rN   r$   r
   )r   rÉ   ÚslÚelÚout_hlÚout_slÚout_elr   r   r   Útest_get_link_classi  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 z	/mongoosezsomewhere.hdf5r…   rÐ   rÑ   rÒ   T)rÓ   N)
r	   r   r   r   rN   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   r7   rË   rÏ   rÙ   rÜ   r   r   r   r   rÇ   K  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   sB   t |  ¡ dƒ| _ddddddg| _x| jD ]}| j |¡ q*W d S )Nr   Zgrp1zgrp1/sg1zgrp1/sg2r"   zgrp2/sg1zgrp2/sg1/ssg1)r   r   r   r~   r   )r   rr   r   r   r   r   ˜  s    zTestVisit.setUpc             C   s   | j  ¡  d S )N)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–   rr   )r   r   r   r—   ¬  s    z-TestVisit.test_visititems.<locals>.<listcomp>c                s   ˆ   | |f¡S )N)rß   )rr   Ú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 )Nr   )rr   r   r   r   rã   ²  rŠ   z(TestVisit.test_bailout.<locals>.<lambda>r   c             S   s   | |fS )Nr   )rr   râ   r   r   r   rã   ´  rŠ   N)r   rÞ   r$   r~   rä   )r   rr   r   r   r   Útest_bailout°  s    zTestVisit.test_bailoutN)	r   r   r   r7   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 z/fooN)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 z/fooN)r	   r    rw   rx   )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   rp   rÔ   Úg2r   r   r   r#   Ç  s
    

zTestSoftLinks.test_createc          	   C   s2   t dƒ| jd< |  t¡ | jd  W dQ R X dS )z0 Opening dangling soft link results in KeyError rì   rí   N)r	   r   r'   ra   )r   r   r   r   rˆ   Ï  s    zTestSoftLinks.test_excN)r   r   r   r7   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 )N)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 zfoo.hdf5z/fooN)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 zfoo.hdf5z/fooN)r   r    rw   rx   )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 z	/externalÚextN)r   rð   r   Úfilerñ   ÚassertNotEqualr$   r%   )r   r!   r   r   r   r#   ó  s
    
zTestExternalLinks.test_createc          	   C   s6   t | jdƒ| jd< |  t¡ | jd  W dQ R X dS )z5 KeyError raised when attempting to open broken link z/missingrõ   N)r   rð   r   r'   ra   )r   r   r   r   rˆ   û  s    zTestExternalLinks.test_excc          	   C   s4   t ddƒ| jd< |  t¡ | jd  W dQ R X dS )z6 KeyError raised when attempting to open missing file zmongoose.hdf5z/foorõ   N)r   r   r'   ra   )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 dQ R X t|dƒ| jd< dS )zh
        Check that external links encode unicode filenames properly
        Testing issue #732
        u   Î±.hdf5r   rÒ   Nz	/externalrõ   )Úosré   Újoinr   r   r   r   r   )r   Úext_filenameÚ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 d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
        u   Î±.hdf5r   rÒ   rl   Úext_attrNz	/externalrõ   )
rû   ré   rü   r   r   r   Úattrsr   r   r$   )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 d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   u   Î±rl   r   Nu   /Î±rõ   )
rû   ré   rü   r   r   r   r  r   r   r$   )r   rý   rþ   r   r   r   Útest_unicode_hdf5_path,  s    
z(TestExternalLinks.test_unicode_hdf5_pathN)r   r   r   r7   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*   yˆ rˆ   ¡  W n tk
r$   Y nX d S )N)r   ÚIOErrorr   )rr   r   r   r   F  s
    z9TestExtLinkBugs.test_issue_212.<locals>.closer.<locals>.wr   )rr   r   r   )rr   r   ÚcloserE  s    z.TestExtLinkBugs.test_issue_212.<locals>.closerr   r;   r   Úlinkrc   N)r   r   Z
addCleanupr   r   r   r    r   )r   r  Ú	orig_nameÚnew_namer   rp   Úhr   r   r   Útest_issue_212>  s    



zTestExtLinkBugs.test_issue_212N)r   r   r   r7   r  r   r   r   r   r  8  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 )Nr   )r   r   Úf1rù   )r   r   r   r   r   `  s    zTestCopy.setUpc             C   s$   | j r| j  ¡  | jr | j ¡  d S )N)r  r   rù   )r   r   r   r   r   d  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   rX   rT   rÍ   rÎ   )r  r   Úcopyr    r   r>   r<   r½   )r   r   rÎ   r   r   r   Útest_copy_path_to_pathj  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   rX   rT   rÍ   rÎ   zfoo/barr   z/foo)	r  r   r  r    r   r>   r<   r½   rù   )r   r   rÎ   r   r   r   Útest_copy_path_to_groupu  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   rX   rT   rÍ   rÎ   z/foozfoo/bar)	r  r   r  r    r   r>   r<   r½   rù   )r   r   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 )
Nr   r   rX   rT   rÍ   rÎ   zfoo/barr   z/foo)	r  r   r  r    r   r>   r<   r½   rù   )r   r   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   rX   rT   r   r!   rÍ   rÎ   z/grp/foo)r  r   r  r>   r<   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   rX   rT   Úquxr9   rW   é   ZquuxrÎ   T)Zshallowr   z/foozfoo/barzfoo/qux)r  r   r  r    r   r$   r   r>   r<   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   rX   rT   r   r9   rW   r  rÍ   rÎ   T)Zwithout_attrs)r  r  r  r>   r<   r½   rP   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   rX   rT   rÍ   r   z/barrÎ   r  T)Zexpand_softzqux/bazz/foozfoo/baz)
r  r   r	   r  rù   r    r   r>   r<   r½   )r   r   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   rX   rT   r   rÍ   rÎ   T)Zexpand_external)r  rò   r   rù   r   r>   r<   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   rX   rT   r   r9   rW   r  rÍ   rÎ   T)Zexpand_refsr   Úrootzroot/foozroot/bar)r  rj   r  r  r>   r<   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  rK   ÚversionZhdf5_version_tupler  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 )Ú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$   )r   r!   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_softT)rÓ   N)rK   r	   r   r%  rN   r$   ré   )r   Zlnkr   r   r   Útest_move_softlink1  s    zTestMove.test_move_softlinkc          	   C   s@   | j  d¡ | j  d¡ |  t¡ | j  dd¡ W dQ R X dS )z! Move conflict raises ValueError r#  r$  N)r   r   r'   r(   r%  )r   r   r   r   Útest_move_conflict8  s    zTestMove.test_move_conflictc             C   s   | j  d¡ | j  dd¡ dS )z Test that a null-move works r#  N)r   r   r%  )r   r   r   r   Útest_short_circuit?  s    zTestMove.test_short_circuitN)r   r   r   r7   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 )Ú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   rP   r   r   rO   )r   r!   r   r   r   Útest_resolutionI  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_validityN  s
    z TestMutableMapping.test_validityN)r   r   r   r7   r-  r3  r   r   r   r   r*  E  s   r*  )1r7   Únumpyr<   rû   Úos.pathÚsysÚtempfiler   Úcollections.abcr   Úcommonr   r   rK   r   r   r	   r
   r   r   r   r   Zh5py._hl.compatr   ÚUnicodeEncodeErrorr  r   r   r8   rC   rE   r]   rg   rv   r{   r   rƒ   r•   rœ   r§   r±   rÇ   rÝ   rè   rï   r  r  r"  r*  r   r   r   r   Ú<module>   sR   
	1=$BJ#UF&c& F"