a
    ze}                     @   s  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 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0 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re !  dS )    N)support_tkinter)Tcl)TclError)INT_MAXPY_SSIZE_T_MAX.c                  C   s   t d u rt } | dd}td|}| \}}}}t|t|t|  }}}dddd| }|dkrz||||dfa n||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   #/usr/lib/python3.9/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                   @   sv  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/dUdV Z0dWS )XTclTestc                 C   s   t  | _| jj | _d S N)r   interptkwantobjectsr$   r   r   r   setUp8   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<   s    
zTclTest.testEvalc                 C   s   | j }| |dd d S )Nzset a "a\0b"a b)r,   r4   r3   r5   r   r   r   test_eval_null_in_resultA   s    z TclTest.test_eval_null_in_resultc                 C   s   | j }| |dd d S )Nzset a "<\ud83d\udcbb>"   <💻>)r,   assertInr3   r5   r   r   r   test_eval_surrogates_in_resultE   s    z&TclTest.test_eval_surrogates_in_resultc                 C   s   | j }| t|jd d S )Nr1   r,   r"   r   r3   r5   r   r   r   testEvalExceptionI   s    zTclTest.testEvalExceptionc                 C   s   | j }| t|jd d S )Nzthis is wrongr<   r5   r   r   r   testEvalException2M   s    zTclTest.testEvalException2c                 C   s,   | j }|ddd | |ddd d S )Nr!   r   r2   )r,   r   r4   r5   r   r   r   testCallQ   s    zTclTest.testCallc                 C   s   | j }| t|jdd d S )Nr!   r   r,   r"   r   r   r5   r   r   r   testCallExceptionV   s    zTclTest.testCallExceptionc                 C   s   | j }| t|jddd d S )NthisisZwrongr@   r5   r   r   r   testCallException2Z   s    zTclTest.testCallException2c                 C   s(   | j }|dd | |dd d S )Nr   r2   r1   r,   setvarr4   r3   r5   r   r   r   
testSetVar^   s    zTclTest.testSetVarc                 C   s(   | j }|dd | |dd d S )Na(1)r2   zset a(1)rE   r5   r   r   r   testSetVarArrayc   s    zTclTest.testSetVarArrayc                 C   s&   | j }|d | |dd d S )Nr0   r   r2   r,   r3   r4   getvarr5   r   r   r   
testGetVarh   s    
zTclTest.testGetVarc                 C   s&   | j }|d | |dd d S )Nz
set a(1) 1rH   r2   rJ   r5   r   r   r   testGetVarArraym   s    
zTclTest.testGetVarArrayc                 C   s   | j }| t|jd d S Nr   r,   r"   r   rK   r5   r   r   r   testGetVarExceptionr   s    zTclTest.testGetVarExceptionc                 C   s   | j }| t|jd d S )NrH   rO   r5   r   r   r   testGetVarArrayExceptionv   s    z TclTest.testGetVarArrayExceptionc                 C   sD   | j }|dd | |dd |d | |dd d S )Nr      zinfo exists ar2   0r,   rF   r4   r3   unsetvarr5   r   r   r   testUnsetVarz   s
    
zTclTest.testUnsetVarc                 C   st   | j }|dd |dd | |dd | |dd |d | |dd | |dd d S )	NrH   rR   za(2)   zinfo exists a(1)r2   zinfo exists a(2)rS   rT   r5   r   r   r   testUnsetVarArray   s    
zTclTest.testUnsetVarArrayc                 C   s   | j }| t|jd d S rN   )r,   r"   r   rU   r5   r   r   r   testUnsetVarException   s    zTclTest.testUnsetVarExceptionc                 C   sP   d}t dkrLt }|dks2d|  kr.dk rLn n|dddd	 dd	  f7 }|S )
N)	r   rR   ii   l        l    l    l               )r\      r   r   )r\   r]   r\   )r\   r^   l            l        rW     )tcl_versionr   )r%   Zintegersvr   r   r   get_integers   s     zTclTest.get_integersc              	   C   s0  | j j}|  D ]l}| |d| | tdkrH| |d| | | |d| dd| | |d| | qtdk r| 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 r[   z %#o o z %#x rW   r_   *   Z4210s   42      E@r   z42 u   42)r,   r-   rb   r4   getintr`   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 rg   z 42.5 g     @E@re   z42.5rf   s   42.5r   z42.5 u   42.5)	r,   r-   r4   	getdoubler"   r#   r   rk   rl   r5   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onTr2   re   r   Fs   on      ?r   zon u   on)	r,   r-   ZassertIs
getbooleanr"   r#   r   rk   rl   r5   r   r   r   test_getboolean   s     zTclTest.test_getbooleanc                 C   s   | j }tj}| tj| t|d}|d W d    n1 sD0    Y  || | |	dd | |	dd | |	dd d S )	NwzKset a 1
            set b 2
            set c [ expr $a + $b ]
            r1   r2   set b2zset c3
r,   r   TESTFN_ASCII
addCleanupunlinkopenwriteevalfiler4   r3   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 sD0    Y  || | |	dd | |	dd d S )Nru   z>
            set a "a b"
            set b "a\0b"
            r1   r7   rv   ry   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 sp0    Y  || | 	|
dd | 	|
dd d S )	Nencodingsystemzutf-8wbsM   
            set a "<>"
            set b "<\ud83d\udcbb>"
            r1   r9   rv   )r,   r   r{   r   rz   r|   r}   r~   r   r4   r3   )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 }~0 0 | t|j| d S )NZdoesnotexists)r,   osremove	Exceptionr"   r   r   )r%   r   r   er   r   r   testEvalFileException   s    zTclTest.testEvalFileExceptionc                 C   s   | j }| t|jd d S )Nzpackage require DNEr<   r5   r   r   r   testPackageRequireException  s    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|sZtdt	
 *}|d	 t|d
dg}W d    n1 s0    Y  | d| d S )NrR   :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                    sJ   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rF|d-td. d S )/Nr!   r   r   r   r^   c                    s&    | } ||  |t d S r+   )
exprstringr4   assertIsInstancerj   exprexpectedresultr5   r   r   check"  s    
z&TclTest.test_exprstring.<locals>.check8.2+6   8.2 + 6spamrd   rS   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 / 4r2   5 / 4.0z1.25$5 / ( [string length "abcd"] + 0.0 )20.0/5.0z4.0"0x03" > "2"   [string length "a½€"]rx   [string length "a\xbd\u20ac"]"abc"abcu   "a½€"u   a½€z"a\xbd\u20ac"z"a\0b"r7   r[   2**64            )r,   r   r"   r#   r   r   r`   rj   r%   r   r   r5   r   test_exprstring  s:    



















zTclTest.test_exprstringc                    s2   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 ))Nr!   r   r   r   r^   c                    s&    | } ||  |t d S r+   )
exprdoubler4   r   floatr   r5   r   r   r   E  s    
z&TclTest.test_exprdouble.<locals>.checkr   r   r   r   rd           r   gffffff,@r   gffffff@r   gffffff@r   g       @r   r   r   g      @r   rr   r   g      ?r   r   g      @r   r   g      @r   r   r[   r   r   )r,   r   r"   r#   r   r   r`   r   r   r   r5   r   test_exprdoubleA  s4    















zTclTest.test_exprdoublec                    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r0 tjd# d S )$Nr!   r   r   r   r^   c                    s&    | } ||  |t d S r+   )exprlongr4   r   r   r   r5   r   r   r   e  s    
z$TclTest.test_exprlong.<locals>.checkr   r   r   r   rd   r   r      r   r   r]   r   r\   r   r   r   r   rR   r   r   r      r   r   r   r   r[   r   )r,   r   r"   r#   r   r   r`   r   r   r5   r   test_exprlonga  s4    















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 q|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 )$Nr!   r   r   r   r^   c                    s2    | } ||  |t  |t d S r+   )exprbooleanr4   r   r   ZassertNotIsInstanceboolr   r5   r   r   r     s    
z'TclTest.test_exprboolean.<locals>.checkr   r   r   r   rd   F)rS   falsenooffz"%s"z{%s})r2   trueyesrq   Tr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r[   r   )r,   r   r"   r#   r   r   r`   )r%   r   valuer   r5   r   test_exprboolean  sD    

















zTclTest.test_exprbooleanr[   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                    sV    d| } r. ||  |t n$ || tt|f  |t d S )Nr   )r   r.   r4   r   r   r:   rj   r   r5   r   r   r     s    z$TclTest.test_booleans.<locals>.checkr   Tr   rq   r   Fr   r   z1 < 2z1 > 2)r,   r   r   r5   r   test_booleans  s    






zTclTest.test_booleansc                 C   s   | j }|  D ]P}|dt|}| jrB| || | |t q| |t| | |t qt dk r| 	t
|jdtdd  d S )Nr   r[   rW   r_   )r,   rb   r   rj   r.   r4   r   r   r   r"   r   )r%   r   rm   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rڈ  |dd   |dd   |d jrdnd
   |d jr
dnd   |d jr&dnd   D ]&}  || jrN|nt| q4t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 ]4} jrȈ  ||| n  t
||| q jr6|t
d} ||   |t
d t
d    |t
d  t
d   n<  t
|t
d t
d    t
|t
d  t
d     |d! jrd!nd"   |d#d$d%gg jrd&nd' d S )(Nc                    s    j dd| S )Nr!   _)r,   r   r   r$   r   r   	passValue  s    z.TclTest.test_passing_values.<locals>.passValueTr2   FrS   r    	   string€
   string💻str ing	   str ing½
   str ing€u   str ing💻r      <>   <€>   <>r9      str ing   string
   strÀings   stringu   str½ingr[   rW   r_   r   rr         UUUUUU?naninfrR   rw   333333@z1 2 3.4r   r   cr   )r   r   a {b c})r4   r.   r   platformrb   rj   r`   
float_infominmaxr   ZassertNotEqual)r%   r   rm   r   r   r$   r   test_passing_values  sh    






$
 
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r|dd |dd |d |dd |dd |dd |dd |d |d |d |dd |d d! |d"d#  D ]}||t	| qt
d$k rJ|d%d& t	d%d&  d'D ]}||t| qNd(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   rj   )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_eqTr2   FrS   r    u   string½r   r   r   r   r   r   r9   rd   s   strings	   string€u   stringâ¬s   string    r   r   r   r   r   r   s   string€u   strÀingâ¬r[   rW   r_   )r   rr   r   r   r   r   )rR   )rW   )r   r   5 6r   z1 2 {3 4} {5 6} {}rR   r   r   r   )N)r,   createcommandr{   r-   deletecommandr4   r   r   rb   rj   r`   reprr   r   r   r   )r%   r   r   r   rm   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rdndfg}t }td kr| jr|d!k rd"}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   rW   )rw   )rw   )rd   r   ){}rd   )""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)r7   zc d)r   r   b c)a b\ cr
  )r
  r
  za 2)r   rw   r   rW   r  za 3.4)r   3.4r   r   r  r   r   r   r   listrR   rw   r   r   r2   rw   r  r[   r\   r]   r]   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#   r.   r   r`   r4   r   )	r%   r  r   	testcasesZtk_patchlevelr   Zdbg_infor   resr   r   r   test_splitlist7  sd    




zTclTest.test_splitlistc                 C   sp  | j jj}| j jj}t H tddt | t	| | t	|dd | t	|d W d    n1 sj0    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
rd$nd%fg}td&kr| j
rt d'k rd(}nd)}||d*d+d,d-d.d#|fg7 }|D ]J\}}| t$ | j||||d/ W d    n1 s^0    Y  q d S )0Nignorez\bsplit\b.*\bsplitlist\br   r   rW   )rw   rw   )rd   rd   )r   rd   )r   rd   )r  r  r  r  r  r  )s   abr7   r	  )s
   {ab cdz{a b c d)r   r   )r  r   ))r   s   b cr   )r
  r   r  r  r  r  )r   )rW   r   r$  r  r   r  r   r   r  rR   rw   r   r   r  r[   r  r  r  r  r  r  r  r  )msg)r,   r-   splitr   warningscatch_warningsfilterwarningsDeprecationWarningr"   r#   r.   r`   r   ZassertWarnsr4   )r%   r&  r   r   r   r   r!  r   r   r   
test_splitj  sf    


,


zTclTest.test_splitc              
   C   sB  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rd	ndddd t	dkr>|dddd	dddd}| jrt
 dk r dddd}nd	ddd}| |||| d S )Nz#-a {1 2 3} -something foo status {}Fz1 2 3foord   )-a
-somethingstatus)r   Z	somethingr/  )r-  rR   rW   r   r.  r,  r/  r   r0  r   z-a b -c )r-  r   r   r  r-  r.  r/  r   r[   r  r  r  )tkinterZ
_splitdictr,   r-   r4   r"   RuntimeErrorr   r.   r`   r   )r%   Z	splitdictr   r   r   r   r   r   test_splitdict  sD    




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   )r4   r   )joinr%   r6  r   r   r     s    z TclTest.test_join.<locals>.checkrd   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}
)r1  Z_joinr,   r-   r   r   )r7  r%   r   r6  r   	test_join  s8    zTclTest.test_joinc                 C   s   |  ttj d S r+   )r"   r#   r   ZTcl_Objr$   r   r   r   test_new_tcl_obj  s    zTclTest.test_new_tcl_objN)1r'   r(   r)   r/   r6   r8   r;   r=   r>   r?   rA   rD   rG   rI   rL   rM   rP   rQ   rV   rX   rY   rb   rn   rp   rt   r   r   r   r   r   r   
skipUnlessr   r   r   r   r   r   r   r`   r   r   r   r   r"  r+  r3  r8  r9  r   r   r   r   r*   6   sV   
	
#  )
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   r/     s    zBigmemTclTest.setUpzneeds UINT_MAX < SIZE_MAXrR   r]   F)sizeZmemusedry_runc                 C   s$   d| }|  t| jjdd|d d S )N r    indexr   )r"   OverflowErrorr,   r   )r%   r<  r   r   r   r   test_huge_string_call  s    z#BigmemTclTest.test_huge_string_callrW   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 )Nr2   r>  xr   )r,   r-   r"   r@  rh   ro   rs   r3   r   recordZadderrorinforF   rU   r   r   r   r  r&  r   r   r   r%   r<  r-   r   r   r   r   test_huge_string_builtins  s*    z'BigmemTclTest.test_huge_string_builtinsr^   c                 C   sJ   | j j}dd|  }| t|j| | t|j| | t|jd| d S )Nr2   r>  rB  )r,   r-   r"   r@  r   rU   rD  r   r   r   test_huge_string_builtins2  s
    z(BigmemTclTest.test_huge_string_builtins2N)r'   r(   r)   r/   r   Zcpython_onlyr   r:  r   r   Z
bigmemtestrA  rE  rF  r   r   r   r   r;    s   r;  c                  C   s"   t jrt } td| dd d S )Nzpatchlevel =r	   r
   )r   verboser   printr   r5  r   r   r   setUpModule  s    rI  __main__)"r   localer   r   r   r   r'  testr   import_moduler   r1  r   r   Z	_testcapir   r   ImportErrormaxsizetuplemapr   ZTCL_VERSIONr&  r`   r   r   ZTestCaser   r*   r;  rI  r'   mainr   r   r   r   <module>   s:   
     92
