o
    2g$                     @  s  d 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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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& ddl'm(Z( ddl)m*Z* ej+,e*dZ-ej+,e*dZ.G dd deZ/dUddZ0ej1dVd#d$Z2dWd&d'Z3	dXdYd-d.Z4	dXdZd0d1Z5d[d3d4Z6		d\d]d:d;Z7d^d<d=Z8d_d?d@Z9d`dBdCZ:dadEdFZ;dbdIdJZ<dcdNdOZ=dddPdQZ>dedSdTZ?dS )fzHelpers for writing tests    )annotationsN)CallableIterator)build)CompileError)Options)test_temp_dir)DataDrivenTestCase	DataSuite)assert_string_arrays_equal)assert_func_ir_valid)IS_32_BIT_PLATFORMPLATFORM_SIZE)Errors)FuncIR)ModuleIR)build_ir)Mapper)CompilerOptions)test_data_prefixzfixtures/ir.pyzfixtures/testutil.pyc                   @  s   e Zd ZU g Zded< eZdS )MypycDataSuite	list[str]filesN)__name__
__module____qualname__r   __annotations__r   data_prefix r   r   K/home/garg/my-data/venv/lib/python3.10/site-packages/mypyc/test/testutil.pyr   "   s   
 r   func$Callable[[DataDrivenTestCase], None]pathstrreturnc                   s    fddS )zDecorate a function that implements a data-driven test case to copy an
    alternative builtins module implementation in place before performing the
    test case. Clean up after executing the test case.
    c                   s   t  | S N)perform_test)testcaser    r"   r   r   <lambda>/   s    z"builtins_wrapper.<locals>.<lambda>r   r(   r   r(   r   builtins_wrapper(   s   r*   builtins_pathr'   r	   Iterator[None]c              	   c  s    |j D ]\}}tj|dkrd} nqtjtjtd}t| | d}zd V  W |r6t	| d S d S |r@t	| w w )Nzbuiltins.pyiFT)
r   osr"   basenameabspathjoinr   shutilcopyfileremove)r+   r'   r"   _default_builtinsbuiltinsr   r   r   use_custom_builtins2   s    r7   Nonec                 C  sd   |j D ]\}}tj|dkrd} nqtjtd}t|| d}| | |r0t| d S d S )Nzbuiltins.pyFT)	r   r-   r"   r.   r0   r   r1   r2   r3   )r    r+   r'   r"   r4   r5   r6   r   r   r   r&   G   s   r&   input_linesr   compiler_optionsCompilerOptions | Nonelist[FuncIR]c                 C  s   t | |jS r%   )build_ir_for_single_file2	functions)r9   r:   r   r   r   build_ir_for_single_file\   s   r?   r   c           
      C  s   d | }|ptdd}t }d|_d|_d|_d|_|jpd|_d|_d|_	d|_
ddi|jd< tdd|}tj|g|td	}|jrIt|jt|}t|jd g|j|jtdd i||}|jrit| t| d
 }|jD ]}	t|	 qt|S )N
      )capi_versionT)rB      mypyc__main__main)sourcesoptionsalt_lib_pathr   )r0   r   r   show_tracebackhide_error_codesuse_builtins_fixturesstrict_optionalpython_versionexport_typespreserve_astsallow_empty_bodiesper_module_optionsr   BuildSourcer   errorsr   r   r   r   graphtypesr   
num_errorsnew_messageslistvaluesr>   r   )
r9   r:   program_textrJ   sourceresultrV   modulesmodulefnr   r   r   r=   b   s>   





r=   outputc                 C  sD  | j d us	J dtj| j | j}t|}|  }W d    n1 s'w   Y  d| j d}|	|dkr<d S |
|}|d }|t|k rc|| dsc|d7 }|t|k rc|| drR||| }|
d}	|||	d d < |dg |||< d|}
t|d	}t|
|d
 W d    d S 1 sw   Y  d S )Nztest was not properly set upz[case ]      z[out] r@   w)file)old_cwdr-   r"   r0   ri   openread
splitlinesnamecountindexlen
startswithprint)r'   rc   testcase_pathf
data_lines	test_slug	start_idxstop_idxtest	out_startdatar   r   r   update_testcase_output   s*   



"r}   actualmessageexpectedlist[str] | None	formattedc              	   C  s\   d}|d ur|n| j }||kr| jddrt| | t||| d| j d| j d d S )NTz--update-dataFz (z, line ))rc   config	getoptionr}   r   ri   line)r'   r~   r   r   r   __tracebackhide__expected_outputr   r   r   assert_test_output   s   
r   c                 C  s2   g }| D ]}t d|}|r||d q|S )Nzdef ([_a-zA-Z0-9.*$]+)\(re   )rematchappendgroup)r   ressmr   r   r   get_func_names   s   r   ac                 C  s:   g }| D ]}|  dr|  dsq|| q|S )zrReturn a copy of array with comments removed.

    Lines starting with '--' (but not with '---') are removed.
    z--z---)striprr   r   )r   rr   r   r   r   remove_comment_lines   s   r   r   c                 C  s2   |   }t|D ]\}}td|d |f  qd S )Nz%-4d %sre   )rm   	enumeraters   )r   linesir   r   r   r   print_with_line_numbers   s   r   textc                 C  s   t d|  d d  d S )Nz====================  z====================)rs   )r   r   r   r   heading   s   r   cfileslist[list[tuple[str, str]]]c                 C  sD   t d | D ]}|D ]\}}td| d t| q
qt d d S )NzGenerated Cz== z ==zEnd C)r   rs   r   )r   r   cfilectextr   r   r   show_c   s   
r   dirdeltaintc                 C  sT   t | D ]"\}}}|D ]}t j||}t |j| }t j|||fd qqd S )N)times)r-   walkr"   r0   statst_mtimeutime)r   r   dirpathr4   	filenamesrn   r"   	new_mtimer   r   r   fudge_dir_mtimes   s   r   c                 C  sr   g }| D ]2}| d}|dkr1||d  d }t|dd }tt| }|||| q|| q|S )z2Replace WORDSIZE with platform specific word sizes	WORD_SIZENr   
   )findsplitr   r#   r   r   replace)r   r_   r   rp   word_size_tokennreplace_strr   r   r   replace_word_size   s   
r   rn   c                 C  s   d| v rt rdS d| v rt sdS td| v dd}td| }|r5t|dt|d	f|_|j|_|S d
| v s=d| v rDJ d|  |S )a  Look for magic substrings in test case name to set compiler options.

    Return None if the test case should be skipped (always pass).

    Supported naming conventions:

      *_64bit*:
          Run test case only on 64-bit platforms
      *_32bit*:
          Run test caseonly on 32-bit platforms
      *_python3_8* (or for any Python version):
          Use Python 3.8+ C API features (default: lowest supported version)
      *StripAssert*:
          Don't generate code for assert statements
    _64bitN_32bitStripAssertrA   )strip_assertsrD   z_python([3-9]+)_([0-9]+)(_|\b)re      _py_PythonFz,Invalid _py* suffix (should be _pythonX_Y): )r   r   r   searchr   r   rD   rP   )rn   rJ   r   r   r   r   %infer_ir_build_options_from_test_name   s   r   )r    r!   r"   r#   r$   r!   )r+   r#   r'   r	   r$   r,   )r    r!   r+   r#   r'   r	   r$   r8   r%   )r9   r   r:   r;   r$   r<   )r9   r   r:   r;   r$   r   )r'   r	   rc   r   r$   r8   )NN)r'   r	   r~   r   r   r#   r   r   r   r   r$   r8   )r   r   r$   r   )r   r   r$   r   )r   r#   r$   r8   )r   r#   r$   r8   )r   r   r$   r8   )r   r#   r   r   r$   r8   )r   r   r$   r   )rn   r#   r$   r;   )@__doc__
__future__r   
contextlibr-   os.pathr   r1   typingr   r   mypyr   mypy.errorsr   mypy.optionsr   mypy.test.configr   mypy.test.datar	   r
   mypy.test.helpersr   mypyc.analysis.ircheckr   mypyc.commonr   r   mypyc.errorsr   mypyc.ir.func_irr   mypyc.ir.module_irr   mypyc.irbuild.mainr   mypyc.irbuild.mapperr   mypyc.optionsr   mypyc.test.configr   r"   r0   ICODE_GEN_BUILTINSTESTUTIL_PATHr   r*   contextmanagerr7   r&   r?   r=   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s\    



, 

	



	
