U
    ½mœd½  ã                   @   s  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 d dlm	Z	 d dl
Zd dlZd dlZze edƒ¡\ZZW n ek
rŽ   dZY nX dZe e¡ e e¡ [[G dd„ dejƒZed	d
„ ej d¡d d… D ƒƒZeddd„ƒZdd„ Zdd„ ZdS )é    N)Úcontextmanager©Úwrapsi·  FTc                   @   sh   e Zd ZdZedd„ ƒZedd„ ƒZdd	d
„Zddd„Zdd„ Z	dd„ Z
dd„ Zddd„Zddd„ZdS )ÚTestCasez(
        Base class for unit tests.
    c                 C   s   t jdd�| _d S )Nz
h5py-test_)Úprefix)ÚtempfileÚmkdtempÚtempdir©Úcls© r   úJ/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/h5py/tests/common.pyÚ
setUpClass/   s    zTestCase.setUpClassc                 C   s   t  | j¡ d S ©N)ÚshutilÚrmtreer	   r
   r   r   r   ÚtearDownClass3   s    zTestCase.tearDownClassú.hdf5Ú Nc                 C   s   |d kr| j }tj|||d�S )N)Údir)r	   r   Úmktemp)ÚselfÚsuffixr   r   r   r   r   r   7   s    zTestCase.mktempc                 C   sH   |d krddl m} |j}d }| ¡ dkr8|  |||¡}| |d¡}|S )Nr   )ÚMPI)Zmpi4pyr   Z
COMM_WORLDZGet_rankr   Zbcast)r   Zcommr   r   r   r   Úfnamer   r   r   Ú
mktemp_mpi<   s    zTestCase.mktemp_mpic                 C   s   t  |  ¡ d¡| _d S )NÚw)Úh5pyÚFiler   Úf©r   r   r   r   ÚsetUpF   s    zTestCase.setUpc                 C   s&   z| j r| j  ¡  W n   Y nX d S r   )r   Úcloser    r   r   r   ÚtearDownI   s
    zTestCase.tearDownc                 C   sl   |D ].}d}|D ]}||krd}q|st d| ƒ‚q|D ].}d}|D ]}||krDd}qD|s8t d| ƒ‚q8d S )NFTz Item '%s' appears in a but not bz Item '%s' appears in b but not a)ÚAssertionError)r   ÚaÚbÚxÚmatchÚyr   r   r   ÚassertSameElementsP   s    zTestCase.assertSameElementsc                 C   sv  |dkrd}|dkrd}nd| }t  |¡s6t  |¡r|t  |¡rJt  |¡s\td|||f ƒ‚|| |k sxtd||f ƒ‚dS |j|jksžtd|j|j|f ƒ‚|j|jksÀtd|j|j|f ƒ‚|jjdk	�r|jjD ]*}d	||f }| j|| || ||d
� qÖnn|jjdk�rFt  t  	|d |d  ¡|k ¡�srtd||f ƒ‚n,t  |d |d k¡�srtd|jj
|f ƒ‚dS )z¹ Make sure dset and arr have the same shape, dtype and contents, to
            within the given precision.

            Note that dset may be a NumPy array or an HDF5 dataset.
        Ngñhãˆµøä>r   z (%s)z&Scalar/array mismatch ("%r" vs "%r")%sz"Scalars differ by more than %.3f%szShape mismatch (%s vs %s)%szDtype mismatch (%s vs %s)%sz[FIELD %s] %s)ÚmessageÚ	precision)Úir   .z!Arrays differ by more than %.3f%sz"Arrays are not equal (dtype %s) %s)ÚnpZisscalarr$   ÚshapeZdtypeÚnamesÚassertArrayEqualÚkindÚallÚabsÚstr)r   ÚdsetÚarrr+   r,   Únr   r   r   r1   a   s<    ÿ
ÿÿÿ$
ÿÿzTestCase.assertArrayEqualFc           	   
   C   sÊ   d}z|| }W n* t k
r: } zt|ƒ}W 5 d}~X Y nX t|tƒrJ|n|f}|dkr‚|  || |¡ |sÆ|  |j |¡|¡ nD|  |¡� ||  W 5 Q R X |sÆ|  |¡� |j |¡ W 5 Q R X dS )a   Apply slicing arguments "s" to both dset and arr.

        Succeeds if the results of the slicing are identical, or the
        exception raised is of the same type for both.

        "arr" must be a Numpy array; "dset" may be a NumPy array or dataset.
        N)Ú	ExceptionÚtypeÚ
isinstanceÚtupler1   Z_fast_readerÚreadÚassertRaises)	r   r6   r7   ÚsZskip_fast_readerÚexcZ
arr_resultÚeZs_fastr   r   r   ÚassertNumpyBehavior…   s$    
þzTestCase.assertNumpyBehavior)r   r   N)Nr   r   N)NN)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úclassmethodr   r   r   r   r!   r#   r*   r1   rB   r   r   r   r   r   )   s   





$r   c                 C   s   g | ]}t |ƒ‘qS r   )Úint)Ú.0r-   r   r   r   Ú
<listcomp>¥   s     rJ   Ú.é   r   c              	   c   sT   t jd| dd��&}|j}|dk	r2| |¡ | ¡  W 5 Q R X |V  tj|dd� dS )zì
    Context manager which yields the path to a closed temporary file with the
    suffix `suffix`. The file will be deleted on exiting the context. An
    additional argument `text` can be provided to have the file contain `text`.
    úw+tF)r   ÚdeleteNT)Úignore_errors)r   ÚNamedTemporaryFileÚnameÚwriteÚflushr   r   )r   ÚtextZ	test_fileÚ	file_namer   r   r   Úclosed_tempfile§   s      ÿ
rV   c                    s   t ˆ ƒ‡ fdd„ƒ}|S )z!Runs a test in its own subprocessc              
      sþ   t  ˆ ¡d | jj }d| }dD ]}| |d¡}q"tj |d ¡}|rVˆ | f|ž|ŽS dtj|< tj ¡ }d||< | 	t
ˆ di ƒ¡ tƒ �V}t|dƒ�"}	tjtjdd	|g|	|	|d
�}
W 5 Q R X t|dƒ�}	|	 ¡ }W 5 Q R X W 5 Q R X |
dksútd| ƒ‚d S )Nz::ZIN_SUBPROCESS_z/\,:.Ú_Ú1Úsubproc_envrM   z-mZpytest)ÚstdoutÚstderrÚenvÚrtr   Ú
)ÚinspectÚgetsourcefileÚnoderQ   ÚreplaceÚosÚenvironÚgetÚcopyÚupdateÚgetattrrV   ÚopenÚ
subprocessÚcallÚsysÚ
executabler=   r$   )ÚrequestÚargsÚkwargsZ	curr_testZinsubÚcZdefinedr\   rZ   ÚfhZrtnÚout©r   r   r   Úwrapper»   s*    

  ÿzinsubprocess.<locals>.wrapperr   )r   ru   r   rt   r   Úinsubprocess¹   s    rv   c                    s   ‡ fdd„}|S )z9Set environment variables for the @insubprocess decoratorc                    s
   ˆ | _ | S r   )rY   rt   ©Údr   r   Ú	decoratorÙ   s    zsubproc_env.<locals>.decoratorr   )rx   ry   r   rw   r   rY   ×   s    rY   )r   N)rl   rc   r   r_   r   rj   Ú
contextlibr   Ú	functoolsr   Únumpyr.   r   ZunittestÚutÚmkstempÚchrZtestfiler   ÚUnicodeErrorZUNICODE_FILENAMESr"   Úunlinkr   r<   Ú__version__ÚsplitZNUMPY_RELEASE_VERSIONrV   rv   rY   r   r   r   r   Ú<module>
   s2   


|"