o
    eiX"                     @   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mZm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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$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)Callable)AnyUnion)	polyfills)	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   a/var/www/addictedbytheproject.nl/epg/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
dededededdf
 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#   r2   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#   r9   V   s   



zTestCase.setUpc                    s   t | j tj D ]\}}t||  qt  tj	  t
jj  t   | jt
 ur>td t
| j d S d S )NzRunning test changed grad mode)r   removeHandlerr>   r   r:   itemsprintmost_commonr   r;   r   _C	_autograd_saved_tensors_hooks_enabler(   tearDownr8   r7   logwarningset_grad_enabled)rA   kvr,   r   r#   rI   ^   s   


zTestCase.tearDownxyargskwargsc                    s>   t jr	t|tjst|tjrd S t j||g|R i |S r&   )r   debug_disable_compile_counterr   r   CompileCounterIntr(   assertEqual)rA   rO   rP   rQ   rR   r,   r   r#   rU   j   s   

zTestCase.assertEqualr   N)__name__
__module____qualname__r3   r4   __annotations__classmethodr)   r2   r9   rI   r   rU   __classcell__r   r   r,   r#   r
   B   s   
 
*r
   c                       s,   e Zd Zd fddZd fddZ  ZS )TestCaseWithNestedGraphBreaksr   Nc                    s$   t    tjjj| _dtjj_d S )NT)r(   r9   r   _dynamor   nested_graph_breaksprev_nested_graph_breaksr@   r,   r   r#   r9   z   s   
z#TestCaseWithNestedGraphBreaks.setUpc                    s   t    | jtjj_d S r&   )r(   rI   r`   r   r^   r   r_   r@   r,   r   r#   rI      s   
z&TestCaseWithNestedGraphBreaks.tearDownrV   )rW   rX   rY   r9   rI   r\   r   r   r,   r#   r]   y   s    r]   c                
       s  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 Z!ej"Z#ej	j$Z$ej	j%Z%ej	j&Z&e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e0de1f de2e3e0de1f f de4de0de1f fd	d
Z5de3f fddZ6e7d fddZ8e7d fddZ9de3de0ddfddZ:  Z;S )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.
    _stackTfn.backendnopythonr   c                 C   s2   t | | j}tjj||d|}t| | j| |S )N)error_on_graph_break)getattr_testMethodNamer   r^   optimizesetattr)rA   rc   rd   re   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)rA   suffixtest_cls	test_filepy_verr,   r   r#   rs      s   
 z CPythonTestCase._dynamo_test_keyNc                    r%   r&   )rb   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}ro      rn   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joinrw   rx   escapert   ru   ry   tuplemapintrz   removeprefixrv   sysversion_infor   unittestSkipTestr(   r2   r3   r4   rb   r5   r   r6   )	r+   prefixregexsearch_pathmtest_py_verr   expectedgotr,   r   r#   r2      s0   


zCPythonTestCase.setUpClassmethod_namepolicyc                 C   s   d S r&   r   )rA   r   r   r   r   r#   wrap_with_policy   s   z CPythonTestCase.wrap_with_policyrV   )<rW   rX   rY   __doc__r3   r4   rZ   dynamo_strict_nopythonr   r
   rU   assertNotEqual
assertTrueassertFalseassertIsassertIsNotassertIsNoneassertIsNotNoneassertInassertNotInassertIsInstanceassertNotIsInstanceassertAlmostEqualassertNotAlmostEqualassertGreaterassertGreaterEqual
assertLessassertLessEqualassertRegexassertNotRegexassertCountEqualr   assert_multi_line_equalassertMultiLineEqualassert_sequence_equalassertSequenceEqualassertListEqualassertTupleEqualassertSetEqualassert_dict_equalassertDictEqualassertRaisesassertRaisesRegexassertWarnsassertWarnsRegex
assertLogsfailfailureExceptionr   r   r   r   boolrl   rs   r[   r)   r2   r   r\   r   r   r,   r#   ra      sj   
 



ra   )r   )&r   r3   r   rt   r<   r   rx   r   r   collections.abcr   typingr   r   r   torch.testingtorch._dynamor   torch._logging._internalr   r   r   r   r	   r
   TorchTestCaserp   r   r   r   	getLoggerrW   rJ   r   r   r   r]   ra   r   r   r   r#   <module>   s,    

$7