o
    giu                     @   s  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	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 d	d
lmZmZmZmZ zed W n eya   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Z0G d8d9 d9eZ1d:d; Z2d<d= Z3e	j45d>d?e	j45d@d?dAdB Z6e	j45d@d?dCdD Z7dEdF Z8e	j45dGdHe	j45dIg dJdKdL Z9G dMdN dNeZ:G dOdP dPeZ;G dQdR dReZ<G dSdT dTeZ=dS )Uz
    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)MutableMapping)mkdtemp)FileGroupSoftLinkHardLinkExternalLink)DatasetDatatype)h5t)filename_encode   )utTestCase	make_nameis_main_thread   α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   S/home/ubuntu/SoloSpeech/.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   tearDown2      zBaseGroup.tearDownN)__name__
__module____qualname__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S )
TestCreatezI
        Feature: New groups can be created via .create_group method
    c                 C   s   | j t }| |t dS )z Simple .create_group call N)r   create_groupr   assertIsInstancer   r   grpr   r   r   test_create_str<   s   zTestCreate.test_create_strc                 C   s$   | j t d}| |t d S )Nutf8)r   r'   r   encoder(   r   r)   r   r   r   test_create_bytesA   s   zTestCreate.test_create_bytesc                 C   s*   t d}| j|}| |jd|  dS )z2 Intermediate groups can be created automatically foo{}/bar/baz/N)r   r   r'   assertEqualname)r   pathr*   r   r   r   test_create_intermediate_strE   s   z'TestCreate.test_create_intermediate_strc                 C   s0   t d}| j|d}| |jd|  d S )Nr/   r,   r0   )r   r   r'   r-   r1   r2   )r   r3   grp2r   r   r   test_create_intermediate_bytesK   s   z)TestCreate.test_create_intermediate_bytesc                 C   sN   t  }| j| | t | j| W d   dS 1 s w   Y  dS )z= Name conflict causes group creation to fail with ValueError N)r   r   r'   assertRaises
ValueErrorr   r2   r   r   r   test_create_exceptionP   s
   "z TestCreate.test_create_exceptionc                 C   sP   dt   td }| j|}| |j| | |jj|	dj
tj dS )z$ Unicode names are correctly stored r0   i E  r,   N)r   chrr   r'   r1   r2   idlinksget_infor-   csetr   	CSET_UTF8r   ngroupr   r   r   test_unicodeW   s   $zTestCreate.test_unicodec                 C   sF   t 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'   r1   r2   r<   r=   r>   r-   r?   r   
CSET_ASCIIrA   r   r   r   test_unicode_default^   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)r7   	TypeErrorr   r'   r   r   r   r   	test_typef   s   "zTestCreate.test_typec                 C   sN   | j t dgd}| 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   f4N)r   create_datasetr   r7   r8   r   r<   )r   dsetr   r   r   test_appropriate_low_level_idk   s   "z(TestCreate.test_appropriate_low_level_idN)r#   r$   r%   __doc__r+   r.   r4   r6   r:   rD   rF   rI   rM   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   sJ   t  }tjddd}|| j|< | | j| t | | j| d | dS )z, Dataset auto-creation by direct assignment    rR   r   dtype.N)r   nponesr   r(   r	   assertArrayEqual)r   r2   datar   r   r   test_ndarrayw   s
   
z"TestDatasetAssignment.test_ndarrayc                 C   s:   t jddd}t d}|| j|< | | j| t d S )NrQ   r   rS   r,   )rU   rV   r   r-   r   r(   r	   )r   rX   rB   r   r   r   test_name_bytes   s   
z%TestDatasetAssignment.test_name_bytesN)r#   r$   r%   rN   rY   rZ   r   r   r   r   rP   q       rP   c                   @   rO   )TestDtypeAssignmentzP
        Feature: Named types can be created by direct assignment of dtypes
    c                 C   sD   t  }td}|| j|< | | j| t | | j| j| dS ) Named type creation |S10N)r   rU   rT   r   r(   r
   r1   )r   r2   rT   r   r   r   
test_dtype   s
   

zTestDtypeAssignment.test_dtypec                 C   s6   t d}t d}|| j|< | | j| t dS )r]   r^   r,   N)rU   rT   r   r-   r   r(   r
   )r   rT   rB   r   r   r   rZ      s   

z#TestDtypeAssignment.test_name_bytesN)r#   r$   r%   rN   r_   rZ   r   r   r   r   r\      r[   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 )TestRequirezO
        Feature: Groups can be auto-created, or opened via .require_group
    c                 C   sL   t  }| j|}| j|}| || | j|d}| || dS )z' Existing group is opened and returned r,   N)r   r   r'   require_groupr1   r-   r   r2   r*   r5   grp3r   r   r   test_open_existing   s   zTestRequire.test_open_existingc                 C   s4   t  }| j|}| |t | |jd|  dS )z& Group is created if it doesn't exist r0   N)r   r   ra   r(   r   r1   r2   r   r2   r*   r   r   r   test_create   s   zTestRequire.test_createc                 C   sR   t  }| j|dd | t | j| W d   dS 1 s"w   Y  dS )z1 Opening conflicting object results in TypeError r   r   N)r   r   rK   r7   rH   ra   r9   r   r   r   test_require_exception   s
   "z"TestRequire.test_require_exceptionc                 C   sf   t d}t }| jj| dd|d | j|}t|ts!J | j| d}t|ts1J dS )z- Intermediate is created if it doesn't exist foo/bar/bazrg   rS   /barN)r   h5pystring_dtyper   require_datasetget
isinstancer   )r   r2   dtrC   r   r   r    test_intermediate_create_dataset   s   z,TestRequire.test_intermediate_create_datasetc                 C   sx   t d}| j| d | j|}t|tsJ | j| d}t|ts*J | j| d}t|ts:J d S )Nri   rj   rk   )r   r   ra   ro   rp   r   )r   r2   rC   r   r   r   test_intermediate_create_group   s   z*TestRequire.test_intermediate_create_groupc                 C   sL  t d}| jj|ddtd}|jddd | jj|ddtd | jj|dtd	 | t | jj|d
dtd W d    n1 sBw   Y  | t | jj|d
dtd W d    n1 saw   Y  | t | jj|d
dtd W d    n1 sw   Y  | t | jj|dtd	 W d    d S 1 sw   Y  d S )Nzfoo{}/resizable)r      )Nrt   )shapemaxshaperT      r   )axis)rw   rt   )ru   rT   r   r   )rt   N)N   )Nrz      )
   rt   )r   r   rn   intresizer7   rH   )r   rB   dsr   r   r   test_require_shape   s"   "zTestRequire.test_require_shapeN)
r#   r$   r%   rN   rd   rf   rh   rr   rs   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   s:   t  }| j| | || j | j|= | || j dS )z Object deletion via "del" Nr   r   r'   assertInassertNotInr9   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 ri   Nr7   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   ri   rN)r   r   r'   r    r7   r   )r   fnamehfiler   r   r   test_readonly_delete_exception   s   

z)TestDelete.test_readonly_delete_exceptionN)r#   r$   r%   rN   r   r   r   r   r   r   r   r      s
    r   c                   @   sV   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Ze	j
jdddd Zdd ZdS )TestOpenzJ
        Feature: Objects can be opened via indexing syntax obj[name]
    c                 C   sH   t  }| j|}| j| }| jd|  }| || | || dS )z Simple obj[name] opening r0   N)r   r   r'   r1   rb   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 notexistNr   r   r   r   r   test_nonexistent  s   "zTestOpen.test_nonexistentc                 C   s*   | j t }| j |j }| || dS )z0 Objects can be opened by HDF5 object reference N)r   r'   r   refr1   )r   r*   r5   r   r   r   test_reference  s   zTestOpen.test_referencec                 C   sh   | j td}tddtjfg}| j t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.
        g)aibxrg   *   r   r   N)
r   r'   r   rU   rT   rl   	ref_dtyperK   r   r1   )r   r   rq   rL   rX   r   r   r   test_reference_numpyobj  s   z TestOpen.test_reference_numpyobjc                 C   sD   t j }| t | j|  W d   dS 1 sw   Y  dS )z5 Invalid region references should raise an exception N)rl   h5r	Referencer7   r8   r   )r   r   r   r   r   test_invalid_ref*  s   
"zTestOpen.test_invalid_refzFIXME #2672 does not raise)reasonc                 C   s`   t  }| j| | j| j}| j|= | t | j|  W d   dS 1 s)w   Y  dS )z9 References to deleted objects should raise an exception N)r   r   r'   r   r7   	Exception)r   r2   r   r   r   r   test_deleted_ref1  s   "zTestOpen.test_deleted_refc                 C   s|   | j t  | t | j d  W d   n1 sw   Y  | t | j d  W d   dS 1 s7w   Y  dS )z> Access with non bytes or str types should raise an exception r   N.)r   r'   r   r7   rH   r   r   r   r   test_path_type_validation<  s   "z"TestOpen.test_path_type_validationN)r#   r$   r%   rN   r   r   r   r   r   pytestmarkthread_unsafer   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   sn   t  }| j|}| t|t |j  | t|t | j| }t r5| j	  | t|t dS dS )z; Opened and closed groups provide a useful __repr__ string N)
r   r   r'   r(   reprstrr<   _closer   r    )r   r2   r   r   r   r   	test_reprK  s   


zTestRepr.test_reprN)r#   r$   r%   rN   r   r   r   r   r   r   H  s    r   c                   @   rO   )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   )r   r   cd	/mongooser   r   )r   r   r   groupsr'   rl   r   r   r   r   r   r   r   ]  s   
zBaseMapping.setUpc                 C   r   r   r   r   r   r   r   r!   e  r"   zBaseMapping.tearDownN)r#   r$   r%   rN   r   r!   r   r   r   r   r   X  s    r   c                   @   rO   )TestLenzM
        Feature: The Python len() function returns the number of groups
    c                 C   s   |  t| jt| j dS )z' len() returns number of group members N)r1   lenr   r   r   r   r   r   test_leno  s   zTestLen.test_lenc                 C   s   t |  d6}| t|d |d | t|d |d | t|d |d= | t|d W d    d S 1 s@w   Y  d S )Nr   r   r   r   yr{   )r   r   r1   r   r'   r   r   r   r   r   test_len_after_create_groups  s   

"z#TestLen.test_len_after_create_groupN)r#   r$   r%   rN   r   r   r   r   r   r   r   i  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   s   t  }| j| | |d| j | || j | d| d| j | d| | j | d| j | d| j dS )z6 "in" builtin works for membership (byte and Unicode) zutf-8r0   s   mongoosemongooseN)r   r   r'   r   r-   r   r9   r   r   r   test_contains  s   zTestContains.test_containsc                 C   s\   t |  d}|d | d|v  | d|v  |  | d|v  | d|v  dS )z8 "in" on closed File returns False (see also issue 174) r   r      aN)r   r   r'   
assertTruer    assertFalser   r   r   r   test_closed  s   
zTestContains.test_closedc                 C       |  d| j |  d| j dS )z2 Empty strings work properly and aren't contained      N)r   r   r   r   r   r   
test_empty     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    /r0   Nr   r   r   r   r   	test_root  r   zTestContains.test_rootc                 C   s~   t d}t d}| j| d| j|< | d| d| j | | d| j | d| d| j | | d| j dS )z. Trailing slashes are unconditionally ignored r   r   r   r0   N)r   r   r'   r   )r   r   r   r   r   r   test_trailing_slash  s   
z TestContains.test_trailing_slashc                 C   s   t  }| j| td| jd| d< tdd| jd| d< | d| d| j | d| d| j | d| d| j | d| d| j dS )	z; Broken softlinks are contained, but their members are not r   r0   z/softmongoose.hdf5	/externalz/soft/somethingz/external/somethingN)r   r   r'   rl   r   r   r   r   r9   r   r   r   test_softlinks  s   zTestContains.test_softlinksc                 C   s   t d}t d}| j| d d| j|< | d| j | d| j | d| j | d| j | d	| j | j| }| d
| d| j | d
| d| | | d| j | d| d| j | | d| j | d| d| j dS )z0 Technically legitimate (but odd-looking) paths r   rL   z/y/zr   r0   z//z///z.///z././/z.//z./Nr   )r   r   rL   r*   r   r   r   test_oddball_paths  s    

zTestContains.test_oddball_pathsN)r#   r$   r%   rN   r   r   r   r   r   r   r   r   r   r   r   r   r   ~  s    
r   c                   @   rO   )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   r1   r    )r   r   r   r   r   r   test_iter_zero  s
   zTestIter.test_iter_zeroN)r#   r$   r%   rN   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 )Nd   r|   r   )ranger'   r   )r   r   r   r   r   r   populate  s
   zTestTrackOrder.populatec                 C   s^   | j jt dd}| | dd tdD }| t|| | tt|tt| d S )NT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   r1   listreversedr   r   r   r   r   r   test_track_order  s
   
 zTestTrackOrder.test_track_orderc                 C   sb   | j jt dd}| | tdd tdD }| t|| | tt|tt| d S )NFr   c                 S   r   r   r   r   r   r   r   r     r   z6TestTrackOrder.test_no_track_order.<locals>.<listcomp>r   )	r   r'   r   r   sortedr   r1   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   r1   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   ro   r   r   r   r   r     s    z+TestPy3Dict.test_values.<locals>.<listcomp>N
r   r   r   r   r   r   r1   r   r   ro   )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/dtest)r   r   r   r'   rC   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 t }|d |d | \}}|dv sJ | || | \}}|dkr3|dks4J 	 | || | t |  W d   dS 1 sOw   Y  dS )z.pop_item removes an itemr   r   )r   r   N)r   r'   r   popitemr   r7   r   )r   r   k_k2r   r   r   test_pop_item1  s   


"z(TestAdditionalMappingFuncs.test_pop_itemc                 C   sH   | j t }|d |d |d | d| | d| dS )z'.pop returns and removes specified itemr   r   N)r   r'   r   popr   r   r   r   r   r   r   test_popB  s   


z#TestAdditionalMappingFuncs.test_popc                 C   s   | j dd}| |d dS )z.pop falls back to defaulteN)rC   r   r1   r   valuer   r   r   test_pop_defaultK  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)r7   r   rC   r   )r   keyr   r   r   test_pop_raisesQ  s   "z*TestAdditionalMappingFuncs.test_pop_raisesc                 C   sN   | j t }|d |d | t|d |  | t|d dS )z.clear removes groupsr   r   r{   r   N)r   r'   r   r1   r   clearr   r   r   r   
test_clearW  s   

z%TestAdditionalMappingFuncs.test_clearc                 C   s8   | j t }dtdgi}|| | d| dS )z.update works with dictr  r   Nr   r'   r   rU   arrayupdater   r   r   	new_itemsr   r   r   test_update_dict`  s   
z+TestAdditionalMappingFuncs.test_update_dictc                 C   sH   | j t }dtdgfdtdgfg}|| | d| dS )z.update works with listr  r   r   Nr	  r  r   r   r   test_update_iterg  s   
z+TestAdditionalMappingFuncs.test_update_iterc                 C   s>   | j t }dtdgi}|jdi | | d| dS )z.update works with kwargsr  r   Nr   r	  r  r   r   r   test_update_kwargsq  s   z-TestAdditionalMappingFuncs.test_update_kwargsc                 C   s$   | j d}| || j d dS )z#.setdefault gets group if it existsr   N)rC   
setdefaultr1   ro   r  r   r   r   test_setdefaultx  s   z*TestAdditionalMappingFuncs.test_setdefaultc                 C   s(   | j t tdg}| |d dS )z/.setdefault gets default if group doesn't existr   N)rC   r  r   rU   r
  r1   r  r   r   r   test_setdefault_with_default}  s   z7TestAdditionalMappingFuncs.test_setdefault_with_defaultc                 C   rG   )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)r7   rH   rC   r  r   r   r   r   test_setdefault_no_default  s   "z5TestAdditionalMappingFuncs.test_setdefault_no_defaultN)r#   r$   r%   rN   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   sT   t  }t }| jd|}| || | j|}| j|d}| || dS )z4 Object is returned, or default if it doesn't exist r   r,   N)r   objectr   ro   assertIsr'   r-   r1   )r   r2   defaultoutr*   r   r   r   test_get_default  s   zTestGet.test_get_defaultc                 C   s   t d}t d}t d}| j| | jj|dd}| |t | j|dd | jj|dd}| |t t	d| j|< | jj|dd}| |t
 d	S )
z/ Object class is returned with getclass option ri   barbazT)getclass)rR   rJ   r^   N)r   r   r'   ro   r1   r   rK   r	   rU   rT   r
   )r   ri   r  r  r  r   r   r   test_get_class  s   zTestGet.test_get_classc           
      C   s   t d}t d}t d}t }td}tdd}| j| || j|< || j|< | jj||ddd}| jj||ddd}| jj||ddd}	| |t | |t | |	t d	S )
z Get link classes hardsoftexternalr   somewhere.hdf5r   T)getlinkr  N)	r   r  r   r   r   r'   ro   r1   r   )
r   r   r!  r"  r  slelout_hlout_slout_elr   r   r   test_get_link_class  s   


zTestGet.test_get_link_classc           	      C   s   t d}t d}t d}td}tdd}| j| || j|< || j|< | jj|dd}| jj|dd}| jj|dd}| |t | |t | |j	|j	 | |t | |j	|j	 | |j
|j
 d	S )
z Get link values r   r!  r"  r   r#  r   Tr$  N)r   r   r   r   r'   ro   r(   r   r1   _path	_filename)	r   r   r!  r"  r%  r&  r'  r(  r)  r   r   r   test_get_link  s"   


zTestGet.test_get_linkN)r#   r$   r%   rN   r  r  r*  r.  r   r   r   r   r    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/sg2r5   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   r5  r   r   r7  r   r   <lambda>      z+TestVisit.test_visititems.<locals>.<lambda>N)r   r   
visititemsr   r   compr   r7  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 Nr<  r   r>  r   r   r?    r@  z(TestVisit.test_bailout.<locals>.<lambda>rI  r   r   c                    r9  r   r:  r   r   r   r   r     r;  z*TestVisit.test_bailout.<locals>.<listcomp>c                         | |fpdS rH  r<  r=  r>  r   r   r?        N)r   r4  r   r   rA  )r   r   rC  r   rD  r   test_bailout  s   &(zTestVisit.test_bailoutN)	r#   r$   r%   rN   r   r!   r8  rE  rL  r   r   r   r   r0    s    r0  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   )r1  z
grp1/grp11z
grp1/grp12r5   z
grp2/grp21zgrp2/grp21/grp211)linkto_grp1zgrp1/linkto_grp11zgrp1/linkto_grp12linkto_grp2zgrp2/linkto_grp21zgrp2/grp21/linkto_grp211T)strictr0   )r   r   r   r   r=   zipr'   r   )r   r   r7  r   r   r   r     s   

zTestVisitLinks.setUpc                 C   r2  r   r   r   r   r   r   r!     r3  zTestVisitLinks.tearDownc                 C   s*   g }| j |j | || j| j  dS )z% All subgroups and links are visited N)r   visit_linksr5  r   r   r=   r6  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   ro   r   r   r   r   r   (  s   $ z2TestVisitLinks.test_visititems.<locals>.<listcomp>c                    s     | t|fS r   )r5  rT  r=  r>  r   r   r?  )  rK  z0TestVisitLinks.test_visititems.<locals>.<lambda>N)r   r=   r   visititems_linksr   rB  r   rD  r   rE  %  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 )rF  c                    rG  rH  r<  r   r>  r   r   r?  0  r@  z-TestVisitLinks.test_bailout.<locals>.<lambda>rI  r   c                    rJ  rH  r<  r=  r>  r   r   r?  4  rK  N)r   rR  r   rU  r   r   r>  r   rL  ,  s   zTestVisitLinks.test_bailoutN)	r#   r$   r%   rN   r   r!   rS  rE  rL  r   r   r   r   rM  
  s    rM  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   )rX  r5  )r   r2   objr   r   r   __call__=  s   zVisitor.__call__c                 C   s   | j S r   rW  r   r   r   r   names@  s   zVisitor.namesr   )r#   r$   r%   rN   rY  r[  propertyr\  r   r   r   r   rV  7  s    
rV  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splitr0   c                 C   s   t |  ddd| _| jddd | jjddd}|ddd |ddd | jjd	dd}|ddd |ddd | jddd | jd
dd | jd | jd< | jd | jd< | jd | jd< | jd | jd< | jd | jd< dS )z3 Populate example hdf5 file, with track_order=True zw-Tr   r   )r|   rJ   Br   zzz-zB/bzA/xzz/ar   zA$AzA/B/CzA/aN)r   r   r   rK   r'   r)   r   r   r   r   O  s   zTestLexicographic.setUpc                 C   s*   t  }| j| |jt|jksJ dS )z/check that test example is not trivially sortedN)rV  r   r4  r\  r   r   vr   r   r   test_nontrivial_sort_visith  s   z,TestLexicographic.test_nontrivial_sort_visitc                 C   0   t  }| j| |jt|j| jdksJ dS )z5check that File.visit iterates in lexicographic orderr  NrV  r   r4  r\  r   split_partsrc  r   r   r   r8  n     zTestLexicographic.test_visitc                 C   rf  )z;check that File.visit_links iterates in lexicographic orderrg  N)rV  r   rR  r\  r   ri  rc  r   r   r   rS  t  rj  z"TestLexicographic.test_visit_linksc                 C   rf  )z:check that File.visititems iterates in lexicographic orderrg  N)rV  r   rA  r\  r   ri  rc  r   r   r   rE  z  rj  z!TestLexicographic.test_visititemsc                 C   rf  )z@check that File.visititems_links iterates in lexicographic orderrg  N)rV  r   rU  r\  r   ri  rc  r   r   r   test_visititems_links  rj  z'TestLexicographic.test_visititems_linksc                 C   s4   t  }| jd | |jt|j| jdksJ dS )z6check that Group.visit iterates in lexicographic orderrb  rg  Nrh  rc  r   r   r   test_visit_group  s   z"TestLexicographic.test_visit_group)r#   r$   r%   rN   operatormethodcallerri  r   re  r8  rS  rE  rk  rl  r   r   r   r   r^  D  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 /fooN)r   r1   r3   r   r%  r   r   r   
test_spath  s   zTestSoftLinks.test_spathc                 C   s   t d}| t|t dS )z SoftLink path repr rp  N)r   r(   r   r   rq  r   r   r   
test_srepr  s   zTestSoftLinks.test_sreprc                 C   sN   t d}t d}| j|}td| }|| j|< | j| }| || dS )z$ Create new soft link by assignment newaliasr0   N)r   r   r'   r   r1   )r   rt  ru  r   r%  g2r   r   r   rf     s   

zTestSoftLinks.test_createc                 C   sN   t  }td| j|< | t | j|  W d   dS 1 s w   Y  dS )z0 Opening dangling soft link results in KeyError rt  N)r   r   r   r7   r   r9   r   r   r   test_exc  s
   "zTestSoftLinks.test_excN)r#   r$   r%   rN   rr  rs  rf   rw  r   r   r   r   ro    s    ro  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    rz  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.hdf5rp  N)r   r1   filenamer3   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}  rp  N)r   r(   r   r   r  r   r   r   
test_erepr  s   
zTestExternalLinks.test_ereprc                 C   sL   t  }t| jd| j|< | j| }|j| _| | j| j | |jd dS )z Creating external links r   N)	r   r   ry  r   filerz  assertNotEqualr1   r2   re   r   r   r   rf     s   
zTestExternalLinks.test_createc                 C   sR   t  }t| jd| j|< | t | j|  W d   dS 1 s"w   Y  dS )z5 KeyError raised when attempting to open broken link z/missingN)r   r   ry  r   r7   r   r9   r   r   r   rw    s
   "zTestExternalLinks.test_excc                 C   sP   t  }tdd| j|< | t | j|  W d   dS 1 s!w   Y  dS )z6 KeyError raised when attempting to open missing file r   rp  N)r   r   r   r7   r   r9   r   r   r   test_exc_missingfile  s
   "z&TestExternalLinks.test_exc_missingfilec                 C   s>   t  }t| jd| j|< | j| }|j}|  | | dS )zT Files opened by accessing external links can be closed

        Issue 189.
        r0   N)r   r   ry  r   r  r    r   )r   r2   r*   f2r   r   r   test_close_file  s   
z!TestExternalLinks.test_close_filezNo unicode filename supportc                 C   sZ   t jt d}t|d}|d W d   n1 sw   Y  t|d| jt < dS )zh
        Check that external links encode unicode filenames properly
        Testing issue #732
           α.hdf5r   r"  Nr   )	osr3   joinr   r   r'   r   r   r   )r   ext_filenameext_filer   r   r   test_unicode_encode  s
   z%TestExternalLinks.test_unicode_encodec                 C      t  }tjt d}t|d}|d d|d jd< W d   n1 s'w   Y  t|d| j	|< | 
| j	| jd d dS )zh
        Check that external links decode unicode filenames properly
        Testing issue #732
        r  r   r"  r   ext_attrNr   r   r  r3   r  r   r   r'   attrsr   r   r1   r   r2   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   /αr  r  r   r   r   test_unicode_hdf5_path  s   
z(TestExternalLinks.test_unicode_hdf5_pathN)r#   r$   r%   rN   r   r!   r  r  rf   rw  r  r  r   skipIfNO_FS_UNICODEr  r  r  r   r   r   r   rx    s    		




rx  c              	   C   s  | t d }t|d}|d W d   n1 sw   Y  | t d }t|d}tt|d|d< W d   n1 s@w   Y  t|d9}|jddd	}|jjdksZJ t	
t d
|d< W d   n1 snw   Y  W d   dS W d   dS 1 sw   Y  dS )z<Check that external link is opened with modified access modeexternal{}.h5r   /groupN	main{}.h5r   r   r   
elink_moder   rX   )r   r   r'   rl   r   r   ro   r  moder   raisesr8   )tmp_pathexternal_filepathexternal_filemain_filepath	main_file	ext_groupr   r   r   test_get_elink_mode_arg  s"   
"r  c              	   C   s  | t d }t|d}|d W d   n1 sw   Y  | t d }t|d}tt|d|d< W d   n1 s@w   Y  t|d-}tt |j	dd	d
 W d   n1 sbw   Y  W d   dS W d   dS 1 szw   Y  dS )zFCheck that external links open in write mode from read-only file failsr  r   r  Nr  r   r   r"  zr+r  )
r   r   r'   rl   r   r   r   r  r8   ro   r  r  r  r  r  r   r   r   !test_get_elink_mode_arg_exception*  s   "r  	file_swmr)FT
elink_swmrc                 C   s   | t d }t|ddd}|d W d   n1 sw   Y  | t d }t|ddd}tt|d|d< W d   n1 sDw   Y  t|d	|d
 }|jd|d}|jjd	ks`J |jj	|kshJ W d   dS 1 ssw   Y  dS )DCheck that external links are opened with custom read-only SWMR moder  r   latestlibverr  Nr  r   r   )swmrr"  r  
r   r   r'   rl   r   r   ro   r  r  	swmr_mode)r  r  r  r  r  r  r  r  r   r   r   $test_get_elink_swmr_arg_from_ro_file9  s   "r  c                 C   s   | t d }t|ddd}|d W d   n1 sw   Y  | t d }t|ddd}tt|d|d< W d   n1 sDw   Y  t|d	!}|jd
d|d}|jjdks_J |jj	|ksgJ W d   dS 1 srw   Y  dS )r  r  r   r  r  r  Nr  r   r   r"  r   )r  r  r  )r  r  r  r  r  r  r  r   r   r   $test_get_elink_swmr_arg_from_rw_fileK  s   "r  c              	   C   s  | t d }t|ddd}|d W d   n1 sw   Y  | t d }t|dddV}tt|d|d< d	|_tt	 |j
d
dd W d   n1 sTw   Y  tt	 |j
d
dd W d   n1 spw   Y  W d   dS W d   dS 1 sw   Y  dS )zeCheck that exceptions are raised when changing access mode from a file opened in read-write SWMR moder  r   r  r  r  Nr  r   Tr"  r   r  Fr  )r   r   r'   rl   r   r   r  r   r  r8   ro   r  r   r   r   )test_get_elink_swmr_arg_from_rw_swmr_file\  s"   "r  file_locking)FTbest-effortz elink_locking,file_locking_props))Fry   )T)r   r   )r  )r   r   c                 C   sD  | t d }t|d}|d d|d< W d   n1 sw   Y  | t d }t|d}tt|d|d< W d   n1 sCw   Y  t|d	|d
I}|jdd|d}|tu s^J |jdd|d}	t|	tsmJ |jd|d}
t	j
jdkr|
jj }| |ksJ W d   dS W d   dS 1 sw   Y  dS )z=Check that external links are opened with custom file lockingr  r   r  r   r{   rt   z/group/dataNr  r"  r   )lockingz/external/dataT)r  elink_locking)r$  r  )r  )r      rR   )r   r   r'   r   r   ro   r	   rp   r   rl   versionhdf5_version_tupler  r<   get_access_plistget_file_locking)r  r  r  file_locking_propsr  r  r  r  clslinkr  access_plistr   r   r   test_get_elink_locking_argn  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    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   r   r0   r  r   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%   rN   r  r   r   r   r   r    s    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   f1r  r   r   r   r   r     s   zTestCopy.setUpc                 C   r{  r   )r  r    r  r   r   r   r   r!     r|  zTestCopy.tearDownc                 C   sj   t d}t d}| j|}g d|d< | j|| | j| }| |t | |d tg d d S )Nfoo1foo2r  r  )	r   r  r'   copyr(   r   rW   rU   r
  r   name1name2r  r  r   r   r   test_copy_path_to_path  s   
zTestCopy.test_copy_path_to_pathc                 C   s   t d}t d}| j|}g d|d< | j|}| j|| | j| }| |t | || d tg d | j|| j	d  | | j	| t | | j	| d tg d d S Nr  r  r  r  rk   r0   
r   r  r'   r  r(   r   rW   rU   r
  r  )r   r  r  r  r  r  r   r   r   test_copy_path_to_group  s   
 &z TestCopy.test_copy_path_to_groupc                 C   s   t d}t d}| j|}g d|d< | j|| | j| }| |t | |d tg d | j	|| | | j	| t | | j	| d tg d d S )Nr  r  r  r  rk   r  r  r   r   r   test_copy_group_to_path  s   
&z TestCopy.test_copy_group_to_pathc                 C   s   t d}t d}| j|}g d|d< | j|}| j|| | j| }| |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   s2  t d}t d}t d}t d}g d| j|< | j| }| j|}| j|| | | j| tg d | j|| | | j| tg d | j|| | | jd| d|  tg d | j|| j | | j| tg d | j| j| | j| | | j| tg d d S )Nri   r  r  r*   r  r0   )r   r  r'   r  rW   rU   r
  r  )r   r  r  name3name4ri   r*   r   r   r   test_copy_dataset   s&   
  zTestCopy.test_copy_datasetc                 C   s(  t d}t d}| j|}|d}g d|d< g d|d< | jj||dd	 | j| }| |t | |d t | t|d d
 | |d t	
g d | jj||dd	 | | jd|  t | | j| d t | t| j| d d
 | | j| d t	
g d d S )Nr  r  r  r  quxrR   rz      quuxT)shallowr   r0   rk   /qux)r   r  r'   r  r(   r   r1   r   rW   rU   r
  r  )r   r  r  r  r  r  r   r   r   test_copy_shallow  s"   

&zTestCopy.test_copy_shallowc                 C   s   t d}t d}g d| j|< | j| }g d|jd< | jj||dd | | j| tg d d| j| jvs<J | jj||dd | | j| tg d d| j| jvs]J d S )Nr  r  r  r  r  T)without_attrs)r   r  r  r  rW   rU   r
  r  )r   r  r  r  r   r   r   test_copy_without_attributes1  s   
z%TestCopy.test_copy_without_attributesc                 C   s   t d}t d}t d}g d| j|< | j|}td| |d< | jj||dd | jj||dd | j|= | | j| t | | j| d	 t	
g d | | jd|  t | | j| d	 t	
g d d S )
Nri   r  r  r  r0   r  T)expand_softr  )r   r  r'   r   r  r  r(   r   rW   rU   r
  )r   r  r  r  ri   r   r   r   test_copy_soft_linksA  s   "&zTestCopy.test_copy_soft_linksc                 C   s   t d}t d}t d}|  }t|d}g d||< t|j|| j|< W d    n1 s/w   Y  | | j| tg d | jj	||dd t
| | | j| tg d d S )Nri   r  r  r   r  T)expand_external)r   r   r   r   r~  r  rW   rU   r
  r  r  unlink)r   r  r  r  r~  r  r   r   r   test_copy_external_linksT  s   
 z!TestCopy.test_copy_external_linksc           	      C   s  t d}t d}t d}t d}g d| j|< g d| j|< | j| }| j| }|j|jd< | jj||dd | | j| tg d | j| jd }| | j| tg d | | j| j	|j	 | jj|| j
|dd | | j
| tg d | j
| jd }| | j
| tg d | jjd	| j
|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 )
Nri   r  r  r  r  r  T)expand_refsr0   )r   r  r   r  r  rW   rU   r
  r  r2   r  r1   )	r   r  r  r  r  ri   r  baz_barfoo_barr   r   r   test_copy_refsd  s0   

&&&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   sh   t d}t d}t d}| j|}| j|| | | j| | | j|| | | j| | dS )z Moving an object r   r   zz{}/nested/pathN)r   r   r'   mover1   )r   r   r   ra  r*   r   r   r   test_move_hardlink  s   zTestMove.test_move_hardlinkc                 C   sX   t d}t d}t d}t|| j|< | j|| | jj|dd}| |j| dS )z Moving a soft link r!  new_softzrelative{}/pathTr+  N)r   rl   r   r   r  ro   r1   r3   )r   r  r  r  lnkr   r   r   test_move_softlink  s   zTestMove.test_move_softlinkc                 C   sf   t d}t d}| j| | j| | t | j|| W d   dS 1 s,w   Y  dS )z! Move conflict raises ValueError r   r   N)r   r   r'   r7   r8   r  )r   r   r   r   r   r   test_move_conflict  s   "zTestMove.test_move_conflictc                 C   s$   t  }| j| | j|| dS )z Test that a null-move works N)r   r   r'   r  r9   r   r   r   test_short_circuit  s   zTestMove.test_short_circuitN)r#   r$   r%   rN   r  r  r  r  r   r   r   r   r    s    
r  c                   @   rO   )TestMutableMappingzSTests if the registration of Group as a MutableMapping
    behaves as expected
    c                 C   s.   t ttsJ | jt }t|tsJ d S r   )
issubclassr   r   r   r'   r   rp   r)   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%   rN   r  r  r   r   r   r   r    s    r  )>rN   numpyrU   r  os.pathcollections.abcr   tempfiler   r   rl   r   r   r   r   r   r	   r
   r   h5py._hl.compatr   commonr   r   r   r   UnicodeEncodeErrorr  r   r&   rP   r\   r`   r   r   r   r   r   r   r   r   r   r   r  r0  rM  rV  r^  ro  rx  r  r  r   parametrizer  r  r  r  r  r  r  r  r   r   r   r   <module>   sx   
		;B%FT#kR+-H#j
& P.