U
    ,dy!                     @   s   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mZ d dlZG dd de
ZG dd deZG d	d
 d
eZdd ZG dd deZG dd deZedkre  dS )    N)capture_cache_log)BaseCacheTest)configc                   @   sr   e Zd ZdZdZejeZ	ej
e	dZdZedZedZedZedZd	d
 Zdd Zdd ZdS )UfuncCacheTestzg
    Since the cache stats is not exposed by ufunc, we test by looking at the
    cache debug log.
    Fzcache_usecases.pyZufunc_caching_test_fodderz\[cache\] data saved toz\[cache\] index saved toz\[cache\] data loaded fromz\[cache\] index loaded fromc                 C   s<   | j |}| j|}| t|| | t|| dS )z8
        Check number of cache-save were issued
        N)regex_data_savedfindallregex_index_savedassertEquallen)selfcachelogcountZ
data_savedZindex_saved r   E/tmp/pip-unpacked-wheel-eu7e0c37/numba/tests/npyufunc/test_caching.pycheck_cache_saved   s    z UfuncCacheTest.check_cache_savedc                 C   s<   | j |}| j|}| t|| | t|| dS )z8
        Check number of cache-load were issued
        N)regex_data_loadedr   regex_index_loadedr	   r
   )r   r   r   Zdata_loadedZindex_loadedr   r   r   check_cache_loaded(   s    z!UfuncCacheTest.check_cache_loadedc           
   	   K   s~   |   }t||}t }|f |}W 5 Q R X | }| j||d t }|f |}	W 5 Q R X | }| j||d ||	fS )zf
        Check number of cache load/save.
        There should be one per overloaded version.
        r   )import_modulegetattrr   getvaluer   r   )
r   usecase_namen_overloadskwargsmodusecaseout	new_ufuncr   cached_ufuncr   r   r   check_ufunc_cache1   s    
z UfuncCacheTest.check_ufunc_cacheN)__name__
__module____qualname____doc__Z_numba_parallel_test_ospathdirname__file__herejoinZusecases_filemodnamerecompiler   r   r   r   r   r   r    r   r   r   r   r      s   



		r   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TestUfuncCacheTestc                 K   sl   | j dddi|\}}tjdtj}tj|||| tjdtjd}tj|||| d S )Ndirect_ufunc_cache_usecaser      
   Zdtype)r/   	r    nprandomZastypeZfloat64ZtestingZassert_equalarangeZintpr   r   r   r   inpr   r   r   test_direct_ufunc_cacheI   s     
z*TestUfuncCacheTest.test_direct_ufunc_cachec                 C   s   | j dd d S NT)Zforceobjr9   r   r   r   r   test_direct_ufunc_cache_objmodeR   s    z2TestUfuncCacheTest.test_direct_ufunc_cache_objmodec                 C   s   | j dd d S Nparallel)targetr;   r<   r   r   r    test_direct_ufunc_cache_parallelU   s    z3TestUfuncCacheTest.test_direct_ufunc_cache_parallelc                 K   sl   | j dddi|\}}tjdtj}tj|||| tjdtjd}tj|||| d S )Nindirect_ufunc_cache_usecaser      r1   r2   )rB   r3   r7   r   r   r   test_indirect_ufunc_cacheX   s     
z,TestUfuncCacheTest.test_indirect_ufunc_cachec                 C   s   | j dd d S r>   )rD   r<   r   r   r   "test_indirect_ufunc_cache_parallela   s    z5TestUfuncCacheTest.test_indirect_ufunc_cache_parallelN)r!   r"   r#   r9   r=   rA   rD   rE   r   r   r   r   r.   G   s
   		r.   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestDUfuncCacheTestc              	   C   s   |   }t||}t }| }W 5 Q R X | j| dd t }|td W 5 Q R X | j| dd | j| dd t }| }|td W 5 Q R X | j| dd d S )Nr   r   r1      )r   r   r   r   r   r4   r6   r   )r   r   r   r   r   Zufuncr   r   r   check_dufunc_usecaseh   s    
z(TestDUfuncCacheTest.check_dufunc_usecasec                 C   s   |  d d S )NZdirect_dufunc_cache_usecaserH   r<   r   r   r   test_direct_dufunc_cachez   s    z,TestDUfuncCacheTest.test_direct_dufunc_cachec                 C   s   |  d d S )NZindirect_dufunc_cache_usecaserI   r<   r   r   r   test_indirect_dufunc_cache~   s    z.TestDUfuncCacheTest.test_indirect_dufunc_cacheN)r!   r"   r#   rH   rJ   rK   r   r   r   r   rF   e   s   rF   c                 C   s   t jr| dd} | S )N/z\\\\)r   ZIS_WIN32replace)Zrstrr   r   r   _fix_raw_path   s    rN   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )TestGUfuncCacheTestc           	   	   C   s   |   }t|d}t }|  W 5 Q R X | }td}t|| j|}td}t|| j|}| 	t
|d | t
|t
| d S )Ndirect_gufunc_cache_usecasez/__pycache__/guf-{}z/__pycache__/{}r0   )r   r   r   r   rN   r,   r   formatr+   ZassertGreaterr
   r	   )	r   r   r   r   r   Zfmt1prefixedZfmt2normalr   r   r   test_filename_prefix   s    
z(TestGUfuncCacheTest.test_filename_prefixc                 K   sl   | j dddi|\}}tjdtj}tj|||| tjdtjd}tj|||| d S )NrP   r      r1   r2   )rP   r3   r7   r   r   r   test_direct_gufunc_cache   s     
z,TestGUfuncCacheTest.test_direct_gufunc_cachec                 C   s   | j dd d S r:   rV   r<   r   r   r    test_direct_gufunc_cache_objmode   s    z4TestGUfuncCacheTest.test_direct_gufunc_cache_objmodec                 C   s   | j dd d S r>   rW   r<   r   r   r   !test_direct_gufunc_cache_parallel   s    z5TestGUfuncCacheTest.test_direct_gufunc_cache_parallelc                 K   sl   | j dddi|\}}tjdtj}tj|||| tjdtjd}tj|||| d S )Nindirect_gufunc_cache_usecaser   rC   r1   r2   )rZ   r3   r7   r   r   r   test_indirect_gufunc_cache   s     
z.TestGUfuncCacheTest.test_indirect_gufunc_cachec                 K   s   | j dd d S r>   )r[   )r   r   r   r   r   #test_indirect_gufunc_cache_parallel   s    z7TestGUfuncCacheTest.test_indirect_gufunc_cache_parallelN)	r!   r"   r#   rT   rV   rX   rY   r[   r\   r   r   r   r   rO      s   rO   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestCacheSpecificIssuec                 C   sb   dt | j| j|d }tjtjd|gtjtjd}| \}}|j	dkr^t
d|j	| f d S )Nzif 1:
            import sys

            sys.path.insert(0, %(tempdir)r)
            mod = __import__(%(modname)r)
            mod.%(runcode)s
            )tempdirr+   runcodez-c)stdoutstderrr   z/process failed with code %s: stderr follows
%s
)dictr^   r+   
subprocessPopensys
executablePIPEcommunicate
returncodeAssertionErrordecode)r   r_   codepopenr   errr   r   r   run_in_separate_process   s    
	 
z.TestCacheSpecificIssue.run_in_separate_processc                 C   s   |  d |  d d S )Nzdirect_ufunc_cache_usecase()ro   r<   r   r   r   test_first_load_cached_ufunc   s    
z3TestCacheSpecificIssue.test_first_load_cached_ufuncc                 C   s   |  d |  d d S )Nzdirect_gufunc_cache_usecase()rp   r<   r   r   r   test_first_load_cached_gufunc   s    
z4TestCacheSpecificIssue.test_first_load_cached_gufuncN)r!   r"   r#   ro   rq   rr   r   r   r   r   r]      s   r]   __main__)re   os.pathr%   r,   rc   Znumpyr4   Znumba.tests.supportr   Znumba.tests.test_cachingr   Z
numba.corer   Zunittestr   r.   rF   rN   rO   r]   r!   mainr   r   r   r   <module>   s    92)