a
    ¿ßúeŒN  ã                   @   sü   d Z 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røej$dd dS )zTest squeezer, coverage 95%é    )Údedent)ÚTextÚTkN)ÚMockÚNonCallableMagicMockÚpatchÚsentinelÚANY)Úrequires)ÚidleConf)Úcount_lines_with_wrappingÚExpandingButtonÚSqueezer)Úmacosx)Ú	view_text)ÚHovertip)ÚPyShellc                    s0   t dƒ tƒ ‰ ˆ  ¡  ‡ fdd„}|  |¡ ˆ S )z*Helper for tests: Create a root Tk object.Úguic                      s   ˆ   ¡  ˆ  ¡  d S ©N)Zupdate_idletasksZdestroy© ©Úrootr   ú0lib/python3.9/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                   @   sP   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d„ Z
dd„ ZdS )ÚCountLinesTestz1Tests for the count_lines_with_wrapping function.c                 C   s   |   |t||ƒ¡S r   ©ÚassertEqualr   )ÚselfÚexpectedÚtextÚ	linewidthr   r   r   Úcheck%   s    þzCountLinesTest.checkc                 C   s   |   tdƒd¡ dS )zTest with an empty string.Ú r   Nr   ©r   r   r   r   Útest_count_empty+   s    zCountLinesTest.test_count_emptyc                 C   s   |   tdƒd¡ dS )z/Test with a string which begins with a newline.z
texté   Nr   r%   r   r   r   Ú!test_count_begins_with_empty_line/   s    z0CountLinesTest.test_count_begins_with_empty_linec                 C   s   |   tdƒd¡ dS )z-Test with a string which ends with a newline.ztext
é   Nr   r%   r   r   r   Útest_count_ends_with_empty_line3   s    z.CountLinesTest.test_count_ends_with_empty_linec                 C   s   |   tdƒd¡ dS )z Test with several lines of text.z1
2
3
é   Nr   r%   r   r   r   Útest_count_several_lines7   s    z'CountLinesTest.test_count_several_linesc                 C   s4   | j dddd | j dddd | j dddd d S )	Nr)   Ú
éP   ©r    r!   r"   r'   ú

é
   z










©r#   r%   r   r   r   Útest_empty_lines;   s    zCountLinesTest.test_empty_linesc                 C   s$   | j dddd | j dddd d S )Nr+   ZÈaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar.   r/   zÉaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
r2   r%   r   r   r   Útest_long_line@   s    zCountLinesTest.test_long_linec                 C   s`   t dƒ}| jd|dd | jd|d dd | jd|dd | jd|d	d | jd
|dd d S )Nz€            13 characters
            43 is the number of characters on this line

            7 chars
            13 charactersé   r.   r/   r-   é   é(   é   é   é   r1   )r   r#   )r   r!   r   r   r   Ú$test_several_lines_different_lengthsD   s    z3CountLinesTest.test_several_lines_different_lengthsN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r#   r&   r(   r*   r,   r3   r4   r;   r   r   r   r   r   #   s   r   c                   @   sŽ   e Zd ZdZd"dd„Zd#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d d!„ ZdS )%ÚSqueezerTestzTests for the Squeezer class.Fc                 C   s:   t ƒ }d|_|r6t| ƒ|_| j|jd}| |_|j_|S )z$Create a mock EditorWindow instance.r.   r   )r   Úwidthr   r   Úmake_text_widgetr!   ZperZbottom)r   Úwith_text_widgetÚeditwinÚtext_widgetr   r   r   Úmake_mock_editor_windowT   s    
z$SqueezerTest.make_mock_editor_windowNc                 C   s   |du r|   ¡ }t|ƒ}|S )z<Create an actual Squeezer instance with a mock EditorWindow.N)rF   r   )r   Zeditor_windowÚsqueezerr   r   r   Úmake_squeezer_instance`   s    z#SqueezerTest.make_squeezer_instancec                 C   s0   |d u rt | ƒ}t|ƒ}d|d< | dd¡ |S )N)ZCourierr1   ZfontZiomarkú1.0)r   r   Úmark_set)r   r   rE   r   r   r   rB   g   s    zSqueezerTest.make_text_widgetc                 C   s6   t  |||¡}t  ||||¡ |  t j||||¡ d S r   )r   Z	GetOptionZ	SetOptionr   )r   Z
configTypeZsectionZoptionÚvalueZprev_valr   r   r   Ú set_idleconf_option_with_cleanupo   s
    ÿz-SqueezerTest.set_idleconf_option_with_cleanupc              
   C   sž   |   ¡ }|  |¡}dD ]‚\}}}| j|||dX t|ƒ}t |d|¡" |  | |¡|¡ W d  ƒ n1 sp0    Y  W d  ƒ q1 sŽ0    Y  qdS )z0Test Squeezer.count_lines() with various inputs.))z'\n'r.   r)   )z'\n' * 3r.   r+   )z'a' * 40 + '\n'r.   r)   )z'a' * 80 + '\n'r.   r)   )z'a' * 200 + '\n'r.   r+   )ú'aa\t' * 20r.   r'   )z'aa\t' * 21r.   r+   )rM   r7   é   )Ú	text_codeÚ
line_widthr    rA   N)rF   rH   ZsubTestÚevalr   Úobjectr   Úcount_lines)r   rD   rG   rO   rP   r    r!   r   r   r   Útest_count_linesu   s    

þzSqueezerTest.test_count_linesc                 C   s2   |   ¡ }|  |¡}|  |j|¡ |  |jg ¡ dS )z(Test the creation of Squeezer instances.N)rF   rH   ZassertIsrD   r   Úexpandingbuttons)r   rD   rG   r   r   r   Ú	test_init‹   s    
zSqueezerTest.test_initc                 C   s~   |   ¡ }dddd dfD ]`}ttd |_}|  |¡}|  |j |d¡t¡ |  |jd¡ | |d¡ |  t	|j
ƒd	¡ qd
S )ú@Test Squeezer's overriding of the EditorWindow's write() method.r$   ÚTEXTú	LONG TEXTéè  áL  MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
©Úreturn_valuer   r)   r   N)rF   r   ÚSENTINEL_VALUEÚwriterH   r   rD   Ú
call_countÚassert_called_withÚlenrU   ©r   rD   r!   Ú
orig_writerG   r   r   r   Útest_write_no_tags’   s    
zSqueezerTest.test_write_no_tagsc                 C   s|   dddd dfD ]f}|   ¡ }t|j_|j}|  |¡}|  |j |d¡t¡ |  |jd¡ | |d¡ |  t	|j
ƒd¡ qd	S )
rW   r$   rX   rY   rZ   r[   Ústderrr)   r   N)rF   r^   r_   r]   rH   r   rD   r`   ra   rb   rU   )r   r!   rD   rd   rG   r   r   r   Útest_write_not_stdoutž   s    
ÿz"SqueezerTest.test_write_not_stdoutc                 C   sè   t dƒ |  ¡ }dD ]f}ttd |_}|  |¡}d|_|  |j |d¡t¡ |  |j	d¡ | 
|d¡ |  t|jƒd¡ qdd	 d
fD ]Z}ttd |_}|  |¡}d|_|  |j |d¡d¡ |  |j	d¡ |  t|jƒd¡ qˆdS )rW   r   )r$   rX   r\   é2   Ústdoutr)   r   rY   rZ   r[   N)r
   rF   r   r^   r_   rH   Úauto_squeeze_min_linesr   rD   r`   ra   rb   rU   rc   r   r   r   Útest_write_stdout¬   s&    
ÿ
zSqueezerTest.test_write_stdoutc                 C   sd   | j dd}|j}|  |¡}d|_tdd|_| dd¡ |  | dd	¡d
¡ |  t	|j
ƒd¡ dS )zATest that the auto-squeezing creates an ExpandingButton properly.T©rC   r5   r6   r\   zTEXT
TEXT
TEXT
TEXT
TEXT
TEXT
ri   rI   Úendr-   r)   N)rF   r!   rH   rj   r   rS   r_   r   Úgetrb   rU   )r   rD   rE   rG   r   r   r   Útest_auto_squeezeÅ   s    
zSqueezerTest.test_auto_squeezec                 C   s  dD ]ú}| j dd}|j}|  |¡}tdd|_| dd|¡ | dd¡ |  | dd	¡d
¡ |  t	|j
ƒd¡ |jtƒ d}|  |d¡ |  | dd	¡d¡ |  t	|j
ƒd¡ |  |j
d jd¡ |j
d jtƒ d |  | dd	¡d
¡ |  t	|j
ƒd¡ qdS )z$Test the squeeze_current_text event.)ri   rf   Trl   r6   r\   rI   ú
SOME
TEXT
Úinsertrm   úSOME
TEXT

r   ©ZeventÚbreakr0   r)   z	SOME
TEXTN)rF   r!   rH   r   rS   rq   rJ   r   rn   rb   rU   Úsqueeze_current_text_eventÚsÚexpand)r   Ztag_namerD   rE   rG   Úretvalr   r   r   Útest_squeeze_current_text_eventÑ   s"    
z,SqueezerTest.test_squeeze_current_text_eventc                 C   s¬   | j dd}|j}|  |¡}tdd|_| ddd¡ | dd¡ |  | dd	¡d
¡ |  t	|j
ƒd¡ |jtƒ d}|  |d¡ |  | dd	¡d
¡ |  t	|j
ƒd¡ dS )z@Test that the event doesn't squeeze text without a relevant tag.Trl   r6   r\   rI   rp   ZTAGrq   rm   rr   r   rs   rt   N)rF   r!   rH   r   rS   rq   rJ   r   rn   rb   rU   ru   ©r   rD   rE   rG   rx   r   r   r   Ú/test_squeeze_current_text_event_no_allowed_tagsî   s    
z<SqueezerTest.test_squeeze_current_text_event_no_allowed_tagsc                 C   sà   | j dd}|j}|  |¡}tdd|_| ddd¡ | dd¡ |jtƒ d	 |  t	|j
ƒd
¡ | ddd¡ | dd¡ |jtƒ d	}|  |d¡ |  | dd¡d¡ |  t	|j
ƒd¡ |  | |j
d d|j
d
 ¡¡ dS )z2Test squeezing text before existing squeezed text.Trl   r6   r\   rI   rp   ri   rq   rs   r)   zMORE
STUFF
rt   rm   z


r'   r   ú<N)rF   r!   rH   r   rS   rq   rJ   ru   r   rb   rU   rn   Ú
assertTrueZcomparerz   r   r   r   Ú/test_squeeze_text_before_existing_squeezed_text  s&    
ýz<SqueezerTest.test_squeeze_text_before_existing_squeezed_textc                 C   sR   | j dd}|  |¡}|j}|d }|  dddt|ƒ¡ t ¡  |  |j|¡ dS )zTest the reload() class-method.Trl   r1   Úmainr   zauto-squeeze-min-linesN)rF   rH   rj   rL   Ústrr   Úreloadr   )r   rD   rG   Zorig_auto_squeeze_min_linesZnew_auto_squeeze_min_linesr   r   r   Útest_reload  s    
þÿzSqueezerTest.test_reloadc                 C   s   t  ¡  dS )z@Test that Squeezer.reload() runs without any instances existing.N)r   r   r%   r   r   r   Ú!test_reload_no_squeezer_instances-  s    z.SqueezerTest.test_reload_no_squeezer_instances)F)N)N)r<   r=   r>   r?   rF   rH   rB   rL   rT   rV   re   rg   rk   ro   ry   r{   r~   r‚   rƒ   r   r   r   r   r@   R   s    


r@   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.rh   )r   r   r   rD   r!   rj   )r   r   rG   r   r   r   Úmake_mock_squeezer6  s
    z&ExpandingButtonTest.make_mock_squeezerzidlelib.squeezer.Hovertip©Zautospecc                 C   sÖ   |   ¡ }|jj}tddd|ƒ}|  |jd¡ |  |j|¡ |  d| d¡v ¡ |  | 	dd¡d¡ |  
d	| ¡ ¡ d
t ¡ r€dnd }|  
|| ¡ ¡ |  |jd¡ |j|ttd |jd d }|  
d| ¡ ¡ dS )z1Test the simplest creation of an ExpandingButton.rX   ÚTAGSrh   z50 linesr!   rI   rm   r-   z<Double-Button-1>z<Button-%s>Ú2Ú3r)   )Zhover_delayr   zright-clickN)r…   rD   r!   r   r   rv   Zmasterr}   Zcgetrn   ZassertInZbindr   ZisAquaTkr`   ra   r	   Ú	call_argsÚlower)r   ZMockHovertiprG   rE   ÚexpandingbuttonZright_button_codeZtooltip_textr   r   r   rV   @  s    zExpandingButtonTest.test_initc                 C   sº   |   ¡ }tddd|ƒ}|j}|jd|d |j|_|jtƒ d}|  |d¡ |  | dd¡d	¡ | 	d
¡}|  | d|¡d¡ |  | 
dd¡d|f¡ |  |jjjd¡ |jj |¡ dS )zTest the expand event.rX   r‡   rh   rI   ©Zwindowrs   Nrm   zTEXT
úend-1cr)   )r…   r   r!   Úwindow_createÚ	base_textrw   r   r   rn   ÚindexZtag_nextrangerU   Úremover`   ra   )r   rG   rŒ   rE   rx   Ztext_end_indexr   r   r   Útest_expand]  s    
ÿzExpandingButtonTest.test_expandc                 C   s"  |   ¡ }dd }t|dd|ƒ}| ¡  |  |j¡ |j}|jd|d |j|_tdƒ.}d|j	_
d|j_
|jtƒ d	}W d
  ƒ n1 sŠ0    Y  |  |d¡ |  |j dd¡d¡ tdƒ.}d|j	_
d|j_
|jtƒ d	}W d
  ƒ n1 sò0    Y  |  |d
¡ |  |j dd¡|¡ d
S )z@Test that expanding very long output asks user for confirmation.Úai † r‡   rh   rI   r   zidlelib.squeezer.messageboxFrs   Nrt   rŽ   r$   T)r…   r   Zset_is_dangerousr}   Zis_dangerousr!   r   r   r   Zaskokcancelr]   Zaskyesnorw   r   r   rn   )r   rG   r!   rŒ   rE   Zmock_msgboxrx   r   r   r   Útest_expand_dangerous_oupput}  s(    
,
,z0ExpandingButtonTest.test_expand_dangerous_oupputc                 C   sp   |   ¡ }tddd|ƒ}tƒ |_tƒ |_|jtƒ d}|  |d¡ |  |jjd¡ |  |jjd¡ |j d¡ dS )zTest the copy event.rX   r‡   rh   rs   Nr)   )	r…   r   r   Zclipboard_clearZclipboard_appendÚcopyr   r`   ra   )r   rG   rŒ   rx   r   r   r   Ú	test_copy¥  s    zExpandingButtonTest.test_copyc                 C   s€   |   ¡ }tddd|ƒ}tƒ |_tdtdB}|jtƒ d |  |jd¡ |  |j	d d	 d¡ W d
  ƒ n1 sr0    Y  d
S )zTest the view event.rX   r‡   rh   zidlelib.squeezer.view_textr†   rs   r)   r   r'   N)
r…   r   r   Zselection_ownr   r   Zviewr   r`   rŠ   )r   rG   rŒ   Zmock_view_textr   r   r   Ú	test_view¹  s    zExpandingButtonTest.test_viewc                 C   s¢   |   ¡ }tddd|ƒ}tdƒp}tƒ }||_tƒ }d|_d|_|j|d |  |j	j
t|jƒ¡ |jD ]^}}|j	j|td qfW d  ƒ n1 s”0    Y  dS )	zTest the context menu.rX   r‡   rh   ztkinter.Menur1   rs   )ÚlabelZcommandN)r…   r   r   r   r]   ÚxÚyZcontext_menu_eventr   Zadd_commandr`   rb   Zrmenu_specsZassert_any_callr	   )r   rG   rŒ   Z	mock_MenuZ	mock_menuZ
mock_eventr™   Údatar   r   r   Ú
test_rmenuÊ  s    

ÿzExpandingButtonTest.test_rmenuN)r<   r=   r>   r?   r…   r   r   rV   r“   r•   r—   r˜   r   r   r   r   r   r„   2  s   


 (r„   Ú__main__r'   )Ú	verbosity)%r?   Útextwrapr   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   r^   r   ZTestCaser   r@   r„   r<   r   r   r   r   r   Ú<module>   s(   / a *