o
    ^ùhàL  ã                   @   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 dd	lmZmZ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 dS )zTest squeezer, coverage 95%é    )Údedent)ÚTextÚTkN)ÚMockÚNonCallableMagicMockÚpatchÚsentinelÚANY)Úrequires)ÚidleConf)Ú
Percolator)Úcount_lines_with_wrappingÚExpandingButtonÚSqueezer)Úmacosx)Ú	view_text)ÚHovertipc                    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   á1  /home/conda/feedstock_root/build_artifacts/python-split_1761171407825/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehol/lib/python3.10/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   ó   |   tdƒd¡ dS )zTest with an empty string.Ú r   Nr   ©r   r   r   r   Útest_count_empty*   ó   zCountLinesTest.test_count_emptyc                 C   r$   )z/Test with a string which begins with a newline.z
texté   Nr   r&   r   r   r   Ú!test_count_begins_with_empty_line.   r(   z0CountLinesTest.test_count_begins_with_empty_linec                 C   r$   )z-Test with a string which ends with a newline.ztext
é   Nr   r&   r   r   r   Útest_count_ends_with_empty_line2   r(   z.CountLinesTest.test_count_ends_with_empty_linec                 C   r$   )z Test with several lines of text.z1
2
3
é   Nr   r&   r   r   r   Útest_count_several_lines6   r(   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Èaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar0   r1   zÉaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
r4   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é   r0   r1   r/   é   é(   é   é   é   r3   )r   r#   )r   r!   r   r   r   Ú$test_several_lines_different_lengthsC   s   z3CountLinesTest.test_several_lines_different_lengthsN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r#   r'   r*   r,   r.   r5   r6   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|_|rt| ƒ|_| j|jd}| |_|j_|S )z$Create a mock EditorWindow instance.r0   r   )r   Úwidthr   r   Úmake_text_widgetr!   ÚperZbottom)r   Úwith_text_widgetÚeditwinÚtext_widgetr   r   r   Úmake_mock_editor_windowS   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)rI   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Courierr3   ZfontZiomarkú1.0)r   r   Úmark_set)r   r   rH   r   r   r   rD   f   s   zSqueezerTest.make_text_widgetc                 C   s6   t  |||¡}t  ||||¡ |  t j||||¡ d S r   )r   Z	GetOptionZ	SetOptionr   )r   Z
configTypeÚsectionÚoptionÚvalueZprev_valr   r   r   Ú set_idleconf_option_with_cleanupn   s
   ÿz-SqueezerTest.set_idleconf_option_with_cleanupc              
   C   sž   |   ¡ }|  |¡}dD ]A\}}}| j|||d, t|ƒ}t |d|¡ |  | |¡|¡ W d  ƒ n1 s8w   Y  W d  ƒ n1 sGw   Y  qdS )z0Test Squeezer.count_lines() with various inputs.))z'\n'r0   r+   )z'\n' * 3r0   r-   )z'a' * 40 + '\n'r0   r+   )z'a' * 80 + '\n'r0   r+   )z'a' * 200 + '\n'r0   r-   )ú'aa\t' * 20r0   r)   )z'aa\t' * 21r0   r-   )rR   r9   é   )Ú	text_codeÚ
line_widthr    rC   N)rI   rK   ZsubTestÚevalr   Úobjectr   Úcount_lines)r   rG   rJ   rT   rU   r    r!   r   r   r   Útest_count_linest   s   

þÿ€ü€özSqueezerTest.test_count_linesc                 C   s2   |   ¡ }|  |¡}|  |j|¡ |  |jg ¡ dS )z(Test the creation of Squeezer instances.N)rI   rK   ZassertIsrG   r   Úexpandingbuttons)r   rG   rJ   r   r   r   Ú	test_initŠ   s   
zSqueezerTest.test_initc                 C   s~   |   ¡ }dddd dfD ]0}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)rI   r   ÚSENTINEL_VALUEÚwriterK   r   rG   Ú
call_countÚassert_called_withÚlenrZ   ©r   rG   r!   Ú
orig_writerJ   r   r   r   Útest_write_no_tags‘   s   
ùzSqueezerTest.test_write_no_tagsc                 C   s|   dddd dfD ]3}|   ¡ }t|j_|j}|  |¡}|  |j |d¡t¡ |  |jd¡ | |d¡ |  t	|j
ƒd¡ qd	S )
r\   r%   r]   r^   r_   r`   Ústderrr+   r   N)rI   rc   rd   rb   rK   r   rG   re   rf   rg   rZ   )r   r!   rG   ri   rJ   r   r   r   Útest_write_not_stdout   s   
ÿöz"SqueezerTest.test_write_not_stdoutc                 C   sè   t dƒ |  ¡ }dD ]3}ttd |_}|  |¡}d|_|  |j |d¡t¡ |  |j	d¡ | 
|d¡ |  t|jƒd¡ q
dd	 d
fD ]-}ttd |_}|  |¡}d|_|  |j |d¡d¡ |  |j	d¡ |  t|jƒd¡ qDdS )r\   r   )r%   r]   ra   é2   Ústdoutr+   r   r^   r_   r`   N)r
   rI   r   rc   rd   rK   Úauto_squeeze_min_linesr   rG   re   rf   rg   rZ   rh   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©rF   r7   r8   ra   zTEXT
TEXT
TEXT
TEXT
TEXT
TEXT
rn   rL   Úendr/   r+   N)rI   r!   rK   ro   r   rX   rd   r   Úgetrg   rZ   )r   rG   rH   rJ   r   r   r   Útest_auto_squeezeÄ   s   
zSqueezerTest.test_auto_squeezec                 C   sø   dD ]w}| j dd}|j}|  |¡}tdd|_| dd|¡ | dd¡ |  | dd	¡d
¡ |  t	|j
ƒd¡ | ¡ }|  |d¡ |  | dd	¡d¡ |  t	|j
ƒd¡ |  |j
d jd¡ |j
d  ¡  |  | dd	¡d
¡ |  t	|j
ƒd¡ qdS )z%Test the squeeze_current_text method.)rn   rk   Trq   r8   ra   rL   ú
SOME
TEXT
Úinsertrr   úSOME
TEXT

r   Úbreakr2   r+   z	SOME
TEXTN)rI   r!   rK   r   rX   rv   rM   r   rs   rg   rZ   Úsqueeze_current_textÚsÚexpand)r   Ztag_namerG   rH   rJ   Úretvalr   r   r   Útest_squeeze_current_textÐ   s$   
èz&SqueezerTest.test_squeeze_current_textc                 C   s¦   | j dd}|j}|  |¡}tdd|_| ddd¡ | dd¡ |  | dd	¡d
¡ |  t	|j
ƒd¡ | ¡ }|  |d¡ |  | dd	¡d
¡ |  t	|j
ƒd¡ dS )z@Test that the event doesn't squeeze text without a relevant tag.Trq   r8   ra   rL   ru   ZTAGrv   rr   rw   r   rx   N)rI   r!   rK   r   rX   rv   rM   r   rs   rg   rZ   ry   ©r   rG   rH   rJ   r|   r   r   r   Ú)test_squeeze_current_text_no_allowed_tagsí   s   
z6SqueezerTest.test_squeeze_current_text_no_allowed_tagsc                 C   sÔ   | j dd}|j}|  |¡}tdd|_| ddd¡ | dd¡ | ¡  |  t	|j
ƒd	¡ | dd
d¡ | dd¡ | ¡ }|  |d¡ |  | dd¡d¡ |  t	|j
ƒd¡ |  | |j
d d|j
d	 ¡¡ dS )z2Test squeezing text before existing squeezed text.Trq   r8   ra   rL   ru   rn   rv   r+   zMORE
STUFF
rx   rr   z


r)   r   ú<N)rI   r!   rK   r   rX   rv   rM   ry   r   rg   rZ   rs   Ú
assertTrueZcomparer~   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.Trq   r3   ÚmainZPyShellzauto-squeeze-min-linesN)rI   rK   ro   rQ   Ústrr   Úreloadr   )r   rG   rJ   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)Fr   )r>   r?   r@   rA   rI   rK   rD   rQ   rY   r[   rj   rl   rp   rt   r}   r   r‚   r†   r‡   r   r   r   r   rB   Q   s"    


rB   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   sD   t | ƒ}tƒ }t|ƒ|j_t|jjƒ|j_|  |jjj¡ d|_	|S )z0Helper for tests: Create a mock Squeezer object.rm   )
r   r   r   rG   r!   r   rE   r   Úclosero   )r   r   rJ   r   r   r   Úmake_mock_squeezer5  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.r]   ÚTAGSrm   z50 linesr!   rL   rr   r/   z<Double-Button-1>z<Button-%s>Ú2Ú3r+   )Zhover_delayr   zright-clickN)rŠ   rG   r!   r   r   rz   Zmasterr   Zcgetrs   ZassertInÚbindr   ZisAquaTkre   rf   r	   Ú	call_argsÚlower)r   ZMockHovertiprJ   rH   ÚexpandingbuttonZright_button_codeZtooltip_textr   r   r   r[   A  s   zExpandingButtonTest.test_initc                 C   s´   |   ¡ }tddd|ƒ}|jj}|jd|d |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.r]   rŒ   rm   rL   ©Zwindow©ÚeventNrr   zTEXT
úend-1cr+   )rŠ   r   rG   r!   Úwindow_creater{   r   r   rs   ÚindexZtag_nextrangerZ   Úremovere   rf   )r   rJ   r’   rH   r|   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 tdƒ}d|j_	d|j
_	|jtƒ d	}W d
  ƒ n1 sAw   Y  |  |d¡ |  |j dd¡d¡ tdƒ}d|j_	d|j
_	|jtƒ d	}W d
  ƒ n1 suw   Y  |  |d
¡ |  |j dd¡|¡ d
S )z@Test that expanding very long output asks user for confirmation.Úai † rŒ   rm   rL   r“   zidlelib.squeezer.messageboxFr”   Nrx   r–   r%   T)rŠ   r   Zset_is_dangerousr   Zis_dangerousr!   r—   r   Zaskokcancelrb   Zaskyesnor{   r   r   rs   )r   rJ   r!   r’   rH   Zmock_msgboxr|   r   r   r   Útest_expand_dangerous_oupputy  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.r]   rŒ   rm   r”   Nr+   )	rŠ   r   r   Zclipboard_clearZclipboard_appendÚcopyr   re   rf   )r   rJ   r’   r|   r   r   r   Ú	test_copyœ  s   zExpandingButtonTest.test_copyc                 C   s‚   |   ¡ }tddd|ƒ}tƒ |_tdtd"}|jtƒ d |  |jd¡ |  |j	d d	 d¡ W d
  ƒ d
S 1 s:w   Y  d
S )zTest the view event.r]   rŒ   rm   zidlelib.squeezer.view_textr‹   r”   r+   r   r)   N)
rŠ   r   r   Zselection_ownr   r   Úviewr   re   r   )r   rJ   r’   Zmock_view_textr   r   r   Ú	test_view°  s   "÷zExpandingButtonTest.test_viewc                 C   s¤   |   ¡ }tddd|ƒ}tdƒ9}tƒ }||_tƒ }d|_d|_|j|d |  |j	j
t|jƒ¡ |jD ]^}}|j	j|td q3W d  ƒ dS 1 sKw   Y  dS )	zTest the context menu.r]   rŒ   rm   ztkinter.Menur3   r”   )ÚlabelZcommandN)rŠ   r   r   r   rb   ÚxÚyZcontext_menu_eventr   Zadd_commandre   rg   Zrmenu_specsZassert_any_callr	   )r   rJ   r’   Z	mock_MenuZ	mock_menuZ
mock_eventr¡   Údatar   r   r   Ú
test_rmenuÁ  s    

ÿÿ"÷zExpandingButtonTest.test_rmenuN)r>   r?   r@   rA   rŠ   r   r   r[   rš   rœ   rž   r    r¥   r   r   r   r   rˆ   1  s    

#rˆ   Ú__main__r)   )Ú	verbosity)%rA   Útextwrapr   Útkinterr   r   ZunittestZunittest.mockr   r   r   r   r	   Ztest.supportr
   Zidlelib.configr   Zidlelib.percolatorr   Zidlelib.squeezerr   r   r   Zidlelibr   Zidlelib.textviewr   Zidlelib.tooltipr   rc   r   ZTestCaser   rB   rˆ   r>   rƒ   r   r   r   r   Ú<module>   s,    / a "ÿ