U
    †»|e¹  ã                   @   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dgZG dd„ deƒZ	G dd„ dƒZ
G d	d„ dƒZd
d„ Zdd„ Zdd„ Zdd„ ZdS )z
Generic test utilities.

é    NÚPytestTesterÚcheck_free_memoryÚ_TestPythranFuncc                   @   s   e Zd ZdZdS )ÚFPUModeChangeWarningzWarning about FPU mode changeN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r
   r
   úR/var/www/website-v5/atlas_env/lib/python3.8/site-packages/scipy/_lib/_testutils.pyr      s   r   c                   @   s"   e Zd ZdZdd„ Zd
dd	„ZdS )r   z)
    Pytest test runner entry point.
    c                 C   s
   || _ d S ©N)Úmodule_name)Úselfr   r
   r
   r   Ú__init__   s    zPytestTester.__init__Úfasté   NFc              
   C   sN  dd l }tj| j }	tj |	jd ¡}
ddg}|r:tdƒ‚|rJ|t	|ƒ7 }|rtt
|ƒdkrt|ddt
|ƒd   g7 }|r†|d|
 g7 }|d	krœ|d
dg7 }n|dkr°|d
|g7 }|d krÀ| jg}|d k	rú|dkrútƒ rè|dt|ƒg7 }ndd l}| d¡ |dgt	|ƒ 7 }z| |¡}W n* tk
�rD } z
|j}W 5 d }~X Y nX |dkS )Nr   z--showlocalsz
--tb=shortzDoctests not supportedr   ú-Úvz--cov=r   z-mznot slowÚfullz-nzMCould not run tests in parallel because pytest-xdist plugin is not available.z--pyargs)ÚpytestÚsysÚmodulesr   ÚosÚpathÚabspathÚ__path__Ú
ValueErrorÚlistÚintÚ_pytest_has_xdistÚstrÚwarningsÚwarnÚmainÚ
SystemExitÚcode)r   ÚlabelÚverboseÚ
extra_argvÚdoctestsÚcoverageÚtestsÚparallelr   ÚmoduleÚmodule_pathÚpytest_argsr!   r%   Úexcr
   r
   r   Ú__call__   s:    
zPytestTester.__call__)r   r   NFFNN)r   r   r   r	   r   r1   r
   r
   r
   r   r      s         ÿc                   @   s|   e Zd ZdZejejejejej	ej
gZejejgZejejgZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ ZdS )r   aL  
    These are situations that can be tested in our pythran tests:
    - A function with multiple array arguments and then
      other positional and keyword arguments.
    - A function with array-like keywords (e.g. `def somefunc(x0, x1=None)`.
    Note: list/tuple input is not yet tested!

    `self.arguments`: A dictionary which key is the index of the argument,
                      value is tuple(array value, all supported dtypes)
    `self.partialfunc`: A function used to freeze some non-array argument
                        that of no interests in the original function
    c                 C   s   i | _ d | _d | _d S r   )Ú	argumentsZpartialfuncÚexpected)r   r
   r
   r   Úsetup_method]   s    z_TestPythranFunc.setup_methodc                 C   s>   t  |¡}i }|j ¡ D ] \}}|jt jjk	r|j||< q|S r   )ÚinspectÚ	signatureÚ
parametersÚitemsÚdefaultÚ	ParameterÚempty)r   Úfuncr6   Zoptional_argsÚkr   r
   r
   r   Úget_optional_argsb   s    
z"_TestPythranFunc.get_optional_argsc                 C   s2   d}| j D ]"}t| j | d ƒ}||kr
|}q
|S )Nr   r   )r2   Úlen)r   Zmax_lenÚarg_idxÚcur_lenr
   r
   r   Úget_max_dtype_list_lengthl   s    
z*_TestPythranFunc.get_max_dtype_list_lengthc                 C   s$   |t |ƒd kr|d S || S d S )Nr   éÿÿÿÿ)r?   )r   Z
dtype_listZ	dtype_idxr
   r
   r   Ú	get_dtypeu   s    z_TestPythranFunc.get_dtypec                 C   s`   t |  ¡ ƒD ]N}g }| jD ]4}|  | j| d |¡}| | j| d  |¡¡ q| j|Ž  qd S )Nr   r   )ÚrangerB   r2   rD   ÚappendÚastypeÚpythranfunc)r   Ztype_idxÚ
args_arrayr@   Ú	new_dtyper
   r
   r   Útest_all_dtypes}   s    
ÿz _TestPythranFunc.test_all_dtypesc                 C   sF   g }| j D ],}| | j | d d d d… d d d… ¡ q
| j|Ž  d S )Nr   rC   )r2   rF   rH   ©r   rI   r@   r
   r
   r   Ú
test_views†   s    
*z_TestPythranFunc.test_viewsc                 C   sH   g }| j D ].}| tj| j | d ddd�d d d… ¡ q
| j|Ž  d S )Nr   é   )Úaxis)r2   rF   ÚnpÚrepeatrH   rL   r
   r
   r   Útest_stridedŒ   s    
 ÿÿ
z_TestPythranFunc.test_stridedN)r   r   r   r	   rP   Úint8Úint16Úint32Úint64ÚintcÚintpZALL_INTEGERÚfloat32Úfloat64Z	ALL_FLOATÚ	complex64Ú
complex128ZALL_COMPLEXr4   r>   rB   rD   rK   rM   rR   r
   r
   r
   r   r   L   s   
		c                  C   s   ddl m}  | dƒdk	S )zQ
    Check if the pytest-xdist plugin is installed, providing parallel tests
    r   ©Ú	find_specZxdistN)Zimportlib.utilr^   r]   r
   r
   r   r   ”   s    r   c                 C   s„   ddl }z$ttjd ƒ}d | tjd ¡}W n< tk
rh   tƒ }|dkrT| d¡ d | |d ¡}Y nX || d k r€| |¡ dS )zJ
    Check *free_mb* of memory is available, otherwise do pytest.skip
    r   NZSCIPY_AVAILABLE_MEMz?{0} MB memory required, but environment SCIPY_AVAILABLE_MEM={1}zlCould not determine available memory; set SCIPY_AVAILABLE_MEM variable to free memory in MB to run the test.z,{0} MB memory required, but {1} MB availableç    €„.A)r   Ú_parse_sizer   ÚenvironÚformatÚKeyErrorÚ_get_mem_availableÚskip)Zfree_mbr   Zmem_freeÚmsgr
   r
   r   r   �   s"     ÿ
 ÿ
c                 C   sx   dddddddddddddd	d
œ}t  d d | ¡ ¡¡| t j¡}|rT| d¡|kr\tdƒ‚t| d¡ƒ|| d¡  S )Nr_   g      ð?ç     @�@g    eÍÍAg   ¢”mBg      �@g      0Ag      ÐAg      pB)Ú Úbr=   ÚMÚGÚTZkbZMbZGbZTbZkibZMibZGibZTibz^\s*(\d+)\s*({0})\s*$ú|rN   zInvalid size stringr   )	ÚreÚmatchrb   ÚjoinÚkeysÚIÚgroupr   Úfloat)Úsize_strÚsuffixesÚmr
   r
   r   r`   ³   s,             üþr`   c               	   C   s¬   zddl } |  ¡ jW S  ttfk
r,   Y nX tj d¡r¨i }tddƒ�:}|D ].}| 	¡ }t
|d ƒd ||d  d¡ ¡ < qNW 5 Q R X d	|kr˜|d	 S |d
 |d  S dS )zD
    Get information about memory available, not counting swap.
    r   NÚlinuxz/proc/meminfoÚrr   rg   ú:ZmemavailableZmemfreeÚcached)ÚpsutilZvirtual_memoryÚ	availableÚImportErrorÚAttributeErrorr   ÚplatformÚ
startswithÚopenÚsplitrt   ÚstripÚlower)r|   ÚinfoÚfÚlineÚpr
   r
   r   rd   Â   s    .rd   )r	   r   rn   r   ÚnumpyrP   r5   Ú__all__ÚRuntimeWarningr   r   r   r   r   r`   rd   r
   r
   r
   r   Ú<module>   s   
7H	