a
    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e
eeed	f f dd
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rL| f} | D ]D}|dkrntj s d S qPzt| W qP ty   Y  d S 0 qP|  d S )Nr   )	run_testsZTORCHINDUCTOR_WINDOWS_TESTS0cuda)$torch.testing._internal.common_utilsr   r   r   torchZxpuZis_availabler   osenvironget
isinstancestrr   	importlibimport_moduleImportError)r   r   Zneedr   r   E/var/www/auris/lib/python3.9/site-packages/torch/_dynamo/test_case.pyr   '   s*    

r   c                       sl   e Zd ZU ejed< edd fddZedd fddZdd fdd	Z	dd fd
dZ
  ZS )r   _exit_stackNr   c                    s   | j   t   d S N)r   closesupertearDownClasscls	__class__r   r   r"   E   s    
zTestCase.tearDownClassc                    s0   t    t | _| jtjdddd d S )NTF)Zraise_on_ctx_manager_usageZsuppress_errorsZ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   r.   V   s    



zTestCase.setUpc                    sp   t | j tj D ]\}}t||  qt  tj	  t
   | jt urltd t| j d S )NzRunning test changed grad mode)r   removeHandlerr3   r   r/   itemsprintmost_commonr
   r0   r!   tearDownr-   r   r,   logwarningZset_grad_enabled)r5   kvr%   r   r   r:   ^   s    


zTestCase.tearDown)__name__
__module____qualname__r(   r)   __annotations__classmethodr"   r'   r.   r:   __classcell__r   r   r%   r   r   B   s   

r   c                       st  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d	 fd
dZ/e.d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)getattrZ_testMethodNamer   Z_dynamooptimizesetattr)r5   fnbackendrG   methodr   r   r   
compile_fn   s    zCPythonTestCase.compile_fnc                    sz   t   }| j}t|tjd dd }t	dt|}|r`|
 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)r5   suffixZtest_clsZ	test_filepy_verr%   r   r   rU      s    
 z CPythonTestCase._dynamo_test_keyNr   c                    s   | j   t   d S r   )rF   r    r!   r"   r#   r%   r   r   r"      s    
zCPythonTestCase.tearDownClassc           	         s   t jddt jj }t|d }t| }t||}|rt	t
t| |d}tjd d }||k rdt
t|}dt
t|}td| d| ntd	t|  t   t | _| jtjd
d d S )NZdynamocpythonz\d_\d{2}rQ      rP   zTest requires Python z but got Python z>Test requires a specific Python version but not found in path T)Zenable_trace_unittest)r   pathjoinrY   rZ   escaperV   rW   r[   tuplemapintr\   removeprefixrX   sysversion_infor   unittestZSkipTestr!   r'   r(   r)   rF   r*   r	   r+   )	r$   prefixregexsearch_pathmZtest_py_verr`   expectedgotr%   r   r   r'      s.    


zCPythonTestCase.setUpClass)2r?   r@   rA   __doc__r(   r)   rB   Zdynamo_strict_nopythonrl   r   assertEqualZassertNotEqual
assertTrueZassertFalseZassertIsZassertIsNotZassertIsNoneZassertIsNotNoneZassertInZassertNotInZassertIsInstanceZassertNotIsInstanceZassertAlmostEqualZassertNotAlmostEqualZassertGreaterZassertGreaterEqualZ
assertLessZassertLessEqualassertRegexassertNotRegexassertCountEqualZassertMultiLineEqualZassertSequenceEqualZassertListEqualZassertTupleEqualZassertSetEqualZassertDictEqualassertRaisesassertRaisesRegexZassertWarnsZassertWarnsRegexZ
assertLogsZfailZfailureExceptionrN   rU   rC   r"   r'   rD   r   r   r%   r   rE   j   sV   

rE   )r   ) rs   r(   r   rV   r1   r   rZ   rj   rl   typingr   r   Ztorch.testingZtorch._logging._internalr   r   r   r   r   r   ZTorchTestCaserR   r	   r
   r   	getLoggerr?   r;   r   rf   r   rE   r   r   r   r   <module>   s$   

"(