a 9êdg.}ã@sNdZddlmZddlZddlZddlZddlmZmZddl Z ddl m Z ddlZddl m Z ej Z e jZiZe d¡Zed<e d¡Zed <e d¡Zed <e d¡Zed <d d „Zdd„ZGdd„de jƒZGdd„de jƒZGdd„de jƒZGdd„de jƒZGdd„de jƒZGdd„de jƒZedkrJe j dddS)zÒTest config, coverage 93%. (100% for IdleConfParser, IdleUserConfParser*, ConfigChanges). * Exception is OSError clause in Save method. Much of IdleConf is also exercised by ConfigDialog and test_configdialog. é)ÚconfigN)Úcaptured_stderrÚfindfile)Úmock)ÚFuncÚÚmainÚ highlightÚkeysÚ extensionscCstt_dt_dS)NT)ÚtestcfgÚidleConfÚuserCfgÚidlelibÚtesting©rrú9/usr/local/lib/python3.9/idlelib/idle_test/test_config.pyÚ setUpModulesrcCstt_dt_dS)NF)Úusercfgr rrrrrrrÚtearDownModule!src@s4eZdZdZdZdd„Zdd„Zdd„Zd d „Zd S) ÚIdleConfParserTestzTest that IdleConfParser workszœ [one] one = false two = true three = 10 [two] one = a string two = true three = false cCsôt d¡}| |j¡|j}| |jddddd¡| |jddddd¡||jddd dd ƒ|| dd¡d ƒ| |jddddd¡| |jddddd¡|| dd¡d ƒ|| dd¡d ƒ| | dd¡¡||jdddddƒdS)NrÚoneÚbool©ÚtypeFÚtwoTÚthreeÚinté za stringÚtrueÚfalseÚnotZexistZDEFAULT©Údefault)rÚIdleConfParserÚ read_stringÚ assertEqualZassertIsÚGetZ assertIsNone)ÚselfÚparserÚeqrrrÚtest_get5s  zIdleConfParserTest.test_getcCsXt d¡}| |j¡|j}| |dƒgd¢¡| |dƒgd¢¡| |dƒg¡dS)Nrr)rrrrz not exist)rr$r%Ú GetOptionListÚassertCountEqualr&)r(r)Zget_listrrrÚtest_get_option_listJs   z'IdleConfParserTest.test_get_option_listcCs&t d¡}| ¡| | ¡g¡dS)Nr)rr$ÚLoadr&Úsections©r(r)rrrÚtest_load_nothingRs z$IdleConfParserTest.test_load_nothingcCsFtdƒ}t |¡}| ¡| | dd¡d¡| | d¡dg¡dS)Nú cfgparser.1úFoo BarÚfooÚnewbar)rrr$r/r&r'r,)r(Ú config_pathr)rrrÚtest_load_fileWs  z!IdleConfParserTest.test_load_fileN) Ú__name__Ú __module__Ú __qualname__Ú__doc__rr+r.r2r8rrrrr&s  rc@sJeZdZdZddd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dS)ÚIdleUserConfParserTestz"Test that IdleUserConfParser worksrcCs t |¡S©N)rÚIdleUserConfParser)r(ÚpathrrrÚ new_parserdsz!IdleUserConfParserTest.new_parsercCs¢| ¡}| d¡| | ddd¡¡| | ddd¡¡| | ddd¡¡| | dd¡d¡| | ddd¡¡| | ¡ddg¡| | dd¡d¡dS)NÚFooÚbarrr ÚBar) rAÚ add_sectionÚ assertTrueÚ SetOptionÚ assertFalser&r'r-r0r1rrrÚtest_set_optiongs z&IdleUserConfParserTest.test_set_optioncCsZ| ¡}| d¡| ddd¡| | dd¡¡| | dd¡¡| | dd¡¡dS)NrBrCrZNotZExist)rAÚ AddSectionrGrFZ RemoveOptionrHr1rrrÚtest_remove_optionws  z)IdleUserConfParserTest.test_remove_optioncCsN| ¡}| | ¡g¡| d¡| d¡| d¡| | ¡ddg¡dS)NrBrD)rAr&r0rJr-r1rrrÚtest_add_section€s    z'IdleUserConfParserTest.test_add_sectioncCs\| ¡}| d¡| d¡| ddd¡| | ¡gd¢¡| ¡| | ¡dg¡dS)NrBrDÚIdleÚnameÚval)rDrBrM)rArJrGr-r0ZRemoveEmptySectionsr&r1rrrÚtest_remove_empty_sections‹s  z1IdleUserConfParserTest.test_remove_empty_sectionscCsv| ¡}| d¡| d¡| | ¡¡| | ¡g¡| ddd¡| d¡| | ¡¡| | ¡dg¡dS)NrBrDrCr ) rArJrFZIsEmptyr&r0rGrHr-r1rrrÚ test_is_empty•s   z$IdleUserConfParserTest.test_is_emptycCs¬t ¡}tj |d¡}| |¡}| d¡| ddd¡| tj  |¡¡|  ¡|  tj  |¡¡|  d¡|  ¡| tj  |¡¡Wdƒn1sž0YdS)Nztest.cfgrBrCr) ÚtempfileÚTemporaryDirectoryÚosr@ÚjoinrArJrGrHÚexistsZSaverFÚremove_section)r(Ztdirr@r)rrrÚ test_save¢s    z IdleUserConfParserTest.test_saveN)r) r9r:r;r<rArIrKrLrPrQrXrrrrr=as     r=c@s,eZdZdZedd„ƒZedd„ƒZdAdd„Zd d „Ze   e j   d ¡d ¡d d„ƒZe   e j   d ¡ d¡dd„ƒZdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zd*d+„Zd,d-„Zd.d/„Zd0d1„Zd2d3„Z d4d5„Z!d6d7„Z"d8d9„Z#d:d;„Z$dd?„Z&d@S)BÚ IdleConfTestzTest for idleConfc Cs¤i|_tjdd}tdkr(tj t¡}ntj t jd¡}|j D]N}tj  |d|¡}t |dƒ}|  ¡|j|<Wdƒq@1s„0Yq@tj|_tƒt_dS)NT©Ú_utestÚ__main__rz../config-%s.defÚr)Ú config_stringrÚIdleConfr9rTr@ÚdirnameÚ__file__ÚabspathÚsysÚ config_typesrUÚopenÚreadÚ_warnÚ orig_warnr)ÚclsÚconfÚidle_dirÚctyper7ÚfrrrÚ setUpClass·s   .zIdleConfTest.setUpClasscCs |jt_dSr>)rhrrg)rirrrÚ tearDownClassÈszIdleConfTest.tearDownClassFcCs tj|dS)NrZ)rr_)r(r[rrrÚ new_configÌszIdleConfTest.new_configcCshtjdd}|jD]P}t d¡|j|<|j| |j|¡t d¡|j|<|j| |j|¡q|S)zbReturn a mocked idleConf Both default and user config used the same config-*.def TrZr) rr_rdr$Ú defaultCfgr%r^r?r)r(rjrlrrrÚ mock_configÏs  zIdleConfTest.mock_configÚwinzthis is test for unix systemc Cs¤|jdd}tjdddNtjddd | | ¡d¡Wdƒn1sP0YWdƒn1sn0Ytjdddxtjd d dJt d ¡ | | ¡d ¡Wdƒn1sÈ0YWdƒn1sæ0YWdƒn1s0Ytjd ddp| t¡D| t¡| ¡Wdƒn1sV0YWdƒn1sv0YWdƒn1s–0YdS)NTrZúos.path.expanduserú /home/foo©Z return_valueúos.path.existsz/home/foo/.idlercú~ú os.getcwdz/home/foo/cpythonúos.mkdirz/home/foo/cpython/.idlercú os.path.joinú/path/not/exists©rprÚpatchr&Z GetUserCfgDirÚ assertRaisesÚ SystemExitÚFileNotFoundError©r(rjrrrÚtest_get_user_cfg_dir_unixÝs L  ÿ`  z'IdleConfTest.test_get_user_cfg_dir_unixzthis is test for Windows systemc Cs¤|jdd}tjdddNtjddd | | ¡d¡Wdƒn1sP0YWdƒn1sn0Ytjdddxtjd d dJt d ¡ | | ¡d ¡Wdƒn1sÈ0YWdƒn1sæ0YWdƒn1s0Ytjd ddp| t¡D| t¡| ¡Wdƒn1sV0YWdƒn1sv0YWdƒn1s–0YdS)NTrZrtzC:\foorvrwzC:\foo\.idlercrxryzC:\foo\cpythonrzzC:\foo\cpython\.idlercr{r|r}r‚rrrÚtest_get_user_cfg_dir_windowsôs L  ÿ`  z*IdleConfTest.test_get_user_cfg_dir_windowsc CsP|jdd}d}tj ddi¡Ftjd|d| ¡Wdƒn1sN0YWdƒn1sl0Y| |j ¡|j¡| |j  ¡|j¡|j  ¡D]}|  |t j ¡q¨|j   ¡D]}|  |t j¡qÆ|j ¡D](\}}| |jtj |d|›d ¡¡qä|j  ¡D]2\}}| |jtj |jp8d d|›d ¡¡qdS) NTrZrur9Z__foo__zos.path.dirnamervzconfig-z.defú#z.cfg)rprr~ÚdictZCreateConfigHandlersr-rqr rdrÚvaluesZassertIsInstancerr$r?Úitemsr&ÚfilerTr@rUZuserdir)r(rjrkZdefault_parserZ user_parserZcfg_typer)rrrÚtest_create_config_handlers s& Dÿÿz(IdleConfTest.test_create_config_handlerscCs¦|jdd}tdƒ}t |¡|jd<t |¡|jd<| ¡|j}||jd  dd¡dƒ||jd  d¡dgƒ||jd  dd¡dƒ||jd  d¡dgƒdS)NTrZr3r5r4r6) rprrr$rqr?rZ LoadCfgFilesr&r'r,)r(rjr7r*rrrÚtest_load_cfg_files&s z IdleConfTest.test_load_cfg_filescCsR| ¡}t d¡,}| ¡| |jt|jƒ¡Wdƒn1sD0YdS)Nz&idlelib.config.IdleUserConfParser.Save)rrrr~ZSaveUserCfgFilesr&Ú call_countÚlenr)r(rjÚmrrrÚtest_save_user_cfg_files;s z%IdleConfTest.test_save_user_cfg_filescCs¸| ¡}|j}|| ddd¡dƒ||jddddddƒt d¡`}||jddd dddƒ|| ddd ¡dƒ||jddd d d d ƒ||jd ƒWdƒn1sª0YdS)NrÚ EditorWindowÚwidthZ80rréPúidlelib.config._warnZfontÚ NotExistsZNEr"é)rrr&Ú GetOptionrr~rŒ)r(rjr*rgrrrÚtest_get_optionBs zIdleConfTest.test_get_optioncCs2| ¡}| dddd¡| | ddd¡d¡dS)NrrBrCr6)rrrGr&r–r‚rrrrINszIdleConfTest.test_set_optioncCs¬| ¡}| | dd¡gd¢¡| | dd¡gd¢¡| tj¡| dd¡Wdƒn1sf0Y| tj¡| dd¡Wdƒn1sž0YdS)Nr#r)ZGeneralrZPyShellÚIndentÚThemeÚKeysZHistoryÚ HelpFilesÚuserZfoobarZ notexists)rrr-ÚGetSectionListrrÚInvalidConfigSetZInvalidConfigTyper‚rrrÚtest_get_section_listTs þ þ*z"IdleConfTest.test_get_section_listcCs¤| ¡}|j}|| dd¡dddœƒ|| dd¡dddœƒ| dd d d ¡| dd d d ¡t d¡(|| d d¡d d dœƒWdƒn1s–0YdS)Nú IDLE ClassicZnormalz#000000z#ffffff)Z foregroundZ backgroundZcursorZblackr ÚFoobarznormal-foregroundz#747474znormal-backgroundz#171717r“)rrr&Z GetHighlightrGrr~©r(rjr*rrrÚtest_get_highlightesÿÿ ÿzIdleConfTest.test_get_highlightcCs`| ¡}| | dd¡| dd¡¡| tj¡| dd¡Wdƒn1sR0YdS)Nr#r rœÚbad)rrr&Z GetThemeDictrrZ InvalidThemer‚rrrÚtest_get_theme_dictws  þz IdleConfTest.test_get_theme_dictcCs8| ¡}| | ¡| d¡¡| | ¡| d¡¡dS)Nr™rš)rrr&Z CurrentThemeÚcurrent_colors_and_keysÚ CurrentKeysr‚rrrÚtest_get_current_theme_and_keysƒsz,IdleConfTest.test_get_current_theme_and_keyscCs| ¡}| | d¡d¡dS)Nr™r )rrr&r¦r‚rrrÚtest_current_colors_and_keys‰sz)IdleConfTest.test_current_colors_and_keyscCs^tj}|jdd}dt_| | ¡d¡dt_| | ¡d¡dt_| | ¡d¡|t_dS) NTrZÚwin32úIDLE Classic WindowsÚdarwinúIDLE Classic OSXú some-linuxúIDLE Modern Unix)rcÚplatformrpr&Ú default_keys©r(Zcurrent_platformrjrrrÚtest_default_keysŽs zIdleConfTest.test_default_keyscCsˆt d¡|j}tj}||ddgƒ||ƒdgƒ||dddgƒ||ddddgƒ||ddd ddgƒt d¡t d¡dS) Nzn [ZzDummy] enable = True [DISABLE] enable = False T)Z shell_onlyÚZzDummy)Ú editor_onlyF)Ú active_onlyZDISABLE)r¶rµ)Úuserextnr%r&r Z GetExtensionsrW)r(r*ZiGErrrÚtest_get_extensionsžs  z IdleConfTest.test_get_extensionscCs*| ¡}| | | dd¡¡gd¢¡dS)Nr#r )Z AutoCompleteZ CodeContextZFormatParagraphZ ParenMatchr´)rrr-ZRemoveKeyBindNamesrr‚rrrÚtest_remove_key_bind_names°s þz'IdleConfTest.test_remove_key_bind_namescCs>t d¡|j}|t d¡dƒ|t d¡dƒt d¡dS)Nú= [ZzDummy] enable = True zz-inr´zz-out)r·r%r&r ZGetExtnNameForEventrW)r(r*rrrÚtest_get_extn_name_for_event·s  z)IdleConfTest.test_get_extn_name_for_eventcCs0t d¡| t d¡ddgi¡t d¡dS)Nrºr´ú<>ú!)r·r%r&r ZGetExtensionKeysrW©r(rrrÚtest_get_extension_keysÁs   ÿz$IdleConfTest.test_get_extension_keyscCsNt d¡|j}tj}||dƒiƒdgdgdœ}||dƒ|ƒt d¡dS)Nrºr”r½z!)r¼z <>r´)r·r%r&r ZGetExtensionBindingsrW)r(r*ZiGEBÚexpectrrrÚtest_get_extension_bindingsÍs ÿz(IdleConfTest.test_get_extension_bindingscCs | ¡}|j}|| dd¡ddgƒ|| dd¡ddgƒ|| dd¡d d gƒ|| d d¡d gƒ|| d d¡d gƒ|| dd¡gƒ|| dd¡gƒdS)Nr¯ú<>zzúIDLE Classic Unixz z r«zzzIDLE Classic Macúr­z NOT EXISTS)rrr&Z GetKeyBindingr¢rrrÚtest_get_keybindingÚs ÿ ÿ ÿz IdleConfTest.test_get_keybindingcCs8tj}| ¡}dt_| | ¡| | ¡¡¡|t_dS)Nr®)rcr°rrr&ZGetCurrentKeySetÚ GetKeySetr§r²rrrÚtest_get_current_keysetës  z$IdleConfTest.test_get_current_keysetcCsj| ¡}|jd d¡|jd d¡|jd ddd¡|jd ddd¡| | d¡d d ¡dS) Nr r¡ZFoobar_cfgBindingsÚenableÚTrueZnewfoozr¯z <>r)rrrqrEÚsetr&rÆr‚rrrÚtest_get_keysetüs zIdleConfTest.test_get_keysetcCsL| ¡}| | d¡¡| | d¡¡| | d¡¡| | d¡¡dS)NÚcopyZcutzdel-word-rightz not-exists)rrrFZ IsCoreBindingrHr‚rrrÚtest_is_core_bindings z!IdleConfTest.test_is_core_bindingcCs| ¡}| | d¡g¡| | d¡g¡| tj¡"| | d¡g¡Wdƒn1s`0Y| | ¡| d¡| d¡¡|jd  ddd¡|jd  ddd ¡|jd  dd d ¡|jd  dd d ¡| | d¡gd¢¡| | ¡| d¡| d¡¡dS)Nr#rœr¤rr›Ú4zPython;https://python.orgÚ3zPython:https://python.orgÚ2z/Pillow;https://pillow.readthedocs.io/en/latest/Ú1z/IDLE;C:/Programs/Python36/Lib/idlelib/help.html))ÚIDLEz*C:/Programs/Python36/Lib/idlelib/help.htmlrÑ)ZPillowz(https://pillow.readthedocs.io/en/latest/rÐ)ÚPythonzhttps://python.orgrÎ) rrr&ZGetExtraHelpSourceListrrržr-ZGetAllExtraHelpSourcesListrrGr‚rrrÚtest_extra_help_source_lists(0þ ÿþz(IdleConfTest.test_extra_help_source_listcCsœddlm}ddlm}ddlm}| ¡}|dƒ|ƒ}| ¡| |dd|d¡}|  |  |d d ¡|d |d dkr|d n|d |df¡|  ¡~dS)Nr)Úrequires)ÚTk)ÚFontZguiZ TkFixedFontT)rNrVÚrootrrÚfamilyÚsizerZweight) Ú test.supportrÕÚtkinterrÖZ tkinter.fontr×rrZwithdrawÚactualr&ZGetFontZdestroy)r(rÕrÖr×rjrØrmrrrÚ test_get_font*s    $þzIdleConfTest.test_get_fontcCs®| ¡}|j}|| ¡ddgƒ|| ¡dddgƒ|| ¡ddgƒ|| d¡dd d gƒ|| d ¡dd gƒ|| d ¡dddgƒ|| d¡dddgƒdS)Nz<>z rÂz z z<>zr«zzr­rÄrÃz z r¯)rrr&Z GetCoreKeysr¢rrrÚtest_get_core_keys=sÿÿÿzIdleConfTest.test_get_core_keysN)F)'r9r:r;r<Ú classmethodrnrorprrÚunittestZskipIfrcr°Ú startswithrƒr„rŠr‹rr—rIrŸr£r¥r¨r©r³r¸r¹r»r¿rÁrÅrÇrËrÍrÔrÞrßrrrrrY´sD            rYc@sReZdZdZejZdZe ¡Zdd„Z dd„Z dd„Z d d „Z d d „Z d d„ZdS)ÚCurrentColorKeysTesta Test colorkeys function with user config [Theme] and [Keys] patterns. colorkeys = config.IdleConf.current_colors_and_keys Test all patterns written by IDLE and some errors Item 'default' should really be 'builtin' (versus 'custom). r cCs~| | d¡|j¡t d¡| | d¡|j¡dtdd<| | d¡d¡dtdd<| | d¡|j¡t d¡dS)Nr™z< [Theme] default = True úIDLE NewrNú non-existent)r&Ú colorkeysÚ default_themeÚusermainr%rWr¾rrrÚtest_old_builtin_themeXs   z+CurrentColorKeysTest.test_old_builtin_themecCsht d¡| | d¡d¡dtdd<| | d¡d¡dtdd<| | d¡|j¡t d¡dS)NzZ [Theme] default = True name2 = IDLE Dark r™z IDLE DarkrärNråÚname2)rèr%r&rærçrWr¾rrrÚtest_new_builtin_themejs   z+CurrentColorKeysTest.test_new_builtin_themecCspt d¡| | d¡|j¡t d¡| | d¡d¡dtdd<| | d¡d¡t d¡t d¡dS)Nz\ [Theme] default = False name = Custom Dark r™z[Custom Dark] a=bz Custom Darkrårê)rèr%r&rærçÚuserhighrWr¾rrrÚtest_user_override_themezs    z-CurrentColorKeysTest.test_user_override_themecCs^| | d¡|j¡t d¡| | d¡d¡dtdd<| | d¡|j¡t d¡dS)Nršz` [Keys] default = True name = IDLE Classic Unix rÃrårN)r&rær±rèr%rWr¾rrrÚtest_old_builtin_keys‹s   z*CurrentColorKeysTest.test_old_builtin_keyscCsht d¡| | d¡d¡dtdd<| | d¡d¡dtdd<| | d¡|j¡t d¡dS)Nz` [Keys] default = True name2 = IDLE Modern Unix ršr¯rÃrNrårê)rèr%r&rær±rWr¾rrrÚtest_new_builtin_keysšs   z*CurrentColorKeysTest.test_new_builtin_keyscCspt d¡| | d¡|j¡t d¡| | d¡d¡dtdd<| | d¡d¡t d¡t d¡dS)Nz[ [Keys] default = False name = Custom Keys ršz[Custom Keys] a=bz Custom Keysrårê)rèr%r&rær±ÚuserkeysrWr¾rrrÚtest_user_override_keysªs    z,CurrentColorKeysTest.test_user_override_keysN)r9r:r;r<r r¦rærçr±rérërírîrïrñrrrrrãMsrãc@seZdZiiiidœZdd„Zdddiiddd iid d d iiidœZd d„Zdd„Zdd„Zdd„Z dd„Z dd„Z dd„Z dd„Z dd„ZdS) Ú ChangesTest)rr r r cCs:|j}| dddd¡| dddd¡| d d d d ¡|S) NrÚMsecÚmitemÚmvalr ÚHsecÚhitemÚhvalr ÚKsecÚkitemÚkval©ÚchangesÚ add_option©r(rýrrrÚloadÀs zChangesTest.loadrórôrõrör÷rørùrúrûcCst ¡|_dSr>)rZ ConfigChangesrýr¾rrrÚsetUpÌszChangesTest.setUpcCs| |j|j¡dSr>)r&rýÚemptyr¾rrrÚ test_initÏszChangesTest.test_initcCs8| ¡}| ||j¡| dddd¡| ||j¡dS)Nrrórôrõ)rr&ÚloadedrþrÿrrrÚtest_add_optionÒszChangesTest.test_add_optioncCs |jj}| |ddddƒ¡| |ddddƒ¡| tddd¡| |ddddƒ¡| tddd¡| |ddddƒ¡| t dd¡¡t d¡dS)Nrr˜ZwhatÚ0ú use-spacesrÑ)rýÚ save_optionrFrHr&rèÚ has_optionrW)r(rrrrÚtest_save_optionØszChangesTest.test_save_optioncCs’| ¡}| | ¡¡| tddd¡| tddd¡| tddd ¡| d ddd¡| | ¡¡t  d¡t  d¡t  d¡dS) Nrórôrõrör÷rørùrúrûr) rrFÚsave_allr&rèrìrðrþrHrWrÿrrrÚtest_save_addedäs  zChangesTest.test_save_addedcCsV|j}| dddd¡| dddd¡| ¡| t dd¡¡| t dd¡¡dS)Nrr›rÒZidledocZELDIZcodeldi)rýrrþr rHrèr rFrÿrrrÚtest_save_helpðs zChangesTest.test_save_helpcCs|j}| dddd¡dS)Nrr˜rrÑrürÿrrrÚtest_save_defaultùszChangesTest.test_save_defaultc Cs”| ¡}| dd¡| ||j¡dD]h\}}t| |dd¡| ||¡| t¡(|||t||Wdƒq&1s„0Yq&dS)NrZfake))rró)r rùrNÚvalue)rZdelete_sectionr&rr rGrÚKeyError)r(rýZcfgtypeÚsectionrrrÚtest_delete_sections     zChangesTest.test_delete_sectioncCs"| ¡}| ¡| ||j¡dSr>)rÚclearr&rrÿrrrÚ test_clear szChangesTest.test_clearN)r9r:r;rrrrrrr r r rrrrrrrrò¼s    ý    ròc@seZdZdd„ZdS)Ú WarningTestcCsð|j}tƒt_tƒ}t dd¡Wdƒn1s60Y|tjdhƒ|| ¡dƒtƒ}t dd¡Wdƒn1s„0Y|| ¡dƒtƒ}t dd¡Wdƒn1sÄ0Y|tjddhƒ|| ¡d ƒdS) NÚwarningÚkey)rrzwarning rÚwarn2Úyek)rrzwarn2 )r&rÊrZ_warnedrrgÚgetvalue)r(ZEqualÚstderrrrrÚ test_warns***zWarningTest.test_warnN)r9r:r;rrrrrrsrr\é)Ú verbosity)!r<rrrcrTrRrÛrrrárZidlelib.idle_test.mock_idlerr rrr r?rèrìrðr·rrZTestCaserr=rYrãròrr9rrrrrÚs:   ;SoV