Current File : //usr/local/apps/python3/lib/python3.11/test/__pycache__/test__xxsubinterpreters.cpython-311.pyc
�

�Ke�;���ddlmZddlZddlZddlZddlZddlZddlmZddl	Z	ddl
Z
ddlZddlm
Z
ddlmZddlmZejd��Zd�ZdAd	�ZdAd
�Zejd���Zd�Zifd
�ZGd�dedd����Zejd���ZGd�dedd����ZGd�dedd����Zdd�d�Zd�Zd�Z d�Z!Gd�dej"��Z#Gd �d!ej"��Z$Gd"�d#ej"��Z%Gd$�d%e#��Z&Gd&�d'e#��Z'Gd(�d)e#��Z(Gd*�d+e#��Z)Gd,�d-e#��Z*Gd.�d/e#��Z+Gd0�d1e#��Z,Gd2�d3e#��Z-Gd4�d5e#��Z.Gd6�d7e#��Z/Gd8�d9e#��Z0Gd:�d;ed;d<����Z1ej2d=��Gd>�d?e#����Z3e4d@krej5��dSdS)B�)�
namedtupleN)�dedent)�support)�
import_helper)�
script_helper�_xxsubinterpretersc��tj��\}}|�dd��}td|�d|�d���}|t	|d���fS)N�
z
                z-
        import contextlib
        with open(zg, 'w', encoding="utf-8") as spipe:
            with contextlib.redirect_stdout(spipe):
                z	
        �utf-8��encoding)�os�pipe�replacer�open)�script�r�w�indented�wrappeds     �F/usr/local/apps/python3/lib/python3.11/test/test__xxsubinterpreters.py�_captured_scriptrst��
�7�9�9�D�A�q��~�~�d�$8�9�9�H�������	���
�
�G��D��W�-�-�-�-�-�c��t|��\}}|5t�|||��|���cddd��S#1swxYwYdS�N)r�interpreters�
run_string�read)�interp�request�sharedr�rpipes     r�_run_outputr##s���$�W�-�-�M�F�E�	���������7�7�7��z�z�|�|���������������������s�0A�A�Ac�2�|�tj}tj��}||z}t�|��sVtj��|krt
d���tjd��t�|���TdSdS)Nzinterp is not runningg{�G�z�?)r�
SHORT_TIMEOUT�time�	monotonicr�
is_running�RuntimeError�sleep)r�timeout�
start_time�deadlines    r�_wait_for_interp_to_runr.*s������'����!�!�J��G�#�H��%�%�f�-�-���>���h�&�&��6�7�7�7��
�5�����%�%�f�-�-�����rc#�d��K�tj��\�}��fd�}tj|���}|���t���dV�t
|dd���5}|�d��ddd��n#1swxYwY|���dS)Nc�`��t��td��d�����dS)Nz7
            # wait for "signal"
            with open(zG, encoding="utf-8") as rpipe:
                rpipe.read()
            )rrr)rrs��r�runz_running.<locals>.run;sJ��������0��0�0�0�)�)�	�	�	�	�	r��targetrrr�done)	rr�	threading�Thread�startr.r�write�join)rrr1�t�spipers`    @r�_runningr<8s�������
�7�9�9�D�A�q�������	���$�$�$�A��G�G�I�I�I��F�#�#�#�	�E�E�E�	
�a��w�	'�	'�	'��5�
���F�����������������������F�F�H�H�H�H�Hs�/B�B�Bc�(�t|||��dSr)�_run_interp)�id�sourcer!s   r�
run_interprAWs����F�F�#�#�#�#�#rc��t|��}t���}||kr6t���|krt�t||��dSt�|||��dSr)rr�get_main�get_currentr)�execr)r?r@r!�_mainns�mains     rr>r>[sx��
�F�^�^�F�� � �"�"�D��r�z�z��#�#�%�%��-�-����V�W����������F�F�3�3�3�3�3rc�6��eZdZed���Zd�fd�	Z�xZS)�Interpreterc�t�t||��r|St|t��r||��St�r)�
isinstance�str�NotImplementedError)�cls�raws  r�from_rawzInterpreter.from_rawis>���c�3���	&��J�
��S�
!�
!�	&��3�s�8�8�O�%�%rNc����t���}||kr0|sd}n(|dkr"td�|�����|}nw|�O|sd}n|dkrtd���t	|tj��st�|��}n&|r|dkrd}|}nt���}t���|||��}|S)NrGz)name mismatch (expected "main", got "{}")rz!name mismatch (unexpected "main"))	rrC�
ValueError�formatrK�
InterpreterID�create�super�__new__)rN�namer?rG�self�	__class__s     �rrWzInterpreter.__new__rs����$�$�&�&��
��:�:��
N�������� �?�F�F�t�L�L�N�N�N��B�B�
�^��
F�������� �!D�E�E�E��b�,�"<�=�=�
4�!�/�/��3�3����	'������D��B�B��$�$�&�&�B��w�w���s�D�"�-�-���r�NN)�__name__�
__module__�__qualname__�classmethodrPrW�
__classcell__�rZs@rrIrIgsV��������&�&��[�&����������rrIzname idc#�PK�	dV�Jd���#tj$rYdSwxYw)NFzchannel not closed)r�ChannelClosedError�rr�expect_channel_closedre�sL����+�
����	+�*�*�*�*���*�
�
�
����
���s��%�%c�2��eZdZd�fd�	Zd�Zd�Zd�Z�xZS)�
ChannelActionNc�`��|sd}|sd}t���||||��}|S)N�bothrG�rVrW)rN�action�endrrYrZs     �rrWzChannelAction.__new__�s=����	��C��	��F��w�w���s�F�C��8�8���rc��|jdkr|jdvrt|j���n;|jdvr|jdvrt|j���nt|j���|jdvrt|j���dS)N�use)�same�opposite�send�recv��close�force-close)rirorprqrr)rGro�other�extra)rkrlrRr)rY�args�kwargss   r�__init__zChannelAction.__init__�s����;�%����x�C�C�C� ���*�*�*�D�
�[�4�
4�
4��x�K�K�K� ���*�*�*�L��T�[�)�)�)��;�@�@�@��T�[�)�)�)�A�@rc�T�|jdkr|S|jdkr
|dkrdndS|jS)Nrorprqrr�rl�rYrls  r�resolve_endzChannelAction.resolve_end�s:���8�v����J�
�X��
#�
#� �F�]�]�6�6��6��8�Orc���|jdkr|S|jdkr|�t�|S|jdkr|�t�|S|jdkr#|jdkr|S|r
|jdkr|St�dS)NrorvrwrG)rr)rX)rYrrvrws    r�resolve_interpzChannelAction.resolve_interp�s����;�&� � ��M�
�[�G�
#�
#��}�"�"��L�
�[�G�
#�
#��}�"�"��L�
�[�F�
"�
"��{�f�$�$��
��
#�5�:��/�/���"�"�
#�
"rr[)r\r]r^rWrzr~r�r`ras@rrgrg�sj�������������
*�
*�
*����#�#�#�#�#�#�#rrgzaction end interpc�>��eZdZd
dd��fd�Zd�Zd�Zdd�d	�Z�xZS)�ChannelStaterF��closedc�N��t���|||��}|Srrj)rN�pendingr�rYrZs    �rrWzChannelState.__new__�s!����w�w���s�G�V�4�4���rc�P�t|��|jdz|j���S�N�r���typer�r��rYs r�incrzChannelState.incr��&���t�D�z�z�$�,��*�4�;�?�?�?�?rc�P�t|��|jdz
|j���Sr�r�r�s r�decrzChannelState.decr�r�rT��forcec�t�|jr|r|jdkr|St|��|rdn|jd���S)NrTr�)r�r�r�)rYr�s  rrtzChannelState.close�sK���;�	��
�D�L�A�-�-����t�D�z�z�u�6�!�!�$�,�t�D�D�D�Dr)r)r\r]r^rWr�r�rtr`ras@rr�r��s���������%��������@�@�@�@�@�@�"�E�E�E�E�E�E�E�E�Err�zpending closedT��
hideclosedc���|jr|dkr|dkr
|jrd}nd}nd}	t||||��}|rd�n.#tj$r|s|s�|���}YnwxYw|S)NrnrrFT.)r�r��_run_actionrrcrt)�cidrkrl�stater��
expectfail�results       r�
run_actionr��s����|���U�?�?�s�f�}�}���}��J�J��J�J��
���S�&�#�u�5�5���	��I�	���*�����	�*�	���������������Ms�;�(A&�%A&c��|dkr�|dkr/t�|d��|���S|dkrv|jsA	t�|��td���#tj$r|cYSwxYwt�|��|���St|���|dkr1i}|dvrd||<tj	|fi|��|�
��S|d	kr5d
di}|dvrd||<tj	|fi|��|�
d���St|���)Nrnrq�spamrrzexpected ChannelEmptyErrorrt�rrrqTrur�r�)r�channel_sendr�r��channel_recv�	Exception�ChannelEmptyErrorr�rR�
channel_closert)r�rkrlr�rys     rr�r��s���
�����&�=�=��%�%�c�7�3�3�3��:�:�<�<��
�F�]�]��=�	
$�B� �-�-�c�2�2�2�$�$@�A�A�A��$�5�!�!�!� �L�L�L�!����
�)�)�#�.�.�.��z�z�|�|�#��S�/�/�!�	�7�	�	����"�"�"��F�3�K��"�3�1�1�&�1�1�1��{�{�}�}��	�=�	 �	 ��T����"�"�"��F�3�K��"�3�1�1�&�1�1�1��{�{��{�&�&�&��� � � s�
A3�3B�Bc��t���D]4}|dkr�		t�|���%#t$rY�1wxYwdS)Nr)r�list_all�destroyr)�r?s r�clean_up_interpretersr�so���#�#�%�%����
��7�7��	�� � ��$�$�$�$���	�	�	��D�	�����s�?�
A�Ac��t���D]2}	t�|���#tj$rY�/wxYwdSr)r�channel_list_all�channel_destroy�ChannelNotFoundError�r�s r�clean_up_channelsr� sf���,�,�.�.����	��(�(��-�-�-�-���0�	�	�	��D�	�����s�8�A
�	A
c��eZdZd�ZdS)�TestBasec�>�t��t��dSr�r�r�r�s r�tearDownzTestBase.tearDown*� �����������rN)r\r]r^r�rdrrr�r�(s#����������rr�c��eZdZd�Zd�ZdS)�IsShareableTestsc���gd�}|D]\}|�|��5|�t�|����ddd��n#1swxYwY�]dS)N)Nr��spam�
i����)�subTest�
assertTruer�is_shareable)rY�
shareables�objs   r�test_default_shareablesz(IsShareableTests.test_default_shareables4s������
��	4�	4�C����c�"�"�
4�
4���� �-�-�c�2�2�4�4�4�
4�
4�
4�
4�
4�
4�
4�
4�
4�
4�
4����
4�
4�
4�
4��	4�	4s�.A�A	�A	c��Gd�d��}Gd�dt��}ddtdttt��t	��d||d	��|d
��g}|D]i}|�t
|����5|�t�	|����ddd��n#1swxYwY�jdS)Nc��eZdZd�Zd�ZdS)�3IsShareableTests.test_not_shareable.<locals>.Cheesec��||_dSr�rX)rYrXs  rrzz<IsShareableTests.test_not_shareable.<locals>.Cheese.__init__Es
�� ��	�	�	rc��|jSrr�r�s r�__str__z;IsShareableTests.test_not_shareable.<locals>.Cheese.__str__Gs
���y� rN)r\r]r^rzr�rdrr�Cheeser�Ds2������
!�
!�
!�
!�
!�
!�
!�
!rr�c��eZdZdZdS)�5IsShareableTests.test_not_shareable.<locals>.SubByteszA subclass of a shareable type.N)r\r]r^�__doc__rdrr�SubBytesr�Js������1�1�1�1rr�TF.gY@�Wensleydaler�)
�bytes�NotImplementedr��objectr�r��repr�assertFalserr�)rYr�r��not_shareablesr�s     r�test_not_shareablez#IsShareableTests.test_not_shareableCsO��	!�	!�	!�	!�	!�	!�	!�	!�	2�	2�	2�	2�	2�u�	2�	2�	2�
����������������}�%�%����!�!���""�	4�	4�C����d�3�i�i�(�(�
4�
4�� � � �-�-�c�2�2�4�4�4�
4�
4�
4�
4�
4�
4�
4�
4�
4�
4�
4����
4�
4�
4�
4��	4�	4s�.C�C	�C	N)r\r]r^r�r�rdrrr�r�2s2������
4�
4�
4�4�4�4�4�4rr�c�R��eZdZ�fd�Z�fd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Z�xZS)
�ShareableTypeTestsc���t�����t���|_dSr)rV�setUpr�channel_creater��rYrZs �rr�zShareableTypeTests.setUpfs+���
���
�
�����.�.�0�0����rc���t�|j��t�����dSr)rr�r�rVr�r�s �rr�zShareableTypeTests.tearDownjs5����$�$�T�X�.�.�.�
���������rc�t�|D]�}|�|��5t�|j|��t�|j��}|�||��|�t|��t|����ddd��n#1swxYwY��dSr)r�rr�r�r��assertEqual�assertIsr�)rY�valuesr��gots    r�_assert_valuesz!ShareableTypeTests._assert_valuesns����	4�	4�C����c�"�"�
4�
4��)�)�$�(�C�8�8�8�"�/�/���9�9��� � ��c�*�*�*��
�
�d�3�i�i��c���3�3�3�
4�
4�
4�
4�
4�
4�
4�
4�
4�
4�
4����
4�
4�
4�
4��	4�	4s�BB,�,B0	�3B0	c��dD]�}|�|��5t�|j|��t�|j��}|�||��ddd��n#1swxYwY��dS)Nr)r�rr�r�r�r�)rYr�r�s   r�test_singletonsz"ShareableTypeTests.test_singletonsys����	(�	(�C����c�"�"�
(�
(��)�)�$�(�C�8�8�8�"�/�/���9�9���
�
�c�3�'�'�'�
(�
(�
(�
(�
(�
(�
(�
(�
(�
(�
(����
(�
(�
(�
(��	(�	(s�AA<�<B	�B	c�@�|�dd|jg��dS)Nr�i')r�r�r�s r�
test_typeszShareableTypeTests.test_types�s4��������H��	�	�	�	�	rc�`�|�d�tdd��D����dS)Nc3�FK�|]}|�ddd���V��dS)��littleT)�signedN)�to_bytes)�.0�is  r�	<genexpr>z0ShareableTypeTests.test_bytes.<locals>.<genexpr>�sH����5�5� !��J�J�q�(�4�J�@�@�5�5�5�5�5�5r����)r��ranger�s r�
test_byteszShareableTypeTests.test_bytes�sH�����5�5�%*�2�s�^�^�5�5�5�	5�	5�	5�	5�	5rc�4�|�gd���dS)N)zhello worldu你好世界�)r�r�s r�	test_strszShareableTypeTests.test_strs�s#�����?�?�?�@�@�@�@�@rc��|�tjtdd��tjtjdz
g����dS)Nr�r�r�)r��	itertools�chainr��sys�maxsizer�s r�test_intzShareableTypeTests.test_int�sV�����I�O�E�"�c�N�N�-0�[�3�;�,��:J�,K�M�M�	N�	N�	N�	N�	Nrc�T�tjdztjdz
ddzg}|D]�}|�|��5|�t��5t
�|j|��ddd��n#1swxYwYddd��n#1swxYwY��dS)Nr�r���)r�r�r��assertRaises�
OverflowErrorrr�r�)rY�intsr�s   r�test_non_shareable_intz)ShareableTypeTests.test_non_shareable_int�s'���K�!�O�
�[�L�1��
�t�G�
��
�	;�	;�A����a���
;�
;��&�&�}�5�5�;�;� �-�-�d�h��:�:�:�;�;�;�;�;�;�;�;�;�;�;����;�;�;�;�
;�
;�
;�
;�
;�
;�
;�
;�
;�
;�
;����
;�
;�
;�
;��	;�	;s5�B�!B�9B�B	�	B�B	�
B�B 	�#B 	)
r\r]r^r�r�r�r�r�r�r�r�rr`ras@rr�r�ds��������1�1�1�1�1������4�4�4�(�(�(����5�5�5�A�A�A�N�N�N�	;�	;�	;�	;�	;�	;�	;rr�c� �eZdZd�Zd�Zd�ZdS)�ListAllTestsc��t���}t���}|�||g��dSr)rrCr�r�)rYrG�idss   r�test_initialzListAllTests.test_initial�sB���$�$�&�&���#�#�%�%������t�f�%�%�%�%�%rc��t���}t���}t���}t���}|�||||g��dSr)rrCrUr�r��rYrG�first�secondrs     r�test_after_creatingz ListAllTests.test_after_creating�si���$�$�&�&���#�#�%�%���$�$�&�&���#�#�%�%������t�U�F�3�4�4�4�4�4rc�2�t���}t���}t���}t�|��t���}|�|||g��dSr)rrCrUr�r�r�rs     r�test_after_destroyingz"ListAllTests.test_after_destroying�sz���$�$�&�&���#�#�%�%���$�$�&�&�����U�#�#�#��#�#�%�%������t�V�n�-�-�-�-�-rN)r\r]r^rrr
rdrrrr�sA������&�&�&�
5�5�5�.�.�.�.�.rrc��eZdZd�Zd�ZdS)�GetCurrentTestsc���t���}t���}|�||��|�|tj��dSr)rrCrDr��assertIsInstancerT)rYrG�curs   r�	test_mainzGetCurrentTests.test_main�sY���$�$�&�&���&�&�(�(������d�#�#�#����c�<�#=�>�>�>�>�>rc�v�t���}t���}t|t	d����}t|�����}t���\}}|�||��|�	||��dS)Nz�
            import _xxsubinterpreters as _interpreters
            cur = _interpreters.get_current()
            print(cur)
            assert isinstance(cur, _interpreters.InterpreterID)
            )
rrCrUr#r�int�stripr�r��assertNotEqual)rYrGr�outr�_�expecteds       r�test_subinterpreterz#GetCurrentTests.test_subinterpreter�s����$�$�&�&���$�$�&�&���&�&�*�#�#�����#�)�)�+�+����"�+�+�-�-���8�����h�'�'�'����C��&�&�&�&�&rN)r\r]r^rrrdrrrr�s2������?�?�?�'�'�'�'�'rrc��eZdZd�Zd�ZdS)�GetMainTestsc���t���\}t���}|�||��|�|tj��dSr)rr�rCr�rrT)rYrrGs   r�test_from_mainzGetMainTests.test_from_main�s[��!�*�*�,�,�
���$�$�&�&������x�(�(�(����d�L�$>�?�?�?�?�?rc��t���\}t���}t|t	d����}t|�����}|�||��dS)Nz�
            import _xxsubinterpreters as _interpreters
            main = _interpreters.get_main()
            print(main)
            assert isinstance(main, _interpreters.InterpreterID)
            )rr�rUr#rrrr�)rYrrrrGs     r�test_from_subinterpreterz%GetMainTests.test_from_subinterpreter�s{��!�*�*�,�,�
���$�$�&�&���&�&�*�#�#�����3�9�9�;�;��������x�(�(�(�(�(rN)r\r]r^rr!rdrrrr�s5������@�@�@�
)�
)�
)�
)�
)rrc�^�eZdZd�Zejd��d���Zd�Zd�Zd�Z	d�Z
dS)	�IsRunningTestsc��t���}|�t�|����dSr)rrCr�r()rYrGs  rrzIsRunningTests.test_main�s9���$�$�&�&������/�/��5�5�6�6�6�6�6rzFails on FreeBSDc��t���}|�t�|����t	|��5|�t�|����ddd��n#1swxYwY|�t�|����dSr)rrUr�r(r<r��rYrs  rrz"IsRunningTests.test_subinterpreter�s����$�$�&�&������0�0��8�8�9�9�9�
�f�
�
�	=�	=��O�O�L�3�3�F�;�;�<�<�<�	=�	=�	=�	=�	=�	=�	=�	=�	=�	=�	=����	=�	=�	=�	=�����0�0��8�8�9�9�9�9�9s�.B�B�Bc���t���}t|td|�d�����}|�|���d��dS)Nz`
            import _xxsubinterpreters as _interpreters
            if _interpreters.is_running(zZ):
                print(True)
            else:
                print(False)
            �True)rrUr#rr�r)rYrrs   rr!z'IsRunningTests.test_from_subinterpreter�sm���$�$�&�&���&�&�*�)/�*�*�*�#�#����	
��������f�-�-�-�-�-rc��t���}t�|��|�t��5t�|��ddd��dS#1swxYwYdSr)rrUr�r�r)r(r&s  r�test_already_destroyedz%IsRunningTests.test_already_destroyeds����$�$�&�&�����V�$�$�$�
�
�
�|�
,�
,�	,�	,��#�#�F�+�+�+�	,�	,�	,�	,�	,�	,�	,�	,�	,�	,�	,�	,����	,�	,�	,�	,�	,�	,��A6�6A:�=A:c��|�t��5t�d��ddd��dS#1swxYwYdS�Ni@B)r�r)rr(r�s r�test_does_not_existz"IsRunningTests.test_does_not_exists���
�
�
�|�
,�
,�	/�	/��#�#�I�.�.�.�	/�	/�	/�	/�	/�	/�	/�	/�	/�	/�	/�	/����	/�	/�	/�	/�	/�	/��A�A�
Ac��|�t��5t�d��ddd��dS#1swxYwYdS�Nr�)r�rRrr(r�s r�test_bad_idzIsRunningTests.test_bad_id
s���
�
�
�z�
*�
*�	(�	(��#�#�B�'�'�'�	(�	(�	(�	(�	(�	(�	(�	(�	(�	(�	(�	(����	(�	(�	(�	(�	(�	(r/N)r\r]r^r�unittest�skiprr!r*r.r2rdrrr#r#�s�������7�7�7��X�]�%�&�&�:�:�'�&�:�	.�	.�	.�,�,�,�/�/�/�(�(�(�(�(rr#c�8�eZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z	dS)	�InterpreterIDTestsc��t�dd���}|�t|��d��dS)Nr�Tr�)rrTr�r�rYr?s  r�
test_with_intz InterpreterIDTests.test_with_ints<��
�
'�
'��$�
'�
7�
7������R���"�%�%�%�%�%rc��Gd�dt��}t�|��d���}|�t	|��d��dS)Nc��eZdZd�ZdS)�.InterpreterIDTests.test_coerce_id.<locals>.Intc��dS�Nr�rdr�s r�	__index__z8InterpreterIDTests.test_coerce_id.<locals>.Int.__index__����rrN�r\r]r^r?rdrr�Intr<�#������
�
�
�
�
rrBTr�r�)rLrrTr�r)rYrBr?s   r�test_coerce_idz!InterpreterIDTests.test_coerce_idsn��	�	�	�	�	�#�	�	�	��
'�
'�����T�
'�
:�
:������R���"�%�%�%�%�%rc���|�ttjt	����|�ttjd��|�ttjd��|�ttjd��|�t
tjd��|�ttjd��dS�Ng$@�10s10r�l)r��	TypeErrorrrTr�rRr�r�s rr2zInterpreterIDTests.test_bad_ids������)�\�%?����J�J�J����)�\�%?��F�F�F����)�\�%?��F�F�F����)�\�%?��G�G�G����*�l�&@�"�E�E�E����-��)C�U�K�K�K�K�Krc���t���}|�t��5t�t|��dz��ddd��dS#1swxYwYdS�Nr�)rr�r�r)rTrr8s  rr.z&InterpreterIDTests.test_does_not_exist&s���
�
(�
(�
*�
*��
�
�
�|�
,�
,�	4�	4��&�&�s�2�w�w��{�3�3�3�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4����	4�	4�	4�	4�	4�	4s�+A,�,A0�3A0c��t�dd���}|�t|��d��dS�Nr�Tr�rG)rrTr�rLr8s  r�test_strzInterpreterIDTests.test_str+s<��
�
'�
'��$�
'�
7�
7������R���$�'�'�'�'�'rc��t�dd���}|�t|��d��dS)Nr�Tr�zInterpreterID(10))rrTr�r�r8s  r�	test_reprzInterpreterIDTests.test_repr/s=��
�
'�
'��$�
'�
7�
7������b���#6�7�7�7�7�7rc���t���}t�t|����}t���}|�||k��|�||k��|�|t|��k��|�t|��|k��|�|tt|����k��|�tt|����|k��|�|tt|����dzk��|�|tt|����k��|�|ddzk��|�|td��k��|�|dk��|�||k��|�||k��|�||k��|�||k��dS�N皙�����?r�r��infr�)rrUrTrr��floatr�rL�rY�id1�id2�id3s    r�
test_equalityz InterpreterIDTests.test_equality3s����!�!�#�#���(�(��S���2�2���!�!�#�#������s�
�#�#�#�����s�
�#�#�#�����s�3�x�x��(�(�(�����C���C��(�(�(�����u�S��X�X���.�/�/�/�����c�#�h�h���3�.�/�/�/������c�#�h�h���#� 5�5�6�6�6������C��H�H�
�
�-�.�.�.������4���(�(�(������e���,�-�-�-�������'�'�'�������$�$�$�������$�$�$�������$�$�$�����s�
�#�#�#�#�#rN)
r\r]r^r9rDr2r.rMrOrYrdrrr6r6s�������&�&�&�
&�&�&�L�L�L�4�4�4�
(�(�(�8�8�8�$�$�$�$�$rr6c�d�eZdZd�Zejd��d���Zd�Zd�Zd�Z	d�Z
d�Zd	S)
�CreateTestsc���t���}|�|tj��|�|t�����dSr)rrUrrT�assertInr�r8s  r�test_in_mainzCreateTests.test_in_mainLsR��
�
 �
 �
"�
"�����b�,�"<�=�=�=��
�
�b�,�/�/�1�1�2�2�2�2�2rz*enable this test when working on pystate.cc��t��}td��D]J}t���}t�|��|�|���K|�t|��d��dS)N�d)�setr�rrUr��addr��len)rY�seenrr?s    r�test_unique_idzCreateTests.test_unique_idRsx���u�u���s���	�	�A��$�$�&�&�B�� � ��$�$�$��H�H�R�L�L�L�L�����T���C�(�(�(�(�(rc�H���tj���d���fd�}tj|���}�5|���ddd��n#1swxYwY|���|��t�����dS)Nc���t������������dSr)rrU�acquire�release)r?�locks��r�fz%CreateTests.test_in_thread.<locals>.f_s2����$�$�&�&�B��L�L�N�N�N��L�L�N�N�N�N�Nrr2)r5�Lockr6r7r9r]rr�)rYrkr:r?rjs   @@r�test_in_threadzCreateTests.test_in_thread\s������~����
��	�	�	�	�	�	�
��A�&�&�&��
�	�	�
�G�G�I�I�I�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	�	�������
�
�b�,�/�/�1�1�2�2�2�2�2s�A�A�Ac�d�t���\}t���}t|t	d����}t|�����}|�tt�����|||h��dS)Nz�
            import _xxsubinterpreters as _interpreters
            id = _interpreters.create()
            print(id)
            assert isinstance(id, _interpreters.InterpreterID)
            )	rr�rUr#rrrr�ra)rYrGrVrrWs     r�test_in_subinterpreterz"CreateTests.test_in_subinterpreterks����%�%�'�'����!�!�#�#���#�v�'� � �����#�)�)�+�+��������\�2�2�4�4�5�5��c�3�7G�H�H�H�H�Hrc�v���t���\}t����d���fd�}tj|���}|���|���|�tt�����|��h��dS)Nc���t�td����}t|������dS)Nz�
                import _xxsubinterpreters as _interpreters
                id = _interpreters.create()
                print(id)
                )r#rrr)rrVrWs ��rrkz6CreateTests.test_in_threaded_subinterpreter.<locals>.f|s@����c�6�+�$�$���C�
�c�i�i�k�k�"�"�C�C�Crr2)	rr�rUr5r6r7r9r�ra)rYrGrkr:rVrWs    @@r�test_in_threaded_subinterpreterz+CreateTests.test_in_threaded_subinterpreterxs������%�%�'�'����!�!�#�#����	#�	#�	#�	#�	#�	#�
��A�&�&�&��	���	�	�	�	����������\�2�2�4�4�5�5��c�3�7G�H�H�H�H�Hrc���tt�����}g}td��D]0}t���}|�|���1|D]}t�|���t���}|�tt�����||hz��dS�N�)rarr�r�rU�appendr�r��rY�beforerrr?s     r�test_after_destroy_allz"CreateTests.test_after_destroy_all�s����\�*�*�,�,�-�-�����q���	�	�A��$�$�&�&�B��J�J�r�N�N�N�N��	%�	%�B�� � ��$�$�$�$�
�
 �
 �
"�
"������\�2�2�4�4�5�5�v���}�E�E�E�E�Erc��tt�����}t���}t���}t���}t�|��t�|��t���}|�tt�����|||hz��dSr)rarr�rUr�r�)rYrxrVrWrXr?s      r�test_after_destroy_somez#CreateTests.test_after_destroy_some�s����\�*�*�,�,�-�-���!�!�#�#���!�!�#�#���!�!�#�#�����S�!�!�!����S�!�!�!�
�
 �
 �
"�
"������\�2�2�4�4�5�5�v��S�	�7I�J�J�J�J�JrN)r\r]r^r^r3r4rermrorrryr{rdrrr[r[Js�������3�3�3��X�]�?�@�@�)�)�A�@�)�
3�
3�
3�I�I�I�I�I�I�&F�F�F�K�K�K�K�Krr[c�J�eZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
�ZdS)�DestroyTestsc�8�t���}t���}t���}|�|t�����t�|��|�|t�����|�|t�����|�|t�����dSr)rrUr]r�r��assertNotInrUs    r�test_onezDestroyTests.test_one�s����!�!�#�#���!�!�#�#���!�!�#�#���
�
�c�<�0�0�2�2�3�3�3����S�!�!�!�����l�3�3�5�5�6�6�6��
�
�c�<�0�0�2�2�3�3�3��
�
�c�<�0�0�2�2�3�3�3�3�3rc��tt�����}t��}td��D]0}t���}|�|���1|�tt�����||z��|D]}t�|���|�tt�����|��dSrt)rarr�r�rUrbr�r�rws     r�test_allzDestroyTests.test_all�s����\�*�*�,�,�-�-���e�e���q���	�	�A��$�$�&�&�B��G�G�B�K�K�K�K�����\�2�2�4�4�5�5�v��|�D�D�D��	%�	%�B�� � ��$�$�$�$�����\�2�2�4�4�5�5�v�>�>�>�>�>rc�^���t���\���t��5t����ddd��n#1swxYwY��fd�}tj|���}|���|���dS)Nc�����t��5t����ddd��dS#1swxYwYdSr�r�r)rr�)rGrYs��rrkz!DestroyTests.test_main.<locals>.f�s�����"�"�<�0�0�
+�
+��$�$�T�*�*�*�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+�
+����
+�
+�
+�
+�
+�
+s�A�A�Ar2)	rr�r�r)r�r5r6r7r9)rYrkr:rGs`  @rrzDestroyTests.test_main�s������%�%�'�'���
�
�
�|�
,�
,�	'�	'�� � ��&�&�&�	'�	'�	'�	'�	'�	'�	'�	'�	'�	'�	'����	'�	'�	'�	'�	+�	+�	+�	+�	+�	+�
��A�&�&�&��	���	�	�	�	�������s�A�A#�&A#c��t���}t�|��|�t��5t�|��ddd��dS#1swxYwYdSr)rrUr�r�r)r8s  rr*z#DestroyTests.test_already_destroyed�s���
�
 �
 �
"�
"�����R� � � �
�
�
�|�
,�
,�	%�	%�� � ��$�$�$�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%����	%�	%�	%�	%�	%�	%r+c��|�t��5t�d��ddd��dS#1swxYwYdSr-r�r�s rr.z DestroyTests.test_does_not_exist�s���
�
�
�|�
,�
,�	,�	,�� � ��+�+�+�	,�	,�	,�	,�	,�	,�	,�	,�	,�	,�	,�	,����	,�	,�	,�	,�	,�	,r/c��|�t��5t�d��ddd��dS#1swxYwYdSr1)r�rRrr�r�s rr2zDestroyTests.test_bad_id�s���
�
�
�z�
*�
*�	%�	%�� � ��$�$�$�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%����	%�	%�	%�	%�	%�	%r/c�B�t���\}t���}td|�d���}t�||��|�t
t�����||h��dS)Nzo
            import _xxsubinterpreters as _interpreters
            try:
                _interpreters.destroy(zD)
            except RuntimeError:
                pass
            �rr�rUrrr�ra)rYrGr?rs    r�test_from_currentzDestroyTests.test_from_current�s����%�%�'�'���
�
 �
 �
"�
"����(*�������	����F�+�+�+�����\�2�2�4�4�5�5��b�z�B�B�B�B�Brc�t�t���\}t���}t���}td|�d���}t�||��|�t
t�����||h��dS)NzZ
            import _xxsubinterpreters as _interpreters
            _interpreters.destroy(�)
            r�)rYrGrVrWrs     r�test_from_siblingzDestroyTests.test_from_sibling�s����%�%�'�'����!�!�#�#���!�!�#�#����#&�������	����V�,�,�,�����\�2�2�4�4�5�5��c�{�C�C�C�C�Crc���t�����fd�}tj|���}|���|���dS)Nc�<��t����dSr)rr�r�s�rrkz.DestroyTests.test_from_other_thread.<locals>.f�s���� � ��$�$�$�$�$rr2)rrUr5r6r7r9)rYrkr:r?s   @r�test_from_other_threadz#DestroyTests.test_from_other_thread�s`���
�
 �
 �
"�
"��	%�	%�	%�	%�	%�
��A�&�&�&��	���	�	�	�	�������rc�"�t���\}t���}t|��5|�t�|��d|�d����|�td|�d����5t�|��ddd��n#1swxYwY|�t�|����ddd��dS#1swxYwYdS)NzInterp z& should be running before destruction.)�msgz%Should not be able to destroy interp z while it's still running.)	rr�rUr<r�r(r�r)r�)rYrGrs   r�test_still_runningzDestroyTests.test_still_running�s����%�%�'�'����$�$�&�&��
�f�
�
�	=�	=��O�O�L�3�3�F�;�;� X�&� X� X� X�
�
Z�
Z�
Z��"�"�<�'q�v�'q�'q�'q�#�s�s�
-�
-��$�$�V�,�,�,�
-�
-�
-�
-�
-�
-�
-�
-�
-�
-�
-����
-�
-�
-�
-�
�O�O�L�3�3�F�;�;�<�<�<�	=�	=�	=�	=�	=�	=�	=�	=�	=�	=�	=�	=����	=�	=�	=�	=�	=�	=s7�AD�B?�3D�?C	�D�C	�0D�D�DN)
r\r]r^r�r�rr*r.r2r�r�r�r�rdrrr}r}�s�������4�4�4�	?�	?�	?����%�%�%�,�,�,�%�%�%�C�C�C�
D�
D�
D����
=�
=�
=�
=�
=rr}c���eZdZ�fd�Zd�Zd�Zd�Zej��d���Z	d�Z
d�Zd�Zd	�Z
d
�Zd�Zejdd
���Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zejd��d���Z�xZS)�RunStringTestsc���t�����t���|_dSr)rVr�rrUr?r�s �rr�zRunStringTests.setUps+���
���
�
�����%�%�'�'����rc���td��\}}|5t�|j|��|���}ddd��n#1swxYwY|�|d��dS)N�print("it worked!", end="")�
it worked!)rrrr?rr�)rYr�filers    r�test_successzRunStringTests.test_successs���'�(E�F�F����
�	�	��#�#�D�G�V�4�4�4��)�)�+�+�C�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	�	
����l�+�+�+�+�+s�5A�A�Ac�<���td��\�}|5��fd�}tj|���}|���|���|���}ddd��n#1swxYwY��|d��dS)Nr�c�H��t��j���dSr)rrr?)rrYs��rrkz(RunStringTests.test_in_thread.<locals>.fs!����'�'����8�8�8�8�8rr2r�)rr5r6r7r9rr�)rYr�rkr:rrs`    @rrmzRunStringTests.test_in_threads�����'�(E�F�F����
�	�	�
9�
9�
9�
9�
9�
9�� ��*�*�*�A�
�G�G�I�I�I�
�F�F�H�H�H��)�)�+�+�C�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	�	
����l�+�+�+�+�+s�AA;�;A?�A?c��t�d���}td��\}}|5t�||��|���}ddd��n#1swxYwY|�|d��dS)NF)�isolatedz�
            import threading
            def f():
                print('it worked!', end='')

            t = threading.Thread(target=f)
            t.start()
            t.join()
            r�)rrUrrrr�)rY�	subinterprr�rs     r�test_create_threadz!RunStringTests.test_create_thread$s��� �'�'��'�7�7�	�'�)�������	�	��#�#�I�v�6�6�6��)�)�+�+�C�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	�	
����l�+�+�+�+�+s�0A,�,A0�3A0c��ddl}|�dd���5}|�d��|���d}t	d|j�d|�d	���}t�|j|��|�	d��|�
��}|�||��ddd��dS#1swxYwYdS)
Nrzw+rrr�zspam spam spam spam spamz�
                import os
                try:
                    os.fork()
                except RuntimeError:
                    with open('zE', 'w', encoding='utf-8') as out:
                        out.write('z')
                )�tempfile�NamedTemporaryFiler8�flushrrXrrr?�seekrr�)rYr�r�rr�contents      r�	test_forkzRunStringTests.test_fork5s+������
�
(�
(���
(�
@�
@�	0�D��J�J�r�N�N�N��J�J�L�L�L�1�H���
!%�	���%-�
�����F�
�#�#�D�G�V�4�4�4��I�I�a�L�L�L��i�i�k�k�G����W�h�/�/�/�#	0�	0�	0�	0�	0�	0�	0�	0�	0�	0�	0�	0����	0�	0�	0�	0�	0�	0s�B&C�C�Cc��t|j��5|�t��5t�|jd��ddd��n#1swxYwYddd��dS#1swxYwYdS)N�
print("spam"))r<r?r�r)rrr�s r�test_already_runningz#RunStringTests.test_already_runningKs��
�d�g�
�
�	B�	B��"�"�<�0�0�
B�
B��'�'����A�A�A�
B�
B�
B�
B�
B�
B�
B�
B�
B�
B�
B����
B�
B�
B�
B�	B�	B�	B�	B�	B�	B�	B�	B�	B�	B�	B�	B����	B�	B�	B�	B�	B�	Bs4�A5�!A�A5�A!	�!A5�$A!	�%A5�5A9�<A9c��d}|t���vr |dz
}|t���v� |�t��5t�|d��ddd��dS#1swxYwYdS)Nrr�r�)rr�r�r)rr8s  rr.z"RunStringTests.test_does_not_existPs���
���L�)�)�+�+�+�+��!�G�B��L�)�)�+�+�+�+�
�
�
�|�
,�
,�	9�	9��#�#�B��8�8�8�	9�	9�	9�	9�	9�	9�	9�	9�	9�	9�	9�	9����	9�	9�	9�	9�	9�	9s�B�B�Bc��|�t��5t�dd��ddd��dS#1swxYwYdS)Nr�r�)r�rRrrr�s r�
test_error_idzRunStringTests.test_error_idWs���
�
�
�z�
*�
*�	9�	9��#�#�B��8�8�8�	9�	9�	9�	9�	9�	9�	9�	9�	9�	9�	9�	9����	9�	9�	9�	9�	9�	9��A�A�Ac��|�t��5t�dd��ddd��dS#1swxYwYdS)Nr�r�)r�rHrrr�s rr2zRunStringTests.test_bad_id[s���
�
�
�y�
)�
)�	=�	=��#�#�F�O�<�<�<�	=�	=�	=�	=�	=�	=�	=�	=�	=�	=�	=�	=����	=�	=�	=�	=�	=�	=r�c��|�t��5t�|jd��ddd��dS#1swxYwYdSr>�r�rHrrr?r�s r�test_bad_scriptzRunStringTests.test_bad_script_s���
�
�
�y�
)�
)�	1�	1��#�#�D�G�R�0�0�0�	1�	1�	1�	1�	1�	1�	1�	1�	1�	1�	1�	1����	1�	1�	1�	1�	1�	1��!A	�	A
�A
c��|�t��5t�|jd��ddd��dS#1swxYwYdS)Ns
print("spam")r�r�s r�test_bytes_for_scriptz$RunStringTests.test_bytes_for_scriptcs���
�
�
�y�
)�
)�	?�	?��#�#�D�G�-=�>�>�>�	?�	?�	?�	?�	?�	?�	?�	?�	?�	?�	?�	?����	?�	?�	?�	?�	?�	?r�Nc#�K�|�tj��5}dV�ddd��n#1swxYwY|�P|�t	|j���d��dt	|����dS|�t	|j��d�||����dS)N�:rz{}: {})r�r�RunFailedErrorr�rL�	exception�splitrS)rY�exctyper��caughts    r�assert_run_failedz RunStringTests.assert_run_failedgs
����
�
�
�|�:�
;�
;�	�v��E�E�E�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	��;����S��!1�2�2�8�8��=�=�a�@� ��\�\�
+�
+�
+�
+�
+�
���S��!1�2�2�%�_�_�W�c�:�:�
<�
<�
<�
<�
<s�3�7�7c��|�t��5t�|jd��ddd��dS#1swxYwYdS)Nzprint("spam")r��SyntaxErrorrrr?r�s r�test_invalid_syntaxz"RunStringTests.test_invalid_syntaxrs���
�
#�
#�K�
0�
0�	=�	=��#�#�D�G�^�<�<�<�	=�	=�	=�	=�	=�	=�	=�	=�	=�	=�	=�	=����	=�	=�	=�	=�	=�	=r�c��|�td��5t�|jd��ddd��dS#1swxYwYdS)Nr�zraise Exception("spam"))r�r�rrr?r�s r�test_failurezRunStringTests.test_failurews���
�
#�
#�I�v�
6�
6�	H�	H��#�#�D�G�-F�G�G�G�	H�	H�	H�	H�	H�	H�	H�	H�	H�	H�	H�	H����	H�	H�	H�	H�	H�	H��!A
�
A�Ac��|�td��5t�|jd��ddd��dS#1swxYwYdS)N�42zraise SystemExit(42))r��
SystemExitrrr?r�s r�test_SystemExitzRunStringTests.test_SystemExit{s���
�
#�
#�J��
5�
5�	E�	E��#�#�D�G�-C�D�D�D�	E�	E�	E�	E�	E�	E�	E�	E�	E�	E�	E�	E����	E�	E�	E�	E�	E�	Er�c��|�t��5t�|jtd����ddd��n#1swxYwY|�td��5t�|jtd����ddd��dS#1swxYwYdS)NzG
                import sys
                sys.exit()
                r�zI
                import sys
                sys.exit(42)
                )r�r�rrr?rr�s r�
test_sys_exitzRunStringTests.test_sys_exitsA��
�
#�
#�J�
/�
/�	�	��#�#�D�G�V�5�.�.�
�
�
�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	��
#�
#�J��
5�
5�	�	��#�#�D�G�V�5�.�.�
�
�
�	�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	�	�	s#�.A�A�A�;.B6�6B:�=B:c��tj��\}}dddd�}td|�d���}t�|j||��t
|d��5}tj|��}ddd��n#1swxYwY|�	|dd��|�	|d	d
��|�	|dd��|�
|d
��dS)N�hams-1)r��eggs�cheddarz�
            eggs = int(eggs)
            spam = 42
            result = spam + eggs

            ns = dict(vars())
            del ns['__builtins__']
            import pickle
            with open(�C, 'wb') as chan:
                pickle.dump(ns, chan)
            �rbr��*r�r�r��)r�)rrrrrr?r�pickle�loadr��assertIsNone�rYrrr!r�chan�nss       r�test_with_sharedzRunStringTests.test_with_shared�sK���w�y�y���1�������
�
��
�
�
�
�
��	�������8�8�8�
�!�T�]�]�	#�d���T�"�"�B�	#�	#�	#�	#�	#�	#�	#�	#�	#�	#�	#����	#�	#�	#�	#�	
����F��R�(�(�(�����F��R�(�(�(�����H��r�*�*�*����"�Y�-�(�(�(�(�(s�!B�B�	Bc��t�|jtd����ddi}td��}t�|j||��t	j��\}}td|�d���}t�|j|��t
|d��5}tj|��}ddd��n#1swxYwY|�	|ddd	��|�	|d
dd��|�	|dd��dS)Nzj
            spam = 'eggs'
            ns1 = dict(vars())
            del ns1['__builtins__']
            r�r�zL
            ns2 = dict(vars())
            del ns2['__builtins__']
        zr
            ns = dict(vars())
            del ns['__builtins__']
            import pickle
            with open(r�r��ns1r��ns2)
rrr?rrrrr�r�r�)rYr!rrrr�r�s       r�test_shared_overwritesz%RunStringTests.test_shared_overwrites�s���������1�*�*�	�	�	��&�!����
�
��	�������8�8�8��w�y�y���1����	������	������0�0�0�
�!�T�]�]�	#�d���T�"�"�B�	#�	#�	#�	#�	#�	#�	#�	#�	#�	#�	#����	#�	#�	#�	#�	
����E��6�*�F�3�3�3�����E��6�*�F�3�3�3�����F��V�,�,�,�,�,s�;C�C �#C c�R�tj��\}}ddi}td|�d���}t�|j||��t
|d��5}tj|��}ddd��n#1swxYwY|�	|dd��dS)Nr\snot __main__z�
            spam = 42

            ns = dict(vars())
            del ns['__builtins__']
            import pickle
            with open(r�r�)
rrrrrr?rr�r�r�r�s       r�#test_shared_overwrites_default_varsz2RunStringTests.test_shared_overwrites_default_vars�s����w�y�y���1��o�.�����
������	�������8�8�8�
�!�T�]�]�	#�d���T�"�"�B�	#�	#�	#�	#�	#�	#�	#�	#�	#�	#�	#����	#�	#�	#�	#�	
����J���9�9�9�9�9s�B�B�Bc���tj��\}}t�|jtd|�d�����t
|d��5}tj|��}ddd��n#1swxYwYtj��\}}t�|jtd|�d�����t
|d��5}tj|��}ddd��n#1swxYwY|�	d|��|�
d|��|�	d|��|�	d|��dS)Nz�
            spam = True

            ns = dict(vars())
            del ns['__builtins__']
            import pickle
            with open(zd, 'wb') as chan:
                pickle.dump(ns, chan)
            del ns, pickle, chan
            r�z�
            eggs = False

            ns = dict(vars())
            del ns['__builtins__']
            import pickle
            with open(r�r�r�)rrrrr?rrr�r�r]r)rYrrr�r�r�s      r�test_main_reusedzRunStringTests.test_main_reused�s����w�y�y���1�������	1��
	1�	1�	1�	*�	*�		�		�		��!�T�]�]�	$�d��+�d�#�#�C�	$�	$�	$�	$�	$�	$�	$�	$�	$�	$�	$����	$�	$�	$�	$��w�y�y���1�������1��
1�1�1�*�*�	�	�	��!�T�]�]�	$�d��+�d�#�#�C�	$�	$�	$�	$�	$�	$�	$�	$�	$�	$�	$����	$�	$�	$�	$�	
�
�
�f�c�"�"�"������%�%�%��
�
�f�c�"�"�"��
�
�f�c�"�"�"�"�"s$�A9�9A=�A=�C<�<D�Dc
��tj��\}}td|�d���}t�|j|��t
|d��5}tj|��}ddd��n#1swxYwY|�	d��|�	d��|�
|diddddd���dS)	Nz�
            spam = 42

            ns = dict(vars())
            ns['__builtins__'] = str(ns['__builtins__'])
            import pickle
            with open(r�r��__builtins__�
__loader__�__main__r�)r\�__annotations__r��__package__�__spec__r�)rrrrrr?rr�r��popr�)rYrrrr�r�s      r� test_execution_namespace_is_mainz/RunStringTests.test_execution_namespace_is_main�s(���w�y�y���1����
������	������0�0�0�
�!�T�]�]�	#�d���T�"�"�B�	#�	#�	#�	#�	#�	#�	#�	#�	#�	#�	#����	#�	#�	#�	#�	���~����
���|��������"�!�����
��	�	�	�	�	s�A;�;A?�A?zblocking foreverc�R�td��}tj��5}tj|d|��}tj|��5}|���}ddd��n#1swxYwYddd��n#1swxYwY|�|d��dS)Na�
        from textwrap import dedent
        import threading
        import _xxsubinterpreters as _interpreters
        id = _interpreters.create()
        def f():
            _interpreters.run_string(id, dedent('''
                import time
                # Give plenty of time for the main interpreter to finish.
                time.sleep(1_000_000)
                '''))

        t = threading.Thread(target=f)
        t.start()
        rr)rr�temp_dirr�make_script�spawn_python�waitr�)rYr�dirname�filename�proc�retcodes      r�test_still_running_at_exitz)RunStringTests.test_still_running_at_exits����
�
���
�
�
�	&�7�$�0��(�F�K�K�H��+�H�5�5�
&���)�)�+�+��
&�
&�
&�
&�
&�
&�
&�
&�
&�
&�
&����
&�
&�
&�
&�	&�	&�	&�	&�	&�	&�	&�	&�	&�	&�	&����	&�	&�	&�	&�
	
����!�$�$�$�$�$s5�+B�A/�#B�/A3	�3B�6A3	�7B�B
�
B
r) r\r]r^r�r�rmr�r�
requires_forkr�r�r.r�r2r�r��
contextlib�contextmanagerr�r�r�r�r�r�r�r�r�r�r3r4r�r`ras@rr�r�	s��������(�(�(�(�(�,�,�,�,�,�,�,�,�,�"�W����0�0���0�*B�B�B�
9�9�9�9�9�9�=�=�=�1�1�1�?�?�?���<�<�<���<�=�=�=�
H�H�H�E�E�E����)�)�)�8-�-�-�<:�:�:�&#�#�#�B���8�X�]�%�&�&�%�%�'�&�%�%�%�%�%rr�c�D�eZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
S)�ChannelIDTestsc��t�dd���}|�t|��d��|�|jd��dS)Nr�Tr�ri)r�_channel_idr�rrl�rYr�s  r�test_default_kwargsz"ChannelIDTests.test_default_kwargs4sT���&�&�r��&�6�6������S���2�&�&�&������&�)�)�)�)�)rc�<�t�ddd���}|�|jd��t�dddd���}|�|jd��t�ddd���}|�|jd��t�dddd�	��}|�|jd��t�dddd���}|�|jd
��dS)Nr�T�rqr�rqF�rqrrr��rrr�rr)rrrqr�ri)rr�r�rlr�s  r�test_with_kwargszChannelIDTests.test_with_kwargs:s���&�&�r��D�&�A�A�������&�)�)�)��&�&�r��5��&�M�M�������&�)�)�)��&�&�r��D�&�A�A�������&�)�)�)��&�&�r��5��&�M�M�������&�)�)�)��&�&�r��4�t�&�L�L�������&�)�)�)�)�)rc��Gd�dt��}t�|��d���}|�t	|��d��dS)Nc��eZdZd�ZdS)�*ChannelIDTests.test_coerce_id.<locals>.Intc��dSr>rdr�s rr?z4ChannelIDTests.test_coerce_id.<locals>.Int.__index__Lr@rNrArdrrrBrKrCrrBTr�r�)rLrr�r�r)rYrBr�s   rrDzChannelIDTests.test_coerce_idJsn��	�	�	�	�	�#�	�	�	��&�&�s�s�u�u�D�&�9�9������S���2�&�&�&�&�&rc���|�ttjt	����|�ttjd��|�ttjd��|�ttjd��|�t
tjd��|�ttjd��dSrF)r�rHrr�r�rRr�r�s rr2zChannelIDTests.test_bad_idRs������)�\�%=�v�x�x�H�H�H����)�\�%=�t�D�D�D����)�\�%=�t�D�D�D����)�\�%=�u�E�E�E����*�l�&>��C�C�C����-��)A�5�I�I�I�I�Irc��|�t��5t�ddd���ddd��dS#1swxYwYdS)Nr�F�rqrr)r�rRrr�r�s r�test_bad_kwargszChannelIDTests.test_bad_kwargsZs���
�
�
�z�
*�
*�	A�	A��$�$�R�e�%�$�@�@�@�	A�	A�	A�	A�	A�	A�	A�	A�	A�	A�	A�	A����	A�	A�	A�	A�	A�	As�A�A
�
A
c��t���}|�tj��5t�t|��dz��ddd��dS#1swxYwYdSrJ)rr�r�r�r�rr�s  rr.z"ChannelIDTests.test_does_not_exist^s����)�)�+�+��
�
�
�|�@�
A�
A�	3�	3��$�$�S��X�X��\�2�2�2�	3�	3�	3�	3�	3�	3�	3�	3�	3�	3�	3�	3����	3�	3�	3�	3�	3�	3s�+A1�1A5�8A5c��t�dd���}|�t|��d��dSrL)rr�r�rLr�s  rrMzChannelIDTests.test_strcs<���&�&�r��&�6�6������S���4�(�(�(�(�(rc��t�dd���}|�t|��d��t�ddd���}|�t|��d��t�ddd���}|�t|��d��t�dddd�	��}|�t|��d��dS)
Nr�Tr�z
ChannelID(10)rzChannelID(10, send=True)rzChannelID(10, recv=True)r)rr�r�r�r�s  rrOzChannelIDTests.test_reprgs����&�&�r��&�6�6������c���O�4�4�4��&�&�r��D�&�A�A������c���$>�?�?�?��&�&�r��D�&�A�A������c���$>�?�?�?��&�&�r��4�t�&�L�L������c���O�4�4�4�4�4rc���t���}t�t|����}t���}|�||k��|�||k��|�|t|��k��|�t|��|k��|�|tt|����k��|�tt|����|k��|�|tt|����dzk��|�|tt|����k��|�|ddzk��|�|td��k��|�|dk��|�||k��|�||k��|�||k��|�||k��dSrQ)rr�r�rr�rTr�rL)rY�cid1�cid2�cid3s    rrYzChannelIDTests.test_equalityts����*�*�,�,���'�'��D�	�	�2�2���*�*�,�,��������%�%�%�������%�%�%������D�	�	�)�*�*�*�����D�	�	�T�)�*�*�*������c�$�i�i� 0� 0�0�1�1�1�����c�$�i�i�(�(�D�0�1�1�1������s�4�y�y�!1�!1�C�!7�7�8�8�8������S��Y�Y���/�0�0�0������D���)�)�)������u���-�.�.�.�������(�(�(�������&�&�&�������&�&�&�������&�&�&�������%�%�%�%�%rN)r\r]r^r�rrDr2rr.rMrOrYrdrrr�r�2s�������*�*�*�*�*�*� '�'�'�J�J�J�A�A�A�3�3�3�
)�)�)�5�5�5�&�&�&�&�&rr�c��eZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
�Zd�Z
d�Zd
�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zejd��d���Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z d�Z!d�Z"d �Z#d!�Z$d"�Z%d#�Z&d$�Z'd%�Z(d&�Z)d'S)(�ChannelTestsc�x�t���}|�|tj��dSr)rr�r�	ChannelIDr�s  r�test_create_cidzChannelTests.test_create_cid�s2���)�)�+�+�����c�<�#9�:�:�:�:�:rc��t���}t���}t���}t���}t���}|�|t	|��dz��|�|t	|��dz��|�t|��t|��z
|||h��dSrJ)rr�r�r�rra)rYrxrVrWrX�afters      r�test_sequential_idsz ChannelTests.test_sequential_ids�s����.�.�0�0���)�)�+�+���)�)�+�+���)�)�+�+���-�-�/�/������c�#�h�h��l�+�+�+�����c�#�h�h��l�+�+�+�����U���c�&�k�k�1�C��c�?�C�C�C�C�Crc��t���}t|td����}t	|�����}t���}t|td����}t	|�����}|�|t	|��dz��dS)Nz�
            import _xxsubinterpreters as _interpreters
            cid = _interpreters.channel_create()
            print(cid)
            r�)rrUr#rrrr�)rYrVrrrWrs      r�test_ids_globalzChannelTests.test_ids_global�s����!�!�#�#���#�v�'� � ����
�3�9�9�;�;�����!�!�#�#���#�v�'� � ����
�3�9�9�;�;��������s�4�y�y�1�}�-�-�-�-�-rc��t���}t�|d���}t�|d���}|�|g��|�|g��dS)z=Test listing interpreters for a channel with no associations.T�rqFN)rr��channel_list_interpretersr�)rYr��send_interps�recv_interpss    r�#test_channel_list_interpreters_nonez0ChannelTests.test_channel_list_interpreters_none�sw���)�)�+�+��#�=�=�c��=�M�M��#�=�=�c��=�N�N������r�*�*�*�����r�*�*�*�*�*rc��t���}t���}t�|d��t�|d���}t�|d���}|�||g��|�|g��t���}t|td|�d�����t�|d���}t�|d���}|�||g��|�||g��dS)z(Test basic listing channel interpreters.rqTrF�e
            import _xxsubinterpreters as _interpreters
            obj = _interpreters.channel_recv(r�N)	rrCr�r�rr�rUr#r)rY�interp0r�r r!�interp1s      r�$test_channel_list_interpreters_basicz1ChannelTests.test_channel_list_interpreters_basic�sH���'�'�)�)���)�)�+�+���!�!�#�v�.�.�.�#�=�=�c��=�M�M��#�=�=�c��=�N�N�������y�1�1�1�����r�*�*�*��%�%�'�'���G�V�%�.1�%�%�%���	�	�	�
$�=�=�c��=�M�M��#�=�=�c��=�N�N�������y�1�1�1������y�1�1�1�1�1rc��t���}t���}t���}t���}t���}t�|d��t|t
d|�d�����t|t
d|�d�����t|t
d|�d�����t�|d���}t�|d���}|�t|��||h��|�t|��||h��d	S)
z?Test listing interpreters for a channel with many associations.rq�_
            import _xxsubinterpreters as _interpreters
            _interpreters.channel_send(z, "send")
            r$r�TrFN)
rrCrUr�r�r#rrr�ra)rYr%r&�interp2�interp3r�r r!s        r�'test_channel_list_interpreters_multiplez4ChannelTests.test_channel_list_interpreters_multiple�s����'�'�)�)���%�%�'�'���%�%�'�'���%�%�'�'���)�)�+�+���!�!�#�v�.�.�.��G�V�%�(+�%�%�%���	�	�	�	�G�V�%�.1�%�%�%���	�	�	�	�G�V�%�.1�%�%�%���	�	�	�$�=�=�c��=�M�M��#�=�=�c��=�N�N������\�*�*�W�g�,>�?�?�?�����\�*�*�W�g�,>�?�?�?�?�?rc���t���}t���}t���}t�|d��t|t
d|�d�����t�|d���}t�|d���}|�||g��|�||g��t�	|��t�|d���}t�|d���}|�||g��|�|g��dS)z?Test listing channel interpreters with a destroyed interpreter.rqr$r�TrFN)
rrCrUr�r�r#rrr�r��rYr%r&r�r r!s      r�(test_channel_list_interpreters_destroyedz5ChannelTests.test_channel_list_interpreters_destroyed�s\���'�'�)�)���%�%�'�'���)�)�+�+���!�!�#�v�.�.�.��G�V�%�.1�%�%�%���	�	�	�
$�=�=�c��=�M�M��#�=�=�c��=�N�N�������y�1�1�1������y�1�1�1����W�%�%�%�#�=�=�c��=�M�M��#�=�=�c��=�N�N�������y�1�1�1�����r�*�*�*�*�*rc��t���}t���}t���}t���}t�|d��t|t
d|�d�����t�|d��t|t
d|�d�����t�|d���}t�|d���}|�t|��d��|�t|��d��t�
|d���t�|d���}t�|d���}|�t|��d	��|�t|��d��t|t
d
|�d�����t�|d���}t�|d���}|�t|��d	��|�||g��dS)z:Test listing channel interpreters with a released channel.�datar$r�TrFr�r�r�b
            import _xxsubinterpreters as _interpreters
            _interpreters.channel_release(N)rrCrUr�r�r#rrr�rc�channel_release)rYr%r&r*r�r r!s       r�'test_channel_list_interpreters_releasedz4ChannelTests.test_channel_list_interpreters_released�s����'�'�)�)���%�%�'�'���%�%�'�'���)�)�+�+���!�!�#�v�.�.�.��G�V�%�.1�%�%�%���	�	�	�	�!�!�#�v�.�.�.��G�V�%�.1�%�%�%���	�	�	�
$�=�=�c��=�M�M��#�=�=�c��=�N�N������\�*�*�A�.�.�.�����\�*�*�A�.�.�.�	�$�$�S�t�$�4�4�4�#�=�=�c��=�M�M��#�=�=�c��=�N�N������\�*�*�A�.�.�.�����\�*�*�A�.�.�.�	�G�V�%�+.�%�%�%���	�	�	�
$�=�=�c��=�M�M��#�=�=�c��=�N�N������\�*�*�A�.�.�.������y�1�1�1�1�1rc�T�t���}t���}t���}t�|d��t�|d���}t�|d���}|�t|��d��|�t|��d��t�|d���|�	tj
��5t�|d���ddd��n#1swxYwY|�	tj
��5t�|d���ddd��dS#1swxYwYdS)	z8Test listing channel interpreters with a closed channel.rqTrFr�rr�N)rrCrUr�r�rr�rcr�r�rcr.s      r�%test_channel_list_interpreters_closedz2ChannelTests.test_channel_list_interpreters_closed*s���'�'�)�)���%�%�'�'���)�)�+�+���!�!�#�v�.�.�.�$�=�=�c��=�M�M��#�=�=�c��=�N�N������\�*�*�A�.�.�.�����\�*�*�A�.�.�.�	�"�"�3�d�"�3�3�3�
�
�
�|�>�
?�
?�	C�	C��2�2�3�T�2�B�B�B�	C�	C�	C�	C�	C�	C�	C�	C�	C�	C�	C����	C�	C�	C�	C�
�
�
�|�>�
?�
?�	D�	D��2�2�3�U�2�C�C�C�	D�	D�	D�	D�	D�	D�	D�	D�	D�	D�	D�	D����	D�	D�	D�	D�	D�	Ds$� E	�	E
�E
�3F�F!�$F!c��t���}t���}t���}t�|d��t�|d���}t�|d���}|�t|��d��|�t|��d��t�|d���|�	tj
��5t�|d���ddd��n#1swxYwYt�|d���}|�t|��d��t|td|�d	�����|�	tj
��5t�|d���ddd��n#1swxYwY|�	tj
��5t�|d���ddd��dS#1swxYwYdS)
zCTest listing channel interpreters with a channel's send end closed.rqTrFr�rN�`
            import _xxsubinterpreters as _interpreters
            _interpreters.channel_close(�, force=True)
            )
rrCrUr�r�rr�rcr�r�rcr#rr.s      r�.test_channel_list_interpreters_closed_send_endz;ChannelTests.test_channel_list_interpreters_closed_send_end@s���'�'�)�)���%�%�'�'���)�)�+�+���!�!�#�v�.�.�.�$�=�=�c��=�M�M��#�=�=�c��=�N�N������\�*�*�A�.�.�.�����\�*�*�A�.�.�.�	�"�"�3�T�"�2�2�2�
�
�
�|�>�
?�
?�	C�	C��2�2�3�T�2�B�B�B�	C�	C�	C�	C�	C�	C�	C�	C�	C�	C�	C����	C�	C�	C�	C�$�=�=�c��=�N�N������\�*�*�A�.�.�.�	�G�V�%�),�%�%�%���	�	�	�
�
�
�|�>�
?�
?�	C�	C��2�2�3�T�2�B�B�B�	C�	C�	C�	C�	C�	C�	C�	C�	C�	C�	C����	C�	C�	C�	C�
�
�
�|�>�
?�
?�	D�	D��2�2�3�U�2�C�C�C�	D�	D�	D�	D�	D�	D�	D�	D�	D�	D�	D�	D����	D�	D�	D�	D�	D�	Ds6� E	�	E
�E
�G<�<H�H�&I�I�Ic��t���}d}t�||��t�|��}|�||��|�||��dS�Nr�)rr�r�r�r��assertIsNot)rYr��origr�s    r�test_send_recv_mainz ChannelTests.test_send_recv_maindss���)�)�+�+�����!�!�#�t�,�,�,��'�'��,�,������d�#�#�#�����d�#�#�#�#�#rc�r�t���}t|td����}dS)Na6
            import _xxsubinterpreters as _interpreters
            cid = _interpreters.channel_create()
            orig = b'spam'
            _interpreters.channel_send(cid, orig)
            obj = _interpreters.channel_recv(cid)
            assert obj is not orig
            assert obj == orig
            )rrUr#r)rYrVrs   r�test_send_recv_same_interpreterz,ChannelTests.test_send_recv_same_interpreterms9���!�!�#�#���#�v�'� � �����rc��t���}t���}t|t	d|�d�����}t�|��}|�|d��dS)Nr)�, b'spam')
            r�)rr�rUr#rr�r�)rYr�rVrr�s     r�%test_send_recv_different_interpretersz2ChannelTests.test_send_recv_different_interpretersys����)�)�+�+���!�!�#�#���#�v�'�(+�'�'�'� � �����'�'��,�,������g�&�&�&�&�&rc�T��t�����fd�}tj|���}|���t��d��|���t����}|�|d��dS)Nc����		t����}n*#tj$rtjd��YnwxYw�Ft��|��dS)NTrR)rr�r�r&r*r�)r�r�s �rrkz8ChannelTests.test_send_recv_different_threads.<locals>.f�su���
$�$�&�3�3�C�8�8�C���#�5�$�$�$��J�s�O�O�O�O�O�$����	
$�
�%�%�c�3�/�/�/�/�/s��#A�Ar2r�)	rr�r5r6r7r�r9r�r�)rYrkr:r�r�s    @r� test_send_recv_different_threadsz-ChannelTests.test_send_recv_different_threads�s�����)�)�+�+��	0�	0�	0�	0�	0�
��A�&�&�&��	���	�	�	��!�!�#�w�/�/�/�	�������'�'��,�,������g�&�&�&�&�&rc�����t����t����d����fd�}tj|���}|���t��d��|���t����}|�	|d��dS)Nc
�P��t�td��d��d������dS)Nz�
                import time
                import _xxsubinterpreters as _interpreters
                while True:
                    try:
                        obj = _interpreters.channel_recv(z�)
                        break
                    except _interpreters.ChannelEmptyError:
                        time.sleep(0.1)
                assert(obj == b'spam')
                _interpreters.channel_send(z, b'eggs')
                )r#r)r�rVrs���rrkzIChannelTests.test_send_recv_different_interpreters_and_threads.<locals>.f�sL����c�6�+�
;>�+�+�-0�+�+�+�$�$���C�C�Crr2r��eggs)
rr�rUr5r6r7r�r9r�r�)rYrkr:r�r�rVrs    @@@r�1test_send_recv_different_interpreters_and_threadsz>ChannelTests.test_send_recv_different_interpreters_and_threads�s�������)�)�+�+���!�!�#�#����
	�
	�
	�
	�
	�
	�
	�
��A�&�&�&��	���	�	�	��!�!�#�w�/�/�/�	�������'�'��,�,������g�&�&�&�&�&rc��|�tj��5t�dd��ddd��dS#1swxYwYdS)Nr�r�)r�rr�r�r�s r�test_send_not_foundz ChannelTests.test_send_not_found�s���
�
�
�|�@�
A�
A�	3�	3��%�%�b�'�2�2�2�	3�	3�	3�	3�	3�	3�	3�	3�	3�	3�	3�	3����	3�	3�	3�	3�	3�	3s�A	�	A
�A
c��|�tj��5t�d��ddd��dS#1swxYwYdSr>)r�rr�r�r�s r�test_recv_not_foundz ChannelTests.test_recv_not_found�s���
�
�
�|�@�
A�
A�	*�	*��%�%�b�)�)�)�	*�	*�	*�	*�	*�	*�	*�	*�	*�	*�	*�	*����	*�	*�	*�	*�	*�	*s�A�A�Ac���t���}|�tj��5t�|��ddd��dS#1swxYwYdSr)rr�r�r�r�r�s  r�test_recv_emptyzChannelTests.test_recv_empty�s����)�)�+�+��
�
�
�|�=�
>�
>�	+�	+��%�%�c�*�*�*�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+����	+�	+�	+�	+�	+�	+s�A!�!A%�(A%c�v�t��}t���}t�||��}t�|d��t�|d��t�|d��t�|d��t�||��}t�||��}t�|��}t�||��}t�||��}|�||��|�|d��|�|d��|�|d��|�|d��|�||��dS)Nr�r�rJ)r�rr�r�r�r�r�)	rY�defaultr��obj1�obj2�obj3�obj4�obj5�obj6s	         r�test_recv_defaultzChannelTests.test_recv_default�st���(�(���)�)�+�+���(�(��g�6�6���!�!�#�t�,�,�,��!�!�#�q�)�)�)��!�!�#�w�/�/�/��!�!�#�w�/�/�/��(�(��g�6�6���(�(��g�6�6���(�(��-�-���(�(��g�6�6���(�(��g�6�6���
�
�d�G�$�$�$��
�
�d�D�!�!�!�����q�!�!�!�����w�'�'�'�����w�'�'�'��
�
�d�G�$�$�$�$�$rc�|�t���}t���}t|t	d��t|j�����}t�|��}|�|d��|�|�	��d��dS)Nz�
            import _xxsubinterpreters as _interpreters
            print(cid.end)
            _interpreters.channel_send(cid, b'spam')
            r�r�rq)
rr�rUr#r�dictrqr�r�r�rYr�rrr�s     r�test_run_string_arg_unresolvedz+ChannelTests.test_run_string_arg_unresolved�s����)�)�+�+���$�$�&�&���&�&�*�#�#�

�S�X���� � ���'�'��,�,������g�&�&�&���������f�-�-�-�-�-rz(disabled until high-level channels existc��t���}t�|d���}t���}t	|td��t
|j�����}t�|��}|�	|d��|�	|�
��d��dS)NT)�_resolvez�
            import _xxsubinterpreters as _interpreters
            print(chan.id.end)
            _interpreters.channel_send(chan.id, b'spam')
            )r�r�rq)rr�r�rUr#rr\rqr�r�rr]s     r�test_run_string_arg_resolvedz)ChannelTests.test_run_string_arg_resolved�s����)�)�+�+���&�&�s�T�&�:�:���$�$�&�&���&�&�*�#�#�

�c�h����!�!���'�'��,�,������g�&�&�&���������f�-�-�-�-�-rc��t���}t�|d��t�|��t�|��|�tj��5t�|d��ddd��n#1swxYwY|�tj��5t�|��ddd��dS#1swxYwYdS�Nr�rJ�rr�r�r�r�r�rcr�s  r�test_close_single_userz#ChannelTests.test_close_single_user�sb���)�)�+�+���!�!�#�w�/�/�/��!�!�#�&�&�&��"�"�3�'�'�'�
�
�
�|�>�
?�
?�	4�	4��%�%�c�7�3�3�3�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4����	4�	4�	4�	4�
�
�
�|�>�
?�
?�	+�	+��%�%�c�*�*�*�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+����	+�	+�	+�	+�	+�	+�$�B0�0B4�7B4�D�D�	Dc	��t���}t���}t���}t�|t	d|�d�����t�|t	d|�d�����t�|��|�tj��5}t�|t	d|�d�����ddd��n#1swxYwY|�dt|j
����|�tj��5}t�|t	d|�d�����ddd��n#1swxYwY|�dt|j
����dS)Nr)rCz_
            import _xxsubinterpreters as _interpreters
            _interpreters.channel_recv(r�z,
                _interpreters.channel_send(z, b'spam')
                rc)rr�rUrrr�r�r�r]rLr�)rYr�rVrW�cms     r�test_close_multiple_usersz&ChannelTests.test_close_multiple_userss[���)�)�+�+���!�!�#�#���!�!�#�#������V�-�(+�-�-�-�&�&�	�	�	�	����V�-�(+�-�-�-�&�&�	�	�	�	�"�"�3�'�'�'�
�
�
�|�:�
;�
;�	�r��#�#�C��1�,/�1�1�1�*�*�
�
�
�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	�	
�
�
�*�C���,=�,=�>�>�>�
�
�
�|�:�
;�
;�	�r��#�#�C��1�,/�1�1�1�*�*�
�
�
�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	�	
�
�
�*�C���,=�,=�>�>�>�>�>s$�-D�D�D�(-F!�!F%�(F%c�z�t���}t�|d��t�|��t�|��|�tj��5t�|��ddd��dS#1swxYwYdSr<rdr�s  r�test_close_multiple_timesz&ChannelTests.test_close_multiple_timess����)�)�+�+���!�!�#�w�/�/�/��!�!�#�&�&�&��"�"�3�'�'�'�
�
�
�|�>�
?�
?�	,�	,��&�&�s�+�+�+�	,�	,�	,�	,�	,�	,�	,�	,�	,�	,�	,�	,����	,�	,�	,�	,�	,�	,s�B0�0B4�7B4c��gd�}|D�]C\}}|�||f��5t���}t�|d��t�|��t�|||���|�tj��5t�|d��ddd��n#1swxYwY|�tj��5t�|��ddd��n#1swxYwYddd��n#1swxYwY��EdS)N))FF�TF)FT)TTr�r
rJ)r�rr�r�r�r�r�rc)rY�testsrqrrr�s     r�test_close_emptyzChannelTests.test_close_empty's������� �
	3�
	3�J�D�$����t�T�l�+�+�	
3�	
3�"�1�1�3�3���)�)�#�w�7�7�7��)�)�#�.�.�.��*�*�3�T��*�E�E�E��&�&�|�'F�G�G�<�<� �-�-�c�7�;�;�;�<�<�<�<�<�<�<�<�<�<�<����<�<�<�<��&�&�|�'F�G�G�3�3� �-�-�c�2�2�2�3�3�3�3�3�3�3�3�3�3�3����3�3�3�3�	
3�	
3�	
3�	
3�	
3�	
3�	
3�	
3�	
3�	
3�	
3����	
3�	
3�	
3�	
3��
	3�
	3sZ�BD?�/C�D?�C�D?�C�"D?�D(�D?�(D,�,D?�/D,�0D?�?E	�E	c��t���}t�|d��t�|d��|�tj��5t�|��ddd��n#1swxYwYt�|��t�|d��dS)Nr�r�rJ�rr�r�r��ChannelNotEmptyErrorr�r�r�s  r�%test_close_defaults_with_unused_itemsz2ChannelTests.test_close_defaults_with_unused_items:s����)�)�+�+���!�!�#�w�/�/�/��!�!�#�v�.�.�.�
�
�
�|�@�
A�
A�	,�	,��&�&�s�+�+�+�	,�	,�	,�	,�	,�	,�	,�	,�	,�	,�	,����	,�	,�	,�	,��!�!�#�&�&�&��!�!�#�w�/�/�/�/�/s�/B�B�Bc�T�t���}t�|d��t�|d��|�tj��5t�|d���ddd��n#1swxYwYt�|��t�|d��t�|��t�|��t�|d���dS)Nr�r�T�rrrJrqr�s  r�*test_close_recv_with_unused_items_unforcedz7ChannelTests.test_close_recv_with_unused_items_unforcedDs5���)�)�+�+���!�!�#�w�/�/�/��!�!�#�v�.�.�.�
�
�
�|�@�
A�
A�	7�	7��&�&�s��&�6�6�6�	7�	7�	7�	7�	7�	7�	7�	7�	7�	7�	7����	7�	7�	7�	7��!�!�#�&�&�&��!�!�#�w�/�/�/��!�!�#�&�&�&��!�!�#�&�&�&��"�"�3�T�"�2�2�2�2�2s�/B�B�Bc��t���}t�|d��t�|d��t�|d���|�tj��5t�|d��ddd��n#1swxYwYt�|��t�|��|�tj��5t�|��ddd��dS#1swxYwYdS)Nr�r�TrrJ�rr�r�r�r�rcr�r�s  r�*test_close_send_with_unused_items_unforcedz7ChannelTests.test_close_send_with_unused_items_unforcedQs����)�)�+�+���!�!�#�w�/�/�/��!�!�#�v�.�.�.��"�"�3�T�"�2�2�2�
�
�
�|�>�
?�
?�	4�	4��%�%�c�7�3�3�3�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4����	4�	4�	4�	4��!�!�#�&�&�&��!�!�#�&�&�&�
�
�
�|�>�
?�
?�	+�	+��%�%�c�*�*�*�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+����	+�	+�	+�	+�	+�	+s$�B3�3B7�:B7�D9�9D=�D=c�V�t���}t�|d��t�|d��|�tj��5t�|dd���ddd��n#1swxYwYt�|��t�|d��t�|��t�|��t�|d���dS)Nr�r�Tr�rJrurqr�s  r�*test_close_both_with_unused_items_unforcedz7ChannelTests.test_close_both_with_unused_items_unforced^sH���)�)�+�+���!�!�#�w�/�/�/��!�!�#�v�.�.�.�
�
�
�|�@�
A�
A�	B�	B��&�&�s��D�&�A�A�A�	B�	B�	B�	B�	B�	B�	B�	B�	B�	B�	B����	B�	B�	B�	B��!�!�#�&�&�&��!�!�#�w�/�/�/��!�!�#�&�&�&��!�!�#�&�&�&��"�"�3�T�"�2�2�2�2�2s�/B�B� Bc�&�t���}t�|d��t�|d��t�|dd���|�tj��5t�|d��ddd��n#1swxYwY|�tj��5t�|��ddd��dS#1swxYwYdS)Nr�r�TrrJrxr�s  r�(test_close_recv_with_unused_items_forcedz5ChannelTests.test_close_recv_with_unused_items_forcedk�k���)�)�+�+���!�!�#�w�/�/�/��!�!�#�v�.�.�.��"�"�3�T��"�>�>�>�
�
�
�|�>�
?�
?�	4�	4��%�%�c�7�3�3�3�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4����	4�	4�	4�	4�
�
�
�|�>�
?�
?�	+�	+��%�%�c�*�*�*�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+����	+�	+�	+�	+�	+�	+�$�B4�4B8�;B8�D�D
�
D
c�&�t���}t�|d��t�|d��t�|dd���|�tj��5t�|d��ddd��n#1swxYwY|�tj��5t�|��ddd��dS#1swxYwYdS)Nr�r�TrrJrxr�s  r�(test_close_send_with_unused_items_forcedz5ChannelTests.test_close_send_with_unused_items_forcedvr~rc�(�t���}t�|d��t�|d��t�|ddd���|�tj��5t�|d��ddd��n#1swxYwY|�tj��5t�|��ddd��dS#1swxYwYdS)Nr�r�TrrJrxr�s  r�(test_close_both_with_unused_items_forcedz5ChannelTests.test_close_both_with_unused_items_forced�sm���)�)�+�+���!�!�#�w�/�/�/��!�!�#�v�.�.�.��"�"�3�T��D�"�I�I�I�
�
�
�|�>�
?�
?�	4�	4��%�%�c�7�3�3�3�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4����	4�	4�	4�	4�
�
�
�|�>�
?�
?�	+�	+��%�%�c�*�*�*�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+����	+�	+�	+�	+�	+�	+s$�
B5�5B9�<B9�D�D�Dc��t���}t�|��|�tj��5t�|d��ddd��n#1swxYwY|�tj��5t�|��ddd��dS#1swxYwYdSr<)rr�r�r�rcr�r�r�s  r�test_close_never_usedz"ChannelTests.test_close_never_used�s8���)�)�+�+���"�"�3�'�'�'�
�
�
�|�>�
?�
?�	4�	4��%�%�c�7�3�3�3�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4����	4�	4�	4�	4�
�
�
�|�>�
?�
?�	+�	+��%�%�c�*�*�*�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+����	+�	+�	+�	+�	+�	+�$�A;�;A?�A?�%C
�
C�Cc�>�t���}t�|d��t���}t�|td|�d�����|�tj��5t�|��ddd��n#1swxYwY|�tj��5t�	|��ddd��dS#1swxYwYdS)Nr�r8r9)
rr�r�rUrrr�rcr�r��rYr�rs   r�!test_close_by_unassociated_interpz.ChannelTests.test_close_by_unassociated_interp�s����)�)�+�+���!�!�#�w�/�/�/��$�$�&�&�������0�),�0�0�0�)�)�	�	�	��
�
�|�>�
?�
?�	+�	+��%�%�c�*�*�*�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+����	+�	+�	+�	+�
�
�
�|�>�
?�
?�	,�	,��&�&�s�+�+�+�	,�	,�	,�	,�	,�	,�	,�	,�	,�	,�	,�	,����	,�	,�	,�	,�	,�	,s$�C�C�C�*D�D�Dc��t���}t�|d��t�|d��t�|d��t�|��t�|d���|�tj��5t�|d��ddd��n#1swxYwY|�tj��5t�|��ddd��dS#1swxYwYdS)Nr�Tr�rJrdr�s  r�-test_close_used_multiple_times_by_single_userz:ChannelTests.test_close_used_multiple_times_by_single_user�s����)�)�+�+���!�!�#�w�/�/�/��!�!�#�w�/�/�/��!�!�#�w�/�/�/��!�!�#�&�&�&��"�"�3�d�"�3�3�3�
�
�
�|�>�
?�
?�	4�	4��%�%�c�7�3�3�3�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4����	4�	4�	4�	4�
�
�
�|�>�
?�
?�	+�	+��%�%�c�*�*�*�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+����	+�	+�	+�	+�	+�	+s$�C(�(C,�/C,�D:�:D>�D>c��t���}|�tj��5t�dd���ddd��n#1swxYwYt�|��|�tj��5t�|d���ddd��dS#1swxYwYdS)Nr�Tr)rr�r�r�rr�rcr�s  r�.test_channel_list_interpreters_invalid_channelz;ChannelTests.test_channel_list_interpreters_invalid_channel�sg���)�)�+�+��
�
�
�|�@�
A�
A�	D�	D��2�2�4�d�2�C�C�C�	D�	D�	D�	D�	D�	D�	D�	D�	D�	D�	D����	D�	D�	D�	D�	�"�"�3�'�'�'�
�
�
�|�>�
?�
?�	C�	C��2�2�3�T�2�B�B�B�	C�	C�	C�	C�	C�	C�	C�	C�	C�	C�	C�	C����	C�	C�	C�	C�	C�	Cs#�A"�"A&�)A&�&C�C�Cc���t���}|�t��5t�|��ddd��dS#1swxYwYdSr)rr�r�rHrr�s  r�+test_channel_list_interpreters_invalid_argsz8ChannelTests.test_channel_list_interpreters_invalid_args�s����)�)�+�+��
�
�
�y�
)�
)�	8�	8��2�2�3�7�7�7�	8�	8�	8�	8�	8�	8�	8�	8�	8�	8�	8�	8����	8�	8�	8�	8�	8�	8s�A�A �#A N)*r\r]r^rrrr"r'r,r/r4r6r:r?rArDrGrKrMrOrQrZr^r3r4rarerirkrorsrvryr{r}r�r�r�r�r�r�r�rdrrrr�sj������;�;�;�	D�	D�	D�.�.�.�&+�+�+�2�2�2�,@�@�@�4+�+�+�.)2�)2�)2�VD�D�D�, D� D� D�H$�$�$�
�
�
�	'�	'�	'�'�'�'�('�'�'�83�3�3�*�*�*�+�+�+�
%�%�%�*
.�
.�
.�$�X�]�=�>�>�.�.�?�>�.�$	+�	+�	+�?�?�?�0,�,�,�3�3�3�&0�0�0�3�3�3�+�+�+�3�3�3�	+�	+�	+�	+�	+�	+�	+�	+�	+�+�+�+�,�,�,�+�+�+�	C�	C�	C�8�8�8�8�8rrc�R�eZdZdZ		d�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
�Zd�Z
dS)
�ChannelReleaseTestsa�
    - main / interp / other
    - run in: current thread / new thread / other thread / different threads
    - end / opposite
    - force / no force
    - used / not used  (associated / not associated)
    - empty / emptied / never emptied / partly emptied
    - closed / not closed
    - released / not released
    - creator (interp) / other
    - associated interpreter not running
    - associated interpreter destroyed
    c�$�t���}t�|d��t�|��t�|dd���|�tj��5t�|d��ddd��n#1swxYwY|�tj��5t�|��ddd��dS#1swxYwYdS�Nr�Tr
rJ�rr�r�r�r3r�rcr�s  r�test_single_userz$ChannelReleaseTests.test_single_user�si���)�)�+�+���!�!�#�w�/�/�/��!�!�#�&�&�&��$�$�S�t�$�$�?�?�?�
�
�
�|�>�
?�
?�	4�	4��%�%�c�7�3�3�3�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4����	4�	4�	4�	4�
�
�
�|�>�
?�
?�	+�	+��%�%�c�*�*�*�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+����	+�	+�	+�	+�	+�	+s$�B3�3B7�:B7�D�D	�D	c
���t���}t���}t���}t�|t	d|�d�����t|t	d|�d|�d�����}t�|t	d|�d�����|�|���d��dS)	Nr)rCr$z,)
            _interpreters.channel_release(z+)
            print(repr(obj))
            z+
            _interpreters.channel_release(r�zb'spam')rr�rUrrr#r�r)rYr�rVrWrs     r�test_multiple_usersz'ChannelReleaseTests.test_multiple_users�s���)�)�+�+���!�!�#�#���!�!�#�#������V�-�(+�-�-�-�&�&�	�	�	��#�v�'�.1�'�'�,/�'�'�'� � ����	����V�-�+.�-�-�-�&�&�	�	�	�	
��������i�0�0�0�0�0rc��t���}t�|d��t�|��t�|��|�tj��5t�|d��ddd��n#1swxYwY|�tj��5t�|��ddd��dS#1swxYwYdSrcr�r�s  r�test_no_kwargsz"ChannelReleaseTests.test_no_kwargssb���)�)�+�+���!�!�#�w�/�/�/��!�!�#�&�&�&��$�$�S�)�)�)�
�
�
�|�>�
?�
?�	4�	4��%�%�c�7�3�3�3�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4����	4�	4�	4�	4�
�
�
�|�>�
?�
?�	+�	+��%�%�c�*�*�*�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+����	+�	+�	+�	+�	+�	+rfc��t���}t�|d��t�|��t�|dd���|�tj��5t�|dd���ddd��dS#1swxYwYdS)Nr�Tr
r�r�s  r�test_multiple_timesz'ChannelReleaseTests.test_multiple_timess���)�)�+�+���!�!�#�w�/�/�/��!�!�#�&�&�&��$�$�S�t�$�$�?�?�?�
�
�
�|�>�
?�
?�	D�	D��(�(��4�d�(�C�C�C�	D�	D�	D�	D�	D�	D�	D�	D�	D�	D�	D�	D����	D�	D�	D�	D�	D�	Ds�B6�6B:�=B:c��t���}t�|d��t�|d��t�|dd���|�tj��5t�|��ddd��dS#1swxYwYdS)Nr�r�Tr
)rr�r�r3r�rcr�r�s  r�test_with_unused_itemsz*ChannelReleaseTests.test_with_unused_itemss����)�)�+�+���!�!�#�w�/�/�/��!�!�#�v�.�.�.��$�$�S�t�$�$�?�?�?�
�
�
�|�>�
?�
?�	+�	+��%�%�c�*�*�*�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+����	+�	+�	+�	+�	+�	+s�B4�4B8�;B8c��t���}t�|��|�tj��5t�|d��ddd��n#1swxYwY|�tj��5t�|��ddd��dS#1swxYwYdSr<)rr�r3r�rcr�r�r�s  r�test_never_usedz#ChannelReleaseTests.test_never_used(s8���)�)�+�+���$�$�S�)�)�)�
�
�
�|�>�
?�
?�	4�	4��%�%�c�7�3�3�3�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4����	4�	4�	4�	4�
�
�
�|�>�
?�
?�	+�	+��%�%�c�*�*�*�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+����	+�	+�	+�	+�	+�	+r�c�0�t���}t�|d��t���}t�|td|�d�����t�|��}t�|��|�tj	��5t�|d��ddd��n#1swxYwY|�
|d��dS)Nr�r2r�rJ)rr�r�rUrrr�r3r�rcr�)rYr�rr�s    r�test_by_unassociated_interpz/ChannelReleaseTests.test_by_unassociated_interp1s>���)�)�+�+���!�!�#�w�/�/�/��$�$�&�&�������0�+.�0�0�0�)�)�	�	�	��'�'��,�,���$�$�S�)�)�)�
�
�
�|�>�
?�
?�	4�	4��%�%�c�7�3�3�3�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4����	4�	4�	4�	4�����g�&�&�&�&�&s�
C5�5C9�<C9c
�l�t���}t���}t�|t	d|�d|�d�����|�tj��5t�|��ddd��dS#1swxYwYdS)Nze
            import _xxsubinterpreters as _interpreters
            obj = _interpreters.channel_send(z5, b'spam')
            _interpreters.channel_release(r�)rr�rUrrr�rcr�r�s   r�test_close_if_unassociatedz.ChannelReleaseTests.test_close_if_unassociated@s���)�)�+�+���$�$�&�&�������0�.1�0�0�,/�0�0�0�)�)�	�	�	��
�
�|�>�
?�
?�	+�	+��%�%�c�*�*�*�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+����	+�	+�	+�	+�	+�	+s�B)�)B-�0B-c�p�t���}t�|d��t�|��t�|d��t�|d���t�|��}|�|d��dS)Nr�Tr)rr�r�r�r3r�)rYr�r�s   r�test_partiallyz"ChannelReleaseTests.test_partiallyMs����)�)�+�+���!�!�#�t�,�,�,��!�!�#�&�&�&��!�!�#�w�/�/�/��$�$�S�t�$�4�4�4��'�'��,�,������g�&�&�&�&�&rc��t���}t�|d��t�|d��t�|d��t�|��t�|dd���|�tj��5t�|d��ddd��n#1swxYwY|�tj��5t�|��ddd��dS#1swxYwYdSr�r�r�s  r�'test_used_multiple_times_by_single_userz;ChannelReleaseTests.test_used_multiple_times_by_single_userXs����)�)�+�+���!�!�#�w�/�/�/��!�!�#�w�/�/�/��!�!�#�w�/�/�/��!�!�#�&�&�&��$�$�S�t�$�$�?�?�?�
�
�
�|�>�
?�
?�	4�	4��%�%�c�7�3�3�3�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4����	4�	4�	4�	4�
�
�
�|�>�
?�
?�	+�	+��%�%�c�*�*�*�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+�	+����	+�	+�	+�	+�	+�	+s$�C)�)C-�0C-�D;�;D?�D?N)r\r]r^r�r�r�r�r�r�r�r�r�r�r�rdrrr�r��s�����������"	+�	+�	+�1�1�1�(	+�	+�	+�D�D�D�+�+�+�+�+�+�
'�
'�
'�+�+�+�	'�	'�	'�+�+�+�+�+rr�c���eZdZdZ�fd�Zed���Zed���Zd�Zdd�Z	d�Z
d	�Zd
�Zd�Z
d�Zd
�Z�xZS)�ChannelCloseFixtureFc���|dvsJ�|jri}net�|��}t�|��}t�|��}|j||j||j|i}|sd}t	���||||||��}t
��|_t��|_	||_
|S)Nr
ro)�QUICKrIrPrXrVrWra�_preppedr��_state�_known)	rNrlrrvrw�creator�knownrYrZs	        �rrWzChannelCloseFixture.__new__ms�����&�&�&�&�&��9�
	��E�E� �)�)�&�1�1�F��(�(��/�/�E��(�(��/�/�E���V��
�E��
�E��E�
�	��G��w�w���s�C����w�G�G������
�"�n�n�������rc��|jSr�r�r�s rr�zChannelCloseFixture.state�s
���{�rc��	|jS#t$r>|�|j��}|�|��|_|jcYSwxYwr)�_cid�AttributeError�_get_interpreterr��_new_channel)rYr�s  rr�zChannelCloseFixture.cid�sb��	��9����	�	�	��+�+�D�L�9�9�G��)�)�'�2�2�D�I��9����	���s�	�AA�Ac�Z�|�|��}|�|��|Sr)r��_prep_interpreterr&s  r�get_interpreterz#ChannelCloseFixture.get_interpreter�s.���&�&�v�.�.�����v�&�&�&��
rNc�v�|�|j}|dkr|jjdkrdSt|jj��S)NrrrqF)rlr�r��boolr}s  r�expect_closed_errorz'ChannelCloseFixture.expect_closed_error�s>���;��(�C��&�=�=�T�Z�.�&�8�8��5��D�J�%�&�&�&rc�0�|�|��dSr)r�r&s  r�prep_interpreterz$ChannelCloseFixture.prep_interpreter�s�����v�&�&�&�&�&rc��||_dSrr�)rYrkr�s   r�
record_actionz!ChannelCloseFixture.record_action�s
������rc�>�t��t��dSrr�r�s r�clean_upzChannelCloseFixture.clean_up�r�rc��|jdkrt���St���}t|jd|�d���t�|��|_|jS)NrGa
                import _xxsubinterpreters
                cid = _xxsubinterpreters.channel_create()
                # We purposefully send back an int to avoid tying the
                # channel to the other interpreter.
                _xxsubinterpreters.channel_send(zC, int(cid))
                del _xxsubinterpreters
                )rXrr�rAr?r�r�)rYr��chs   rr�z ChannelCloseFixture._new_channel�s����<�6�!�!��.�.�0�0�0��,�,�.�.�B��w�z�$�
24�$�$�$�
�
�
�%�1�1�"�5�5�D�I��y�rc���|dvr|jS|dkr|jS|dkr|jS|}	|j|}n)#t$rt|��x}|j|<YnwxYw|S)N)rorrvrw)rrvrwr��KeyErrorrI)rYrrXs   rr�z$ChannelCloseFixture._get_interpreter�s����'�'�'��;��
�w�
�
��:��
�w�
�
��:���D�
?���T�*�����
?�
?�
?�-8��->�->�>����T�*�*�*�
?�����Ms�
7�#A�Ac��|j|jvrdS|j�|j��|jdkrdSt	|jd|j�d���dS)NrGa
            import _xxsubinterpreters as interpreters
            import test.test__xxsubinterpreters as helpers
            ChannelState = helpers.ChannelState
            try:
                cid
            except NameError:
                cid = interpreters._channel_id(r�)r?r�rbrXrAr�r&s  rr�z%ChannelCloseFixture._prep_interpreter�s{���9��
�%�%��F��
���&�)�$�$�$��;�&� � ��F��6�9��15�����	�	�	�	�	rr)r\r]r^r�rW�propertyr�r�r�r�r�r�r�r�r�r�r`ras@rr�r�fs��������

�E������*����X������X�����
'�'�'�'�'�'�'���������� 
�
�
�������rr�zend interp other extra creatorz%these tests take several hours to runc�t�eZdZdZ		d�Zd�Zd�Zd�Zd�Zdd�d	�Z	d
�Z
d�Zdd
�Zd�Z
dd�Zd�Zd�Zd�ZdS)�ExhaustiveChannelTestsa�
    - main / interp / other
    - run in: current thread / new thread / other thread / different threads
    - end / opposite
    - force / no force
    - used / not used  (associated / not associated)
    - empty / emptied / never emptied / partly emptied
    - closed / not closed
    - released / not released
    - creator (interp) / other
    - associated interpreter not running
    - associated interpreter destroyed

    - close after unbound
    c#�rK�gV�|�dd��D]$}|V�|���D]	}||zV��
�%|�dd��D]$}|V�|���D]	}||zV��
�%|�dd��D]�}|V�|�dd��D])}||z}|V�|���D]	}||zV��
�*|�dd��D])}||z}|V�|���D]	}||zV��
�*��|�dd��D]�}|V�|�dd��D])}||z}|V�|���D]	}||zV��
�*|�dd��D])}||z}|V�|���D]	}||zV��
�*��dS)Nrorvrw)�_iter_close_action_sets�_iter_post_close_action_sets�_iter_use_action_sets)rY�closeactions�postactions�
useactions�actionss     r�iter_action_setsz'ExhaustiveChannelTests.iter_action_setss���������!�8�8���I�I�	1�	1�L�����#�@�@�B�B�
1�
1��"�[�0�0�0�0�0�
1� �8�8��'�J�J�	1�	1�L�����#�@�@�B�B�
1�
1��"�[�0�0�0�0�0�
1��4�4�V�W�E�E�	0�	0�J����� $� <� <�V�W� M� M�
0�
0��$�|�3���
�
�
�#'�#D�#D�#F�#F�0�0�K�!�K�/�/�/�/�/�0� $� <� <�W�g� N� N�
0�
0��$�|�3���
�
�
�#'�#D�#D�#F�#F�0�0�K�!�K�/�/�/�/�/�0�
0�
�4�4�W�g�F�F�	0�	0�J����� $� <� <�V�W� M� M�
0�
0��$�|�3���
�
�
�#'�#D�#D�#F�#F�0�0�K�!�K�/�/�/�/�/�0� $� <� <�W�g� N� N�
0�
0��$�|�3���
�
�
�#'�#D�#D�#F�#F�0�0�K�!�K�/�/�/�/�/�0�
0�	0�	0rc#�xK�||f}tdd|��gV�tdd|��gV�tdd|��tdd|��gV�tdd|��gV�tdd|��gV�tdd|��tdd|��gV�|D]@}|D];}|D]6}tdd|��tdd|��tdd|��gV��7�<�A|D]U}|D]P}|D]K}|D]F}tdd|��tdd|��tdd|��tdd|��gV��G�L�Q�VdS)Nrnrrrq�rg)rYr&r*�interpsr+�interp4s      rr�z,ExhaustiveChannelTests._iter_use_action_sets/s7�����G�$��
�%���1�1��	�	�	�
�%���1�1��	�	�	�
�%���1�1��%���1�1��	�	�	�
�%���1�1��	�	�	�
�%���1�1��	�	�	�
�%���1�1��%���1�1��	�	�	��	�	�G�"�
�
��&���G�%�e�V�W�=�=�%�e�V�W�=�=�%�e�V�W�=�=�������
��		�		�G�"�
�
��&���G�#*����)�%���A�A�)�%���A�A�)�%���A�A�)�%���A�A�	�������
�		�		rc
#��K�d}||f}dD]&}|rdnd}|D]}|D]}t|||��gV����'dD]5}	dD]0}
|D]+}|D]&}t|	d|��t|
d|��gV��'�,�1�6dS)Nr�rmrurtrsrrrqr�)
rYr&r*�endsr�r��oprrl�recvop�sendoprrrqs
             rr�z.ExhaustiveChannelTests._iter_close_action_sets`s�������G�$��"�	�	�E�"'�4���W�B�!�
�
�����C�%�b�#�v�6�6�������
�
/�	�	�F�2�
�
��#���D� '����)�&�&�$�?�?�)�&�&�$�?�?��������
�	�	rc#�dK�dD]*}tdd|��gV�tdd|��gV��+dS)N)rorwrvrnrrrqr�r&s  rr�z3ExhaustiveChannelTests._iter_post_close_action_setsssl����0�	�	�F��e�V�V�4�4��
�
�
��e�V�V�4�4��
�
�
�
�		�	rc�<�|D]}|�||���dSr)r�)rY�fixr�rks    r�run_actionsz"ExhaustiveChannelTests.run_actions|s2���	)�	)�F��O�O�C��(�(�(�(�	)�	)rTr�c�*�|�|j��}|�|j|j|j��}|�|��|jdkr;t|j	|j
||j|���}|�||��dSt���}t|jd|j	�dt#|j
���dt#|���dt#|j���d|�d|�d|�d���t%t&�t�|��d	��t-t�|�����
��}|�||��dS)NrGr�zB
                result = helpers.run_action(
                    z,
                    z!,
                    hideclosed=zB,
                    )
                interpreters.channel_send(zR, result.pending.to_bytes(1, 'little'))
                interpreters.channel_send(z2, b'X' if result.closed else b'')
                r�)r�r�)r~rlr�rrvrwr�rXr�r�rkr�r�rr�rAr?r�r�r�
from_bytesr�r�)rYr�rkr�rlrr�r�s        rr�z!ExhaustiveChannelTests.run_action�s���� � ���)�)���&�&�s�z�3�9�c�i�H�H�����V�$�$�$��;�&� � �����
���	�%����F�
���f�f�-�-�-�-�-��.�.�0�0�D��v�y�
#��W�
#�
#��&�-�(�(�
#�
#��#�Y�Y�	
#�
#�
�#�)�_�_�
#�
#�!+�
#�
#�,0�
#�
#�,0�
#�
#�
#�

�

�

�"����|�'@�'@��'F�'F��Q�Q��L�5�5�d�;�;�<�<����F�
���f�f�-�-�-�-�-rc
#�bK�gd�}|D]%\}}}dD]}dD]}t|||||��V����&dS)N))rGrrw)rrGrw)r&r*rw)r&r*rG)rorvr�r
)r�)rYrrrvrwr�rls       r�
iter_fixturesz$ExhaustiveChannelTests.iter_fixtures�s�����
�
�
��%1�	R�	R� �F�E�5�7�
R�
R��+�R�R�C�-�c�6�5�%��Q�Q�Q�Q�Q�Q�R�
R�	R�	Rrc�:�|rdnd}t||jd��}|���s|�||d���dS|�t
j��5|�||d���ddd��dS#1swxYwYdS)NrurtroFr�)rgrlr�r�r�rrc)rYr�r�r�rts     r�_closezExhaustiveChannelTests._close�s���#�
0�]�]����b�#�'�6�2�2���&�&�(�(�	>��O�O�C��5�O�9�9�9�9�9��"�"�<�#B�C�C�
>�
>�����U�u��=�=�=�
>�
>�
>�
>�
>�
>�
>�
>�
>�
>�
>�
>����
>�
>�
>�
>�
>�
>s�*B�B�BNc��|�|jdk�r^|�tj��5t�|j��ddd��n#1swxYwY|�tj��5t�|jd��ddd��n#1swxYwY|�tj��5t�|j��ddd��n#1swxYwY|�tj��5t�|jd���ddd��dS#1swxYwYdSt|j	d��t|j	d��t|j	d��t|j	d��dS)	NrGr�Tr�zz
                with helpers.expect_channel_closed():
                    interpreters.channel_recv(cid)
                z�
                with helpers.expect_channel_closed():
                    interpreters.channel_send(cid, b'spam')
                z{
                with helpers.expect_channel_closed():
                    interpreters.channel_close(cid)
                z�
                with helpers.expect_channel_closed():
                    interpreters.channel_close(cid, force=True)
                )
rXr�rrcr�r�r�r�rAr?)rYr�rs   r�_assert_closed_in_interpz/ExhaustiveChannelTests._assert_closed_in_interp�s����>�V�[�F�2�2��"�"�<�#B�C�C�
3�
3��)�)�#�'�2�2�2�
3�
3�
3�
3�
3�
3�
3�
3�
3�
3�
3����
3�
3�
3�
3��"�"�<�#B�C�C�
<�
<��)�)�#�'�7�;�;�;�
<�
<�
<�
<�
<�
<�
<�
<�
<�
<�
<����
<�
<�
<�
<��"�"�<�#B�C�C�
4�
4��*�*�3�7�3�3�3�
4�
4�
4�
4�
4�
4�
4�
4�
4�
4�
4����
4�
4�
4�
4��"�"�<�#B�C�C�
@�
@��*�*�3�7�$�*�?�?�?�
@�
@�
@�
@�
@�
@�
@�
@�
@�
@�
@�
@����
@�
@�
@�
@�
@�
@�
�v�y�#�
�
�
�
�v�y�#�
�
�
�
�v�y�#�
�
�
�
�v�y�#�
�
�
�
�
sG� A�A�!A�!B1�1B5�8B5� D�D�D�1"E � E$�'E$c��|�|jj��t|jj��D]!}t
�|j���"|�|��dD]9}|�	|��}|j
dkr�#|�||���:|�	d��}|�||��dS)N)rorvrG�fresh)r�r�r�r�r�rr�r�r�r�rX)rYr�rrs    r�_assert_closedz%ExhaustiveChannelTests._assert_closed�s�������	�(�)�)�)��s�y�(�)�)�	/�	/�A��%�%�c�g�.�.�.�.��%�%�c�*�*�*�'�	7�	7�F��(�(��0�0�F��{�f�$�$���)�)�#�v�6�6�6�6��$�$�W�-�-���%�%�c�6�2�2�2�2�2rFc#�$K�d}|���D]�}t��|���D]�}|dz
}|dkrdS|rL|dz
dzdkrt��t||d�t	|������nL|dz
dzdkrtdd���td	d���t
j���|||fV���|rtd
����t��dS)Nrr�r��z({} actions)� r�r|�.z---)r��printr�rSrcr��stdoutr�)rY�verboser�r�r�s     r�_iter_close_testsz(ExhaustiveChannelTests._iter_close_tests�s4����
���,�,�.�.�	�	�G��G�G�G��)�)�+�+�
&�
&���Q����t�8�8��F�F�F��;��A���{�a�'�'������!�S�.�"7�"7��G���"E�"E�F�F�F�F��A���{�a�'�'��c�r�*�*�*�*��#�2�&�&�&�&��
�(8�(8�(:�(:�(:���g�o�%�%�%�%��
��e�����
�����rc�T�dt_|���D]\}}}�dS)NT)r�r�r��rYr�r�r�s    r�_skim_close_testsz(ExhaustiveChannelTests._skim_close_tests�s9��$(��!�#�5�5�7�7�	�	�O�A�s�G��	�	rc��|���D]�\}}}|�d�|||����5|�|j��|�||��|�|d���|�|��ddd��n#1swxYwY|�����dS)N�	{} {}  {}Fr��	r�r�rSr�rr�r�r�r�r�s    r�
test_closez!ExhaustiveChannelTests.test_close�s
��#�5�5�7�7�		�		�O�A�s�G����k�0�0��C��A�A�B�B�
)�
)��$�$�S�Z�0�0�0�� � ��g�.�.�.����C�u��-�-�-��#�#�C�(�(�(�

)�
)�
)�
)�
)�
)�
)�
)�
)�
)�
)����
)�
)�
)�
)�
�L�L�N�N�N�N�		�		��AB.�.B2	�5B2	c��|���D]�\}}}|�d�|||����5|�|j��|�||��|�|d���|�|��ddd��n#1swxYwY|�����dS)Nr�Tr�r�r�s    r�test_force_closez'ExhaustiveChannelTests.test_force_close		s
��#�5�5�7�7�		�		�O�A�s�G����k�0�0��C��A�A�B�B�
)�
)��$�$�S�Z�0�0�0�� � ��g�.�.�.����C�t��,�,�,��#�#�C�(�(�(�

)�
)�
)�
)�
)�
)�
)�
)�
)�
)�
)����
)�
)�
)�
)�
�L�L�N�N�N�N�		�		r�r)F)r\r]r^r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rdrrr�r��s�������� �� +0�+0�+0�Z/�/�/�b���&���)�)�)�59�.�.�.�.�.�@R�R�R�>�>�>�����83�3�3� ����,���

�
�
�
�
�
�
�
rr�r�r)6�collectionsrr�r�rr�r��textwraprr5r&r3�testr�test.supportrr�
import_modulerrr#r.r�r<rAr>rIrergr�r�r�r�r��TestCaser�r�r�rrrr#r6r[r}r�r�rr�r�r4r�r\rGrdrr�<module>rs���"�"�"�"�"�"���������	�	�	�	�
�
�
�
�
�
�
�
�������������������������&�&�&�&�&�&�&�&�&�&�&�&�+�}�*�+?�@�@��	.�	.�	.�����������
�
���
�<$�$�$�-/�	4�	4�	4�	4�!�!�!�!�!�*�*�]�I�6�6�!�!�!�L��+�+���+�/#�/#�/#�/#�/#�J�J��0C�D�D�/#�/#�/#�fE�E�E�E�E�:�:�n�.>�?�?�E�E�E�&7;������*!!�!!�!!�H�����������x� ����/4�/4�/4�/4�/4�x�(�/4�/4�/4�d9;�9;�9;�9;�9;��*�9;�9;�9;�~.�.�.�.�.�8�.�.�.�.'�'�'�'�'�h�'�'�'�.)�)�)�)�)�8�)�)�)�*&(�&(�&(�&(�&(�X�&(�&(�&(�R8$�8$�8$�8$�8$��8$�8$�8$�vZK�ZK�ZK�ZK�ZK�(�ZK�ZK�ZK�z_=�_=�_=�_=�_=�8�_=�_=�_=�Dc%�c%�c%�c%�c%�X�c%�c%�c%�R	V&�V&�V&�V&�V&�X�V&�V&�V&�rs8�s8�s8�s8�s8�8�s8�s8�s8�lb+�b+�b+�b+�b+�(�b+�b+�b+�Jn�n�n�n�n�*�*�%:�%E�G�G�n�n�n�b���6�7�7�{�{�{�{�{�X�{�{�8�7�{�|	�z����H�M�O�O�O�O�O��r