B
      ›\K3  ã               @   s°  d dl m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
 d dlT d dlZyd dlZW n ek
r„   dZY nX d dlmZ d dlmZ	 d dlmZ d dlmZ d dlmZmZ d d	lmZ d
Ze	 e e¡ZdZe	 ej  !d¡ e¡Z"ddl#m$Z$ ddl%m&Z&m'Z'm(Z(m)Z) ej* +ej* ,e-¡¡Z.dd„ Z/G dd„ de&ƒZ0G dd„ de&ƒZ1eG dd„ de1ƒƒZ2eG dd„ de1ƒƒZ3eG dd„ de&ƒƒZ4e5dkr¬e	 ¡  dS )é    )Úprint_functionN)Úskip)Ú*)Úunittest_support)Úmain)Úclear_export_registry)Úfind_shared_endingÚfind_pyext_ending)Ú_external_compiler_okz AOT compatible compilers missingzwindows onlyÚwiné   )Úhas_blas)ÚTestCaseÚtagÚimport_dynamicÚtemp_directoryc               C   s   dt jkrt jd= dS )zVUnset MACOSX_DEPLOYMENT_TARGET because we are not building portable
    libraries
    ZMACOSX_DEPLOYMENT_TARGETN)ÚosÚenviron© r   r   ú4lib/python3.7/site-packages/numba/tests/test_pycc.pyÚunset_macosx_deployment_target*   s    
r   c               @   s   e Zd Zedd„ ƒZdS )ÚTestCompilerChecksc             C   s6   t j dd ¡d k	}|r2t j dd ¡d k	r2|  t¡ d S )NZCONDA_BUILDZVSINSTALLDIR)r   r   ÚgetÚ
assertTruer
   )ÚselfZis_running_conda_buildr   r   r   Útest_windows_compiler_validity4   s    z1TestCompilerChecks.test_windows_compiler_validityN)Ú__name__Ú
__module__Ú__qualname__Ú_windows_onlyr   r   r   r   r   r   1   s   r   c               @   s*   e Zd Zdd„ Zdd„ Zejdd„ ƒZdS )ÚBasePYCCTestc             C   s   t ƒ  tdƒ| _| jt_d S )NZ	test_pycc)r   r   ÚtmpdirÚtempfileÚtempdir)r   r   r   r   ÚsetUpA   s    
zBasePYCCTest.setUpc             C   s   d t _tƒ  d S )N)r"   r#   r   )r   r   r   r   ÚtearDownI   s    zBasePYCCTest.tearDownc          
   c   s@   t j |¡ zt|ƒ}|V  W d t j |¡ t j |d ¡ X d S )N)ÚsysÚpathÚappendr   ÚremoveÚmodulesÚpop)r   ZextdirÚnameÚlibr   r   r   Úcheck_c_extP   s    
zBasePYCCTest.check_c_extN)r   r   r   r$   r%   Ú
contextlibÚcontextmanagerr.   r   r   r   r   r    ?   s   r    c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestLegacyAPIc             C   sä   t j td¡}dtƒ  }t j | j|¡}t j |¡r>t  |¡ tdd||gd t	|ƒ}t
tƒtttg|j_t|j_t
tƒtttg|j_t|j_tƒ }| t|ƒddd¡ |  |jd	¡ tƒ }| t|ƒdd
d¡ |  |jd¡ dS )zE
        Test creating a C shared library object using pycc.
        zcompile_with_pycc.pyZtest_dll_legacyz--debugz-o)ÚargsNé{   iA  i;š  iÛ  i›Õ )r   r'   ÚjoinÚ	base_pathr   r!   ÚexistsÚunlinkr   ZCDLLZPOINTERZc_doubleZc_void_pZmultZargtypesZc_intZrestypeZc_floatÚmultfZbyrefÚassertEqualÚvalue)r   ÚsourceZcdll_modulenameZ	cdll_pathr-   Úresr   r   r   Útest_pycc_ctypes_lib^   s&    

z"TestLegacyAPI.test_pycc_ctypes_libc          	   C   sª   |   d¡ tj td¡}d}tj | j|tƒ  ¡}tj |¡rHt |¡ t	ddd||gd |  
| j|¡6}| dd	¡}|  |d
¡ | dd	¡}|  |d¡ W dQ R X dS )zF
        Test creating a CPython extension module using pycc.
        z0lack of environment can make the extension crashzcompile_with_pycc.pyZtest_pyext_legacyz--debugz--pythonz-o)r2   r3   iA  i;š  iÛ  g    lVAN)ÚskipTestr   r'   r4   r5   r!   r	   r6   r7   r   r.   ÚmultiÚassertPreciseEqualr8   )r   r;   Ú
modulenameZout_modulenamer-   r<   r   r   r   Útest_pycc_pymodulez   s    


z TestLegacyAPI.test_pycc_pymodulec          	   C   sŒ   t j td¡}t j | jd¡}t j |¡r4t  |¡ tddd||d gd t|dƒ}| 	¡ }W d	Q R X d
}d}|  
| ||f¡|¡ d	S )z?
        Test creating a LLVM bitcode file using pycc.
        Úcompile_with_pyccztest_bitcode_legacy.bcz--debugz--llvmz-oz.py)r2   ÚrbNs   ÞÀs   BCÀÞ)r   r'   r4   r5   r!   r6   r7   r   ÚopenÚreadr   Ú
startswith)r   rA   Zbitcode_modulenameÚfZbcZbitcode_wrapper_magicZbitcode_magicr   r   r   Útest_pycc_bitcode   s    

zTestLegacyAPI.test_pycc_bitcodeN)r   r   r   r=   rB   rI   r   r   r   r   r1   [   s   r1   c                   sz   e Zd Z‡ fdd„Zejdd„ ƒZdd„ Zdd„ Zd	d
„ Z	dd„ Z
dd„ Zdd„ Zedƒdd„ ƒZedƒdd„ ƒZ‡  ZS )ÚTestCCc                s0   t t| ƒ ¡  ddlm} || _t | j¡ d S )Nr   )rC   )ÚsuperrJ   r$   Ú rC   Ú_test_moduleÚimpÚreload)r   rC   )Ú	__class__r   r   r$   §   s    zTestCC.setUpc          	   c   s6   | j |_| ¡  |  | j |j¡}|V  W d Q R X d S )N)r!   Ú
output_dirÚcompiler.   r,   )r   Úccr-   r   r   r   Úcheck_cc_compiled­   s    zTestCC.check_cc_compiledc             C   s>   d|j tj |j¡dœ }| d¡| }t tj	d|g¡ d S )Nzuif 1:
            import sys
            sys.path.insert(0, %(path)r)
            import %(name)s as lib
            )r,   r'   ú z-c)
r   r   r'   ÚdirnameÚ__file__ÚstripÚ
subprocessZ
check_callr&   Ú
executable)r   r-   ÚcodeZprologr   r   r   Úcheck_cc_compiled_in_subprocess¶   s    z&TestCC.check_cc_compiled_in_subprocessc             C   s¤   | j j}|  |jd¡ | j jj}|  tj |¡|¡ | j jj	}|  
tj |¡|¡ |  tj |¡ d¡|¡ tj d¡r |  | d¡|¡ tjdkr |  d|¡ d S )NÚpycc_test_simplezpycc_test_simple.Zlinuxz.so)é   z.cpython)rM   rS   r9   r,   rQ   r   r   r'   ÚisdirZoutput_fileZassertFalser6   ÚbasenamerG   r&   ÚplatformÚendswithÚversion_infoZassertIn)r   rS   ÚdrH   r   r   r   Útest_cc_propertiesÀ   s    


zTestCC.test_cc_propertiesc          
   C   s–   |   | jj¡~}| dd¡}|  |d¡ | dd¡}|  |d¡ | d¡}|  |d¡ |  | ¡ d ¡ |  	t
¡ | dd	¡ W d Q R X W d Q R X d S )
Nr3   iA  i;š  iÛ  g    lVAé   é   r   r   )rT   rM   rS   r?   r@   r8   ZsquareZassertIsZget_noneZassertRaisesÚZeroDivisionErrorZdiv)r   r-   r<   r   r   r   Útest_compileÑ   s    
zTestCC.test_compilec          	   C   sP   | j j}||_|  |¡.}| dd¡}|  |d¡ |  |jjd¡ W d Q R X d S )Nr3   iA  i;š  r]   )rM   rS   Z
target_cpurT   r?   r@   r9   r   )r   Zcpu_namerS   r-   r<   r   r   r   Úcheck_compile_for_cpuÝ   s    zTestCC.check_compile_for_cpuc             C   s   |   t ¡ ¡ d S )N)rj   ÚllZget_host_cpu_name)r   r   r   r   Útest_compile_for_cpuæ   s    zTestCC.test_compile_for_cpuc             C   s   |   d¡ d S )NZhost)rj   )r   r   r   r   Útest_compile_for_cpu_hostê   s    z TestCC.test_compile_for_cpu_hostZ	importantc          	   C   s&  |   | jj¡}| dd¡}|  |d¡ x.ddt d¡fD ]}| |¡}|  |d¡ q<W x.ddt d¡fD ]}| 	|¡}|  |d	¡ qlW | 
d
¡}|  |d¡ |  | d¡| d¡¡ | d¡}tj d¡ ¡ }|  ||¡ | t dgd ¡¡}|  |d¡ dd|i }|  ||¡ W d Q R X d S )Né   é   é€   éÿÿÿÿy      ð¿        y              ð?é   g      @g       @g      ð?g      °<é*   r   r^   aR  if 1:
                from numpy.testing import assert_equal, assert_allclose
                res = lib.power(2, 7)
                assert res == 128
                res = lib.random(42)
                assert_allclose(res, %(expected)s)
                res = lib.spacing(1.0)
                assert_allclose(res, 2**-52)
                Úexpected)rT   rM   Zcc_helperlibZpowerr@   ÚnpZ
complex128ZsqrtÚfloat64Znp_sqrtZspacingZassertNotEqualZrandomZRandomStateZrandom_sampleÚsizer\   )r   r-   r<   Úvalrt   r[   r   r   r   Útest_compile_helperlibî   s&    




zTestCC.test_compile_helperlibc          	   C   s¸   |   | jj¡ }|  | d¡d¡ | d¡}|  t|ƒdddg¡ tr\| 	d¡}|  |d¡ t
 ddd	d
dg¡}| |¡}t
 |¡}|  ||¡ dttd }|  ||¡ W d Q R X d S )Nr   g        r^   r   rr   g      >@g       @g      @g      ð?g      @g      @aB  if 1:
                from numpy.testing import assert_equal
                from numpy import float64, argsort
                res = lib.zero_scalar(1)
                assert res == 0.0
                res = lib.zeros(3)
                assert list(res) == [0, 0, 0]
                if %(has_blas)s:
                    res = lib.vector_dot(4)
                    assert res == 30.0
                val = float64([2., 5., 1., 3., 4.])
                res = lib.np_argsort(val)
                expected = argsort(val)
                assert_equal(res, expected)
                )r   )rT   rM   Zcc_nrtr@   Zzero_scalarZzerosr9   Úlistr   Z
vector_dotru   rv   Z
np_argsortZargsortÚdictr\   )r   r-   r<   rx   rt   r[   r   r   r   Útest_compile_nrt  s    



zTestCC.test_compile_nrt)r   r   r   r$   r/   r0   rT   r\   re   ri   rj   rl   rm   r   ry   r|   Ú__classcell__r   r   )rP   r   rJ   ¤   s   	
	!rJ   c               @   s<   e Zd Zdd„ Zdd„ Zdd„ Ze edkd¡d	d
„ ƒZ	dS )ÚTestDistutilsSupportc             C   sB   t ƒ  tdƒ| _tj td¡}tj | jd¡| _t 	|| j¡ d S )NZtest_pycc_distutilsZpycc_distutils_usecaseZwork)
r   r   r!   r   r'   r4   r5   Úusecase_dirÚshutilZcopytree)r   Z
source_dirr   r   r   r$   4  s
    
zTestDistutilsSupport.setUpc                sŒ   dd l }tj tj tj |j¡¡¡}ttjƒ‰ ˆ  dd¡rT|tj	 ˆ d  ˆ d< n|ˆ d< ‡ ‡fdd„}||ddgƒ d}|d	|gƒ d S )
Nr   Z
PYTHONPATHrL   c                sX   t jtjg|  ˆjt jt jˆ d}| ¡ \}}| ¡ }|dkrTˆ 	d| 
dd¡ ¡ d S )N)ÚcwdÚstdoutÚstderrÚenvr   z+python failed with the following output:
%szutf-8Úignore)rY   ÚPopenr&   rZ   r   ÚPIPEZSTDOUTZcommunicateÚwaitZfailÚdecode)r2   ÚpÚoutÚ_Zrc)r„   r   r   r   Ú
run_pythonI  s    z7TestDistutilsSupport.check_setup_py.<locals>.run_pythonZ	build_extz	--inplacez¸if 1:
            import pycc_compiled_module as lib
            assert lib.get_const() == 42
            res = lib.ones(3)
            assert list(res) == [1.0, 1.0, 1.0]
            z-c)
Únumbar   r'   ÚabspathrV   rW   r{   r   r   Úpathsep)r   Zsetup_py_filerŽ   Z
numba_pathr   r[   r   )r„   r   r   Úcheck_setup_py>  s    
z#TestDistutilsSupport.check_setup_pyc             C   s,   t jdk rt jdkr|  d¡ |  d¡ d S )N)r^   Zwin32z4must use setuptools to build extensions for Python 2zsetup_distutils.py)r&   rc   ra   r>   r‘   )r   r   r   r   Útest_setup_py_distutils^  s    
z,TestDistutilsSupport.test_setup_py_distutilsNztest needs setuptoolsc             C   s   |   d¡ d S )Nzsetup_setuptools.py)r‘   )r   r   r   r   Útest_setup_py_setuptoolsd  s    z-TestDistutilsSupport.test_setup_py_setuptools)
r   r   r   r$   r‘   r’   ÚunittestÚskipIfÚ
setuptoolsr“   r   r   r   r   r~   1  s   
 r~   Ú__main__)6Z
__future__r   r/   rN   r   r€   rY   r&   r"   r”   r   ZctypesZnumpyru   r–   ÚImportErrorZllvmlite.bindingZbindingrk   rŽ   r   Z
numba.pyccr   Znumba.pycc.decoratorsr   Znumba.pycc.platformr   r	   r
   Z_skip_reasonr•   Z_skip_missing_compilersra   rG   r   Zmatmul_usecaser   Zsupportr   r   r   r   r'   rV   r   rW   r5   r   r   r    r1   rJ   r~   r   r   r   r   r   Ú<module>   sR   
H 7
