<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
3
 feU                 @   s   d dl mZ d dlmZmZ d dlZd dlmZmZm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZ e
jZdd ZG dd dejZG dd dejZ G dd dejZ!e"dkrej#dd dS )    )
namedtuple)TextTkN)MockNonCallableMagicMockpatchsentinelANY)requires)idleConf)count_lines_with_wrappingExpandingButtonSqueezer)macosx)	view_text)Hovertip)PyShellc                s0   t d t   j   fdd}| j|  S )z*Helper for tests: Create a root Tk object.Zguic                  s    j    j  d S )N)Zupdate_idletasksZdestroy )rootr   D/opt/alt/python36/lib64/python3.6/idlelib/idle_test/test_squeezer.pycleanup_root   s    z&get_test_tk_root.<locals>.cleanup_root)r
   r   Zwithdraw
addCleanup)Ztest_instancer   r   )r   r   get_test_tk_root   s    
r   c               @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )CountLinesTestz1Tests for the count_lines_with_wrapping function.c             C   s   | j |t|||S )N)assertEqualr   )selfexpectedtext	linewidthtabwidthr   r   r   check#   s    zCountLinesTest.checkc             C   s   | j tdd dS )zTest with an empty string. r   N)r   r   )r   r   r   r   test_count_empty)   s    zCountLinesTest.test_count_emptyc             C   s   | j tdd dS )z/Test with a string which begins with a newline.z
text   N)r   r   )r   r   r   r   !test_count_begins_with_empty_line-   s    z0CountLinesTest.test_count_begins_with_empty_linec             C   s   | j tdd dS )z-Test with a string which ends with a newline.ztext
   N)r   r   )r   r   r   r   test_count_ends_with_empty_line1   s    z.CountLinesTest.test_count_ends_with_empty_linec             C   s   | j tdd dS )z Test with several lines of text.z1
2
3
   N)r   r   )r   r   r   r   test_count_several_lines5   s    z'CountLinesTest.test_count_several_linesc             C   s   | j ddddd | j ddddd | j ddddd | j ddddd | j ddddd | j ddd
dd | j d	dd
dd | j ddd	dd | j ddddd | j ddddd | j ddddd | j ddd
dd | j ddddd | j ddddd dS )z-Test with various tab widths and line widths.r%   	      )r   r   r   r   r#   r'      
      	            Nr)   z		z			z				z					z
										z
										z				z										z
										z											z						z						z						)r    )r   r   r   r   test_tab_width9   s    zCountLinesTest.test_tab_widthN)
__name__
__module____qualname____doc__r    r"   r$   r&   r(   r3   r   r   r   r   r   !   s   r   c               @   s   e Zd ZdZdd Zd%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eddZeejejejejfdd Zed!d" Zd#d$ ZdS )&SqueezerTestzTests for the Squeezer class.c             C   s   t  }t|_|S )z$Create a mock EditorWindow instance.)r   r   	__class__)r   editwinr   r   r   make_mock_editor_windowS   s    z$SqueezerTest.make_mock_editor_windowNc             C   s   |dkr| j  }t|S )z<Create an actual Squeezer instance with a mock EditorWindow.N)r;   r   )r   Zeditor_windowr   r   r   make_squeezer_instance[   s    z#SqueezerTest.make_squeezer_instancec             C   s$   xdD ]\}}| j ||d qW d	S )zTest Squeezer.count_lines() with various inputs.

        This checks that Squeezer.count_lines() calls the
        count_lines_with_wrapping() function with the appropriate parameters.
        r+   P   r%   O   r*   r'   x   )r   r   Nr+   r=   r%   r>   r*   r=   r'   r?   )r@   rA   rB   rC   )_test_count_lines_helper)r   r   r   r   r   r   test_count_linesa   s    zSqueezerTest.test_count_linesc       	         s   d d}d}||j _|  d||   |jj_||ddfdd|j_t } fdd	}||j_td
|}|j  | j	|j
 dS )z<Prepare a mock EditorWindow object for Squeezer.count_lines.r-   r#   r%   N)ZborderZpadxZfontc                s    |  S )Nr   )Zopt)	text_optsr   r   <lambda>|   s    zDSqueezerTest._prepare_mock_editwin_for_count_lines.<locals>.<lambda>c                s   | dkr S t dd S )N0z%measure should only be called on '0'!)
ValueError)char)
CHAR_WIDTHr   r   measure   s    zCSqueezerTest._prepare_mock_editwin_for_count_lines.<locals>.measurezidlelib.squeezer.Font)Zget_tk_tabwidthreturn_valuer   Zwinfo_widthcgetr   rL   r   startr   stop)	r   r:   r   r   ZBORDER_WIDTHZPADDING_WIDTHZ	mock_fontrL   Zpatcherr   )rK   rF   r   %_prepare_mock_editwin_for_count_linesk   s    
z2SqueezerTest._prepare_mock_editwin_for_count_linesc             C   sh   | j  }| j||| | j|}ttd}d}td|& | j|j|t |j||| W dQ R X dS )zHelper for test_count_lines.)rM   TEXTz*idlelib.squeezer.count_lines_with_wrappingN)	r;   rQ   r<   r   SENTINEL_VALUEr   assertIscount_linesassert_called_with)r   r   r   r:   squeezerZmock_count_linesr   r   r   r   rD      s    

z%SqueezerTest._test_count_lines_helperc             C   s2   | j  }| j|}| j|j| | j|jg  dS )z(Test the creation of Squeezer instances.N)r;   r<   rT   r:   r   expandingbuttons)r   r:   rW   r   r   r   	test_init   s    
zSqueezerTest.test_initc             C   s   | j  }xxdddd dd gD ]`}ttd |_}| j|}| j|jj|f t | j|jd |j|f  | jt	|j
d	 qW d
S )z@Test Squeezer's overriding of the EditorWindow's write() method.r!   rR   z	LONG TEXTi  zMANY_LINES
d   )rM   r%   r   N)r;   r   rS   writer<   r   r:   
call_countrV   lenrX   )r   r:   r   
orig_writerW   r   r   r   test_write_no_tags   s    
zSqueezerTest.test_write_no_tagsc             C   s   x~dddd dd gD ]f}| j  }t|j_|j}| j|}| j|jj|dt | j|jd |j|d | jt	|j
d	 qW d
S )z@Test Squeezer's overriding of the EditorWindow's write() method.r!   rR   z	LONG TEXTi  zMANY_LINES
rZ   stderrr%   r   N)r;   rS   r[   rM   r<   r   r:   r\   rV   r]   rX   )r   r   r:   r^   rW   r   r   r   test_write_not_stdout   s    
z"SqueezerTest.test_write_not_stdoutc             C   s   | j  }| j|ddd xndD ]f}ttd |_}| j|}d|_| j|jj|dt | j|j	d	 |j
|d | jt|jd
 qW xndd dd gD ]Z}ttd |_}| j|}d|_| j|jj|dd | j|j	d
 | jt|jd	 qW dS )z@Test Squeezer's overriding of the EditorWindow's write() method.r=   r*   )r   r   r!   rR   )rM   2   stdoutr%   r   z	LONG TEXTi  zMANY_LINES
rZ   N)r!   rR   )r;   rQ   r   rS   r[   r<   auto_squeeze_min_linesr   r:   r\   rV   r]   rX   )r   r:   r   r^   rW   r   r   r   test_write_stdout   s&    



zSqueezerTest.test_write_stdoutc             C   s   t | }t|}|jdd | j }||_| j|}d|_tdd|_|j	dd d | j
|jddd	 | j
t|jd
 dS )zATest that the auto-squeezing creates an ExpandingButton properly.iomarkz1.0r,   r1   )rM   zTEXT
rc   end
r%   N)r   r   mark_setr;   r   r<   rd   r   rU   r[   r   getr]   rX   )r   r   text_widgetr:   rW   r   r   r   test_auto_squeeze   s    
zSqueezerTest.test_auto_squeezec             C   s,  t | }xdD ]}t|}|jdd | j }| |_|j_| j|}tdd|_	|j
dd| |jdd | j|jdd	d
 | jt|jd |jt d}| j|d | j|jdd	d | jt|jd | j|jd jd |jd jt d | j|jdd	d
 | jt|jd qW dS )z$Test the squeeze_current_text event.rc   r`   rf   z1.0r1   )rM   z
SOME
TEXT
insertrg   zSOME
TEXT

r   )eventbreakz

r%   z	SOME
TEXTN)rc   r`   )r   r   ri   r;   r   perbottomr<   r   rU   rm   r   rj   r]   rX   squeeze_current_text_eventsexpand)r   r   Ztag_namerk   r:   rW   retvalr   r   r   test_squeeze_current_text_event   s(    
z,SqueezerTest.test_squeeze_current_text_eventc             C   s   t | }t|}|jdd | j }| |_|j_| j|}tdd|_	|j
ddd |jdd | j|jddd	 | jt|jd
 |jt d}| j|d | j|jddd	 | jt|jd
 dS )z@Test that the event doesn't squeeze text without a relevant tag.rf   z1.0r1   )rM   z
SOME
TEXT
ZTAGrm   rg   zSOME
TEXT

r   )rn   ro   N)r   r   ri   r;   r   rp   rq   r<   r   rU   rm   r   rj   r]   rX   rr   )r   r   rk   r:   rW   ru   r   r   r   /test_squeeze_current_text_event_no_allowed_tags  s    
z<SqueezerTest.test_squeeze_current_text_event_no_allowed_tagsc             C   s   t | }t|}|jdd | j }| |_|j_| j|}tdd|_	|j
ddd |jdd |jt d | jt|jd	 |j
dd
d |jdd |jt d}| j|d | j|jddd | jt|jd | j|j|jd d|jd	  dS )z2Test squeezing text before existing squeezed text.rf   z1.0r1   )rM   z
SOME
TEXT
rc   rm   )rn   r%   zMORE
STUFF
ro   rg   z


r#   r   <N)r   r   ri   r;   r   rp   rq   r<   r   rU   rm   rr   r   r]   rX   rj   
assertTrueZcompare)r   r   rk   r:   rW   ru   r   r   r   /test_squeeze_text_before_existing_squeezed_text  s*    
z<SqueezerTest.test_squeeze_text_before_existing_squeezed_textGetOptionSignaturez:configType section option default type warn_on_default rawc             C   s   | j |||||||S )N)r{   )clsZ
configTypeZsectionZoptiondefaulttypeZwarn_on_defaultrawr   r   r   	_make_sig>  s    zSqueezerTest._make_sigc             C   s   |dd  \}}| j ||S )Nr#   )r   )r|   Zmock_call_objargskwargsr   r   r   get_GetOption_signatureF  s    z$SqueezerTest.get_GetOption_signaturec             C   s8   | j tjt tjdddd tj  | jtjd dS )zTest the reload() class-method.mainr   zauto-squeeze-min-linesZ42*   N)ZassertIsInstancer   rd   intr   Z	SetOptionreloadr   )r   r   r   r   test_reloadK  s    zSqueezerTest.test_reload)N)r4   r5   r6   r7   r;   r<   rE   rQ   rD   rY   r_   ra   re   rl   rv   rw   rz   r   r{   classmethodr   Z	NOT_GIVENr   r   r   r   r   r   r   r8   Q   s.   

"r8   c               @   sT   e Zd ZdZdd Zededdd Zdd	 Zd
d Z	dd Z
dd Zdd ZdS )ExpandingButtonTestz$Tests for the ExpandingButton class.c             C   s$   t | }t }t||j_d|_|S )z0Helper for tests: Create a mock Squeezer object.rb   )r   r   r   r:   r   rd   )r   r   rW   r   r   r   make_mock_squeezerW  s
    z&ExpandingButtonTest.make_mock_squeezerzidlelib.squeezer.Hovertip)autospecc             C   s   | j  }|jj}tddd|}| j|jd | j|j| | jd|jdk | j|j	ddd | j
d	|j  d
tj rdnd }| j
||j  | j|jd |j|ttd |jd d }| j
d|j  dS )z1Test the simplest creation of an ExpandingButton.rR   TAGSrb   z50 linesr   z1.0rg   rh   z<Double-Button-1>z<Button-%s>23r%   )Zhover_delayr   zright-clickN)r   r:   r   r   r   rs   Zmasterry   rN   rj   ZassertInZbindr   ZisAquaTkr\   rV   r	   	call_argslower)r   ZMockHovertiprW   rk   expandingbuttonZright_button_codeZtooltip_textr   r   r   rY   a  s    zExpandingButtonTest.test_initc             C   s   | j  }tddd|}|j}|jd|d |j|_|jt d}| j|d | j|jddd	 |j	d
}| j|jd|d | j|j
ddd|f | j|jjjd |jjj| dS )zTest the expand event.rR   r   rb   z1.0)window)rn   Nrg   zTEXT
zend-1cr%   )r   r   r   window_create	base_textrt   r   r   rj   indexZtag_nextrangerX   remover\   rV   )r   rW   r   rk   ru   Ztext_end_indexr   r   r   test_expand~  s    

zExpandingButtonTest.test_expandc             C   s   | j  }dd }t|dd|}|j  | j|j |j}|jd|d |j|_td$}d	|j	_
d	|j_
|jt d
}W dQ R X | j|d | j|jjddd td$}d|j	_
d|j_
|jt d
}W dQ R X | j|d | j|jjdd| dS )z@Test that expanding very long output asks user for confirmation.ar-   r,   r   rb   z1.0)r   zidlelib.squeezer.tkMessageBoxF)rn   Nro   zend-1cr!   Ti )r   r   Zset_is_dangerousry   Zis_dangerousr   r   r   r   ZaskokcancelrM   Zaskyesnort   r   r   rj   )r   rW   r   r   rk   Zmock_msgboxru   r   r   r   test_expand_dangerous_oupput  s(    

z0ExpandingButtonTest.test_expand_dangerous_oupputc             C   sp   | j  }tddd|}t |_t |_|jt d}| j|d | j|jjd | j|jjd |jjd dS )zTest the copy event.rR   r   rb   )rn   Nr%   )	r   r   r   Zclipboard_clearZclipboard_appendcopyr   r\   rV   )r   rW   r   ru   r   r   r   	test_copy  s    zExpandingButtonTest.test_copyc          
   C   sl   | j  }tddd|}t |_tdtd8}|jt d | j|jd | j|j	d d	 d W d
Q R X d
S )zTest the view event.rR   r   rb   zidlelib.squeezer.view_text)r   )rn   r%   r   r#   N)
r   r   r   Zselection_ownr   r   Zviewr   r\   r   )r   rW   r   Zmock_view_textr   r   r   	test_view  s    zExpandingButtonTest.test_viewc             C   s   | j  }tddd|}tdj}t }||_t }d|_d|_|j|d | j|j	j
t|j x"|jD ]^}}|j	j|td qhW W dQ R X dS )	zTest the context menu.rR   r   rb   ztkinter.Menur-   )rn   )labelZcommandN)r   r   r   r   rM   xyZcontext_menu_eventr   Zadd_commandr\   r]   Zrmenu_specsZassert_any_callr	   )r   rW   r   Z	mock_MenuZ	mock_menuZ
mock_eventr   datar   r   r   
test_rmenu  s    

zExpandingButtonTest.test_rmenuN)r4   r5   r6   r7   r   r   r   rY   r   r   r   r   r   r   r   r   r   r   S  s   
)r   __main__r#   )	verbosity)$collectionsr   Ztkinterr   r   ZunittestZunittest.mockr   r   r   r   r	   Ztest.supportr
   Zidlelib.configr   Zidlelib.squeezerr   r   r   Zidlelibr   Zidlelib.textviewr   Zidlelib.tooltipr   Zidlelib.pyshellr   rS   r   ZTestCaser   r8   r   r4   r   r   r   r   r   <module>   s(   0   *