B
     \`                 @   s  d dl mZmZmZ 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Zd dlZd dlZd dlmZmZmZmZmZmZ ddlmZ d dlmZmZ d dlmZ yd dlmZ W n  ek
r   d d	lm Z Y nX d
d Z!G dd de"Z#G dd dej$Z%G dd dej&Z'dd Z(d/ddZ)dd Z*dd Z+G dd de,Z-G dd dej.Z/G dd  d ej0Z1G d!d" d"ej2Z3G d#d$ d$ej0Z4G d%d& d&e"Z5G d'd( d(e"Z6G d)d* d*e"Z7d+d, Z8G d-d. d.ej2Z9dS )0    )print_functiondivisionabsolute_importN)resultrunnersignalssuiteloadercase   )
TestLoader)	PYVERSIONStringIO)config)TimeoutError)Emptyc                s    fdd}|S )zO
    Create a decorator allowing tests to be tagged with the *known_tags*.
    c                 s4   x" D ]}|krt d|f qW  fdd}|S )z
        Tag a test method with the given tags.
        Can be used in conjunction with the --tags command-line argument
        for runtests.py.
        zunknown tag: %rc                s`   t | rt| ts| jds&tdy
| j}W n  tk
rP   t  }| _Y nX |	  | S )NZtest_z(@tag(...) should be used on test methods)
callable
isinstancetype__name__
startswith	TypeErrortagsAttributeErrorsetupdate)funcs)r    1lib/python3.7/site-packages/numba/testing/main.pydecorate+   s    

z1make_tag_decorator.<locals>.tag.<locals>.decorate)
ValueError)r   tr    )
known_tags)r   r   tag!   s
    

zmake_tag_decorator.<locals>.tagr   )r#   r$   r   )r#   r   make_tag_decorator   s    r%   c               @   s    e Zd ZdZdd Zdd ZdS )
TestListerz5Simply list available tests rather than running them.c             C   s   d S )Nr   )selfr   r   r   __init__<   s    zTestLister.__init__c             C   sN   t jtjddd}t|| _x| jD ]}t|  q$W tdt| j  |S )NTr   )Zdescriptions	verbosityz%d tests found)	r   TextTestResultsysstderr_flatten_suiteZ
_test_listprintidlen)r'   testr   r"   r   r   r   run?   s    
zTestLister.runN)r   
__module____qualname____doc__r(   r2   r   r   r   r   r&   :   s   r&   c                   s    e Zd ZdZ fddZ  ZS )SerialSuiteaA  A simple marker to make sure tests in this suite are run serially.

    Note: As the suite is going through internals of unittest,
          it may get unpacked and stuffed into a plain TestSuite.
          We need to set an attribute on the TestCase objects to
          remember they should not be run in parallel.
    c                s@   t |tjs&x.|D ]}| | qW nd|_tt| | d S )NF)r   unittestTestCaseaddTest_numba_parallel_test_superr6   )r'   r1   r"   )	__class__r   r   r9   Q   s
    
zSerialSuite.addTest)r   r3   r4   r5   r9   __classcell__r   r   )r<   r   r6   H   s   r6   c                   sv   e Zd ZdZdZdZdZdZdZdZ	dZ
dZ fddZ fddZd	d
 Z fddZdddZ fddZ  ZS )NumbaTestPrograma3  
    A TestProgram subclass adding the following options:
    * a -R option to enable reference leak detection
    * a --profile option to enable profiling of the test run
    * a -m option for parallel execution
    * a -l option to (only) list tests

    Currently the options are only added in 3.4+.
    FN*   c                s^   t jrtd dt _|dd }t||d< tjd |dd| _	t
t| j|| d S )NzUnset INTERPRETER_FALLBACKFtopleveldirZ
testLoaderz:xnomultiproc)r   ZCOMPATIBILITY_MODEwarningswarnpopr   r+   warnoptionsappendrA   r;   r>   r(   )r'   argskwargsr@   )r<   r   r   r(   s   s    
zNumbaTestProgram.__init__c          	      s   t t|  }| jd kr,|jdddddd |jddd	d
tt dd |jdddddd |jddtdd |jddtdd |jddt	dd |jddddd |S )Nz-Rz	--refleakrefleak
store_truezDetect reference / memory leaks)destactionhelpz-mz--multiprocessmultiprocess?zParallelize tests)rK   nargsr   ZconstrM   z-lz--listlistzList tests without running themz--tagsr   zAComma-separated list of tags to select a subset of the test suite)rK   r   rM   z--exclude-tagsexclude_tagszDComma-separated list of tags to de-select a subset of the test suitez--randomrandom_selectz$Random proportion of tests to selectz	--profileprofilezProfile the test run)
r;   r>   _getParentArgParser
testRunneradd_argumentintmultiprocessing	cpu_countstrfloat)r'   parser)r<   r   r   rU      s.    






z$NumbaTestProgram._getParentArgParserc       	      C   s  d }x.|D ]&}||kr
|d kr$|}q
t d| q
W |d k	r||}yL||krn||d   }|| n$d|kr|dd  }ntdW n$ tk
r   d}t || Y nX |drt dd|krd}t || |d	d  dd
}t	| || || d S )Nzargument %s supplied repeatedlyr   =Zunreachablez,%s requires at least one tag to be specified-z,tag starts with '-', probably a syntax errorz1%s argument contains '=', probably a syntax error   _)
r!   indexstripremovesplitAssertionError
IndexErrorr   replacesetattr)	r'   argvZtagstrfoundxZposnZtag_argsmsgattrr   r   r   _handle_tags   s4    



zNumbaTestProgram._handle_tagsc                s  d|kr| d d| _tdk rd|kr|d}t }yT||d  }|dkryt|}W n$ tk
r   d}t|| Y nX | | W n t	k
r   Y nX || _
| d | |d | |d	 tt| | t| d
r| j s| jf| _|   | jr4dd | jdD }t| j|dd| _| jrddd | jdD }t| j|dd| _| jrt| j| j| j| _| jdkrd| _d S )Nz-lT)      z-mr   z--z7Expected an integer argument to option `-m`, found "%s"z--tagsz--exclude-tagsr1   c             S   s   g | ]}|  qS r   )rc   ).0r   r   r   r   
<listcomp>   s    z.NumbaTestProgram.parseArgs.<locals>.<listcomp>,include)modec             S   s   g | ]}|  qS r   )rc   )rr   r   r   r   r   rs      s    excluder   )rd   rQ   r   rb   rY   rZ   rX   BaseExceptionr!   rg   rN   ro   r;   r>   	parseArgshasattrr1   ZcountTestCasesZdefaultTestZ	testNamesZcreateTestsr   re   _choose_tagged_testsrR   rS   _choose_random_testsrandom_seedr)   buffer)r'   rj   Z
dashm_posnnprocsZm_optionrm   r   )r<   r   r   ry      sJ    





zNumbaTestProgram.parseArgsc             C   s   d S )Nr   )r'   rj   Loaderr   r   r   _do_discovery  s    zNumbaTestProgram._do_discoveryc          	      s   j r"t _ttdsDtd n" jr2t  _n jd krDt	j
 _ jr js jdk rfd}t|t j j j j jd _ fdd} jrtjtjtjd jd	 d
 }tjtjd}|  z|| W d |  t d|f  |!| X n|  d S )Ngettotalrefcountz^detecting reference leaks requires a debug build of Python, only memory leaks will be detectedr   zSValue specified for the number of processes to use in running the suite must be > 0)r)   failfastr~   c                  s   t t  d S )N)r;   r>   runTestsr   )r<   r'   r   r   run_tests_real#  s    z1NumbaTestProgram.runTests.<locals>.run_tests_real__main__r   z.prof)Ztimerz!Writing test profile data into %r)"rI   RefleakTestRunnerrV   rz   r+   rB   rC   rQ   r&   r7   TextTestRunnerrN   rA   r!   ParallelTestRunnerr)   r   r~   rT   ospathsplitextbasenamemodules__file__cProfileZProfiletimeZperf_counterenableZruncalldisabler.   Z
dump_stats)r'   rm   r   filenamep)r<   )r'   r   r   
  s<    




zNumbaTestProgram.runTests)N)r   r3   r4   r5   rI   rT   rN   rQ   r   rR   rS   r}   r(   rU   ro   ry   r   r   r=   r   r   )r<   r   r>   _   s   	%>
r>   c             C   s@   t | tjttfr6g }x| D ]}|t| qW |S | gS dS )z6
    Expand nested suite into list of test cases.
    N)r   r7   	TestSuiterQ   tupleextendr-   )r1   testsrl   r   r   r   r-   6  s    
r-   ru   c          	   C   s   g }t |}xt| D ]}t|tjs*tt||j}y
|j}W n t	k
rT   Y nX t|dd}|dkr|dk	r||@ r|
| q|dkr|dks||@ s|
| qtd| qW t|S )z
    Select tests that are tagged/not tagged with at least one of the given tags.
    Set mode to 'include' to include the tests with tags, or 'exclude' to
    exclude the tests with the tags.
    r   Nru   rw   zInvalid 'mode' supplied: %s.)r   r-   r   r7   r8   rf   getattr_testMethodNameZim_funcr   rF   r!   r   )r   r   rv   Zselectedr1   r   Z
found_tagsr   r   r   r{   C  s$    
r{   c             C   sX   t  }|| t| tjr&t| } || tt	| | } t
| dd d} t| S )z7
    Choose a given proportion of tests at random.
    c             S   s   |   S )N)r/   )r
   r   r   r   <lambda>k  s    z&_choose_random_tests.<locals>.<lambda>)key)randomZRandomseedr   r7   r   r-   ZsamplerX   r0   sorted)r   Zratior   Zrndr   r   r   r|   b  s    
r|   c              C   sx   t j} y
t j}W n tk
r,   dd }Y nX x,t jt jt jt jfD ]}|d k	rD|  qDW t 	  t
  |  | fS )Nc               S   s   dS )Nr?   r   r   r   r   r   r   x  s    z"_refleak_cleanup.<locals>.<lambda>)r+   getallocatedblocksr   r   stdoutr,   
__stdout__
__stderr__flush_clear_type_cachegcZcollect)Zfunc1Zfunc2streamr   r   r   _refleak_cleanupr  s    
r   c               @   s   e Zd ZdS )ReferenceLeakErrorN)r   r3   r4   r   r   r   r   r     s   r   c               @   s   e Zd Zdd ZdS )IntPoolc             C   s   |S )Nr   )r'   r   r   r   r   __missing__  s    zIntPool.__missing__N)r   r3   r4   r   r   r   r   r   r     s   r   c                   s,   e Zd ZdZdZdd Z fddZ  ZS )RefleakTestResultrp      c             C   s   | j   | j}| j}dg||  }dg||  }t }xtddD ]}||  qDW xt|D ]}t }|| |	 s| j
|j
 | j|j t~t \}	}
||kr||
|  ||| < ||	|  ||| < |	|
 }}q^W ||fS )Nr   i8   )r   r   repetitionswarmupr   ranger   Z
TestResultr2   wasSuccessfulfailuresr   errorsrf   r   )r'   r1   ZrepcountZnwarmup	rc_deltasalloc_deltasZ	_int_pooliZresZalloc_afterZrc_afterZ	rc_beforeZalloc_beforer   r   r   
_huntLeaks  s,    


zRefleakTestResult._huntLeaksc          	      s   y|  |\}}W n  tk
r2   |  r.td S X dd }dd }d}x|d|f|d|fgD ]z\}}}	|	|r^d|||t|f }
d	}yt|
W n tk
r   t }Y nX | jr| j	
d
||f  | || q^W |stt| | d S )Nc             S   s   t | S )N)any)deltasr   r   r   check_rc_deltas  s    z5RefleakTestResult.addSuccess.<locals>.check_rc_deltasc             S   s2   d|  d t| k rdS t| tdks.dS dS )Nrp   r   T)r   r   F)countr0   r   )r   r   r   r   check_alloc_deltas  s
    z8RefleakTestResult.addSuccess.<locals>.check_alloc_deltasFZ
referenceszmemory blocksz%s leaked %s %s, sum=%sTz%s = %r )r   rf   r   sumr   	Exceptionr+   exc_infoZshowAllr   writeZ
addFailurer;   r   
addSuccess)r'   r1   r   r   r   r   Zfailedr   Z	item_nameZcheckerrm   r   )r<   r   r   r     s0    	zRefleakTestResult.addSuccess)r   r3   r4   r   r   r   r   r=   r   r   )r<   r   r     s   r   c               @   s   e Zd ZeZdS )r   N)r   r3   r4   r   resultclassr   r   r   r   r     s   r   c               @   s   e Zd ZdZdd ZdS )ParallelTestResultzA
    A TestResult able to inject results from other results.
    c             C   sv   | j |j   | j   |  j|j7  _| j|j | j|j | j|j | j	|j	 | j
|j
 dS )zI
        Add the results from the other *result* to this result.
        N)r   r   getvaluer   testsRunr   r   r   skippedexpectedFailuresunexpectedSuccesses)r'   r   r   r   r   add_results  s    
zParallelTestResult.add_resultsN)r   r3   r4   r5   r   r   r   r   r   r     s   r   c               @   s&   e Zd ZdZdZdd ZdddZdS )	_MinimalResultz7
    A minimal, picklable TestResult-alike object.
    )	r   r   r   r   r   r   
shouldStopr   test_idc             C   s
   d|_ dS )zR
        Remove any unpicklable attributes from TestCase instance *case*.
        N)Z_outcomeForDoCleanups)r'   r
   r   r   r   
fixup_case  s    z_MinimalResult.fixup_caseNc             C   s   x"| j D ]}t| |t||d  qW x| jD ]\}}| | q,W x| jD ]\}}| | qJW x| jD ]\}}| | qhW || _d S )N)	__slots__ri   r   r   r   r   r   r   )r'   Zoriginal_resultr   rn   r
   ra   r   r   r   r(     s    z_MinimalResult.__init__)N)r   r3   r4   r5   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 )_FakeStringIOz:
    A trivial picklable StringIO-alike for Python 2.
    c             C   s
   || _ d S )N)_value)r'   valuer   r   r   r(     s    z_FakeStringIO.__init__c             C   s   | j S )N)r   )r'   r   r   r   r     s    z_FakeStringIO.getvalueN)r   r3   r4   r5   r(   r   r   r   r   r   r     s   r   c               @   s.   e Zd ZdZdd Zdd Zejdd ZdS )	_MinimalRunnerzu
    A minimal picklable object able to instantiate a runner in a
    child process and run a test case with it.
    c             C   s   || _ || _d S )N)
runner_clsrunner_args)r'   r   r   r   r   r   r(   $  s    z_MinimalRunner.__init__c          	   C   s   | j }t |d< | jf |}| }t  t| |j|_|j|_| 	| || W d Q R X t
|j |_t|| S )Nr   )r   r   r   Z_makeResultr   ZinstallHandlerZregisterResultr   r~   cleanup_objectr   r   r   r   r/   )r'   r1   rH   r   r   r   r   r   __call__+  s    

z_MinimalRunner.__call__c          	   c   s@   t |j}z
|V  W dt |j| }x|D ]}|j|= q*W X dS )zu
        A context manager which cleans up unwanted attributes on a test case
        (or any other object).
        N)r   __dict__)r'   r1   Zvanilla_attrsZspurious_attrsnamer   r   r   r   >  s    


z_MinimalRunner.cleanup_objectN)	r   r3   r4   r5   r(   r   
contextlibcontextmanagerr   r   r   r   r   r     s   r   c             C   sl   g }g }dd }t | tjrLxF| D ]$}t|\}}|| || q"W n|| r\| g}nt| }||fS )z:
    Split test suite into parallel and serial tests.
    c             S   s4   | j }t| |}|j|kr(|jdkr(dS t| ddS )NZtestFailureFr:   T)r   r   r   )r1   Zmethod_namemethodr   r   r   is_parallelizable_test_caseT  s
    
z=_split_nonparallel_tests.<locals>.is_parallelizable_test_case)r   r7   r   _split_nonparallel_testsr   r-   )r1   Zptestsstestsr   r"   r   r   r   r   r   r   M  s    


r   c                   s@   e Zd ZdZeZdZdd Zdd Zdd Z	 fd	d
Z
  ZS )r   z\
    A test runner which delegates the actual running to a pool of child
    processes.
    i,  c             K   s&   t jj| f| || _|| _|| _d S )N)r   r   r(   r   r   r   )r'   r   r   rH   r   r   r   r(   w  s    zParallelTestRunner.__init__c          	      s   t jj}d  fddtdtj D }xn|D ]f}tj}zJy	|||| W n   |
   Y nX |jr|
  P n|  W d |  X q:W |jstj}|| |S d S )Ni  c                s   g | ]}j ||   qS r   )_ptests)rr   r   )
chunk_sizer'   r   r   rs     s   z1ParallelTestRunner._run_inner.<locals>.<listcomp>r   )r   r   r   r   r0   r   rY   ZPoolr   _run_parallel_testsZ	terminater   closejoinr6   _stestsr2   )r'   r   child_runnerZsplitted_testsr   poolr   r   )r   r'   r   
_run_inner}  s(    


zParallelTestRunner._run_innerc       
   
   C   s   t dd |D }|||}xy|| j}W nj tk
rD   d S  tk
r } z:dddd t|D  }	|	f|jdd   |_|W d d }~X Y q X |	| |
|j |jr d|_d S q W d S )Nc             s   s   | ]}|  V  qd S )N)r/   )rr   r"   r   r   r   	<genexpr>  s    z9ParallelTestRunner._run_parallel_tests.<locals>.<genexpr>z3Tests didn't finish before timeout (or crashed):
%s c             s   s   | ]}d | V  qdS )z- %r
Nr   )rr   tidr   r   r   r     s    r   T)r   Zimap_unordered__next__timeoutStopIterationr   r   r   rG   r   discardr   r   )
r'   r   r   r   r   Zremaining_idsitZchild_resulterm   r   r   r   r     s"    
z&ParallelTestRunner._run_parallel_testsc                s"   t |\| _| _tt| | jS )N)r   r   r   r;   r   r2   r   )r'   r1   )r<   r   r   r2     s    zParallelTestRunner.run)r   r3   r4   r5   r   r   r   r(   r   r   r2   r=   r   r   )r<   r   r   m  s   "r   )ru   ):Z
__future__r   r   r   Znumba.unittest_supportZunittest_supportr7   collectionsr   r   r   rY   r   r   r+   r   rB   r   r   r   r   r	   r
   r   Znumba.utilsr   r   Znumbar   r   ImportErrorZQueuer   r%   objectr&   r   r6   mainr>   r-   r{   r|   r   RuntimeErrorr   defaultdictr   r*   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sL     X
N/ 