o
    GXîh”  ã                   @   s”   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 G dd„ dej	ƒZ
G dd„ dej	ƒZejG dd	„ d	ej	ƒƒZed
krHe ¡  dS dS )é    N)Úsupport)Úscript_helperc                   @   s   e Zd Zdd„ ZdS )ÚGeneralTestc                 C   s   t  d¡}t |¡ d S )Nz_test_atexit.py)r   Zfindfiler   Zrun_test_script)ÚselfZscript© r   ú:/opt/python-3.10.19/usr/lib/python3.10/test/test_atexit.pyÚtest_general   s   
zGeneralTest.test_generalN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   
   s    r   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚFunctionalTestc                 C   ó@   t  d¡}t d|¡}|  |j ¡  ¡ ddg¡ |  |j	¡ d S )Nz¤
            import atexit

            def f(msg):
                print(msg)

            atexit.register(f, "one")
            atexit.register(f, "two")
        ú-cZtwoZone©
ÚtextwrapÚdedentr   Zassert_python_okÚassertEqualÚoutÚdecodeÚ
splitlinesZassertFalseÚerr©r   ÚcodeÚresr   r   r   Útest_shutdown   s   
	zFunctionalTest.test_shutdownc                 C   r   )Na@  
            import sys
            import atexit as atexit1
            del sys.modules['atexit']
            import atexit as atexit2
            del sys.modules['atexit']

            assert atexit2 is not atexit1

            atexit1.register(print, "atexit1")
            atexit2.register(print, "atexit2")
        r   Zatexit2Zatexit1r   r   r   r   r   Útest_atexit_instances    s   
z$FunctionalTest.test_atexit_instancesN)r	   r
   r   r   r   r   r   r   r   r      s    r   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚSubinterpreterTestc                 C   ó<   t  ¡ }t d¡}t |¡}|  |d¡ |  t  ¡ |¡ d S )Nzƒ
            import atexit
            def f():
                pass
            atexit.register(f)
            del atexit
        r   ©ÚatexitÚ_ncallbacksr   r   r   Úrun_in_subinterpr   ©r   Únr   Úretr   r   r   Útest_callbacks_leak6   s
   

z&SubinterpreterTest.test_callbacks_leakc                 C   r   )Nz‘
            import atexit
            def f():
                pass
            atexit.register(f)
            atexit.__atexit = atexit
        r   r   r"   r   r   r   Útest_callbacks_leak_refcycleF   s
   

z/SubinterpreterTest.test_callbacks_leak_refcyclec                 C   sZ   d}t  ¡ \}}t d |¡¡}t |¡}t  |¡ |  t  	|t
|ƒ¡|¡ t  |¡ d S )Ns   The test has passed!z³
            import os
            import atexit
            def callback():
                os.write({:d}, b"The test has passed!")
            atexit.register(callback)
        )ÚosÚpiper   r   Úformatr   r!   Úcloser   ÚreadÚlen)r   ZexpectedÚrÚwr   r$   r   r   r   Ú(test_callback_on_subinterpreter_teardownU   s   ú

z;SubinterpreterTest.test_callback_on_subinterpreter_teardownN)r	   r
   r   r%   r&   r/   r   r   r   r   r   3   s    r   Ú__main__)r   r'   Úsysr   ZunittestÚtestr   Ztest.supportr   ZTestCaser   r   Zcpython_onlyr   r	   Úmainr   r   r   r   Ú<module>   s    #4ÿ