B
    3Rc$              	   @   s  d dl Z d dlZd dlZd dlmZ yd dlZW n ek
rH   dZY nX dZd ZdZ	dd Z
dd Zd	d
 Zdd Zedkrd dlZeejdd d\ZZd ZdZx*eD ]"\ZZedkrdZqedkrd ZqW e  Zd Zd Zg ZdZx.eD ]$Zyeed W n& ek
r0   ej !de  Y qX e j"#eZ$e j"%eZ&e$rZe 'e$ y$e Z(ee&ee\Z)Z*e Z+W n6 ek
r   d dl,Z,e,-  ej !de  Y n&X e+e( Z.eee)e*e.eej  ee.7 Ze$re 'e e/edkree/e)7 Zee*7 Ze/e)re0e qW edkrej !d ej !de  erej !deef  ej !d x8eD ]Z1ej !de1  qrW nej !dee/ef  e2e G dd dZ3G dd de3Z4G d d! d!e3Z5G d"d# d#Z6dS )$    N)RDConfigZRDKIT_BUILD_TYPEc               C   s(   yt jt dkS  tk
r"   dS X d S )NDEBUGF)osenvironBUILD_TYPE_ENVVARKeyError r	   r	   /lib/python3.7/site-packages/rdkit/TestRunner.pyisDebugBuild   s    r   c             C   s   | dkrt j} |d}t }d|kr6t|d  |dd}tsPtdn@yt	| gt
| }W n& tk
r   td|  tjd tS X d|krt| ||krtS tS d S )	NZpython dirZreturnsr   z;cannot run tests if the subprocess module is not available.zCould not find executable: %s.)file)r   Z	pythonExesplitr   getcwdchdirget
subprocessNotImplementedErrorZcalllistOSErrorprintsysstderrTEST_FAILEDTEST_PASSED)exeNameargsextrasZstartDirZexpectedReturnZretValr	   r	   r
   RunTest#   s&    


r   c          	   C   s  t jd dkrdtjd< tt jdkrDt jd dkrDtt jd  tt jd	krtt jd d
krtt jd  tjt< t jd dkrdgt j t _| 	dd } t
| }y
|j}W n tk
r   g dfS X g }|ry
|j}W n tk
r   Y nX g }xt|D ]\}}y|\}	}
}W n* tk
r@   td| t d Y nX yt|	|
|}W n* tk
r|   dd l}|  t}Y nX |tkr ||	|
|f tjdddkr t jdt|	gt|
   ||d fS q W xt|D ]|\}\}	}
}t|	|
|}|tkr||	|
|f tjdddkrt jdt|	gt|
   |t|| d fS qW t|t| }t j| = |r|rx(|D ] \}	}
}td|	|
|t jd qW ||fS )Nr   z-f1ZPYTHON_TEST_FAILFAST      z	--testDir      z--buildType   r   .z.pyz
bad entry: zExiting from %s
zExitng from %s
z!!! TEST FAILURE: )r   )r   argvr   r   lenr   upperr   pathr   
__import__testsAttributeError	longTests	enumerate
ValueErrorr   exitr   	Exception	traceback	print_excr   r   appendr   r   writestrr   modules)scriptdoLongTestsverbosemodr-   r/   failedientryr   r   r   Zresr4   nTestsr	   r	   r
   	RunScript<   sf    







rB   c       
      C   s   |s| d | d|   nt|sF| d | d| ||f  nh| d | d| t|||f  |rx>|D ]6\}}}|dd}	tj|	}	| d|	||f  qtW d S )	Nz!-!-!-!-!-!-!-!-!-!-!
z	Script: %s.  No tests run!
z-----------------
z.	Script: %s.  Passed %d tests in %.2f seconds
z6	Script: %s.  Failed %d (of %d) tests in %.2f seconds
r   r&   z		(%s): %s %s
)r7   r)   r   r   r+   abspath)
r:   ZfailedTestsrA   runTimer<   destr   r   r   dirNamer	   r	   r
   ReportResults   s    


rG   __main__r"   Zlvz-lz-vg        rz+ERROR: Test script %s could not be opened.
z'ERROR: Could not import test script %s
z3

-*-*-*-*-*-*- Test Results Summary -*-*-*-*-*-*-
z		Total run time: %.2f seconds
z,!!!!!---  %d Failures in %d tests  ---!!!!!
z	Modules with failures:
z		%s
z&  All %d tests (in %d modules) passed
c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )_RedirectStreamNc             C   s   || _ g | _d S )N)_new_target_old_targets)self
new_targetr	   r	   r
   __init__   s    z_RedirectStream.__init__c             C   s*   | j tt| j tt| j| j | jS )N)rL   r6   getattrr   _streamsetattrrK   )rM   r	   r	   r
   	__enter__   s    z_RedirectStream.__enter__c             C   s   t t| j| j  d S )N)rR   r   rQ   rL   pop)rM   exctypeexcinstexctbr	   r	   r
   __exit__   s    z_RedirectStream.__exit__)__name__
__module____qualname__rQ   rO   rS   rX   r	   r	   r	   r
   rJ      s   rJ   c               @   s   e Zd ZdZdZdS )redirect_stdoutaA  Context manager for temporarily redirecting stdout to another file.

        # How to send help() to stderr
        with redirect_stdout(sys.stderr):
            help(dir)

        # How to write help() to a file
        with open('help.txt', 'w') as f:
            with redirect_stdout(f):
                help(pow)
    stdoutN)rY   rZ   r[   __doc__rQ   r	   r	   r	   r
   r\      s   r\   c               @   s   e Zd ZdZdZdS )redirect_stderrzCContext manager for temporarily redirecting stderr to another file.r   N)rY   rZ   r[   r^   rQ   r	   r	   r	   r
   r_      s   r_   c               @   s4   e Zd ZdZejejdfddZdd Zdd Zd	S )
OutputRedirectCa  Context manager which uses low-level file descriptors to suppress
  output to stdout/stderr, optionally redirecting to the named file(s).

  Suppress all output
  with Silence():
    <code>

  Redirect stdout to file
  with OutputRedirectC(stdout='output.txt', mode='w'):
    <code>

  Redirect stderr to file
  with OutputRedirectC(stderr='output.txt', mode='a'):
    <code>
  http://code.activestate.com/recipes/577564-context-manager-for-low-level-redirection-of-stdou/
  >>>

  wbc             C   s<   ||f| _ ||k| _|| _d | _d | _d | _d | _d | _d S )N)outfilescombinemodesaved_streamsfds	saved_fdsnull_fdsnull_streams)rM   r]   r   rd   r	   r	   r
   rO     s    

zOutputRedirectC.__init__c                s   t jt jf  _}dd |D   _}dd |D  _x|D ]}|  q<W  jrt j	d  j
dgd } j	d tjkrdd |D \t _t _n fdd j	D }dd |D   _}| _x"t||D ]\}}t|| qW d S )	Nc             S   s   g | ]}|  qS r	   )fileno).0sr	   r	   r
   
<listcomp>  s    z-OutputRedirectC.__enter__.<locals>.<listcomp>c             S   s   g | ]}t |qS r	   )r   dup)rk   fdr	   r	   r
   rm     s    r   r#   c             S   s   g | ]}t |d dqS )ra   r   )r   fdopen)rk   ro   r	   r	   r
   rm     s    c                s   g | ]}t | jd qS )r   )openrd   )rk   f)rM   r	   r
   rm   !  s    c             S   s   g | ]}|  qS r	   )rj   )rk   rl   r	   r	   r
   rm   "  s    )r   
__stdout__
__stderr__re   rf   rg   flushrc   rq   rb   rd   r   devnullr]   r   rh   ri   zipdup2)rM   re   rf   rl   ri   rh   Znull_fdro   r	   )rM   r
   rS     s    
zOutputRedirectC.__enter__c             G   s   x| j D ]}|  qW x&t| j| jD ]\}}t|| q(W | j \t_t_	x| j
D ]}|  qVW x| jD ]}t| qnW dS )NF)re   ru   rw   rg   rf   r   rx   r   r]   r   ri   close)rM   r   rl   Zsaved_fdro   r	   r	   r
   rX   )  s    zOutputRedirectC.__exit__N)	rY   rZ   r[   r^   r   rv   rO   rS   rX   r	   r	   r	   r
   r`      s   
r`   )7r   r   ZtimeZrdkitr   r   ImportErrorr   r   r   r   r   rB   rG   rY   Zgetoptr(   r   r   r;   r<   argvalr   pwdZtotNumFailedZ	totNumRunZfailuresZ	timeAccumr:   rq   IOErrorr   r7   r+   dirnamerF   basenameZ
scriptBaser   Zt1r>   rA   Zt2r4   r5   rD   r)   r6   Zfailurer2   rJ   r\   r_   r`   r	   r	   r	   r
   <module>   s   
E





