o
    ,hZ                     @   s   d 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
 ddlZddlZddlmZ ddlmZmZmZmZ ddlmZmZmZ eeZdd	e
eeed
f f ddfddZG dd deZG dd deZdS )a  Testing utilities for Dynamo, providing a specialized TestCase class and test running functionality.

This module extends PyTorch's testing framework with Dynamo-specific testing capabilities.
It includes:
- A custom TestCase class that handles Dynamo-specific setup/teardown
- Test running utilities with dependency checking
- Automatic reset of Dynamo state between tests
- Proper handling of gradient mode state
    N)Union)	trace_log)
IS_WINDOWSTEST_WITH_CROSSREFTEST_WITH_TORCHDYNAMOTestCase   )configresetutils needs.returnc              	   C   s   ddl m} ts
trd S tj strtj	
dddkrd S t| tr&| f} | D ]!}|dkr7tj s6 d S q(zt| W q( tyI   Y  d S w |  d S )Nr   )	run_testsTORCHINDUCTOR_WINDOWS_TESTS0cuda)$torch.testing._internal.common_utilsr   r   r   torchxpuis_availabler   osenvironget
isinstancestrr   	importlibimport_moduleImportError)r   r   needr   r   R/var/www/html/scripts/venv/lib/python3.10/site-packages/torch/_dynamo/test_case.pyr   '   s,   


r   c                       s\   e Zd ZU ejed< ed fddZed fddZd fdd	Z	d fd
dZ
  ZS )r   _exit_stackr   Nc                       | j   t   d S N)r!   closesupertearDownClasscls	__class__r   r    r&   E      
zTestCase.tearDownClassc                    s0   t    t | _| jtjdddd d S )NTF)raise_on_ctx_manager_usagesuppress_errorslog_compilation_metrics)r%   
setUpClass
contextlib	ExitStackr!   enter_contextr	   patchr'   r)   r   r    r/   J   s   

zTestCase.setUpClassc                    s>   t  | _t   t  tj  t	
 | _t| j d S r#   )r   is_grad_enabled_prior_is_grad_enabledr%   setUpr
   r   countersclearloggingNullHandlerhandlerr   
addHandler)selfr)   r   r    r6   V   s   



zTestCase.setUpc                    st   t | j tj D ]\}}t||  qt  tj	  t
   | jt ur8td t| j d S d S )NzRunning test changed grad mode)r   removeHandlerr;   r   r7   itemsprintmost_commonr
   r8   r%   tearDownr5   r   r4   logwarningset_grad_enabled)r=   kvr)   r   r    rB   ^   s   


zTestCase.tearDownr   N)__name__
__module____qualname__r0   r1   __annotations__classmethodr&   r/   r6   rB   __classcell__r   r   r)   r    r   B   s   
 
r   c                       sl  e Zd ZU dZejed< dZej	j
Z
ej	jZej	jZej	jZej	jZej	jZej	jZej	jZej	jZej	jZej	jZej	jZej	jZej	jZej	jZej	jZej	jZej	jZej	jZej	jZej	jZej	jZej	j Z ej	j!Z!ej	j"Z"ej	j#Z#ej	j$Z$ej	j%Z%ej	j&Z&ej	j'Z'ej	j(Z(ej	j)Z)ej	j*Z*ej	j+Z+dd Z, fddZ-e.d fd
dZ/e.d fddZ0  Z1S )CPythonTestCasez
    Test class for CPython tests located in "test/dynamo/CPython/Py_version/*".

    This class enables specific features that are disabled by default, such as
    tracing through unittest methods.
    _stackTc                 C   s2   t | | j}tjj||d|}t| | j| |S )N)nopython)getattr_testMethodNamer   _dynamooptimizesetattr)r=   fnbackendrQ   methodr   r   r    
compile_fn   s   zCPythonTestCase.compile_fnc                    sz   t   }| j}t|tjd dd }t	dt|}|r0|
 tjdd}n|S d| d| d| S )	N.r   z
/([\d_]+)/_ CPython-)r%   _dynamo_test_keyr*   inspectgetfilesplitr   sepresearchgroupstripreplace)r=   suffixtest_cls	test_filepy_verr)   r   r    ra      s   
 z CPythonTestCase._dynamo_test_keyr   Nc                    r"   r#   )rP   r$   r%   r&   r'   r)   r   r    r&      r+   zCPythonTestCase.tearDownClassc           	         s   t jddt jj }t|d }t| }t||}|rUt	t
t| |d}tjd d }||k rTdt
t|}dt
t|}td| d| ntd	t|  t   t | _| jtjd
d d S )Ndynamocpythonz\d_\d{2}r]      r\   zTest requires Python z but got Python z>Test requires a specific Python version but not found in path T)enable_trace_unittest)r   pathjoinre   rf   escaperb   rc   rg   tuplemapintrh   removeprefixrd   sysversion_infor   unittestSkipTestr%   r/   r0   r1   rP   r2   r	   r3   )	r(   prefixregexsearch_pathmtest_py_verrn   expectedgotr)   r   r    r/      s0   


zCPythonTestCase.setUpClassrH   )2rI   rJ   rK   __doc__r0   r1   rL   dynamo_strict_nopythonr|   r   assertEqualassertNotEqual
assertTrueassertFalseassertIsassertIsNotassertIsNoneassertIsNotNoneassertInassertNotInassertIsInstanceassertNotIsInstanceassertAlmostEqualassertNotAlmostEqualassertGreaterassertGreaterEqual
assertLessassertLessEqualassertRegexassertNotRegexassertCountEqualassertMultiLineEqualassertSequenceEqualassertListEqualassertTupleEqualassertSetEqualassertDictEqualassertRaisesassertRaisesRegexassertWarnsassertWarnsRegex
assertLogsfailfailureExceptionrZ   ra   rM   r&   r/   rN   r   r   r)   r    rO   j   sX   
 
rO   )r   ) r   r0   r   rb   r9   r   rf   rz   r|   typingr   r   torch.testingtorch._logging._internalr   r   r   r   r   r   TorchTestCaser^   r	   r
   r   	getLoggerrI   rC   r   rv   r   rO   r   r   r   r    <module>   s&   

$(