o
    2g>                     @  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	Z	d dl
mZmZmZmZmZmZ d dlmZ eZd dlZd dlmZ d dl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"m#Z#m$Z$m%Z% ej&j'Z'd
Z(d{ddZ)d|ddZ*dej+ddd}d!d"Z,d#d$d~d+d,Z-dd/d0Z.dd1d2Z/dd5d6Z0dd8d9Z1ej2dd;d<Z3dd?d@Z4ddBdCZ5dddIdJZ6ddMdNZ7dddRdSZ8ddVdWZ9ddZd[Z:ddadbZ;ddedfZ<ddhdiZ=ddldmZ>	ndddqdrZ?ddtduZ@dddydzZAdS )    )annotationsN)IOAnyCallableIterableIteratorPattern)TestCase)defaults)process_options)Options)test_data_prefixtest_temp_dir)DataDrivenTestCase
DeleteFile
UpdateFilefix_cobertura_filename   args	list[str]returnNonec                 C  sR   d}t | ddg \}}}|dkr'tj| tj| tjddd d S d S )NTz--show-tracebackz--no-silence-site-packagesr   zSample check failedF)reasonpytrace)apirunsysstdoutwritestderrpytestfail)r   __tracebackhide__outvalerrvalstatus r&   I/home/garg/my-data/venv/lib/python3.10/site-packages/mypy/test/helpers.pyrun_mypy$   s   r(   leftright3tuple[list[tuple[int, int]], list[tuple[int, int]]]c           	      C  s   t d | |}| }d}d}g }g }|D ].}|||jf |||jf |j|j }|j|j }||j|f ||j|f q||fS )Nr   )difflibSequenceMatcherget_matching_blocksappendabsize)	r)   r*   seqblocksijleft_rangesright_rangesblockr&   r&   r'   diff_ranges/   s   r:      )colouroutputindentrangeslist[tuple[int, int]]contentr<   
str | Noner=   IO[str]r>   intc                C  s   t | D ]^\}}|d dk}||d |d  }t |D ]E\}	}
|r<|	dkr<|	t|d k r<|	dkr;|d| d  q|sE|rE|| |d| |
  |s\|rW|d |d |d	 qqd S )
Nr;      r       z...
z[0mz (diff)
)	enumeratelenr   )r?   rA   r<   r=   r>   r5   
line_rangeis_matchinglinesr6   liner&   r&   r'   render_diff_rangeH   s*   


rO   F)	tracebackexpectedactualmsgstrrP   boolc          	      C  s  t |}| |krt| |\}}tjd tjdkrdnd}t|| |d tjd tjdkr2dnd}t|||d tjd td	d
 tt	| |D t
t| t|}d|  krct|k r~n nt| | tksut|| tkr~t| | ||  tjd tj||d dS dS )zdAssert that two string arrays are equal.

    Display any differences in a human-readable form.
    z
Expected:
win32z[31mN)r<   zActual:
z[32mrH   c                 s  s$    | ]\}\}}||kr|V  qd S Nr&   ).0r5   r0   r1   r&   r&   r'   	<genexpr>~   s   " z-assert_string_arrays_equal.<locals>.<genexpr>r   zUpdate the test output using --update-data (implies -n0; you can additionally use the -k selector to update only specific tests)
)r   )clean_upr:   r   r   r   platformrO   nextrI   zipmaxrJ   MIN_LINE_LENGTH_FOR_ALIGNMENTshow_align_messager    r!   )	rQ   rR   rS   rP   expected_rangesactual_rangesredgreen
first_diffr&   r&   r'   assert_string_arrays_equalk   s.   rf   nameIterable[str]c              	   C  sB   t |}t t|dh}t||dd|d||  d S )N__main__zEActual modules ({}) do not match expected modules ({}) for "[{} ...]", )sortedset
differencerf   formatjoin)rg   rQ   rR   expected_normalizedactual_normalizedr&   r&   r'   assert_module_equivalence   s   rr   c              	   C  s&   t ||dd|d||  dS )z6Compare actual and expected targets (order sensitive).zEActual targets ({}) do not match expected targets ({}) for "[{} ...]"rj   N)rf   rn   ro   )rg   rQ   rR   r&   r&   r'   assert_target_equivalence   s   rs   s1s2c                 C  s`  t | dk rdS d}tjd d}| dd |dd kr8| dd } |dd }d}| dd |dd ks|rBd	|  } d	| }tt | t |}d
}||krSd	}tjd| d|  | d tjd|d|  | d tjd tt|tt | t |D ] }| ||d  |||d  krtjd  ntjd qtjd dS )aQ  Align s1 and s2 so that the their first difference is highlighted.

    For example, if s1 is 'foobar' and s2 is 'fobar', display the
    following lines:

      E: foobar
      A: fobar
           ^

    If s1 and s2 are long, only display a fragment of the strings around the
    first difference. If s1 is very short, do nothing.
       NH   z$Alignment of first line difference:
F   
   Tz... z  E: rH   z  A: z     rE   ^rG   )rJ   r   r   r   r^   rangemin)rt   ru   maxwtruncmax_lenextrar6   r&   r&   r'   r`      s4       r`   r0   c                 C  s   g }t  }|d }| D ]@}t j}|}||t jdfD ]}|dkr4|dkr4|dkr4|dkr4||d}qtdd|}||d}|td	d| q|S )
zRemove common directory prefix from all strings in a.

    This uses a naive string replace; it seems to work well enough. Also
    remove trailing carriage returns.
    z
/driver.py/z//\z\\rz   z +$z	driver.pyz\r$)osgetcwdsepreplaceresubr/   )r0   respwddriversprefixsspr&   r&   r'   rZ      s    rZ   Iterator[None]c                  c  sJ    t j } dt jv sdt jv st jdd z	dV  W | t _dS | t _w )zTemporary insert current directory into sys.path.

    This can be used by test cases that do runtime imports, for example
    by the stubgen tests.
    rz   .r   N)r   pathcopyinsert)old_sys_pathr&   r&   r'   local_sys_path_set   s   
r   r   tuple[int, int]c                 C  s(   t d| }|rdt|dfS tjS )Nzpython3([0-9]+)\.test$rF   rE   )r   searchrD   groupr
   PYTHON3_VERSION)r   mr&   r&   r'   testfile_pyversion  s   r   messagesc                 C  s&   g }| D ]}| |tjd q|S )z@Translate an array of error messages to use / as path separator.r   )r/   r   r   r   )r   r0   r   r&   r&   r'   normalize_error_messages
  s   r         ?funcCallable[[], Any]max_waitfloatc                 C  s^   t   }d}	 z|   W dS  ty-   t|d || t    }|dkr& t | Y nw q)a   Retry callback with exponential backoff when it raises OSError.

    If the function still generates an error after max_wait seconds, propagate
    the exception.

    This can be effective against random file system operation failures on
    Windows.
    g{Gz?TNr;   )timeOSErrorr}   sleep)r   r   t0	wait_timer&   r&   r'   retry_on_error  s   	r   objobjectc                 C  sj   t | tr1| ddkr1dg}| dD ]}|td| dd  q|d  d7  < d|S t| S )NrH   rE   z'''\"r;   z''')
isinstancerT   countsplitr/   reprro   )r   bitsrN   r&   r&   r'   	good_repr*  s   

r   {} != {}r1   fmtc                 C  s(   d}| |krt |t| t|d S )NT)AssertionErrorrn   r   )r0   r1   r   r"   r&   r&   r'   assert_equal6  s   r   ttypec                 C  s4   dt | v rt | dd dS t | dd S )Nr   r   z'>   )rT   r   rstrip)r   r&   r&   r'   typename<  s   r   typvaluec                 C  s4   d}t || krtdtt | dt|  d S )NTzInvalid type z, expected )r   r   r   )r   r   r"   r&   r&   r'   assert_typeC  s    r   program_texttestcaser   incremental_stepr   c                 C  s   t  }tjd| tjd}|dkr!tjd| d| tjd}|r!|}|rE|d }|d t|dd\}}|r=td	d
|vrDd|_	ng }t  }d|_
d|_	d|_d|_tdd |D ret|j|_|jdrr|jd|_|S )z4Parse comments like '# flags: --foo' in a test case.z# flags: (.*)$)flagsrE   z# flagsz: (.*)$z--no-site-packagesF)require_targetsz9Specifying targets via the flags pragma is not supported.z--show-error-codesTc                 s  s"    | ]}| d d dkV  qdS )=r   z--python-versionN)r   )rX   flagr&   r&   r'   rY   f  s     z parse_options.<locals>.<genexpr>z--mypy-verbose)r   r   r   	MULTILINEr   r   r/   r   RuntimeErrorhide_error_codeserror_summaryforce_uppercase_builtinsforce_union_syntaxallr   filepython_versionconfig	getoption	verbosity)r   r   r   optionsr   flags2	flag_listtargetsr&   r&   r'   parse_optionsI  s4   
r   streamsbytesc                  G  s   dd | D S )zDReturns a single list of string lines from the byte streams in args.c                 S  s$   g | ]}| d  D ]}|qqS )utf8)decode
splitlines)rX   streamr   r&   r&   r'   
<listcomp>q  s   $ zsplit_lines.<locals>.<listcomp>r&   )r   r&   r&   r'   split_lineso  s   r   target_pathc                 C  s   d }t j|rt |jd }t j|}t j|dd t|ddd}||  W d    n1 s4w   Y  |rFt j	|||fd d S d S )NrE   T)exist_okwzutf-8encoding)times)
r   r   isfilestatst_mtimedirnamemakedirsopenr   utime)rA   r   new_timedirtargetr&   r&   r'   write_and_fudge_mtimet  s   r   
operationslist[UpdateFile | DeleteFile]c                   sj   | D ]0}t |trt|j|j qtj|jr'|jds J t	
|j q|j t fdd qd S )Ntmpc                     s
   t  S rW   )r   remover&   r   r&   r'   <lambda>  s   
 z)perform_file_operations.<locals>.<lambda>)r   r   r   rA   r   r   r   isdir
startswithshutilrmtreer   )r   opr&   r   r'   perform_file_operations  s   
r   rz   stepstrip_prefixc              	   C  s&  | j D ]\}}||r|t|d  }tj|s+td|| jr'd| dt	|dd}|
 }W d    n1 s@w   Y  t|trZ||d urRqtd||t| tjt}| jr}| jjrytjjdkrydd	 |D }t|}t| |d
|| jrd| nd qd S )Nz0Expected file {} was not produced by test case{}z on step %drz   r   r   zCOutput file {} did not match its expected output pattern
---
{}
---r   c                 S  s   g | ]}t |qS r&   )r   )rX   rN   r&   r&   r'   r     s    z+check_test_output_files.<locals>.<listcomp>z2Output file {} did not match its expected output{})output_filesr   rJ   r   r   existsr   rn   output2r   readr   r   	fullmatchnormalize_file_outputr   abspathr   normalize_outputsuite
native_sepr   r   rf   )r   r   r   r   expected_contentoutput_fileactual_output_contentnormalized_outputr&   r&   r'   check_test_output_files  sL   


r  current_abs_pathc                   sl   t dfdd| D }tjjfdd|D }ttjd  fdd|D }fdd|D }|S )z%Normalize file output for comparison.z\d{10}c                   s   g | ]}|  d qS )z$PWD)r   rX   x)r  r&   r'   r         z)normalize_file_output.<locals>.<listcomp>c                   (   g | ]}t d t   d  d|qS z\bz$VERSIONr   r   escaper  )versionr&   r'   r        ( base_versionc                   r  r  r  r  )r  r&   r'   r     r  c                   s   g | ]}  d |qS )z
$TIMESTAMP)r   r  )timestamp_regexr&   r'   r     r  )r   compilemypyr  __version__getattr)rA   r  resultr&   )r  r  r  r  r'   r    s   
r  patternexcludelist[str] | Nonec                   s    fddt t| D S )Nc                   s    g | ]}|j  p	g vr|j qS r&   )rg   )rX   r   r"  r&   r'   r     s
    z#find_test_files.<locals>.<listcomp>)pathlibPathr   rglob)r!  r"  r&   r$  r'   find_test_files  s   
r(  )r   r   r   r   )r)   r   r*   r   r   r+   )r?   r@   rA   r   r<   rB   r=   rC   r>   rD   r   r   )
rQ   r   rR   r   rS   rT   rP   rU   r   r   )rg   rT   rQ   rh   rR   rh   r   r   )rg   rT   rQ   r   rR   r   r   r   )rt   rT   ru   rT   r   r   )r0   r   r   r   )r   r   )r   rT   r   r   )r   r   r   r   )r   )r   r   r   r   r   r   )r   r   r   rT   )r   )r0   r   r1   r   r   rT   r   r   )r   r   r   rT   )r   r   r   r   r   r   )r   rT   r   r   r   rD   r   r   )r   r   r   r   )rA   rT   r   rT   r   r   )r   r   r   r   )rz   )r   r   r   rD   r   rT   r   r   )rA   r   r  rT   r   r   rW   )r!  rT   r"  r#  r   r   )B
__future__r   
contextlibr,   r   r%  r   r   r   r   typingr   r   r   r   r   r   unittestr	   Suiter    mypy.apir   mypy.versionr  r
   	mypy.mainr   mypy.optionsr   mypy.test.configr   r   mypy.test.datar   r   r   r   markskipr_   r(   r:   r   rO   rf   rr   rs   r`   rZ   contextmanagerr   r   r   r   r   r   r   r   r   r   r   r   r  r  r(  r&   r&   r&   r'   <module>   sf     

$
%


4

	




&


*