a
    v=icï  ã                   @   sÆ  d Z ddlZddlZddlZddlZddlZddlZddlZddlm	Z	m
Z
mZmZ ddlmZ ddlmZ ddlZddlmZ ddlZG d	d
„ d
e
ƒZe	 ejjdk d¡G dd„ de
ƒƒZe	 ejjdk d¡ejjG dd„ de
ƒƒƒZG dd„ de
ƒZG dd„ de
ƒZe	 ejjdk d¡G dd„ de
ƒƒZe	 ejjdk d¡G dd„ de
ƒƒZ G dd„ de
ƒZ!G dd„ de
ƒZ"e	 e d ¡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/d0„ d0e
ƒZ*G d1d2„ d2e
ƒZ+ejj,G d3d4„ d4ƒƒZ-e	 ejjdk d¡G d5d6„ d6e
ƒƒZ.ejj/ejjd7k o€ejjdd… d8kp€ejjd d9k d:d;ejj/d<ej0v d=d;G d>d?„ d?ƒƒƒZ1G d@dA„ dAƒZ2dBdC„ Z3dS )Dz`
    File object test module.

    Tests all aspects of File objects, including their creation.
é    Né   )ÚutÚTestCaseÚUNICODE_FILENAMESÚclosed_tempfile)Ú
direct_vfd)ÚFileé   )Úh5c                   @   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 )ÚTestFileOpenz=
        Feature: Opening files with Python-style modes.
    c              
   C   sd  |   ¡ }t t¡8 t|ƒ W d  ƒ n1 s20    Y  W d  ƒ n1 sP0    Y  t|dƒ W d  ƒ n1 sz0    Y  t |tj¡ zRt|ƒ(}|  	|¡ |  
|jd¡ W d  ƒ n1 sÊ0    Y  W t |tj¡ nt |tj¡ 0 t|dƒ}| d¡ W d  ƒ n1 s"0    Y  |  t¡ t|ƒ W d  ƒ n1 sV0    Y  dS )z8 Default semantics in the presence or absence of a file NÚwÚrÚwbó    )ÚmktempÚpytestÚraisesÚFileNotFoundErrorr   ÚosÚchmodÚstatÚS_IREADÚ
assertTrueÚassertEqualÚmodeÚS_IWRITEÚopenÚwriteÚassertRaisesÚOSError©ÚselfÚfnameÚf© r$   úe/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/h5py/tests/test_file.pyÚtest_default&   s     
<

. *zTestFileOpen.test_defaultc                 C   sP   |   ¡ }t|dƒ}|  |¡ | d¡ | ¡  t|dƒ}|  d|¡ | ¡  dS )z' Mode 'w' opens file in overwrite mode r   ÚfooN)r   r   r   Úcreate_groupÚcloseZassertNotIn©r!   r"   Úfidr$   r$   r%   Útest_create@   s    



zTestFileOpen.test_createc                 C   s\   |   ¡ }t|dƒ}|  |¡ | ¡  |  t¡ t|dƒ W d  ƒ n1 sN0    Y  dS )z( Mode 'w-' opens file in exclusive mode úw-N)r   r   r   r)   r   ÚFileExistsErrorr*   r$   r$   r%   Útest_create_exclusiveK   s    

z"TestFileOpen.test_create_exclusivec                 C   s  |   ¡ }t|dƒ}z,|  |¡ | d¡ d|v s4J ‚W | ¡  n
| ¡  0 t|dƒ}z.d|v sbJ ‚| d¡ d|v sxJ ‚W | ¡  n
| ¡  0 t |tj¡ zLt	 
t¡ t|dƒ W d  ƒ n1 sÈ0    Y  W t |tjtjB ¡ nt |tjtjB ¡ 0 dS )zE Mode 'a' opens file in append/readwrite mode, creating if necessary Úar'   ÚbarN)r   r   r   r(   r)   r   r   r   r   r   r   ÚPermissionErrorr   r*   r$   r$   r%   Útest_appendT   s$    




*zTestFileOpen.test_appendc                 C   sx   |   ¡ }t|dƒ}| ¡  |  |¡ t|dƒ}|  |¡ |  t¡ | d¡ W d  ƒ n1 sb0    Y  | ¡  dS )z& Mode 'r' opens file in readonly mode r   r   r'   N)r   r   r)   ÚassertFalser   r   Ú
ValueErrorr(   r*   r$   r$   r%   Útest_readonlyn   s    



(zTestFileOpen.test_readonlyc                 C   s\   |   ¡ }t|dƒ}| d¡ | ¡  t|dƒ}d|v s:J ‚| d¡ d|v sPJ ‚| ¡  dS )z1 Mode 'r+' opens existing file in readwrite mode r   r'   úr+r1   N)r   r   r(   r)   r*   r$   r$   r%   Útest_readwritez   s    



zTestFileOpen.test_readwritec                 C   st   |   ¡ }|  t¡ t|dƒ W d  ƒ n1 s20    Y  |  t¡ t|dƒ W d  ƒ n1 sf0    Y  dS )z( Modes 'r' and 'r+' do not create files r   Nr7   )r   r   r   r   ©r!   r"   r$   r$   r%   Útest_nonexistent_file†   s
    (z"TestFileOpen.test_nonexistent_filec                 C   s<   |   t¡ t|  ¡ dƒ W d  ƒ n1 s.0    Y  dS )z  Invalid modes raise ValueError ZmongooseN)r   r5   r   r   )r!   r$   r$   r%   Útest_invalid_modeŽ   s    zTestFileOpen.test_invalid_modeN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r&   r,   r/   r3   r6   r8   r:   r;   r$   r$   r$   r%   r       s   	r   )r   é
   r   zRequires HDF5 1.10.1 or laterc                   @   s   e Zd ZdZdd„ ZdS )ÚTestSpaceStrategyzE
        Feature: Create file with specified file space strategy
    c                 C   sL  |   ¡ }t|ddddd}|  |¡ |  t¡ t|ddd W d  ƒ n1 sR0    Y  |  t¡" t|   ¡ dd	d W d  ƒ n1 sŽ0    Y  |jd
ddd}d|d< |jdddd}d|d< |d
= | ¡  t|dƒ}|j ¡ }| 	¡ }|d dksJ ‚|d dksJ ‚|d dks(J ‚|jdddd}d|d< | ¡  dS )z& Create file with file space strategy r   ÚpageTéd   )Úfs_strategyZ
fs_persistZfs_thresholdr0   )rD   NÚinvalidr'   ©rC   Zuint8)Zdtyper   .r1   r   r	   Zfoo2)
r   r   r   r   r5   Zcreate_datasetr)   ÚidZget_create_plistZget_file_space_strategy)r!   r"   r+   ZdsetÚplistZfs_stratr$   r$   r%   Útest_create_with_space_strategyœ   s0    ÿ
,0

z1TestSpaceStrategy.test_create_with_space_strategyN)r<   r=   r>   r?   rI   r$   r$   r$   r%   rA   ”   s   rA   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚTestPageBufferingz)
        Feature: Use page buffering
    c                 C   sè   |   ¡ }t|dddd W d  ƒ n1 s.0    Y  |  t¡ t|ddd W d  ƒ n1 sf0    Y  |  t¡  t|dddd W d  ƒ n1 s 0    Y  |  t¡  t|dddd W d  ƒ n1 sÚ0    Y  dS )	z;Allow page buffering only with fs_strategy="page".
        r   rB   é @  )r   rD   Úpage_buf_sizeN©r   rL   ZfsmZ	aggregate©r   r   r   r   r9   r$   r$   r%   Útest_only_with_page_strategyÄ   s    ,.z.TestPageBuffering.test_only_with_page_strategyc                 C   sl   |   ¡ }d}d}d}t|dd|||d0}|j ¡ }|  | ¡ |||f¡ W d  ƒ n1 s^0    Y  dS )zHVerify set page buffer size, and minimum meta and raw eviction criteria.rK   é   éC   r   rB   )r   rD   rL   Zmin_meta_keepZmin_raw_keepN©r   r   rG   Úget_access_plistr   Zget_page_buffer_size)r!   r"   ÚpbsÚmmÚmrr#   Úfaplr$   r$   r%   Útest_check_page_buf_sizeÑ   s    ÿ
z*TestPageBuffering.test_check_page_buf_sizec                 C   s|   |   ¡ }d}t|dd|d W d  ƒ n1 s20    Y  |  t¡" t|d|d d W d  ƒ n1 sn0    Y  dS )	z;Page buffer size must be greater than file space page size.rK   r   rB   ©r   rD   Zfs_page_sizeNr   r   rM   rN   )r!   r"   Úfspr$   r$   r%   Útest_too_small_pbsÜ   s    z$TestPageBuffering.test_too_small_pbsc                 C   s˜   |   ¡ }d}d| }t|dd|d W d  ƒ n1 s:0    Y  t|d|d d	.}|j ¡ }|  | ¡ d
 |¡ W d  ƒ n1 sŠ0    Y  dS )zVerify actual page buffer size.rK   r	   r   rB   rY   Nr   r   rM   r   rR   )r!   r"   rZ   rT   r#   rW   r$   r$   r%   Útest_actual_pbså   s    
z!TestPageBuffering.test_actual_pbsN)r<   r=   r>   r?   rO   rX   r[   r\   r$   r$   r$   r%   rJ   ¼   s
   	rJ   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú	TestModesz?
        Feature: File mode can be retrieved via file.mode
    c                 C   s|   |   ¡ }t|dƒ}|  |jd¡ W d  ƒ n1 s60    Y  t|dƒ}|  |jd¡ W d  ƒ n1 sn0    Y  dS )z/ Mode equivalent can be retrieved via property r   r7   Nr   )r   r   r   r   r    r$   r$   r%   Útest_mode_attr÷   s
    ,zTestModes.test_mode_attrc                 C   sÊ   |   ¡ }|   ¡ }t|dƒ}| ¡  t|dƒ}z<t |d¡|d< |d j}|  |jd¡ W | ¡  | ¡  n| ¡  | ¡  0 t|dƒ}z,|d j}|  |jd¡ W | ¡  | ¡  n| ¡  | ¡  0 dS )zU Mode property works for files opened via external links

        Issue 190.
        r   ú/ZExternalr7   r   N)r   r   r)   Úh5pyZExternalLinkÚfiler   r   )r!   Zfname1Zfname2Úf1Úf2Zf3r$   r$   r%   Útest_mode_externalÿ   s*    



ÿ



ÿzTestModes.test_mode_externalN)r<   r=   r>   r?   r^   rd   r$   r$   r$   r%   r]   ñ   s   r]   c                   @   sˆ   e Zd ZdZe ejdkd¡dd„ ƒZe e	d¡dd„ ƒZ
e ejdkd	¡d
d„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚTestDriverszz
        Feature: Files can be opened with low-level HDF5 drivers. Does not
        include MPI drivers (see bottom).
    Úposixz"Stdio driver is supported on posixc                 C   sh   t |  ¡ ddd}|  |¡ |  |jd¡ | ¡  t |  ¡ ddd}|  |¡ |  |jd¡ | ¡  dS )z$ Stdio driver is supported on posix r   Zstdio©Údriverr0   N©r   r   r   r   rh   r)   ©r!   r+   r$   r$   r%   Ú
test_stdio#  s    

zTestDrivers.test_stdiozODIRECT driver is supported on Linux if hdf5 is built with the appriorate flags.c           
   	   C   sb  t |  ¡ ddd}|  |¡ |  |jd¡ |j ¡  ¡ }| ¡  t |  ¡ ddd}|  |¡ |  |jd¡ | ¡  ||d |d d|d  f|d d |d d|d  f|d d|d  d	|d  ffD ]”\}}}t |  ¡ dd|||d
`}|j ¡  ¡ }|d }|d }|d }	||ks J ‚||ks.J ‚|	|	ks<J ‚W d  ƒ qÈ1 sR0    Y  qÈdS )z$ DIRECT driver is supported on Linuxr   Údirectrg   r0   r   r   é   r	   é   )rh   Ú	alignmentÚ
block_sizeÚ	cbuf_sizeN)	r   r   r   r   rh   rG   rS   Zget_fapl_directr)   )
r!   r+   Zdefault_faplro   rp   rq   Zactual_faplZactual_alignmentZactual_block_sizeZactual_cbuf_sizer$   r$   r%   Útest_direct1  s6    

üýzTestDrivers.test_directz!Sec2 driver is supported on posixc                 C   sh   t |  ¡ ddd}|  |¡ |  |jd¡ | ¡  t |  ¡ ddd}|  |¡ |  |jd¡ | ¡  dS )z# Sec2 driver is supported on posix r   Zsec2rg   r0   Nri   rj   r$   r$   r%   Ú	test_sec2c  s    

zTestDrivers.test_sec2c                 C   s€   |   ¡ }t|dddd}|  |¡ |  |jd¡ | ¡  |  tj 	|¡¡ t|   ¡ ddd}|  |¡ |  |jd¡ | ¡  dS )z- Core driver is supported (no backing store) r   ÚcoreF©rh   Úbacking_storer0   rg   N)
r   r   r   r   rh   r)   r4   r   ÚpathÚexistsr*   r$   r$   r%   Ú	test_coreq  s    

zTestDrivers.test_corec                 C   s„   |   ¡ }t|dddd}| d¡ | ¡  t|dƒ}d|v s@J ‚| ¡  |  t¡ t|ddd W d  ƒ n1 sv0    Y  dS )	z3 Core driver saves to file when backing store used r   rt   Tru   r'   r   )rv   N)r   r   r(   r)   r   Ú	TypeErrorr*   r$   r$   r%   Útest_backing€  s    

zTestDrivers.test_backingc                 C   sˆ   |   ¡ }t|dƒ}| d¡ | ¡  t|ddd}|  |¡ d|v sHJ ‚|  t¡ | d¡ W d  ƒ n1 sr0    Y  | ¡  dS )z0 Core driver can be used to open existing files r   r'   r   rt   rg   r1   N)r   r   r(   r)   r   r   r5   r*   r$   r$   r%   r6     s    


(zTestDrivers.test_readonlyc                 C   s0   |   ¡ }t|ddddd}|  |¡ | ¡  dS )z* Core driver supports variable block size r   rt   é   F)rh   rp   rv   N)r   r   r   r)   r*   r$   r$   r%   Útest_blocksizeš  s    
ÿ
zTestDrivers.test_blocksizec                 C   sX   |   ¡ }t|ddd}| ¡  |  tj |d ¡¡ t|ddd}|  |¡ | ¡  dS )z* Split stores metadata in a separate file r   Úsplitrg   z-m.h5r   N)r   r   r)   r   r   rw   rx   r*   r$   r$   r%   Ú
test_split¢  s    
zTestDrivers.test_splitc                 C   sr   t  ¡ }t|ddd}|  |¡ |  |jd¡ | ¡  |  t¡ t|ddd W d  ƒ n1 sd0    Y  dS )z( Python file object driver is supported r   Úfileobjrg   rt   N)	ÚtempfileÚTemporaryFiler   r   r   rh   r)   r   r5   )r!   Útfr+   r$   r$   r%   Útest_fileobj¬  s    
zTestDrivers.test_fileobjN)r<   r=   r>   r?   r   Ú
skipUnlessr   Únamerk   r   rr   rs   ry   r{   r6   r}   r   r„   r$   r$   r$   r%   re     s   
ÿ
/

re   )r   r@   r	   zRequires HDF5 before 1.10.2c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )Ú
TestLibverze
        Feature: File format compatibility bounds can be specified when
        opening a file.
    c                 C   s(   t |  ¡ dƒ}|  |jd¡ | ¡  dS )ú Opening with no libver arg r   ©ÚearliestÚlatestN©r   r   r   Úlibverr)   ©r!   r#   r$   r$   r%   r&   Ã  s    zTestLibver.test_defaultc                 C   s,   t |  ¡ ddd}|  |jd¡ | ¡  dS )ú  Opening with single libver arg r   r‹   ©r   )r‹   r‹   NrŒ   rŽ   r$   r$   r%   Útest_singleÉ  s    zTestLibver.test_singlec                 C   s,   t |  ¡ ddd}|  |jd¡ | ¡  dS )ú Opening with two libver args r   r‰   r   NrŒ   rŽ   r$   r$   r%   Útest_multipleÏ  s    zTestLibver.test_multiplec                 C   s(   t |  ¡ dƒ}|  |jd¡ | ¡  dS )ú6 Omitting libver arg results in maximum compatibility r   r‰   NrŒ   rŽ   r$   r$   r%   Ú	test_noneÕ  s    zTestLibver.test_noneN)r<   r=   r>   r?   r&   r‘   r“   r•   r$   r$   r$   r%   r‡   º  s
   r‡   zRequires HDF5 1.10.2 or laterc                       sp   e Zd ZdZe‡ fdd„ƒZdd„ Zdd„ Zdd	„ Zd
d„ Z	e
 ejjdk d¡dd„ ƒZdd„ Zdd„ Z‡  ZS )ÚTestNewLibverz
        Feature: File format compatibility bounds can be specified when
        opening a file.

        Requirement: HDF5 1.10.2 or later
    c                    s<   t ƒ  ¡  tjjdk rd| _ntjjdk r2d| _nd| _d S )N©r   é   é   Úv110)r   é   r   Úv112Zv114)ÚsuperÚ
setUpClassr`   ÚversionÚhdf5_version_tupler‹   )Úcls©Ú	__class__r$   r%   rž   ç  s    
zTestNewLibver.setUpClassc                 C   s.   t |  ¡ dƒ}|  |jd| jf¡ | ¡  dS )rˆ   r   rŠ   N©r   r   r   r   r‹   r)   rŽ   r$   r$   r%   r&   ó  s    zTestNewLibver.test_defaultc                 C   s4   t |  ¡ ddd}|  |j| j| jf¡ | ¡  dS )r   r   r‹   r   Nr¤   rŽ   r$   r$   r%   r‘   ù  s    zTestNewLibver.test_singlec                 C   s2   t |  ¡ ddd}|  |jd| jf¡ | ¡  dS )z  Opening with "v108" libver arg r   Úv108r   Nr¤   rŽ   r$   r$   r%   Útest_single_v108ÿ  s    zTestNewLibver.test_single_v108c                 C   s2   t |  ¡ ddd}|  |jd| jf¡ | ¡  dS )z  Opening with "v110" libver arg r   rš   r   Nr¤   rŽ   r$   r$   r%   Útest_single_v110  s    zTestNewLibver.test_single_v110r—   zRequires HDF5 1.11.4 or laterc                 C   s2   t |  ¡ ddd}|  |jd| jf¡ | ¡  dS )z  Opening with "v112" libver arg r   rœ   r   Nr¤   rŽ   r$   r$   r%   Útest_single_v112  s    zTestNewLibver.test_single_v112c                 C   s,   t |  ¡ ddd}|  |jd¡ | ¡  dS )r’   r   )rŠ   r¥   r   NrŒ   rŽ   r$   r$   r%   r“     s    zTestNewLibver.test_multiplec                 C   s.   t |  ¡ dƒ}|  |jd| jf¡ | ¡  dS )r”   r   rŠ   Nr¤   rŽ   r$   r$   r%   r•     s    zTestNewLibver.test_none)r<   r=   r>   r?   Úclassmethodrž   r&   r‘   r¦   r§   r   ÚskipIfr`   rŸ   r    r¨   r“   r•   Ú__classcell__r$   r$   r¢   r%   r–   Ü  s   ÿ
r–   c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚTestUserblockz;
        Feature: Files can be create with user blocks
    c                 C   sè   t |  ¡ ddd}z|  |jd¡ W | ¡  n
| ¡  0 t |  ¡ ddd}z|  |jd¡ W | ¡  n
| ¡  0 t |  ¡ ddd}z|  |jd¡ W | ¡  n
| ¡  0 |  t¡" t |  ¡ ddd W d  ƒ n1 sÚ0    Y  dS )zA User blocks created with w, w-, x and properties work correctly r-   é   ©Úuserblock_sizeÚxr   ZnonN)r   r   r   r¯   r)   r   r5   rŽ   r$   r$   r%   Útest_create_blocksize&  s    z#TestUserblock.test_create_blocksizec                 C   s’   |   ¡ }t|dƒ}| ¡  |  t¡  tj|ddd}W d  ƒ n1 sJ0    Y  |  t¡  tj|ddd}W d  ƒ n1 s„0    Y  dS )z# User block only allowed for write r   r   r­   r®   Nr7   )r   r   r)   r   r5   r`   ©r!   r†   r#   r$   r$   r%   Útest_write_only=  s    
.zTestUserblock.test_write_onlyc                 C   sŽ   |   ¡ }t|ddd}| ¡  |  t¡ t|ddd}W d  ƒ n1 sL0    Y  t|ddd}z|  |jd¡ W | ¡  n
| ¡  0 dS )zA User block size must match that of file when opening for append r   r­   r®   r0   r|   N)r   r   r)   r   r5   r   r¯   r²   r$   r$   r%   Útest_match_existingI  s    ,z!TestUserblock.test_match_existingc                 C   s´   |   ¡ }|  t¡ t|ddd}W d  ƒ n1 s60    Y  |  t¡ t|ddd}W d  ƒ n1 sn0    Y  |  t¡ t|ddd}W d  ƒ n1 s¦0    Y  dS )z7 User block size must be a power of 2 and at least 512 r   é€   r®   Ni  iÿ  )r   r   r5   r   r²   r$   r$   r%   Útest_power_of_twoX  s    ,,zTestUserblock.test_power_of_twoc                 C   s¼   |   ¡ }t|ddd}| d¡ | ¡  t|dƒ}z| d¡ W | ¡  n
| ¡  0 t |d¡}zd|v snJ ‚W | ¡  n
| ¡  0 t|dƒ}z|  | d¡d¡ W | ¡  n
| ¡  0 d	S )
z= Test that writing to a user block does not destroy the file r   r­   r®   ZFoobarzr+bs   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXr   ÚrbN)	r   r   r(   r)   r   r   r`   r   Úread)r!   r†   r#   Zpyfiler$   r$   r%   Útest_write_blocke  s     


zTestUserblock.test_write_blockN)	r<   r=   r>   r?   r±   r³   r´   r¶   r¹   r$   r$   r$   r%   r¬      s   r¬   c                   @   s   e Zd ZdZdd„ ZdS )ÚTestContextManagerzC
        Feature: File objects can be used as context managers
    c                 C   sH   t |  ¡ dƒ}|  |¡ W d  ƒ n1 s.0    Y  |  | ¡ dS )z- File objects can be used in with statements r   N)r   r   r   rj   r$   r$   r%   Útest_context_manager†  s    (z'TestContextManager.test_context_managerN)r<   r=   r>   r?   r»   r$   r$   r$   r%   rº   €  s   rº   z#Filesystem unicode support requiredc                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚTestUnicodez6
        Feature: Unicode filenames are supported
    c                 C   sR   | j tdƒd}t|dƒ}z(|  |j|¡ |  |jt¡ W | ¡  n
| ¡  0 dS )zM Unicode filenames can be used, and retrieved properly via .filename
        é   ©Úprefixr   N)r   Úchrr   r   ÚfilenameÚassertIsInstanceÚstrr)   r*   r$   r$   r%   Útest_unicode”  s    
zTestUnicode.test_unicodec                 C   sP   | j tdƒd}t|dƒ"}|  tj |¡¡ W d  ƒ n1 sB0    Y  dS )zG Unicode filenames can be used, and seen correctly from python
        r½   r¾   r   N)r   rÀ   r   r   r   rw   rx   r    r$   r$   r%   Ú#test_unicode_hdf5_python_consistentŸ  s    z/TestUnicode.test_unicode_hdf5_python_consistentc                 C   s|   | j tdƒd}|  t¡ t|dƒ W d  ƒ n1 s:0    Y  |  t¡ t|dƒ W d  ƒ n1 sn0    Y  dS )zV
        Modes 'r' and 'r+' do not create files even when given unicode names
        r½   r¾   r   Nr7   )r   rÀ   r   ÚIOErrorr   r9   r$   r$   r%   Útest_nonexistent_file_unicode¦  s
    (z)TestUnicode.test_nonexistent_file_unicodeN)r<   r=   r>   r?   rÄ   rÅ   rÇ   r$   r$   r$   r%   r¼     s   r¼   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚTestFilePropertyzk
        Feature: A File object can be retrieved from any child object,
        via the .file property
    c                 C   sD   |   ¡ }t|dƒ}z"|d j}|  ||¡ W | ¡  n
| ¡  0 dS )z, File object can be retrieved from subgroup r   r_   N)r   r   ra   r   r)   )r!   r"   ÚhfileÚhfile2r$   r$   r%   Útest_property¸  s    

zTestFileProperty.test_propertyc                 C   sV   |   ¡ }t|dƒ}| d¡}|j}|d j}| ¡  |  |¡ |  |¡ |  |¡ dS )z8 All retrieved File objects are closed at the same time r   r'   r_   N)r   r   r(   ra   r)   r4   )r!   r"   rÉ   ÚgrprÊ   Zhfile3r$   r$   r%   Ú
test_closeÂ  s    




zTestFileProperty.test_closec                 C   sF   t |  ¡ dƒ}z(| d¡}|  |jj|j¡ W | ¡  n
| ¡  0 dS )z9 Retrieved File objects have a meaningful mode attribute r   r'   N)r   r   r(   r   ra   r   r)   )r!   rÉ   rÌ   r$   r$   r%   Ú	test_modeÎ  s
    
zTestFileProperty.test_modeN)r<   r=   r>   r?   rË   rÍ   rÎ   r$   r$   r$   r%   rÈ   ±  s   
rÈ   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	Ú	TestClosez*
        Feature: Files can be closed
    c                 C   s.   t |  ¡ dƒ}|  |¡ | ¡  |  |¡ dS )z Close file via .close method r   N)r   r   r   r)   r4   rj   r$   r$   r%   rÍ   Þ  s    
zTestClose.test_closec                 C   sN   t |  ¡ dƒ}| ¡  |  t¡ | d¡ W d  ƒ n1 s@0    Y  dS )z0 Trying to modify closed file raises ValueError r   r'   N)r   r   r)   r   r5   r(   rj   r$   r$   r%   Útest_closed_fileå  s    zTestClose.test_closed_filec                 C   s2   |   ¡ }t |d¡}| d¡ | ¡  | ¡  d S )Nr   Útest)r   r`   r   r(   r)   r    r$   r$   r%   Ú"test_close_multiple_default_driverì  s
    
z,TestClose.test_close_multiple_default_driverN)r<   r=   r>   r?   rÍ   rÐ   rÒ   r$   r$   r$   r%   rÏ   Ø  s   rÏ   c                   @   s   e Zd ZdZdd„ ZdS )Ú	TestFlushz+
        Feature: Files can be flushed
    c                 C   s"   t |  ¡ dƒ}| ¡  | ¡  dS )z Flush via .flush method r   N)r   r   Úflushr)   rj   r$   r$   r%   Ú
test_flushú  s    zTestFlush.test_flushN)r<   r=   r>   r?   rÕ   r$   r$   r$   r%   rÓ   ô  s   rÓ   c                   @   s   e Zd ZdZdd„ ZdS )ÚTestReprzE
        Feature: File objects provide a helpful __repr__ string
    c                 C   s:   t |  ¡ dƒ}|  t|ƒt¡ | ¡  |  t|ƒt¡ dS )z8 __repr__ behaves itself when files are open and closed r   N)r   r   rÂ   ÚreprrÃ   r)   rj   r$   r$   r%   Ú	test_repr  s    zTestRepr.test_reprN)r<   r=   r>   r?   rØ   r$   r$   r$   r%   rÖ     s   rÖ   c                   @   s   e Zd ZdZdd„ ZdS )ÚTestFilenamezO
        Feature: The name of a File object can be retrieved via .filename
    c                 C   sJ   |   ¡ }t|dƒ}z(|  |j|¡ |  |jt¡ W | ¡  n
| ¡  0 dS )z, .filename behaves properly for string data r   N)r   r   r   rÁ   rÂ   rÃ   r)   r*   r$   r$   r%   Útest_filename  s    
zTestFilename.test_filenameN)r<   r=   r>   r?   rÚ   r$   r$   r$   r%   rÙ     s   rÙ   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú!TestCloseInvalidatesOpenObjectIDszO
        Ensure that closing a file invalidates object IDs, as appropriate
    c                 C   sü   t |  ¡ dƒb}| d¡}|  t|jƒ¡ |  t|jƒ¡ | ¡  |  t|jƒ¡ |  t|jƒ¡ W d  ƒ n1 sv0    Y  t |  ¡ dƒZ}| d¡}|  t|jƒ¡ |  t|jƒ¡ |  t|jƒ¡ |  t|jƒ¡ W d  ƒ n1 sî0    Y  dS )z; Closing a file invalidates any of the file's open objects r   r'   N)r   r   r(   r   ÚboolrG   r)   r4   )r!   rb   Úg1rc   Úg2r$   r$   r%   rÍ   &  s    
.
z,TestCloseInvalidatesOpenObjectIDs.test_closec                 C   sÄ   |   ¡ }t|dƒ}| d¡ W d   ƒ n1 s20    Y  t|ƒ}t|ƒ}|d }|d }|jjshJ ‚|jjstJ ‚| ¡  |jjrˆJ ‚|jjs”J ‚|jjs J ‚| ¡  |jjr´J ‚|jjrÀJ ‚d S )Nr   r'   )r   r   r(   rG   Zvalidr)   )r!   r"   r#   rb   rc   rÝ   rÞ   r$   r$   r%   Útest_close_one_handle6  s     (z7TestCloseInvalidatesOpenObjectIDs.test_close_one_handleN)r<   r=   r>   r?   rÍ   rß   r$   r$   r$   r%   rÛ      s   rÛ   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚTestPathlibSupportz6
        Check that h5py doesn't break on pathlib
    c              	   C   sh   t ƒ N}t |¡}t|dƒ}|  d¡ W d  ƒ n1 s<0    Y  W d  ƒ n1 sZ0    Y  dS )z- Check that pathlib is accepted by h5py.File r   TN)r   ÚpathlibÚPathr   r   )r!   r#   rw   rc   r$   r$   r%   Útest_pathlib_accepted_fileQ  s    
z-TestPathlibSupport.test_pathlib_accepted_filec              	   C   s    t ƒ †}t |¡}t|dƒ}|j}W d  ƒ n1 s80    Y  t|dƒ}|j}W d  ƒ n1 sh0    Y  |  ||¡ W d  ƒ n1 s’0    Y  dS )z1 Check that using pathlib does not affect naming r   N)r   rá   râ   r   rÁ   r   )r!   r#   rw   Zh5f1Zpathlib_nameZh5f2Znormal_namer$   r$   r%   Útest_pathlib_name_matchX  s    
$$z*TestPathlibSupport.test_pathlib_name_matchN)r<   r=   r>   r?   rã   rä   r$   r$   r$   r%   rà   L  s   rà   c                   @   s   e Zd ZdZdd„ ZdS )Ú
TestPicklez%Check that h5py.File can't be pickledc              	   C   sf   t |  ¡ dƒD}|  t¡ t |¡ W d   ƒ n1 s:0    Y  W d   ƒ n1 sX0    Y  d S )Nr   )r   r   r   rz   ÚpickleÚdumps)r!   rb   r$   r$   r%   Útest_dump_errore  s    zTestPickle.test_dump_errorN)r<   r=   r>   r?   rè   r$   r$   r$   r%   rå   c  s   rå   c                   @   sD   e Zd Zdd„ Zdd„ Zejjej	j
dk dddd	„ ƒZd
d„ ZdS )ÚTestMPIc                 C   sX   ddl m} t|dd|jd&}|s(J ‚|jdks6J ‚W d  ƒ n1 sJ0    Y  dS )ú MPIO driver and options r   ©ÚMPIr   Úmpio©rh   ZcommN©Úmpi4pyrì   r   Ú
COMM_WORLDrh   ©r!   Zmpi_file_namerì   r#   r$   r$   r%   Ú	test_mpioo  s    zTestMPI.test_mpioc                 C   sX   ddl m} t|dd|jd&}|s(J ‚|jdks6J ‚W d  ƒ n1 sJ0    Y  dS )z& Testing creation of file with append r   rë   r0   rí   rî   Nrï   rò   r$   r$   r%   Útest_mpio_appendw  s    zTestMPI.test_mpio_append)r   é   é	   z5mpio atomic file operations were added in HDF5 1.8.9+©Úreasonc                 C   s\   ddl m} t|dd|jd*}|jr*J ‚d|_|js:J ‚W d  ƒ n1 sN0    Y  dS )z$ Enable atomic mode for MPIO driver r   rë   r   rí   rî   TN)rð   rì   r   rñ   Úatomicrò   r$   r$   r%   Útest_mpi_atomic  s
    
zTestMPI.test_mpi_atomicc                 C   s<   ddl m} t|dd|jd}| d¡ | ¡  | ¡  dS )rê   r   rë   r   rí   rî   rÑ   N)rð   rì   r   rñ   r(   r)   rò   r$   r$   r%   Útest_close_multiple_mpio_driverŠ  s
    
z'TestMPI.test_close_multiple_mpio_driverN)r<   r=   r>   ró   rô   r   ÚmarkÚskipifr`   rŸ   r    rú   rû   r$   r$   r$   r%   ré   m  s   ÿ
	ré   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚTestSWMRModez=
        Feature: Create file that switches on SWMR mode
    c                 C   sr   |   ¡ }t|ddd}| d¡}|j|jj  kr:dks@n J ‚d|_|j|jj  kr`dksfn J ‚| ¡  d S )Nr   r‹   r   r'   r7   T)r   r   r(   r   ra   Ú	swmr_moder)   ©r!   r"   r+   Úgr$   r$   r%   Útest_file_mode_generalizesœ  s    
  z'TestSWMRMode.test_file_mode_generalizesc                 C   sr   |   ¡ }t|ddd}| d¡}|j|jj  kr:dks@n J ‚d|_|j|jj  kr`dksfn J ‚| ¡  d S )Nr   r‹   r   r'   FT)r   r   r(   rÿ   ra   r)   r   r$   r$   r%   Útest_swmr_mode_consistency¨  s    
  z'TestSWMRMode.test_swmr_mode_consistencyN)r<   r=   r>   r?   r  r  r$   r$   r$   r%   rþ   ”  s   rþ   )r   é   r   )r   r@   é   z+Requires HDF5 >= 1.12.1 or 1.10.x >= 1.10.7r÷   ZHDF5_USE_FILE_LOCKINGz&HDF5_USE_FILE_LOCKING env. var. is setc                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚTestFileLockingz"Test h5py.File file locking optionc              
   C   sþ   |d }t j|dddÒ}| ¡  t t¡@ t j|ddd}W d  ƒ n1 sT0    Y  W d  ƒ n1 sr0    Y  t j|ddd}W d  ƒ n1 s¢0    Y  t j|ddd}W d  ƒ n1 sÒ0    Y  W d  ƒ n1 sð0    Y  dS )	z2Test file locking when opening twice the same fileútest.h5r   T©r   Úlockingr   FNzbest-effort)r`   r   rÔ   r   r   r   )r!   Útmp_pathr"   r#   Úh5f_readr$   r$   r%   Útest_reopen¼  s    <zTestFileLocking.test_reopenc              	   C   sf   |d }t  t¡@ tj|ddd}W d  ƒ n1 s:0    Y  W d  ƒ n1 sX0    Y  dS )z&Test with erroneous file locking valuer  r   zunsupported-valuer  N)r   r   r5   r`   r   )r!   r
  r"   r  r$   r$   r%   Útest_unsupported_lockingÎ  s    z(TestFileLocking.test_unsupported_lockingc                 C   sŽ   |d }dd„ }t j|ddd}d|d< W d	  ƒ n1 s>0    Y  t j|d
dd"}||dddslJ ‚W d	  ƒ n1 s€0    Y  d	S )z<Test file locking option from different concurrent processesr  c                 S   sZ   t t tj¡jjƒ}tjtj	dd|›dt | ƒ›d|›d|› d	gdd}|j
d	koX|j S )
z9Open HDF5 file in a subprocess and return True on successz-cz
import sys
sys.path.insert(0, z)
import h5py
f = h5py.File(z, mode=z
, locking=z)
                    T)Úcapture_outputr   )rÃ   rá   râ   r`   Ú__file__ÚparentÚ
subprocessÚrunÚsysÚ
executableÚ
returncodeÚstderr)rÁ   r   r	  Zh5py_import_dirÚprocessr$   r$   r%   Úopen_in_subprocessÙ  s    üý
õz=TestFileLocking.test_multiprocess.<locals>.open_in_subprocessr   Tr  r   ÚdataNr   F)r`   r   )r!   r
  r"   r  r#   r$   r$   r%   Útest_multiprocessÕ  s    &z!TestFileLocking.test_multiprocessN)r<   r=   r>   r?   r  r  r  r$   r$   r$   r%   r  ³  s   r  c                   @   s8   e Zd Zejjejjdk p$e	 
¡ j dddd„ ƒZdS )ÚTestROS3)r   r@   rn   z/ros3 file operations were added in HDF5 1.10.6+r÷   c                 C   s\   t dddd:}|sJ ‚d| ¡ v s(J ‚|d jdks:J ‚W d  ƒ n1 sN0    Y  dS )z ROS3 driver and options z3https://dandiarchive.s3.amazonaws.com/ros3test.hdf5r   Úros3rg   Z	mydatasetrF   N)r   ÚkeysÚshaperŽ   r$   r$   r%   Ú	test_ros3÷  s    ÿzTestROS3.test_ros3N)r<   r=   r>   r   rü   rý   r`   rŸ   r    r
   Z
get_configr  r  r$   r$   r$   r%   r  ö  s
   
þr  c              	   C   s„   t dƒD ]}g | t|ƒ< q| j}|  ¡  t dƒD ]N}t |d¡.}dd„ | ¡ D ƒ}| |¡ ~W d   ƒ q01 st0    Y  q0d S )NrC   r@   r   c                 S   s   g | ]
}|j ‘qS r$   )rG   )Ú.0Údr$   r$   r%   Ú
<listcomp>  ó    z!test_close_gc.<locals>.<listcomp>)ÚrangerÃ   rÁ   r)   r`   r   ÚvaluesÚappend)Zwritable_fileÚirÁ   r#   Úrefsr$   r$   r%   Útest_close_gc  s    
r)  )4r?   r   r   r   ræ   r   r  r  Úcommonr   r   r   r   Zh5py._hl.filesr   r`   r   Ú r
   rá   r   rª   rŸ   r    rA   rü   Zmpi_skiprJ   r]   re   r…   r‡   r–   r¬   rº   r¼   rÈ   rÏ   rÓ   rÖ   rÙ   rÛ   rà   rå   Zmpiré   rþ   rý   Úenvironr  r  r)  r$   r$   r$   r%   Ú<module>
   s~   tÿ&ÿ2+ ÿ ÿB`#',
&ÿ$ýÿ=