B „ fxNã@südZddlmZddlmZmZddlZddlmZm Z m Z m Z m Z ddl mZddlmZddlmZmZmZdd lmZdd lmZdd lmZdd lmZe jZd d„ZGdd„dejƒZ Gdd„dejƒZ!Gdd„dejƒZ"e#dkrøej$dddS)zTest squeezer, coverage 95%é)Údedent)ÚTextÚTkN)ÚMockÚNonCallableMagicMockÚpatchÚsentinelÚANY)Úrequires)ÚidleConf)Úcount_lines_with_wrappingÚExpandingButtonÚSqueezer)Úmacosx)Ú view_text)ÚHovertip)ÚPyShellcs0tdƒtƒ‰ˆ ¡‡fdd„}| |¡ˆS)z*Helper for tests: Create a root Tk object.Zguicsˆ ¡ˆ ¡dS)N)Zupdate_idletasksZdestroy©)ÚrootrúD/opt/alt/python37/lib64/python3.7/idlelib/idle_test/test_squeezer.pyÚ cleanup_rootsz&get_test_tk_root..cleanup_root)r rZwithdrawÚ addCleanup)Z test_instancerr)rrÚget_test_tk_roots   rc@sPeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dS)ÚCountLinesTestz1Tests for the count_lines_with_wrapping function.cCs| |t||ƒ¡S)N)Ú assertEqualr )ÚselfÚexpectedÚtextÚ linewidthrrrÚcheck%szCountLinesTest.checkcCs| tdƒd¡dS)zTest with an empty string.ÚrN)rr )rrrrÚtest_count_empty+szCountLinesTest.test_count_emptycCs| tdƒd¡dS)z/Test with a string which begins with a newline.z textéN)rr )rrrrÚ!test_count_begins_with_empty_line/sz0CountLinesTest.test_count_begins_with_empty_linecCs| tdƒd¡dS)z-Test with a string which ends with a newline.ztext éN)rr )rrrrÚtest_count_ends_with_empty_line3sz.CountLinesTest.test_count_ends_with_empty_linecCs| tdƒd¡dS)z Test with several lines of text.z1 2 3 éN)rr )rrrrÚtest_count_several_lines7sz'CountLinesTest.test_count_several_linescCs4|jdddd|jdddd|jdddddS) Nr$Ú éP)rrrr"z é z )r)rrrrÚtest_empty_lines;szCountLinesTest.test_empty_linescCs$|jdddd|jdddddS)Nr&ZÈaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar))rrrzÉaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa )r)rrrrÚtest_long_line@szCountLinesTest.test_long_linecCs`tdƒ}|jd|dd|jd|ddd|jd|dd|jd|d d|jd |d ddS) Nz€ 13 characters 43 is the number of characters on this line 7 chars 13 charactersér))rrrr(éé(ééé r*)rr)rrrrrÚ$test_several_lines_different_lengthsDsz3CountLinesTest.test_several_lines_different_lengthsN) Ú__name__Ú __module__Ú __qualname__Ú__doc__rr!r#r%r'r+r,r3rrrrr#src@sŽeZdZdZd"dd„Zd#dd„Zd$dd „Zd d „Zd d „Zdd„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zd d!„ZdS)%Ú SqueezerTestzTests for the Squeezer class.FcCs:tƒ}d|_|r6t|ƒ|_|j|jd}||_|j_|S)z$Create a mock EditorWindow instance.r))r)rÚwidthrrÚmake_text_widgetrZperZbottom)rÚwith_text_widgetÚeditwinÚ text_widgetrrrÚmake_mock_editor_windowTs z$SqueezerTest.make_mock_editor_windowNcCs|dkr| ¡}t|ƒ}|S)zr)rZ editor_windowÚsqueezerrrrÚmake_squeezer_instance`sz#SqueezerTest.make_squeezer_instancecCs0|dkrt|ƒ}t|ƒ}d|d<| dd¡|S)N)ZCourierr*ZfontZiomarkz1.0)rrÚmark_set)rrr=rrrr:gs  zSqueezerTest.make_text_widgetcCs6t |||¡}t ||||¡| tj||||¡dS)N)r Z GetOptionZ SetOptionr)rZ configTypeZsectionZoptionÚvalueÚprev_valrrrÚ set_idleconf_option_with_cleanuposz-SqueezerTest.set_idleconf_option_with_cleanupc Csz| ¡}| |¡}xbdD]Z\}}}|j|||d:t|ƒ}t |d|¡| | |¡|¡WdQRXWdQRXqWdS)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&)z 'aa\t' * 20r)r")z 'aa\t' * 21r)r&)z 'aa\t' * 20r/é)Ú text_codeÚ line_widthrr9N)r>r@ZsubTestÚevalrÚobjectrÚ count_lines)rr<r?rFrGrrrrrÚtest_count_linesus   zSqueezerTest.test_count_linescCs2| ¡}| |¡}| |j|¡| |jg¡dS)z(Test the creation of Squeezer instances.N)r>r@ZassertIsr<rÚexpandingbuttons)rr<r?rrrÚ test_init‹s zSqueezerTest.test_initcCs‚| ¡}xtdddddgD]`}ttd|_}| |¡}| |j |d¡t¡| |jd¡| |d¡| t |j ƒd ¡qWd S) z@Test Squeezer's overriding of the EditorWindow's write() method.r ÚTEXTz LONG TEXTièaLMANY_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_valuerr$rN) r>rÚSENTINEL_VALUEÚwriter@rr<Ú call_countÚassert_called_withÚlenrL)rr<rÚ orig_writer?rrrÚtest_write_no_tags’s  zSqueezerTest.test_write_no_tagscCs€xzdddddgD]f}| ¡}t|j_|j}| |¡}| |j |d¡t¡| |jd¡| |d¡| t |j ƒd¡qWd S) z@Test Squeezer's overriding of the EditorWindow's write() method.r rNz LONG TEXTièaLMANY_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 Ústderrr$rN) r>rPrQrOr@rr<rRrSrTrL)rrr<rUr?rrrÚtest_write_not_stdoutžs  z"SqueezerTest.test_write_not_stdoutcCsè| ¡}xndD]f}ttd|_}| |¡}d|_| |j |d¡t¡| |jd¡|  |d¡| t |j ƒd¡qWxjddd gD]Z}ttd|_}| |¡}d|_| |j |d¡d ¡| |jd¡| t |j ƒd¡q†Wd S) z@Test Squeezer's overriding of the EditorWindow's write() method.)r rN)rOé2Ústdoutr$rz LONG TEXTièaLMANY_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 N) r>rrPrQr@Úauto_squeeze_min_linesrr<rRrSrTrL)rr<rrUr?rrrÚtest_write_stdout¬s"    zSqueezerTest.test_write_stdoutcCsd|jdd}|j}| |¡}d|_tdd|_| dd¡| | dd ¡d ¡| t |j ƒd ¡d S) zATest that the auto-squeezing creates an ExpandingButton properly.T)r;r-r.)rOzTEXT TEXT TEXT TEXT TEXT TEXT rZz1.0Úendr(r$N) r>rr@r[rrJrQrÚgetrTrL)rr<r=r?rrrÚtest_auto_squeezeÄs    zSqueezerTest.test_auto_squeezecCs xdD]ú}|jdd}|j}| |¡}tdd|_| dd|¡| dd¡| | dd ¡d ¡| t |j ƒd ¡|j tƒd }| |d ¡| | dd ¡d¡| t |j ƒd¡| |j d j d¡|j d j tƒd | | dd ¡d ¡| t |j ƒd ¡qWdS)z$Test the squeeze_current_text event.)rZrWT)r;r.)rOz1.0z SOME TEXT Úinsertr]z SOME TEXT r)ÚeventÚbreakz r$z SOME TEXTN)r>rr@rrJr`rArr^rTrLÚsqueeze_current_text_eventÚsÚexpand)rZtag_namer<r=r?ÚretvalrrrÚtest_squeeze_current_text_eventÐs"      z,SqueezerTest.test_squeeze_current_text_eventcCs¬|jdd}|j}| |¡}tdd|_| ddd¡| dd¡| | dd ¡d ¡| t |j ƒd ¡|j tƒd }| |d ¡| | dd ¡d ¡| t |j ƒd ¡dS)z@Test that the event doesn't squeeze text without a relevant tag.T)r;r.)rOz1.0z SOME TEXT ZTAGr`r]z SOME TEXT r)rarbN) r>rr@rrJr`rArr^rTrLrc)rr<r=r?rfrrrÚ/test_squeeze_current_text_event_no_allowed_tagsís     zrr@rrJr`rArcrrTrLr^Ú assertTrueZcompare)rr<r=r?rfrrrÚ/test_squeeze_text_before_existing_squeezed_texts$      zr@r[rDÚstrrÚreloadr)rr<r?Zorig_auto_squeeze_min_linesZnew_auto_squeeze_min_linesrrrÚ test_reloads   zSqueezerTest.test_reloadcCs t ¡dS)z@Test that Squeezer.reload() runs without any instances existing.N)rrn)rrrrÚ!test_reload_no_squeezer_instances,sz.SqueezerTest.test_reload_no_squeezer_instances)F)N)N)r4r5r6r7r>r@r:rDrKrMrVrXr\r_rgrhrkrorprrrrr8Rs     r8c@sTeZdZdZdd„Zededdd„ƒZdd „Zd d „Z d d „Z dd„Z dd„Z dS)ÚExpandingButtonTestz$Tests for the ExpandingButton class.cCs$t|ƒ}tƒ}t|ƒ|j_d|_|S)z0Helper for tests: Create a mock Squeezer object.rY)rrrr<rr[)rrr?rrrÚmake_mock_squeezer5s  z&ExpandingButtonTest.make_mock_squeezerzidlelib.squeezer.Hovertip)ÚautospeccCsÖ| ¡}|jj}tddd|ƒ}| |jd¡| |j|¡| d| d¡k¡| |  dd¡d¡|  d |  ¡¡d t   ¡r€d nd }|  ||  ¡¡| |jd ¡|j|ttd|jdd }|  d| ¡¡dS)z1Test the simplest creation of an ExpandingButton.rNÚTAGSrYz50 linesrz1.0r]r(zz Ú2Ú3r$)Z hover_delayrz right-clickN)rrr<rr rrdZmasterrjZcgetr^ZassertInZbindrZisAquaTkrRrSr Ú call_argsÚlower)rZ MockHovertipr?r=ÚexpandingbuttonZright_button_codeZ tooltip_textrrrrM?szExpandingButtonTest.test_initcCsº| ¡}tddd|ƒ}|j}|jd|d|j|_|jtƒd}| |d¡| | dd¡d ¡|  d ¡}| | d|¡d¡| |  dd¡d|f¡| |j j j d ¡|j j  |¡dS) zTest the expand event.rNrtrYz1.0)Úwindow)raNr]zTEXT zend-1cr$)rrr rÚ window_createÚ base_textrerrr^ÚindexZ tag_nextrangerLÚremoverRrS)rr?ryr=rfZtext_end_indexrrrÚ test_expand\s   zExpandingButtonTest.test_expandc Csú| ¡}dd}t|dd|ƒ}| ¡| |j¡|j}|jd|d|j|_tdƒ$}d|j _ d|j _ |j t ƒd }Wd QRX| |d ¡| |j dd ¡d ¡tdƒ$}d|j _ d|j _ |j t ƒd }Wd QRX| |d ¡| |j dd ¡|¡d S)z@Test that expanding very long output asks user for confirmation.Úai †rtrYz1.0)rzzidlelib.squeezer.tkMessageBoxF)raNrbzend-1cr T)rrr Zset_is_dangerousrjZ is_dangerousrr{r|rZ askokcancelrOZaskyesnorerrr^)rr?rryr=Z mock_msgboxrfrrrÚtest_expand_dangerous_oupput|s(     z0ExpandingButtonTest.test_expand_dangerous_oupputcCsp| ¡}tddd|ƒ}tƒ|_tƒ|_|jtƒd}| |d¡| |jjd¡| |jjd¡|j d¡dS)zTest the copy event.rNrtrY)raNr$) rrr rZclipboard_clearZclipboard_appendÚcopyrrRrS)rr?ryrfrrrÚ test_copy¤s zExpandingButtonTest.test_copyc Csl| ¡}tddd|ƒ}tƒ|_tdtd8}|jtƒd| |jd¡| |j dd d¡Wd QRXd S) zTest the view event.rNrtrYzidlelib.squeezer.view_text)rs)rar$rr"N) rrr rZ selection_ownrrZviewrrRrw)rr?ryZmock_view_textrrrÚ test_view¸s zExpandingButtonTest.test_viewc Cs’| ¡}tddd|ƒ}tdƒj}tƒ}||_tƒ}d|_d|_|j|d| |j j t |j ƒ¡x"|j D]^}}|j j |tdqhWWdQRXdS) zTest the context menu.rNrtrYz tkinter.Menur*)ra)ÚlabelZcommandN)rrr rrrOÚxÚyZcontext_menu_eventrZ add_commandrRrTZ rmenu_specsZassert_any_callr )rr?ryZ mock_MenuZ mock_menuZ mock_eventr…ÚdatarrrÚ test_rmenuÉs    zExpandingButtonTest.test_rmenuN) r4r5r6r7rrrrrMrrrƒr„r‰rrrrrq1s  (rqÚ__main__r")Ú verbosity)%r7ÚtextwraprZtkinterrrZunittestZ unittest.mockrrrrr Z test.supportr Zidlelib.configr Zidlelib.squeezerr r rZidlelibrZidlelib.textviewrZidlelib.tooltiprZidlelib.pyshellrrPrZTestCaserr8rqr4rlrrrrÚs(       /`*