
    Mh2                     :   d Z ddl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m	Z	 ddl
mZ ddlmZmZ 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dlmZ ddlmZ ej         dk    rej!        nej"        Z#e#de$de%e$         de%e$         fd            Z&d Z'de'_(        d Z)d Z*d*dZ+d+dZ,	 	 d,dZ- G d dej.                  Z/eZ0 e1 ej2        d                    Z3d Z4 G d! d"          Z5d#Z6 G d$ d%e5          Z7e	d&             Z8d' Z9d-d(Z:d-d)Z;dS ).zWGeneric testing tools.

Authors
-------
- Fernando Perez <Fernando.Perez@berkeley.edu>
    N)Path)contextmanager)StringIO)PopenPIPE)patch)Config)get_output_error_code)list_strings)temp_pyfileTee)	py3compat   )
decorators)skipdoctestwin32	startPathfilesreturnc                     t          |t                    sJ t          j                            |           d         fd|D             S )a  Make full paths for all the listed files, based on startPath.

    Only the base part of startPath is kept, since this routine is typically
    used with a script's ``__file__`` variable as startPath. The base of startPath
    is then prepended to all the listed files, forming the output list.

    Parameters
    ----------
    startPath : string
      Initial path to use as the base for the results.  This path is split
      using os.path.split() and only its first component is kept.

    files : list
      One or more files.

    Examples
    --------

    >>> full_path('/foo/bar.py',['a.txt','b.txt'])
    ['/foo/a.txt', '/foo/b.txt']

    >>> full_path('/foo',['a.txt','b.txt'])
    ['/a.txt', '/b.txt']

    r   c                 P    g | ]"}t           j                            |          #S  )ospathjoin).0fbases     U/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/IPython/testing/tools.py
<listcomp>zfull_path.<locals>.<listcomp>C   s)    222aRW\\$q!!222    )
isinstancelistr   r   split)r   r   r   s     @r   	full_pathr%   &   sM    6 eT"""""7==##A&D222252222r!   c                    t          j        d| t           j                  }|r(t          |                    d                    }d}||fS t          j        d| t           j                  }|r(d}t          |                    d                    }||fS t          j        d| t           j                  }|rHt          |                    d                    }t          |                    d                    }||fS dS )a  Parse the output of a test run and return errors, failures.

    Parameters
    ----------
    txt : str
      Text output of a test run, assumed to contain a line of one of the
      following forms::

        'FAILED (errors=1)'
        'FAILED (failures=1)'
        'FAILED (errors=1, failures=1)'

    Returns
    -------
    nerr, nfail
      number of errors and failures.
    z^FAILED \(errors=(\d+)\)r   r   z^FAILED \(failures=(\d+)\)z(^FAILED \(errors=(\d+), failures=(\d+)\)   )r   r   )research	MULTILINEintgroup)txterr_mnerrnfailfail_mboth_ms         r   parse_test_outputr3   F   s    & I13EEE 5;;q>>""eY4c2<HHF FLLOO$$eYBC|% %F 6<<??##FLLOO$$e 4r!   Fc                  
    g dS )zEReturn a valid default argv for creating testing instances of ipython)z--quickz--colors=nocolorz--no-term-titlez--no-bannerz--autocall=0r   r   r!   r   default_argvr5   t   s       r!   c                     t                      } d| j        _        d| j        _        d| j        _        t          j        dd          }t          |j	                  | j
        _        |                                 d| j
        _        | S )z6Return a config object with good defaults for testing.nocolorFr   ztest_hist.sqliteF)suffixdeletei'  )r	   TerminalInteractiveShellcolors TerminalTerminalInteractiveShell
term_titleautocalltempfileNamedTemporaryFiler   nameHistoryManager	hist_fileclosedb_cache_size)configr   s     r   default_configrH      sr    XXF-6F#*9AF+6/0F#,#+=eLLLA&*16llF#GGIII*/F'Mr!   c                 R    t           j        ddg}| rd                    |          }|S )aW  
    Return appropriate IPython command line name. By default, this will return
    a list that can be used with subprocess.Popen, for example, but passing
    `as_string=True` allows for returning the IPython command as a string.

    Parameters
    ----------
    as_string: bool
        Flag to allow to return the command as a string.
    z-mIPython )sys
executabler   )	as_stringipython_cmds     r   get_ipython_cmdrP      s1     >43K ,hh{++r!   r   c                 &   d}|g }t                      |z   }t          j                            t                    }t                      }t          j                            ||           }||z   d|gz   }t          j                                        }	d|	d<   |		                    dd           |	
                                D ]*\  }
}t          |t                    st          |
|           +t          |t          t          t          |	          }|                    t#          j        d                    |                    pd	          \  }}t#          j        |          t#          j        |          }}|rt)          j        d
d|          }||fS )a  Utility to call 'ipython filename'.

    Starts IPython with a minimal and safe configuration to make startup as fast
    as possible.

    Note that this starts IPython in a subprocess!

    Parameters
    ----------
    fname : str, Path
      Name of file to be executed (should have .py or .ipy extension).

    options : optional, list
      Extra command-line flags to be passed to IPython.

    commands : optional, list
      Commands to send in on stdin

    Returns
    -------
    ``(stdout, stderr)`` of ipython subprocess.
    TNz--ignorePYTHONWARNINGSPYCHARM_HOSTED)stdoutstderrstdinenv
)inputz\x1b\[[^h]+h )r5   r   r   dirname__file__rP   r   environcopypopitemsr"   strprintr   r   communicater   encodedecoder(   sub)fnameoptionscommands__tracebackhide__cmdargstest_dirrO   
full_fnamefull_cmdrX   kvpouterrs                  r   ipexecru      sk   . nnw&Gwx((H!##Kh..JW$j'99H
*//

C %C GGd###		  1 !S!! 	!QKKKhtD#FFFA}}9#3DIIh4G4G#H#H#PD}QQHC$$i&6s&;&;C  /f_b#..8Or!   r[   c                 >   d}t          | ||          \  }}|r|rwd                    |                                                                          d                    |                                                                          k    sJ nt	          d| d|          d                    |                                                                          d                    |                                                                          k    sJ dS )a9  Utility to call 'ipython filename' and validate output/error.

    This function raises an AssertionError if the validation fails.

    Note that this starts IPython in a subprocess!

    Parameters
    ----------
    fname : str, Path
      Name of the file to be executed (should have .py or .ipy extension).

    expected_out : str
      Expected stdout of the process.

    expected_err : optional, str
      Expected stderr of the process.

    options : optional, list
      Extra command-line flags to be passed to IPython.

    Returns
    -------
    None
    TrY   zRunning file z produced error: N)ru   r   strip
splitlines
ValueError)rh   expected_outexpected_errri   rj   rk   rs   rt   s           r   ipexec_validater|      s,   4 eWh//HC
  + 	+99SYY[[335566$))""$$//11; ;      *#eeSS* + + + 99SYY[[++--..$))''))3 3      r!   c                   ,    e Zd ZdZddZd Zd Zd ZdS )	TempFileMixinzcUtility class to create temporary Python/IPython files.

    Meant as a mixin class for test cases..pyc                     t          ||          }t          | d          sg | _        | j                            |           || _        dS )zMake a valid python temp file.tmpsN)r   hasattrr   appendrh   )selfsrcextrh   s       r   mktmpzTempFileMixin.mktmp  sK    C%%tV$$ 	DI	


r!   c                 v    t          | d          r&| j        D ] }	 t          j        |           #  Y xY wd S d S )Nr   )r   r   r   unlink)r   rh   s     r   tearDownzTempFileMixin.tearDown  sc     4   		  Ie$$$$ D		 		 s   04c                     | S Nr   r   s    r   	__enter__zTempFileMixin.__enter__$  s    r!   c                 .    |                                   d S r   )r   )r   exc_type	exc_value	tracebacks       r   __exit__zTempFileMixin.__exit__'  s    r!   N)r   )__name__
__module____qualname____doc__r   r   r   r   r   r!   r   r~   r~   	  s_        . .           r!   r~   zEDid not find {0!r} in printed output (on {1}):
-------
{2!s}
-------
c                   &    e Zd ZdZddZd Zd ZdS )	AssertPrintszContext manager for testing that code prints certain text.

    Examples
    --------
    >>> with AssertPrints("abc", suppress=False):
    ...     print("abcd")
    ...     print("def")
    ...
    abcd
    def
    rU   Tc                     || _         t          | j         t          t          f          r| j         g| _         || _        || _        d S r   )sr"   rb   _re_typechannelsuppress)r   r   r   r   s       r   __init__zAssertPrints.__init__A  s>    dfsHo.. 	fXDF r!   c                    t          t          | j                  | _        t	                      | _        t          | j        | j                  | _        t          t          | j        | j	        r| j        n| j                   d S )N)r   )
getattrrL   r   orig_stream
MyStringIObufferr   teesetattrr   r   s    r   r   zAssertPrints.__enter__H  sb    "355 llt{DL999T\$-#M4;;TXNNNNNr!   c                 |   d}	 |	 | j                                          dS | j                                          t          t          | j        | j                   | j                                        }| j	        D ]}t          |t                    rD|                    |          s.J t                              |j        | j        |                      [||v s)J t                              || j        |                      	 | j                                          dS # | j                                          w xY wNTF)r   rE   flushr   rL   r   r   r   getvaluer   r"   r   r)   notprinted_msgformatpatternr   etypevaluer   rk   printedr   s          r   r   zAssertPrints.__exit__N  s+    	  HNN HNNCt'7888k**,,GV Y Ya** Y88G,,een.C.CAIt|]d.e.eeeee<<<)>)>q$,PW)X)X<<<<HNNDHNNs   D  C"D   D;N)rU   T)r   r   r   r   r   r   r   r   r!   r   r   r   5  sS        
 
! ! ! !O O O    r!   r   z>Found {0!r} in printed output (on {1}):
-------
{2!s}
-------
c                       e Zd ZdZd ZdS )AssertNotPrintszcContext manager for checking that certain output *isn't* produced.

    Counterpart of AssertPrintsc                    d}	 |5| j                                          	 | j                                          dS | j                                          t          t          | j        | j                   | j                                        }| j	        D ]}t          |t                    rD|                    |          r.J t                              |j        | j        |                      [||vs)J t                              || j        |                      	 | j                                          dS # | j                                          w xY wr   )r   rE   r   r   rL   r   r   r   r   r   r"   r   r)   printed_msgr   r   r   s          r   r   zAssertNotPrints.__exit__k  sW    	     HNN HNNCt'7888k**,,GV 2 2a** 2 xx00 : :1C1C	4<2: 2: : : : : G+++[-?-?4<.2 .2++++HNNDHNNs   D9 C"D9 9EN)r   r   r   r   r   r   r!   r   r   r   g  s-        # #    r!   r   c              #      K   t          | dd                                           	 dV  t          j        |            dS # t          j        |            w xY w)zGCreate an empty, named, temporary file for the duration of the context.wzutf-8)encodingN)openrE   r   r   )rB   s    r   make_tempfiler     sZ       	sW%%%++---
	$	$s   A Ac                 N    t          |           dfd	}t          d|          S )a  Temporarily replace the input() function to return the given values

    Use as a context manager:

    with fake_input(['result1', 'result2']):
        ...

    Values are returned in order. If input() is called again after the last value
    was used, EOFError is raised.
    r[   c                 h    	 t                    S # t          $ r}t          d          |d }~ww xY w)NzNo more inputs given)nextStopIterationEOFError)prompteits     r   
mock_inputzfake_input.<locals>.mock_input  sC    	:88O 	: 	: 	:1229	:s    
1,1zbuiltins.inputr[   )iterr   )inputsr   r   s     @r   
fake_inputr     sA     
fB: : : : : : !:...r!   c                     t                      | dgz   }t          |          \  }}}|dk    s
J |            d|vsJ d|v sJ d|v sJ ||fS )z)test that `ipython [subcommand] -h` worksz-hr   	TracebackOptions
--help-allrP   r
   
subcommandcmdrs   rt   rcs        r   help_output_testr     sy    


z40
0C(--LCb777C777c!!!!38Or!   c                     t                      | dgz   }t          |          \  }}}|dk    s
J |            d|vsJ d|v sJ d|v sJ ||fS )z1test that `ipython [subcommand] --help-all` worksr   r   r   r   Classr   r   s        r   help_all_output_testr     su    


z<8
8C(--LCb777C777c!!!!c>>>>8Or!   r8   )Nr   )r[   Nr   r   )<r   r   pathlibr   r(   rL   r@   unittest
contextlibr   ior   
subprocessr   r   unittest.mockr   traitlets.config.loaderr	   IPython.utils.processr
   IPython.utils.textr   IPython.utils.ior   r   IPython.utilsr   r[   r   decr   platformskip_doctest	null_decodoctest_decorb   r#   r%   r3   __test__r5   rH   rP   ru   r|   TestCaser~   r   typecompiler   r   r   r   r   r   r   r   r   r   r!   r   <module>r      s    
			       				 



   % % % % % %       " " " " " " " "       * * * * * * 7 7 7 7 7 7 + + + + + + - - - - - - - - # # # # # #            
 ,/<7+B+B{''3 3T#Y 349 3 3 3 3>' ' 'V #  
 
 

 
 
   $7 7 7 7t 79+-, , , ,^    H%   D 
4

3  * * * * * * * *X    l   4   / / /(        r!   