JFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3RbrJFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3RbrB  fxN@sdZddlmZddlmZmZddlZddlmZm Z m Z m Z m Z ddl mZddlmZddlmZmZmZdd lmZdd lmZdd lmZdd lmZe jZd dZGdddejZ GdddejZ!GdddejZ"e#dkrej$dddS)zTest squeezer, coverage 95%)dedent)TextTkN)MockNonCallableMagicMockpatchsentinelANY)requires)idleConf)count_lines_with_wrappingExpandingButtonSqueezer)macosx) view_text)Hovertip)PyShellcs0tdtfdd}||S)z*Helper for tests: Create a root Tk object.ZguicsdS)N)Zupdate_idletasksZdestroy)rootrD/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)rrget_test_tk_roots   rc@sPeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ dS)CountLinesTestz1Tests for the count_lines_with_wrapping function.cCs||t||S)N) assertEqualr )selfexpectedtext linewidthrrrcheck%szCountLinesTest.checkcCs|tdddS)zTest with an empty string.rN)rr )rrrrtest_count_empty+szCountLinesTest.test_count_emptycCs|tdddS)z/Test with a string which begins with a newline.z textN)rr )rrrr!test_count_begins_with_empty_line/sz0CountLinesTest.test_count_begins_with_empty_linecCs|tdddS)z-Test with a string which ends with a newline.ztext N)rr )rrrrtest_count_ends_with_empty_line3sz.CountLinesTest.test_count_ends_with_empty_linecCs|tdddS)z Test with several lines of text.z1 2 3 N)rr )rrrrtest_count_several_lines7sz'CountLinesTest.test_count_several_linescCs4|jdddd|jdddd|jdddddS) Nr$ P)rrrr"z z )r)rrrrtest_empty_lines;szCountLinesTest.test_empty_linescCs$|jdddd|jdddddS)Nr&Zaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar))rrrzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa )r)rrrrtest_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 charactersr))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@seZdZdZd"ddZd#ddZd$dd Zd d Zd d ZddZ ddZ ddZ ddZ ddZ ddZddZddZddZd d!ZdS)% SqueezerTestzTests for the Squeezer class.FcCs:t}d|_|r6t||_|j|jd}||_|j_|S)z$Create a mock EditorWindow instance.r))r)rwidthrrmake_text_widgetrZperZbottom)rwith_text_widgeteditwin text_widgetrrrmake_mock_editor_windowTs z$SqueezerTest.make_mock_editor_windowNcCs|dkr|}t|}|S)zr)rZ editor_windowsqueezerrrrmake_squeezer_instance`sz#SqueezerTest.make_squeezer_instancecCs0|dkrt|}t|}d|d<|dd|S)N)ZCourierr*ZfontZiomarkz1.0)rrmark_set)rrr=rrrr:gs  zSqueezerTest.make_text_widgetcCs6t|||}t|||||tj||||dS)N)r Z GetOptionZ SetOptionr)rZ configTypeZsectionZoptionvalueprev_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@ZsubTestevalrobjectr count_lines)rr<r?rFrGrrrrrtest_count_linesus   zSqueezerTest.test_count_linescCs2|}||}||j|||jgdS)z(Test the creation of Squeezer instances.N)r>r@ZassertIsr<rexpandingbuttons)rr<r?rrr test_inits zSqueezerTest.test_initcCs|}xtdddddgD]`}ttd|_}||}||j|dt||jd||d|t |j d qWd S) z@Test Squeezer's overriding of the EditorWindow's write() method.r TEXTz LONG TEXTiaLMANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES 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>rSENTINEL_VALUEwriter@rr< call_countassert_called_withlenrL)rr<r orig_writer?rrrtest_write_no_tagss  zSqueezerTest.test_write_no_tagscCsxzdddddgD]f}|}t|j_|j}||}||j|dt||jd||d|t |j dqWd S) z@Test Squeezer's overriding of the EditorWindow's write() method.r rNz LONG TEXTiaLMANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES 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?rrrtest_write_not_stdouts  z"SqueezerTest.test_write_not_stdoutcCs|}xndD]f}ttd|_}||}d|_||j|dt||jd| |d|t |j dqWxjddd gD]Z}ttd|_}||}d|_||j|dd ||jd|t |j dqWd S) z@Test Squeezer's overriding of the EditorWindow's write() method.)r rN)rO2stdoutr$rz LONG TEXTiaLMANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES MANY_LINES 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?rrrtest_write_stdouts"    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.0endr(r$N) r>rr@r[rrJrQrgetrTrL)rr<r=r?rrrtest_auto_squeezes    zSqueezerTest.test_auto_squeezecCs xdD]}|jdd}|j}||}tdd|_|dd||dd||dd d |t |j d |j td }||d ||dd d|t |j d||j d j d|j d j td ||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)eventbreakz r$z SOME TEXTN)r>rr@rrJr`rArr^rTrLsqueeze_current_text_eventsexpand)rZtag_namer<r=r?retvalrrrtest_squeeze_current_text_events"      z,SqueezerTest.test_squeeze_current_text_eventcCs|jdd}|j}||}tdd|_|ddd|dd||dd d |t |j d |j td }||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_tagss     zrr@rrJr`rArcrrTrLr^ assertTrueZcompare)rr<r=r?rfrrr/test_squeeze_text_before_existing_squeezed_texts$      zr@r[rDstrrreloadr)rr<r?Zorig_auto_squeeze_min_linesZnew_auto_squeeze_min_linesrrr test_reloads   zSqueezerTest.test_reloadcCs tdS)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@sTeZdZdZddZededddZdd Zd d Z d d Z ddZ ddZ 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?rrrmake_mock_squeezer5s  z&ExpandingButtonTest.make_mock_squeezerzidlelib.squeezer.Hovertip)autospeccCs|}|jj}tddd|}||jd||j||d|dk|| ddd| d | d t rd nd }| || ||jd |j|ttd|jdd }| d|dS)z1Test the simplest creation of an ExpandingButton.rNTAGSrYz50 linesrz1.0r]r(zz 23r$)Z hover_delayrz right-clickN)rrr<rr rrdZmasterrjZcgetr^ZassertInZbindrZisAquaTkrRrSr call_argslower)rZ MockHovertipr?r=expandingbuttonZright_button_codeZ tooltip_textrrrrM?szExpandingButtonTest.test_initcCs|}tddd|}|j}|jd|d|j|_|jtd}||d||ddd | d }||d|d|| ddd|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_nextrangerLremoverRrS)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 ||jdd d td$}d|j _ d|j _ |j t d }Wd QRX||d ||jdd |d S)z@Test that expanding very long output asks user for confirmation.airtrYz1.0)rzzidlelib.squeezer.tkMessageBoxF)raNrbzend-1cr T)rrr Zset_is_dangerousrjZ is_dangerousrr{r|rZ askokcancelrOZaskyesnorerrr^)rr?rryr=Z mock_msgboxrfrrrtest_expand_dangerous_oupput|s(     z0ExpandingButtonTest.test_expand_dangerous_oupputcCsp|}tddd|}t|_t|_|jtd}||d||jjd||jjd|jddS)zTest the copy event.rNrtrY)raNr$) rrr rZclipboard_clearZclipboard_appendcopyrrRrS)rr?ryrfrrr test_copys zExpandingButtonTest.test_copyc Csl|}tddd|}t|_tdtd8}|jtd||jd||j dd dWd QRXd S) zTest the view event.rNrtrYzidlelib.squeezer.view_text)rs)rar$rr"N) rrr rZ selection_ownrrZviewrrRrw)rr?ryZmock_view_textrrr test_views zExpandingButtonTest.test_viewc Cs|}tddd|}tdj}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 rrrOxyZcontext_menu_eventrZ add_commandrRrTZ rmenu_specsZassert_any_callr )rr?ryZ mock_MenuZ mock_menuZ mock_eventrdatarrr test_rmenus    zExpandingButtonTest.test_rmenuN) r4r5r6r7rrrrrMrrrrrrrrrrq1s  (rq__main__r") verbosity)%r7textwraprZtkinterrrZunittestZ unittest.mockrrrrr Z test.supportr Zidlelib.configr Zidlelib.squeezerr r rZidlelibrZidlelib.textviewrZidlelib.tooltiprZidlelib.pyshellrrPrZTestCaserr8rqr4rlrrrrs(       /`*