o
    c˜‘do  ã                   @   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w 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   ú5lib/python3.10/site-packages/h5py/tests/test_group.pyÚsetUp/   s   zBaseGroup.setUpc                 C   ó   | j r
| j  ¡  d S d S ©N©r   Úcloser   r   r   r   ÚtearDown2   ó   ÿ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   sH   | j  d¡ |  t¡ | j  d¡ W d  ƒ dS 1 sw   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 namer3   N)r   r&   r-   r.   r5   r6   r7   r8   r9   r   Z
CSET_ASCIIr:   r   r   r   Útest_unicode_defaultY   s   $zTestCreate.test_unicode_defaultc                 C   ó<   |   t¡ | j d¡ W d  ƒ dS 1 sw   Y  dS )z" Names should be strings or bytes g      ð?N)r0   Ú	TypeErrorr   r&   r   r   r   r   Ú	test_typea   s   "ÿzTestCreate.test_typec                 C   sJ   | j  ddg¡}|  t¡ t|jƒ W d  ƒ dS 1 sw   Y  dS )zA Binding a group to a non-group identifier fails with ValueError r%   r   N)r   Úcreate_datasetr0   r1   r   r5   )r   Údsetr   r   r   Útest_appropriate_low_level_idf   ó   "ÿz(TestCreate.test_appropriate_low_level_idN)r!   r"   r#   Ú__doc__r+   r/   r2   r<   r=   r@   rC   r   r   r   r   r$   6   s    r$   c                   @   ó    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 ©é   rI   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 )NrH   r   rJ   ó   b)rM   rN   r   r'   r   rP   r   r   r   Útest_name_bytesy   s   
z%TestDatasetAssignment.test_name_bytesN)r!   r"   r#   rE   rR   rT   r   r   r   r   rG   l   ó    rG   c                   @   rF   )Ú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 ú|S10rL   N)rM   rK   r   r'   r   r-   ©r   rK   r   r   r   Ú
test_dtype„   s   

zTestDtypeAssignment.test_dtypec                 C   s*   t  d¡}|| jd< |  | jd t¡ dS )rW   rX   rS   N)rM   rK   r   r'   r   rY   r   r   r   rT   ‹   s   

z#TestDtypeAssignment.test_name_bytesN)r!   r"   r#   rE   rZ   rT   r   r   r   r   rV   ~   rU   rV   c                   @   ó@   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   r]   r'   r   r-   r.   ©r   r)   r   r   r   r+   ¡   s   zTestRequire.test_createc                 C   sL   | j  ddd¡ |  t¡ | j  d¡ W d  ƒ dS 1 sw   Y  dS )z1 Opening conflicting object results in TypeError r%   ©r   r   N)r   rA   r0   r?   r]   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ƒsJ ‚| j d¡}t|tƒs'J ‚dS )z- Intermediate is created if it doesn't exist r,   rb   rJ   r%   úfoo/barN)Úh5pyÚstring_dtyper   Úrequire_datasetÚgetÚ
isinstancer   ©r   Údtr;   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ƒs$J ‚| j d¡}t|tƒs1J ‚d S )Nr,   r%   rd   )re   rf   r   r]   rh   ri   r   rj   r   r   r   Útest_intermediate_create_group¶   s   z*TestRequire.test_intermediate_create_groupc                 C   sD  | 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   ƒ n1 s>w   Y  |  t¡ | j jdd
dtd W d   ƒ n1 s]w   Y  |  t¡ | j jdd
dtd W d   ƒ n1 s|w   Y  |  t¡ | j jddtd	 W d   ƒ d S 1 s›w   Y  d S )Nzfoo/resizable)r   é   )Nrn   )ÚshapeZmaxshaperK   é   r   )Zaxis)rp   rn   )ro   rK   )r   r   )rn   N)Né   )Nrq   é   )é
   rn   )r   rg   ÚintZresizer0   r?   )r   Zdsr   r   r   Útest_require_shapeÀ   s    ÿÿÿ"ÿzTestRequire.test_require_shapeN)
r!   r"   r#   rE   r_   r+   rc   rl   rm   ru   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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   s8   |   t¡ | jd= W d  ƒ dS 1 sw   Y  dS )z. Deleting non-existent object raises KeyError r%   N©r0   ÚKeyErrorr   r   r   r   r   Útest_nonexistingÜ   s   
"ÿzTestDelete.test_nonexistingc                 C   s–   |   ¡ }t|dƒ}z| d¡ W | ¡  n| ¡  w t|dƒ}z&|  t¡ |d= W d  ƒ n1 s3w   Y  W | ¡  dS W | ¡  dS | ¡  w )z2 Deleting object in readonly file raises KeyError r   r%   ÚrN)r   r   r&   r   r0   r|   )r   ÚfnameÚhfiler   r   r   Útest_readonly_delete_exceptioná   s   

ÿýz)TestDelete.test_readonly_delete_exceptionN)r!   r"   r#   rE   rz   r}   r   r   r   r   r   rv   Ï   s
    rv   c                   @   r[   )Ú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%   r`   N)r   r&   r-   r^   r   r   r   Ú	test_openù   s
   

zTestOpen.test_openc                 C   s:   |   t¡ | jd  W d  ƒ dS 1 sw   Y  dS )z) Opening missing objects raises KeyError r%   Nr{   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)rL   ÚiÚbZ	test_dsetrb   é*   r   r   N)	r   r&   rM   rK   re   Z	ref_dtyperA   r…   r-   )r   Úgrk   rB   rQ   r   r   r   Útest_reference_numpyobj  s   z TestOpen.test_reference_numpyobjc                 C   s˜   t j ¡ }|  t¡ | j|  W d  ƒ n1 sw   Y  | j d¡ | jd j}| jd= |  t¡ | j|  W d  ƒ dS 1 sEw   Y  dS )z5 Invalid region references should raise an exception NÚx)	re   Zh5rZ	Referencer0   r1   r   r&   r…   Ú	Exception)r   r…   r   r   r   Útest_invalid_ref  s   
ÿ"ÿzTestOpen.test_invalid_refc                 C   sz   | j  d¡ |  t¡ | j d  W d  ƒ n1 sw   Y  |  t¡ | j d  W d  ƒ dS 1 s6w   Y  dS )z> Access with non bytes or str types should raise an exception r;   r   N.)r   r&   r0   r?   r   r   r   r   Útest_path_type_validation)  s   ÿ"ÿz"TestOpen.test_path_type_validationN)
r!   r"   r#   rE   rƒ   r„   r†   rŒ   r   r   r   r   r   r   r‚   ó   s    r‚   c                   @   ó   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Ústrr5   Z_closer   )r   r‹   r   r   r   Ú	test_repr8  s   


zTestRepr.test_reprN)r!   r"   r#   rE   r•   r   r   r   r   r’   5  s    r’   c                   @   rF   )Ú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   )rL   r‰   ÚcÚdú	/mongooser   ©r   )r   r   r   Úgroupsr&   re   r	   ©r   r   r   r   r   r   H  s   
zBaseMapping.setUpc                 C   r   r   r   r   r   r   r   r   P  r    zBaseMapping.tearDownN)r!   r"   r#   rE   r   r   r   r   r   r   r–   C  s    r–   c                   @   r‘   )Ú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#   rE   r    r   r   r   r   r   T  ó    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) rL   ó   as   /az/as   mongooseÚmongooseNrw   r   r   r   r   Útest_containsg  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) rL   r£   N)r   r&   r   ÚassertFalser   r   r   r   Útest_excq  s   
zTestContains.test_excc                 C   ó    |   d| j¡ |   d| j¡ dS )z2 Empty strings work properly and aren't contained Ú ó    N)ry   r   r   r   r   r   Ú
test_emptyx  ó   zTestContains.test_emptyc                 C   r¨   )z' Current group "." is always contained ó   .Ú.N©rx   r   r   r   r   r   Útest_dot}  r¬   zTestContains.test_dotc                 C   r¨   )z% Root group (by itself) is contained ó   /ú/Nr¯   r   r   r   r   Ú	test_root‚  r¬   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 r;   rŠ   Zdatasetz/group/zgroup/z	/dataset/zdataset/N)r   r&   rx   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&   re   r	   r   rx   ry   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Š   rB   r²   z//z///z.///z././/r   z.//x/y/zzx///z./x///zdset///z/dset//Nrw   ra   r   r   r   Útest_oddball_pathsš  s   

zTestContains.test_oddball_pathsN)r!   r"   r#   rE   r¥   r§   r«   r°   r³   r´   r¶   r·   r   r   r   r   r¢   a  s    
	
r¢   c                   @   rF   )Ú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   ó   g | ]}|‘qS r   r   ©Ú.0r   r   r   r   Ú
<listcomp>³  ó    z&TestIter.test_iter.<locals>.<listcomp>N)r   ÚassertSameElementsr›   )r   Úlstr   r   r   Ú	test_iter±  s   zTestIter.test_iterc                 C   sB   t |  ¡ dƒ}zdd„ |D ƒ}|  |g ¡ W | ¡  dS | ¡  w )z= Iteration works properly for the case with no group members r   c                 S   r¹   r   r   rº   r   r   r   r¼   º  r½   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#   rE   rÀ   rÁ   r   r   r   r   r¸   «  s    r¸   c                   @   ó$   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   rs   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   ó   g | ]}t |ƒ‘qS r   ©r”   ©r»   rˆ   r   r   r   r¼   Ì  ó    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   rÉ   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                   @   rÂ   )ÚTestPy3Dictc                 C   sr   t | jdƒƒ }| j}|  t|ƒ|¡ |  tt|ƒƒtt|ƒƒ¡ | jD ]}|  ||¡ q#|  t|ƒt| jƒ¡ dS )z .keys provides a key view ÚkeysN)	Úgetattrr   r›   r¾   rÍ   rÎ   rx   r-   rŸ   )r   Z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 	|¡|¡ q5dS )z .values provides a value view Úvaluesc                    s   g | ]}ˆ j  |¡‘qS r   ©r   rh   rº   r   r   r   r¼   è  s    z+TestPy3Dict.test_values.<locals>.<listcomp>N©
rÕ   r   r›   r¾   rÍ   rÎ   r-   rŸ   rx   rh   )r   Z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|¡ q5d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&   r;   rœ   r   r   r   r      s   z TestAdditionalMappingFuncs.setUpc                 C   r   r   r   r   r   r   r   r     r    z#TestAdditionalMappingFuncs.tearDownc                 C   s    | j  ¡ \}}|  || j ¡ dS )z!.pop_item exists and removes itemN)r;   Úpopitemry   )r   ÚkeyÚvalr   r   r   Útest_pop_item
  r¬   z(TestAdditionalMappingFuncs.test_pop_itemc                 C   s   | j  d¡ |  d| j ¡ dS )z&.pop exists and removes specified itemrL   N)r;   Úpopry   r   r   r   r   Útest_pop  ó   z#TestAdditionalMappingFuncs.test_popc                 C   s   | j  dd¡}|  |d¡ dS )z.pop falls back to defaultrž   N)r;   râ   r-   ©r   Úvaluer   r   r   Útest_pop_default  s   z+TestAdditionalMappingFuncs.test_pop_defaultc                 C   s<   |   t¡ | j d¡}W d  ƒ dS 1 sw   Y  dS )z&.pop raises KeyError for non-existencerž   N)r0   r|   r;   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)r;   Ú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©rM   Úarrayr;   Úupdaterx   ©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   s4   dt  dg¡i}| jjdi |¤Ž |  d| j¡ dS )z.update works with kwargsrž   rŠ   Nr   rë   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 existsrL   N)r;   Ú
setdefaultr-   rh   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)r;   rò   rM   rì   r-   rå   r   r   r   Útest_setdefault_with_default?  s   z7TestAdditionalMappingFuncs.test_setdefault_with_defaultc                 C   r>   )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)r0   r?   r;   rò   r   r   r   r   Útest_setdefault_no_defaultF  s   "ÿz5TestAdditionalMappingFuncs.test_setdefault_no_defaultN)r!   r"   r#   rE   r   r   rá   rã   rç   rè   rê   rï   rð   rñ   ró   rô   rõ   r   r   r   r   rÝ   û  s    	rÝ   c                   @   ó0   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¤   rL   r£   N)Úobjectr   rh   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)rI   rX   ÚbazN)
r   r&   rh   r-   r   rA   r   rM   rK   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&   rh   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&   rh   r'   r
   r-   Ú_pathZ	_filename)r   r  r  r  r  r	  r   r   r   Útest_get_link  s   


zTestGet.test_get_linkN)r!   r"   r#   rE   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   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¼   ±  s    z-TestVisit.test_visititems.<locals>.<listcomp>c                    s   ˆ   | |f¡S r   )r  ©r   Úy)r  r   r   Ú<lambda>²  s    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  ·  s    z(TestVisit.test_bailout.<locals>.<lambda>r   c                 S   s   | |fS r   r   r  r   r   r   r  ¹  s    N)r   r  r-   r›   r  rœ   r   r   r   Útest_bailoutµ  s   &zTestVisit.test_bailoutN)	r!   r"   r#   rE   r   r   r  r  r  r   r   r   r   r  –  s    r  c                   @   rö   )Ú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 r`   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 r`   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  Zg2r   r   r   r+   Ì  s
   

zTestSoftLinks.test_createc                 C   sH   t dƒ| jd< |  t¡ | jd  W d  ƒ dS 1 sw   Y  dS )z0 Opening dangling soft link results in KeyError r  r   N)r	   r   r0   r|   r   r   r   r   r§   Ô  s   "ÿzTestSoftLinks.test_excN)r!   r"   r#   rE   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   ó(   | j r| j  ¡  | jr| j ¡  d S d S r   )r   r   r#  r   r   r   r   r   ç  ó
   
ÿzTestExternalLinks.tearDownc                 C   s*   t ddƒ}|  |jd¡ |  |jd¡ dS )z  External link paths attributes úfoo.hdf5r`   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&  r`   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.   ra   r   r   r   r+   ø  s
   
zTestExternalLinks.test_createc                 C   sL   t | jdƒ| jd< |  t¡ | jd  W d  ƒ dS 1 sw   Y  dS )z5 KeyError raised when attempting to open broken link z/missingr,  N)r   r"  r   r0   r|   r   r   r   r   r§      s   "ÿzTestExternalLinks.test_excc                 C   sJ   t ddƒ| jd< |  t¡ | jd  W d  ƒ dS 1 sw   Y  dS )z6 KeyError raised when attempting to open missing file rµ   r`   r,  N)r   r   r0   r|   r   r   r   r   Útest_exc_missingfile  rD   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w   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   ó~   t j tƒ d¡}t|dƒ}| d¡ d|d jd< W d  ƒ n1 s$w   Y  t|dƒ| jd< |  	| jd jd d¡ dS )	zh
        Check that external links decode unicode filenames properly
        Testing issue #732
        r2  r   r  r‡   Úext_attrNr+  r,  ©
r3  r  r4  r   r   r&   Úattrsr   r   r-   r5  r   r   r   Útest_unicode_decode$  s   
þz%TestExternalLinks.test_unicode_decodec                 C   r7  )	zi
        Check that external links handle unicode hdf5 paths properly
        Testing issue #333
        zexternal.hdf5r   r   r‡   r8  Nu   /Î±r,  r9  r5  r   r   r   Útest_unicode_hdf5_path1  s   
þz(TestExternalLinks.test_unicode_hdf5_pathN)r!   r"   r#   rE   r   r   r)  r*  r+   r§   r/  r1  r   ÚskipIfÚNO_FS_UNICODEr6  r;  r<  r   r   r   r   r!  Ú  s    




r!  c                   @   r‘   )Ú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 d S W d S  ty   Y d S w 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   rL   r²   Úlinkr~   N)r   r   Z
addCleanupr&   r   r   r'   r   )r   rA  Z	orig_nameÚnew_namer   r‹   Úhr   r   r   Útest_issue_212C  s   



zTestExtLinkBugs.test_issue_212N)r!   r"   r#   rE   rE  r   r   r   r   r?  =  r¡   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   Úf1r0  r   r   r   r   r   e  s   zTestCopy.setUpc                 C   r$  r   )rG  r   r0  r   r   r   r   r   i  r%  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   rr   rn   rý   rþ   )rG  r&   Úcopyr'   r   rO   rM   rì   ©r   r%   rþ   r   r   r   Útest_copy_path_to_patho  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%   rJ  rý   rþ   rd   r²   r`   ©	rG  r&   rK  r'   r   rO   rM   rì   r0  rL  r   r   r   Útest_copy_path_to_groupz  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%   rJ  rý   rþ   r`   rd   rO  rL  r   r   r   Útest_copy_group_to_pathŠ  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 rN  rO  rL  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 )NrJ  r%   r)   rý   rþ   z/grp/foo)rG  r&   rK  rO   rM   rì   r0  )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ý   rJ  Úqux©rI   rq   é   Zquuxrþ   T)Zshallowr   r`   rd   zfoo/qux)rG  r&   rK  r'   r   r-   rŸ   rO   rM   rì   r0  )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s4J ‚| jj|ddd |  | jd t g d¢¡¡ d| jd jvsUJ ‚d S )NrJ  r%   rU  rý   rþ   T)Zwithout_attrs)rG  r:  rK  rO   rM   rì   r0  ©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 )NrJ  rý   r%   z/barrþ   rT  T)Zexpand_softzqux/bazr`   zfoo/baz)
rG  r&   r	   rK  r0  r'   r   rO   rM   rì   rX  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 )NrJ  r%   rý   rþ   T)Zexpand_external)rG  r'  r   r0  r   rO   rM   rì   rK  r3  Ú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 )NrJ  r%   rU  rý   rþ   T)Zexpand_refsr²   Úrootzroot/foozroot/bar)rG  r…   r:  rK  rO   rM   rì   r.  r.   r0  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=  re   ÚversionZhdf5_version_tuplerM  rP  rQ  rR  rS  rW  rY  rZ  r\  r^  r   r   r   r   rF  c  sV    ÿ
	ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿrF  c                   @   rö   )Ú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-   ra   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)re   r	   r   rc  rh   r-   r  )r   Zlnkr   r   r   Útest_move_softlink6  s   zTestMove.test_move_softlinkc                 C   sV   | j  d¡ | j  d¡ |  t¡ | j  dd¡ W d  ƒ dS 1 s$w   Y  dS )z! Move conflict raises ValueError ra  rb  N)r   r&   r0   r1   rc  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 ra  N)r   r&   rc  r   r   r   r   Útest_short_circuitD  rä   zTestMove.test_short_circuitN)r!   r"   r#   rE   rd  re  rf  rg  r   r   r   r   r`  (  s    r`  c                   @   rF   )Ú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&   ri   ra   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#   rE   rk  rq  r   r   r   r   rh  J  s    rh  )1rE   ZnumpyrM   r3  Úos.pathÚsysZtempfiler   Zcollections.abcr   Úcommonr   r   re   r   r   r	   r
   r   r   r   r   Zh5py._hl.compatr   ÚUnicodeEncodeErrorr>  r   r$   rG   rV   r\   rv   r‚   r’   r–   r   r¢   r¸   rÃ   rÓ   rÝ   r÷   r  r  r!  r?  rF  r`  rh  r   r   r   r   Ú<module>   sV   
	ÿ	6=$BJ#UF&c& F"