o
    µ2úh•š  ã                   @   sZ  d 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yY   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„ d3ƒZ+G d4d5„ d5eƒZ,G d6d7„ d7eƒZ-G d8d9„ d9eƒZ.G d:d;„ d;eƒZ/G d<d=„ d=eƒZ0G d>d?„ d?eƒZ1G d@dA„ dAeƒZ2dS )Bz²
    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   úP/var/www/html/chatgem/venv/lib/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   ÚtearDown1   ó   ÿ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_intermediateC   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_exceptionK   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   Ú	CSET_UTF8©r   r.   Úgroupr   r   r   Útest_unicodeQ   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   Ú
CSET_ASCIIr;   r   r   r   Útest_unicode_defaultX   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_type`   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_ide   ó   "ÿz(TestCreate.test_appropriate_low_level_idN)r!   r"   r#   Ú__doc__r+   r/   r2   r=   r?   rB   rE   r   r   r   r   r$   5   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 ©é   rK   r   ©ÚdtypeÚa.N)ÚnpÚonesr   r'   r   ÚassertArrayEqual©r   Údatar   r   r   Útest_ndarrayq   s   
z"TestDatasetAssignment.test_ndarrayc                 C   s.   t jddd}|| jd< |  | jd t¡ d S )NrJ   r   rL   ó   b)rO   rP   r   r'   r   rR   r   r   r   Útest_name_bytesx   s   
z%TestDatasetAssignment.test_name_bytesN)r!   r"   r#   rG   rT   rV   r   r   r   r   rI   k   ó    rI   c                   @   rH   )Ú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 ú|S10rN   N)rO   rM   r   r'   r   r-   ©r   rM   r   r   r   Ú
test_dtypeƒ   s   

zTestDtypeAssignment.test_dtypec                 C   s*   t  d¡}|| jd< |  | jd t¡ dS )rY   rZ   rU   N)rO   rM   r   r'   r   r[   r   r   r   rV   Š   s   

z#TestDtypeAssignment.test_name_bytesN)r!   r"   r#   rG   r\   rV   r   r   r   r   rX   }   rW   rX   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*   Ú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   rC   r0   rA   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,   re   rL   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%   rg   )rh   ri   r   r_   rk   rl   r   rm   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   é   )Nrq   )ÚshapeÚmaxshaperM   é   r   )Úaxis)rt   rq   )rr   rM   )r   r   )rq   N)Né   )Nrv   é   )é
   rq   )r   rj   ÚintÚresizer0   rA   )r   Údsr   r   r   Útest_require_shape¿   s    ÿÿÿ"ÿzTestRequire.test_require_shapeN)
r!   r"   r#   rG   rb   r+   rf   ro   rp   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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#   rG   r   r„   rˆ   r   r   r   r   r}   Î   s
    r}   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%   rc   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)rN   ÚiÚbÚ	test_dsetre   é*   r   r   N)	r   r&   rO   rM   rh   Ú	ref_dtyperC   rŒ   r-   )r   Úgrn   rD   rS   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)	rh   Úh5rÚ	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   rA   r   r   r   r   Útest_path_type_validation(  s   ÿ"ÿz"TestOpen.test_path_type_validationN)
r!   r"   r#   rG   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   Ú_closer   )r   r”   r   r   r   Ú	test_repr7  s   


zTestRepr.test_reprN)r!   r"   r#   rG   r¡   r   r   r   r   r   4  s    r   c                   @   rH   )Ú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   )rN   r   ÚcÚdú	/mongooser–   ©r–   )r   r   r   Úgroupsr&   rh   r	   ©r   r–   r   r   r   r   G  s   
zBaseMapping.setUpc                 C   r   r   r   r   r   r   r   r   O  r    zBaseMapping.tearDownN)r!   r"   r#   rG   r   r   r   r   r   r   r¢   B  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_lenY  s    zTestLen.test_lenN)r!   r"   r#   rG   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) rN   ó   as   /az/as   mongooseÚmongooseNr~   r   r   r   r   Útest_containsf  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) rN   r¯   N)r   r&   r   ÚassertFalser   r   r   r   Útest_excp  s   
zTestContains.test_excc                 C   ó    |   d| j¡ |   d| j¡ dS )z2 Empty strings work properly and aren't contained Ú ó    N)r€   r   r   r   r   r   Ú
test_emptyw  ó   zTestContains.test_emptyc                 C   r´   )z' Current group "." is always contained ó   .Ú.N©r   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’   Ú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)   r¥   z	/grp/softúmongoose.hdf5z/grp/externalz/grp/soft/somethingz/grp/external/somethingN)r   r&   rh   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/zr’   rD   r¾   z//z///z.///z././/r–   z.//x/y/zzx///z./x///zdset///z/dset//Nr~   rd   r   r   r   Útest_oddball_paths™  s   

zTestContains.test_oddball_pathsN)r!   r"   r#   rG   r±   r³   r·   r¼   r¿   rÁ   rÃ   rÄ   r   r   r   r   r®   `  s    
	
r®   c                   @   rH   )Ú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#   rG   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   rx   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©Ú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Ü   r   r-   r«   )r   ÚkvrŒ   r–   r   r   r   Ú	test_keysÙ  s   
zTestPy3Dict.test_keysc                    sˆ   t ˆ jdƒƒ }‡ fdd„ˆ jD ƒ}ˆ  t|ƒ|¡ ˆ  tt|ƒƒtt|ƒƒ¡ ˆ  t|ƒtˆ jƒ¡ ˆ jD ]}ˆ  ˆ j 	|¡|¡ q5dS )z .values provides a value view Úvaluesc                    s   g | ]}ˆ j  |¡‘qS r   ©r   rk   rÇ   r   r   r   rÉ   ç  s    z+TestPy3Dict.test_values.<locals>.<listcomp>N©
rã   r   r§   rË   rÛ   rÜ   r-   r«   r   rk   )r   ÚvvrŒ   r–   r   r   r   Útest_valuesä  s   
ÿzTestPy3Dict.test_valuesc                    sŒ   t ˆ jdƒƒ }‡ fdd„ˆ jD ƒ}ˆ  t|ƒ|¡ ˆ  tt|ƒƒtt|ƒƒ¡ ˆ  t|ƒtˆ jƒ¡ ˆ jD ]}ˆ  |ˆ j 	|¡f|¡ 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   Ú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<   Úpopitemr€   )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 itemrN   N)r<   Úpopr€   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©rO   Úarrayr<   Ú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ª   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_kwargs3  s   z-TestAdditionalMappingFuncs.test_update_kwargsc                 C   s$   | j  d¡}|  || j  d¡¡ dS )z#.setdefault gets group if it existsrN   N)r<   Ú
setdefaultr-   rk   rö   r   r   r   Útest_setdefault9  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  rO   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   rA   r<   r  r   r   r   r   Útest_setdefault_no_defaultE  s   "ÿz5TestAdditionalMappingFuncs.test_setdefault_no_defaultN)r!   r"   r#   rG   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°   rN   r¯   N)Úobjectr   rk   ÚassertIsr&   r-   )r   ÚdefaultÚoutr)   r   r   r   Útest_get_defaultU  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)rK   rZ   ÚbazN)
r   r&   rk   r-   r   rC   r   rO   rM   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&   rk   r-   r
   )r   r  ÚslÚelÚout_hlÚout_slÚout_elr   r   r   Útest_get_link_classm  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&   rk   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#   rG   r  r  r  r!  r   r   r   r   r	  O  s    
r	  c                   @   ó8   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   )Ú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   ó   | j  ¡  d S r   r   r   r   r   r   r   ¤  ó   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                    ó   g | ]	}|ˆ j | f‘qS 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>±  ó    z+TestVisit.test_visititems.<locals>.<lambda>N)r§   r   Ú
visititemsrË   ©r   Úcompr   ©r*  r   r   Útest_visititems­  s   zTestVisit.test_visititemsc                    s’   g ‰ ˆj  ‡ fdd„¡}|dkrtˆ ƒdkrˆ d ˆjv sJ ‚g ‰ ‡fdd„ˆjD ƒ}ˆj  ‡ fdd„¡}|dkrEtˆ ƒdkrEˆ d |v sGJ ‚d	S )
ú9 Returning a non-None value immediately aborts iteration c                    ó   ˆ   | ¡pdS ©Néÿÿÿÿr/  r¦   r2  r   r   r3  ¸  r4  z(TestVisit.test_bailout.<locals>.<lambda>r=  r   r   c                    r,  r   r-  rÇ   r   r   r   rÉ   ¼  r.  z*TestVisit.test_bailout.<locals>.<listcomp>c                    ó   ˆ   | |f¡pdS r<  r/  r0  r2  r   r   r3  ½  ó    N)r   r'  r«   r§   r5  )r   r–   r7  r   r8  r   Útest_bailout´  s   &(zTestVisit.test_bailoutN)	r!   r"   r#   rG   r   r   r+  r9  r@  r   r   r   r   r#  •  s    r#  c                   @   r"  )ÚTestVisitLinksz—
        Feature: The .visit_links and .visititems_links methods allow iterative access to
        links contained in the group and its subgroups.
    c                 C   sd   t |  ¡ dƒ| _g d¢| _g d¢| _t| j| jddD ]\}}| j |¡ td|› ƒ| j|< qd S )Nr   )r$  z
grp1/grp11z
grp1/grp12r*   z
grp2/grp21zgrp2/grp21/grp211)Úlinkto_grp1zgrp1/linkto_grp11zgrp1/linkto_grp12Úlinkto_grp2zgrp2/linkto_grp21zgrp2/grp21/linkto_grp211T)Ústrictr¾   )r   r   r   r§   r6   Úzipr&   r	   )r   r”   r*  r   r   r   r   Æ  s   

þzTestVisitLinks.setUpc                 C   r%  r   r   r   r   r   r   r   Ò  r&  zTestVisitLinks.tearDownc                 C   s*   g }| j  |j¡ |  || j| j ¡ dS )z% All subgroups and links are visited N)r   Úvisit_linksr(  rË   r§   r6   r)  r   r   r   Útest_visit_linksÕ  s   zTestVisitLinks.test_visit_linksc                    sB   g ‰ ‡fdd„ˆj ˆj D ƒ}ˆj ‡ fdd„¡ ˆ |ˆ ¡ dS )z All links are visited c                    s$   g | ]}|t ˆ jj|d dƒf‘qS )Tr  )Útyper   rk   rÇ   r   r   r   rÉ   Þ  s   $ z2TestVisitLinks.test_visititems.<locals>.<listcomp>c                    s   ˆ   | t|ƒf¡S r   )r(  rH  r0  r2  r   r   r3  ß  r?  z0TestVisitLinks.test_visititems.<locals>.<lambda>N)r§   r6   r   Úvisititems_linksrË   r6  r   r8  r   r9  Û  s   zTestVisitLinks.test_visititemsc                    sd   g ‰ | j  ‡ fdd„¡}|dkrtˆ ƒdksJ ‚g ‰ | j  ‡ fdd„¡}|dkr.tˆ ƒdks0J ‚dS )r:  c                    r;  r<  r/  r¦   r2  r   r   r3  æ  r4  z-TestVisitLinks.test_bailout.<locals>.<lambda>r=  r   c                    r>  r<  r/  r0  r2  r   r   r3  ê  r?  N)r   rF  r«   rI  r¨   r   r2  r   r@  â  s   zTestVisitLinks.test_bailoutN)	r!   r"   r#   rG   r   r   rG  r9  r@  r   r   r   r   rA  À  s    rA  c                   @   s.   e Zd ZdZdd„ Zd	dd„Zedd„ ƒZdS )
ÚVisitorz5 Class for exercise 'visit' and 'visititems' methods c                 C   s
   g | _ d S r   ©Ú_namesr   r   r   r   Ú__init__ð  s   
zVisitor.__init__Nc                 C   s   | j  |¡ d S r   )rL  r(  )r   r.   Úobjr   r   r   Ú__call__ó  s   zVisitor.__call__c                 C   s   | j S r   rK  r   r   r   r   Únamesö  s   zVisitor.namesr   )r!   r"   r#   rG   rM  rO  ÚpropertyrP  r   r   r   r   rJ  í  s    
rJ  c                   @   s\   e Zd ZdZddlZe 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 )ÚTestLexicographica#   Test ascending lexicographic order traversal of the 'visit*' methods.

        This semantics is set by the following default args in
        h5py.h5o.visit(..., idx_type=H5_INDEX_NAME, order=H5_ITER_INC, ...)
        h5py.h5l.visit(..., idx_type=H5_INDEX_NAME, order=H5_ITER_INC, ...)
    r   NÚsplitr¾   c                 C   sê   t |  ¡ ddd| _| j dd¡ | jjddd}| dd¡ | dd¡ | jjddd}| dd¡ | dd¡ | j dd¡ | j d	d¡ | jd
 | jd< | jd | jd< | jd | jd< | jd | jd< | jd | jd< tƒ | _dS )z3 Populate example hdf5 file, with track_order=True zw-TrÕ   r   )rx   ÚBrN   Úzzz-zB/bzA/xzz/ar1  zA$ÚAzA/B/CzA/aN)r   r   r   rC   r&   rJ  Úvrd   r   r   r   r     s    zTestLexicographic.setUpc                 C   s*   | j  | j¡ | jjt| jjƒksJ ‚dS )z/check that test example is not trivially sortedN)r   r'  rW  rP  rß   r   r   r   r   Útest_nontrivial_sort_visit!  s   z,TestLexicographic.test_nontrivial_sort_visitc                 C   ó0   | j  | j¡ | jjt| jj| jdksJ ‚dS )z5check that File.visit iterates in lexicographic order©rð   N©r   r'  rW  rP  rß   Úsplit_partsr   r   r   r   r+  &  ó   "zTestLexicographic.test_visitc                 C   rY  )z;check that File.visit_links iterates in lexicographic orderrZ  N)r   rF  rW  rP  rß   r\  r   r   r   r   rG  +  r]  z"TestLexicographic.test_visit_linksc                 C   rY  )z:check that File.visititems iterates in lexicographic orderrZ  N)r   r5  rW  rP  rß   r\  r   r   r   r   r9  0  r]  z!TestLexicographic.test_visititemsc                 C   rY  )z@check that File.visititems_links iterates in lexicographic orderrZ  N)r   rI  rW  rP  rß   r\  r   r   r   r   Útest_visititems_links5  r]  z'TestLexicographic.test_visititems_linksc                 C   s4   | j d  | j¡ | jjt| jj| jdksJ ‚dS )z6check that Group.visit iterates in lexicographic orderrV  rZ  Nr[  r   r   r   r   Útest_visit_group:  s   "z"TestLexicographic.test_visit_group)r!   r"   r#   rG   ÚoperatorÚmethodcallerr\  r   rX  r+  rG  r9  r^  r_  r   r   r   r   rR  ú  s    rR  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 rc   N)r	   r-   Úpath©r   r  r   r   r   Ú
test_spathE  s   zTestSoftLinks.test_spathc                 C   s   t dƒ}|  t|ƒt¡ dS )z SoftLink path repr rc   N)r	   r'   rž   rŸ   rd  r   r   r   Ú
test_sreprJ  s   zTestSoftLinks.test_sreprc                 C   s8   | j  d¡}tdƒ}|| j d< | j d }|  ||¡ dS )z$ Create new soft link by assignment Únewz/newÚaliasN)r   r&   r	   r-   )r   r”   r  Úg2r   r   r   r+   O  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 rg  rh  N)r	   r   r0   rƒ   r   r   r   r   r³   W  s   "ÿzTestSoftLinks.test_excN)r!   r"   r#   rG   re  rf  r+   r³   r   r   r   r   rb  ?  s    rb  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   c  s
   
zTestExternalLinks.setUpc                 C   ó(   | j r| j  ¡  | jr| j ¡  d S d S r   )r   r   rl  r   r   r   r   r   j  ó
   
ÿzTestExternalLinks.tearDownc                 C   s*   t ddƒ}|  |jd¡ |  |jd¡ dS )z  External link paths attributes úfoo.hdf5rc   N)r   r-   Úfilenamerc  ©r   r  r   r   r   Ú
test_epathp  s   
zTestExternalLinks.test_epathc                 C   s   t ddƒ}|  t|ƒt¡ dS )z External link repr ro  rc   N)r   r'   rž   rŸ   rq  r   r   r   Ú
test_ereprv  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   rk  r   Úfilerl  ÚassertNotEqualr-   r.   rd   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/missingru  N)r   rk  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Â   rc   ru  N)r   r   r0   rƒ   r   r   r   r   Útest_exc_missingfile‹  rF   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¾   ru  N)r   rk  r   rv  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  Nrt  ru  )Úosrc  Újoinr   r   r&   r   r   ©r   Úext_filenameÚ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
        r{  r   r  rŽ   Úext_attrNrt  ru  ©
r|  rc  r}  r   r   r&   Úattrsr   r   r-   r~  r   r   r   Útest_unicode_decode§  s   
þz%TestExternalLinks.test_unicode_decodec                 C   r‚  )	zi
        Check that external links handle unicode hdf5 paths properly
        Testing issue #333
        zexternal.hdf5r   r   rŽ   rƒ  Nu   /Î±ru  r„  r~  r   r   r   Útest_unicode_hdf5_path´  s   
þz(TestExternalLinks.test_unicode_hdf5_pathN)r!   r"   r#   rG   r   r   rr  rs  r+   r³   rx  rz  r   ÚskipIfÚNO_FS_UNICODEr  r†  r‡  r   r   r   r   rj  ]  s    




rj  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   ÚOSErrorr   r¦   r   r   r   Î  s   ÿÿz9TestExtLinkBugs.test_issue_212.<locals>.closer.<locals>.wr   )r–   r   r   r¦   r   ÚcloserÍ  s   z.TestExtLinkBugs.test_issue_212.<locals>.closerr   rN   r¾   Úlinkr…   N)r   r   Ú
addCleanupr&   r   r   r'   r   )r   rŒ  Ú	orig_nameÚnew_namer   r”   Úhr   r   r   Útest_issue_212Æ  s   



zTestExtLinkBugs.test_issue_212N)r!   r"   r#   rG   r’  r   r   r   r   rŠ  À  r­   rŠ  c                   @   sl   e 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S )ÚTestCopyc                 C   s$   t |  ¡ dƒ| _t |  ¡ dƒ| _d S r   )r   r   Úf1ry  r   r   r   r   r   è  s   zTestCopy.setUpc                 C   rm  r   )r”  r   ry  r   r   r   r   r   ì  rn  zTestCopy.tearDownc                 C   sZ   | j  d¡}g d¢|d< | j  dd¡ | j d }|  |t¡ |  |d t g d¢¡¡ d S )Nr%   ©r   rw   rq   r  r  )r”  r&   Úcopyr'   r   rQ   rO   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%   r•  r  r  rg   r¾   rc   ©	r”  r&   r–  r'   r   rQ   rO   rý   ry  r—  r   r   r   Útest_copy_path_to_groupû  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%   r•  r  r  rc   rg   rš  r—  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 r™  rš  r—  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 )Nr•  r%   r)   r  r  z/grp/foo)r”  r&   r–  rQ   rO   rý   ry  )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  r•  Úqux©rK   rv   é   Úquuxr  T)Úshallowr   rc   rg   zfoo/qux)r”  r&   r–  r'   r   r-   r«   rQ   rO   rý   ry  )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 )Nr•  r%   r   r  r  T)Úwithout_attrs)r”  r…  r–  rQ   rO   rý   ry  ©r   r%   r   r   r   Útest_copy_without_attributesN  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 )Nr•  r  r%   z/barr  rŸ  T)Úexpand_softzqux/bazrc   zfoo/baz)
r”  r&   r	   r–  ry  r'   r   rQ   rO   rý   r¦  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 )Nr•  r%   r  r  T)Úexpand_external)r”  rp  r   ry  r   rQ   rO   rý   r–  r|  Úunlink)r   rp  r   r   r   Útest_copy_external_linksl  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 )Nr•  r%   r   r  r  T)Úexpand_refsr¾   Úrootzroot/foozroot/bar)r”  rŒ   r…  r–  rQ   rO   rý   rw  r.   ry  r-   )r   r%   r  Úbaz_barÚfoo_barr   r   r   Útest_copy_refsz  s(   

zTestCopy.test_copy_refsN)r!   r"   r#   r   r   r˜  r›  rœ  r  rž  r¤  r§  r©  r¬  r±  r   r   r   r   r“  æ  s    	r“  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-   rd   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  Únew_softTr  N)rh   r	   r   rµ  rk   r-   rc  )r   Úlnkr   r   r   Útest_move_softlink¥  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 r³  r´  N)r   r&   r0   r1   rµ  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 r³  N)r   r&   rµ  r   r   r   r   Útest_short_circuit³  rõ   zTestMove.test_short_circuitN)r!   r"   r#   rG   r¶  r¹  rº  r»  r   r   r   r   r²  —  s    r²  c                   @   rH   )Ú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&   rl   rd   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#   rG   r¿  rÅ  r   r   r   r   r¼  ¹  s    r¼  )3rG   ÚnumpyrO   r|  Úos.pathÚtempfiler   Úcollections.abcr   Úcommonr   r   rh   r   r   r	   r
   r   r   r   r   Úh5py._hl.compatr   ÚUnicodeEncodeErrorr‰  r   r$   rI   rX   r^   r}   r‰   r   r¢   r©   r®   rÅ   rÐ   rá   rî   r	  r#  rA  rJ  rR  rb  rj  rŠ  r“  r²  r¼  r   r   r   r   Ú<module>   sZ   
	ÿ	6=$BJ#UF+-Ec& 2"