o
    HXh*~                     @   s0  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
 d dl	mZ e
dZd dlZd dlmZ d dlmZ z
d dlmZmZ W n ey[   ej ZZY nw eeeejd	Zdad
d ZG dd de jZG dd de jZ G dd de jZ!dd Z"e#dkre $  dS dS )    N)support)import_helper)	os_helper_tkinter)Tcl)TclError)INT_MAXPY_SSIZE_T_MAX.c                  C   s   t d u rEt } | dd}td|}| \}}}}t|t|t|}}}dddd| }|dkr>||||dfa t S ||d||fa t S )	Ninfo
patchlevelz(\d+)\.(\d+)([ab.])(\d+)alphabetafinal)abr
   r   )_tk_patchlevelr   callre	fullmatchgroupsint)tclr   mmajorminorreleaselevelserial r   7/opt/python-3.10.19/usr/lib/python3.10/test/test_tcl.pyget_tk_patchlevel   s   r    c                   @   s   e Zd Zdd ZdS )TkinterTestc                 C   sF   |  ttjd |  ttji  |  ttjd |  ttjdh d S )NTstringset)assertRaises	TypeErrorr   Z_flattenselfr   r   r   testFlattenLen-   s   zTkinterTest.testFlattenLenN)__name__
__module____qualname__r(   r   r   r   r   r!   +   s    r!   c                   @   s|  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zee j!d7kd8d9d: Z"d;d< Z#d=d> Z$d?d@ Z%dAdB Z&ee'dCkdDdEdF Z(dGdH Z)dIdJ Z*dKdL Z+dMdN Z,dOdP Z-dQdR Z.dSdT Z/e0j1dUdV Z2dWS )XTclTestc                 C   s   t  | _| jj | _d S N)r   interptkwantobjectsr&   r   r   r   setUp:   s   zTclTest.setUpc                 C   s&   | j }|d | |dd d S )Nset a 1set a1)r.   evalassertEqualr'   r   r   r   r   testEval>      
zTclTest.testEvalc                 C      | j }| |dd d S )Nzset a "a\0b"a b)r.   r6   r5   r7   r   r   r   test_eval_null_in_resultC      z TclTest.test_eval_null_in_resultc                 C   r:   )Nzset a "<\ud83d\udcbb>"   <💻>)r.   assertInr5   r7   r   r   r   test_eval_surrogates_in_resultG   r=   z&TclTest.test_eval_surrogates_in_resultc                 C      | j }| t|jd d S )Nr3   r.   r$   r   r5   r7   r   r   r   testEvalExceptionK      zTclTest.testEvalExceptionc                 C   rA   )Nzthis is wrongrB   r7   r   r   r   testEvalException2O   rD   zTclTest.testEvalException2c                 C   s,   | j }|ddd | |ddd d S )Nr#   r   r4   )r.   r   r6   r7   r   r   r   testCallS   s   zTclTest.testCallc                 C   s   | j }| t|jdd d S )Nr#   r   r.   r$   r   r   r7   r   r   r   testCallExceptionX   r=   zTclTest.testCallExceptionc                 C   s   | j }| t|jddd d S )NthisisZwrongrG   r7   r   r   r   testCallException2\   s   zTclTest.testCallException2c                 C   (   | j }|dd | |dd d S )Nr   r4   r3   r.   setvarr6   r5   r7   r   r   r   
testSetVar`      zTclTest.testSetVarc                 C   rL   )Na(1)r4   zset a(1)rM   r7   r   r   r   testSetVarArraye   rP   zTclTest.testSetVarArrayc                 C   &   | j }|d | |dd d S )Nr2   r   r4   r.   r5   r6   getvarr7   r   r   r   
testGetVarj   r9   zTclTest.testGetVarc                 C   rS   )Nz
set a(1) 1rQ   r4   rT   r7   r   r   r   testGetVarArrayo   r9   zTclTest.testGetVarArrayc                 C   rA   Nr   r.   r$   r   rU   r7   r   r   r   testGetVarExceptiont   rD   zTclTest.testGetVarExceptionc                 C   rA   )NrQ   rY   r7   r   r   r   testGetVarArrayExceptionx   rD   z TclTest.testGetVarArrayExceptionc                 C   sD   | j }|dd | |dd |d | |dd d S )Nr      zinfo exists ar4   0r.   rN   r6   r5   unsetvarr7   r   r   r   testUnsetVar|   s
   
zTclTest.testUnsetVarc                 C   st   | j }|dd |dd | |dd | |dd |d | |dd | |dd d S )	NrQ   r\   za(2)   zinfo exists a(1)r4   zinfo exists a(2)r]   r^   r7   r   r   r   testUnsetVarArray   s   
zTclTest.testUnsetVarArrayc                 C   rA   rX   )r.   r$   r   r_   r7   r   r   r   testUnsetVarException   rD   zTclTest.testUnsetVarExceptionc                 C   sR   d}t dkr't }|dksd|  krdk r'n |S |dddd	 dd	  f7 }|S )
N)	r   r\   ii   l        l    l    l               )rf      r   r   )rf   rg   rf   )rf   rh   l            l        ra     )tcl_versionr    )r'   Zintegersvr   r   r   get_integers   s   zTclTest.get_integersc              	   C   s0  | j j}|  D ]6}| |d| | tdkr$| |d| | | |d| dd| | |d| | qtdk rO| t|jt	dd  | |d	d	 | t
|j | t
|jd
d | t
|jd | t
|jd | t|jd | t
ttf|jd | tttf|jd d S )Nz %d re   z %#o o z %#x ra   ri   *   Z4210s   42      E@r   z42 u   42)r.   r/   rl   r6   getintrj   replacer$   r   strr%   
ValueErrorUnicodeEncodeError)r'   r   ir   r   r   test_getint   s*   zTclTest.test_getintc                 C   s   | j j}| |dd | |dd | |dd | |dd | t|j | t|jdd | t|jd | t|jd	 | tttf|jd
 | tttf|jd d S )Nz 42 rq   z 42.5 g     @E@ro   z42.5rp   s   42.5r   z42.5 u   42.5)	r.   r/   r6   	getdoubler$   r%   r   ru   rv   r7   r   r   r   test_getdouble   s   zTclTest.test_getdoublec                 C   s   | j j}| |dd | |dd | |dd | |dd | t|j | t|jdd | t|jd | t|jd | t|jd	 | tttf|jd
 | tttf|jd d S )NonTr4   ro   r   Fs   on      ?r   zon u   on)	r.   r/   ZassertIs
getbooleanr$   r%   r   ru   rv   r7   r   r   r   test_getboolean   s    zTclTest.test_getbooleanc                 C   s   | j }tj}| tj| t|d}|d W d    n1 s"w   Y  || | |	dd | |	dd | |	dd d S )	NwzKset a 1
            set b 2
            set c [ expr $a + $b ]
            r3   r4   set b2zset c3
r.   r   TESTFN_ASCII
addCleanupunlinkopenwriteevalfiler6   r5   r'   r   filenamefr   r   r   testEvalFile   s   
zTclTest.testEvalFilec                 C   s   | j }tj}| tj| t|d}|d W d    n1 s"w   Y  || | |	dd | |	dd d S )Nr   z>
            set a "a b"
            set b "a\0b"
            r3   r;   r   r   r   r   r   r   test_evalfile_null_in_result   s   
z$TclTest.test_evalfile_null_in_resultc                 C   s   | j }|dd}| |jdd| |ddd tj}| tj| t|d}|d W d    n1 s8w   Y  || | 	|
dd | 	|
dd d S )	Nencodingsystemzutf-8wbsM   
            set a "<>"
            set b "<\ud83d\udcbb>"
            r3   r>   r   )r.   r   r   r   r   r   r   r   r   r6   r5   )r'   r   r   r   r   r   r   r   "test_evalfile_surrogates_in_result   s   
z*TclTest.test_evalfile_surrogates_in_resultc              
   C   sR   | j }d}zt| W n ty } zW Y d }~nd }~ww | t|j| d S )NZdoesnotexists)r.   osremove	Exceptionr$   r   r   )r'   r   r   er   r   r   testEvalFileException   s   zTclTest.testEvalFileExceptionc                 C   rA   )Nzpackage require DNErB   r7   r   r   r   testPackageRequireException  rD   z#TclTest.testPackageRequireExceptionwin32zRequires Windowsc                 C   s   t jtj}|d dkrtddt jd |d |dd  f }t j|s-tdt	
 }|d	 t|d
dg}W d    n1 sIw   Y  | d| d S )Nr\   :z$Absolute path should have drive partz\\%s\%s$\%sZCOMPUTERNAMEr      zCannot connect to UNC PathZTCL_LIBRARY-czimport tkinter; print(tkinter)s   tkinter)r   pathabspathsys
executableunittestZSkipTestenvironexistsr   ZEnvironmentVarGuardZunset
subprocesscheck_outputr?   )r'   fullnameZunc_nameenvstdoutr   r   r   testLoadWithUNC
  s    





zTclTest.testLoadWithUNCc                    sL   j ddd ddd  fdd} tj  tjdd	  tjd
  tjd |dd |dd |dd |dd |dd |dd |dd |dd |dd |dd |dd |dd  |d!d |d"d# |d$d# |d%d& |d'd( |d)d( |d*d+ td,kr|d-td. d S d S )/Nr#   r   r   r   rh   c                    &    | } ||  |t d S r-   )
exprstringr6   assertIsInstancert   exprexpectedresultr7   r   r   check$     
z&TclTest.test_exprstring.<locals>.check8.2+6   8.2 + 6spamrn   r]   8.2 + 6z14.23.1 + $az6.12 + "$a.$b"z5.64*[llength "6 2"]8{word one} < "word $a"4*2 < 7hypot($a, 4)z5.05 / 4r4   5 / 4.0z1.25$5 / ( [string length "abcd"] + 0.0 )20.0/5.0z4.0"0x03" > "2"   [string length "a½€"]r   [string length "a\xbd\u20ac"]"abc"abcu   "a½€"u   a½€z"a\xbd\u20ac"z"a\0b"r;   re   2**64            )r.   r   r$   r%   r   r   rj   rt   r'   r   r   r7   r   test_exprstring   s<   


















zTclTest.test_exprstringc                    s4   j ddd ddd  fdd} tj  tjdd	  tjd
  tjd |dd |dd |dd |dd |dd |dd |dd |dd |dd |dd |dd |dd  |d!d |d"d# |d$d#  tjd% td&kr|d'td( d S d S ))Nr#   r   r   r   rh   c                    r   r-   )
exprdoubler6   r   floatr   r7   r   r   r   G  r   z&TclTest.test_exprdouble.<locals>.checkr   r   r   r   rn           r   gffffff,@r   gffffff@r   gffffff@r   g       @r   r   r   g      @r   r|   r   g      ?r   r   g      @r   r   g      @r   r   re   r   r   )r.   r   r$   r%   r   r   rj   r   r   r   r7   r   test_exprdoubleC  s6   














zTclTest.test_exprdoublec                    s6   j ddd ddd  fdd} tj  tjdd	  tjd
  tjd |dd |dd |dd |dd |dd |dd |dd |dd |dd |dd |dd |dd |dd |dd |d d  tjd! td"kr tjd# d S d S )$Nr#   r   r   r   rh   c                    r   r-   )exprlongr6   r   r   r   r7   r   r   r   g  r   z$TclTest.test_exprlong.<locals>.checkr   r   r   r   rn   r   r      r   r   rg   r   rf   r   r   r   r   r\   r   r   r      r   r   r   r   re   r   )r.   r   r$   r%   r   r   rj   r   r   r7   r   test_exprlongc  s6   














zTclTest.test_exprlongc                    s   j ddd ddd  fdd} tj  tjdd	  tjd
  tjd |dd dD ]}||d |d| d |d| d q?dD ]}||d |d| d |d| d qW|dd |dd |dd |dd |dd |dd |dd |dd |dd |dd |dd |dd |dd |d d  tjd! td"kr|d#d d S d S )$Nr#   r   r   r   rh   c                    s2    | } ||  |t  |t d S r-   )exprbooleanr6   r   r   ZassertNotIsInstanceboolr   r7   r   r   r     s   
z'TclTest.test_exprboolean.<locals>.checkr   r   r   r   rn   F)r]   falsenooffz"%s"z{%s})r4   trueyesr{   Tr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   re   r   )r.   r   r$   r%   r   r   rj   )r'   r   valuer   r7   r   test_exprboolean  sF   
















zTclTest.test_exprbooleanre   zrequires Tcl version >= 8.5c                    sh    j  fdd}|dd |dd |dd |dd |d	d |d
d |dd |dd d S )Nc                    sX    d| } r ||  |t d S  || tt|f  |t d S )Nr   )r   r0   r6   r   r   r?   rt   r   r7   r   r   r     s   z$TclTest.test_booleans.<locals>.checkr   Tr   r{   r   Fr   r   z1 < 2z1 > 2)r.   r   r   r7   r   test_booleans  s   






zTclTest.test_booleansc                 C   s   | j }|  D ](}|dt|}| jr!| || | |t q| |t| | |t qt dk rD| 	t
|jdtdd  d S d S )Nr   re   ra   ri   )r.   rl   r   rt   r0   r6   r   r   r    r$   r   )r'   r   rw   r   r   r   r   test_expr_bignum  s   
zTclTest.test_expr_bignumc                    s   fdd}  |d jrdnd   |d jrdnd   |dd   |dd   |d	d	   |d
d
   |dd   |dd   |dd tjdkrm  |dd   |dd   |d jrwdnd
   |d jrdnd   |d jrdnd   D ]}  || jr|nt| qtdk r  |dd tdd  ddddtjjtjj	tjj tjj	 fD ]} jrވ  ||| qЈ  t
||| qЈ jr|t
d} ||   |t
d t
d    |t
d  t
d   n  t
|t
d t
d    t
|t
d  t
d     |d! jr=d!nd"   |d#d$d%gg jrRd& d S d' d S )(Nc                    s    j dd| S )Nr#   _)r.   r   r   r&   r   r   	passValue  s   z.TclTest.test_passing_values.<locals>.passValueTr4   Fr]   r"   	   string€
   string💻str ing	   str ing½
   str ing€u   str ing💻r      <>   <€>   <>r>      str ing   string
   strÀings   stringu   str½ingre   ra   ri   r   r|         UUUUUU?naninfr\   r   333333@z1 2 3.4r   r   cr   )r   r   a {b c})r6   r0   r   platformrl   rt   rj   
float_infominmaxr   ZassertNotEqual)r'   r   rw   r   r   r&   r   test_passing_values  sl   






  

zTclTest.test_passing_valuesc                    s  d   fdd}j d| j jjd d1jd fdd}fdd}|d	d
 |dd |d |d |d |d tjdkrS|dd |dd |d |dd |dd |dd |dd |d |d |d |dd |d d! |d"d#  D ]	}||t	| qt
d$k r|d%d& t	d%d&  d'D ]	}||t| qd(tjjtjjtjj tjj fD ]}|||d q|td)|d |td) |d |d*d |d+d, |d-d%gd.d/gd0g gd, d S )2Nc                    s   |  | S r-   r   )arg)r   r   r   testfunc  s   z+TclTest.test_user_command.<locals>.testfuncr   )eqc                   sN   |d u r| }d  j d| } t | | |t ||| d S )Nr   )r.   r   r   rt   )r   r   r   rr   r'   r   r   r     s   
z(TclTest.test_user_command.<locals>.checkc                    s     j t| |t|d d d S )Ng|=)Zdelta)ZassertAlmostEqualr   abs)actualr   r&   r   r   float_eq  s   

z+TclTest.test_user_command.<locals>.float_eqTr4   Fr]   r"   u   string½r   r   r   r   r   r   r>   rn   s   strings	   string€u   stringâ¬s   string    r   r   r   r   r   r   s   string€u   strÀingâ¬re   ra   ri   )r   r|   r   r   r   r   )r\   )ra   )r   r   5 6r   z1 2 {3 4} {5 6} {}r\   r   r   r  r-   )r.   createcommandr   r/   deletecommandr6   r   r   rl   rt   rj   reprr   r   r   r   )r'   r   r   r  rw   r   r   r   r   test_user_command  sR   














zTclTest.test_user_commandc           	      C   s,  | j jj}| j jj}| t| | t|dd | t|d dddddd	d
dddddddddddddg dfdddggdddgff|dddd| jrLdndfg}t }td krq| jr^|d!k rad"}nd#}||d$d%d&d'd(d|fg7 }d)| jt|f }|D ]\}}| 	|||d*||f  q{| t
|d+ d S ),Nr   r   ra   )r   )r   )rn   r   ){}rn   )""r  z
a
 b	 c
 r   r   r   s
   a
 b	 c
 r  u   a €r      €)u   a 💻r   u   💻s   a €r  )s   a 💻r  )s   a r  s	   ab cd)r;   zc d)r   r   b c)a b\ cr  )r  r  za 2)r   r   r   ra   r  za 3.4)r   3.4r   r   r  r   r   r   r   listr\   r   r   r   r4   r   r  re   rf   rg   rg   Z12r  u   â¬r     r     €r   dictcreater&  r  r'  z4want objects? %s, Tcl version: %s, Tk patchlevel: %sz
arg=%a, %s{)r.   r/   	splitlistr   r$   r%   r0   r    rj   r6   r   )	r'   r+  r   	testcasesZtk_patchlevelr   Zdbg_infor   resr   r   r   test_splitlist9  sd   




zTclTest.test_splitlistc                 C   sj  | j jj}| j jj}t $ tddt | t	| | t	|dd | t	|d W d    n1 s5w   Y  dddd	d
dddddddddddddddddg dfddgdfdddggdf|d d!d"d#| j
rjd$nd%fg}td&kr| j
rzt d'k r}d(}nd)}||d*d+d,d-d.d#|fg7 }|D ]#\}}| t | j||||d/ W d    n1 sw   Y  qd S )0Nignorez\bsplit\b.*\bsplitlist\br   r   ra   )r   r   )rn   rn   )r
  rn   )r  rn   )r*  r*  r  r  r  r  )s   abr;   r  )s
   {ab cdz{a b c d)r   r   )r  r   ))r   s   b cr   )r  r   r  r  r  r  )r   )ra   r   r0  r   r   r  r   r   r!  r\   r   r   r   r"  re   r#  r$  r%  r(  r)  r&  r  r'  )msg)r.   r/   splitr   warningscatch_warningsfilterwarningsDeprecationWarningr$   r%   r0   rj   r    ZassertWarnsr6   )r'   r2  r   r,  r   r   r-  r   r   r   
test_splitl  sn   




zTclTest.test_splitc              
   C   s@  t j}| jj}d}| |||ddddd | |||dddd d}| |||dd	dd
d | |||d	dd
d | t||d | t||d |ddd	dddd}| |||| jrgd	ndddd t	dkr|dddd	dddd}| jrt
 dk rdddd}nd	ddd}| |||| d S d S )Nz#-a {1 2 3} -something foo status {}Fz1 2 3foorn   )-a
-somethingstatus)r   Z	somethingr;  )r9  r\   ra   r   r:  r8  r;  r
  r<  r
  z-a b -c )r9  r   r   r!  r9  r:  r;  r   re   r(  r)  r#  )tkinterZ
_splitdictr.   r/   r6   r$   RuntimeErrorr   r0   rj   r    )r'   Z	splitdictr   r   r   r   r   r   test_splitdict  sF   



zTclTest.test_splitdictc                    s   t j jjfdd fdd}|d |d |d |d |d	 |d
 |d |d |d |d |d |d |d |d |d |d |d |d |d |d |d |d |d |d d S )Nc                    s     d| dS )NZlindexr   )r   )sr   r   r   unpack  s   z!TclTest.test_join.<locals>.unpackc                    s     | g|    | dg|    | gg|    | dgg|    | gdg|    | dgdg|  d S )Nr   )r6   r   )joinr'   rB  r   r   r     s   $z TclTest.test_join.<locals>.checkrn   r   zsp amzsp	amzsp
amz 	
z{spam}z{sp am}z"spam"z"sp am"z{"spam"}z"{spam}"zsp\amz"sp\am"z	"{}" "{}"z"\z"{z"}z
\z
{z
}z\
z{
z}
)r=  Z_joinr.   r/   r   r   )rC  r'   r   rB  r   	test_join  s8   zTclTest.test_joinc                 C   s.   t | tj t | tj t | tj d S r-   )r   Zcheck_disallow_instantiationr   ZTcl_ObjZTkttTypeZ	TkappTyper&   r   r   r   test_new_tcl_obj  s   zTclTest.test_new_tcl_objN)3r)   r*   r+   r1   r8   r<   r@   rC   rE   rF   rH   rK   rO   rR   rV   rW   rZ   r[   r`   rb   rc   rl   rx   rz   r~   r   r   r   r   r   r   
skipUnlessr   r   r   r   r   r   r   rj   r   r   r   r	  r.  r7  r?  rD  r   cpython_onlyrE  r   r   r   r   r,   8   sZ    
	
#  )
2:35#%r,   c                   @   s   e Zd Zdd Zejeee	k dej
ed ddddd	 Zejeee	k dej
ed d
dddd Zejeee	k dej
ed ddddd ZdS )BigmemTclTestc                 C   s   t  | _d S r-   )r   r.   r&   r   r   r   r1     s   zBigmemTclTest.setUpzneeds UINT_MAX < SIZE_MAXr\   rg   F)sizeZmemusedry_runc                 C   s$   d| }|  t| jjdd|d d S )N r"   indexr   )r$   OverflowErrorr.   r   )r'   rI  r   r   r   r   test_huge_string_call  s   z#BigmemTclTest.test_huge_string_callra   c                 C   sT  | j j}dd|  }| t|j| | t|j| | t|j| | t|j| | t|j| | t|j	| | t|j
| | t|j|dd | t|jd|d | t|j| | t|jd| | t|j
| | t|j| | t|j| | t|j| | t|j| | t|j| | t|j|t | t|j| d S )Nr4   rK  xr   )r.   r/   r$   rM  rr   ry   r}   r5   r   recordZadderrorinforN   r_   r   r   r   r+  r2  r  r   r  r'   rI  r/   r   r   r   r   test_huge_string_builtins  s*   z'BigmemTclTest.test_huge_string_builtinsrh   c                 C   sJ   | j j}dd|  }| t|j| | t|j| | t|jd| d S )Nr4   rK  rO  )r.   r/   r$   rM  r   r_   rQ  r   r   r   test_huge_string_builtins2  s
   z(BigmemTclTest.test_huge_string_builtins2N)r)   r*   r+   r1   r   rG  r   rF  r   r	   Z
bigmemtestrN  rR  rS  r   r   r   r   rH    s    rH  c                  C   s&   t jrt } td| dd d S d S )Nzpatchlevel =r   r   )r   verboser   printr   rA  r   r   r   setUpModule!  s   rV  __main__)%r   localer   r   r   r   r3  testr   Ztest.supportr   r   import_moduler   r=  r   r   Z	_testcapir   r	   ImportErrormaxsizetuplemapr   ZTCL_VERSIONr2  rj   r   r    ZTestCaser!   r,   rH  rV  r)   mainr   r   r   r   <module>   sD    
     <2