B
    v9a±P  ã               @   s
  d Z ddlm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%é    )Ú
namedtuple)Ú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.Zguic                  s   ˆ   ¡  ˆ  ¡  d S )N)Zupdate_idletasksZdestroy© )Úrootr   ú#/usr/lib/python3.7/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 )N)Ú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   N)r   r   )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é   N)r   r   )r   r   r   r   Ú!test_count_begins_with_empty_line0   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
é   N)r   r   )r   r   r   r   Útest_count_ends_with_empty_line4   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
é   N)r   r   )r   r   r   r   Útest_count_several_lines8   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

é
   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   r   r   zÉaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
)r    )r   r   r   r   Útest_long_lineA   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   r   r)   é   é(   é   é   é   r+   )r   r    )r   r   r   r   r   Ú$test_several_lines_different_lengthsE   s    z3CountLinesTest.test_several_lines_different_lengthsN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    r"   r$   r&   r(   r,   r-   r4   r   r   r   r   r   $   s   r   c               @   s–   e Zd ZdZd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.c             C   s   t jd k	rd t _d S )N)r   Z_instance_weakref)r   r   r   r   ÚtearDownU   s    
zSqueezerTest.tearDownFc             C   s:   t ƒ }t|_|r6t| ƒ|_| j|jd}| |_|j_|S )z$Create a mock EditorWindow instance.)r   )	r   r   Ú	__class__r   r   Úmake_text_widgetr   ZperZbottom)r   Úwith_text_widgetÚeditwinÚtext_widgetr   r   r   Úmake_mock_editor_window[   s    
z$SqueezerTest.make_mock_editor_windowNc             C   s(   |dkr|   ¡ }t|ƒ}tdd|_|S )z<Create an actual Squeezer instance with a mock EditorWindow.Nr*   )Úreturn_value)r@   r   r   Úget_line_width)r   Zeditor_windowÚsqueezerr   r   r   Úmake_squeezer_instancei   s
    z#SqueezerTest.make_squeezer_instancec             C   s0   |d krt | ƒ}t|ƒ}d|d< | dd¡ |S )N)ZCourierr+   ZfontZiomarkz1.0)r   r   Úmark_set)r   r   r?   r   r   r   r<   q   s    zSqueezerTest.make_text_widgetc             C   s6   t  |||¡}t  ||||¡ |  t j||||¡ d S )N)r   Z	GetOptionZ	SetOptionr   )r   Z
configTypeÚsectionÚoptionÚvalueÚprev_valr   r   r   Ú set_idleconf_option_with_cleanupy   s    z-SqueezerTest.set_idleconf_option_with_cleanupc          
   C   sh   |   ¡ }|  |¡}xPdD ]H\}}}| j|||d( t|ƒ}||j_|  | |¡|¡ W dQ R X qW 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'   )z'aa\t' * 20r*   r#   )z'aa\t' * 21r*   r'   )z'aa\t' * 20r0   é   )Ú	text_codeÚ
line_widthr   N)r@   rD   ZsubTestÚevalrB   rA   r   Úcount_lines)r   r>   rC   rL   rM   r   r   r   r   r   Útest_count_lines   s    


zSqueezerTest.test_count_linesc             C   s2   |   ¡ }|  |¡}|  |j|¡ |  |jg ¡ dS )z(Test the creation of Squeezer instances.N)r@   rD   ZassertIsr>   r   Úexpandingbuttons)r   r>   rC   r   r   r   Ú	test_init•   s    
zSqueezerTest.test_initc             C   s‚   |   ¡ }xtdddd dgD ]`}ttd |_}|  |¡}|  |j |d¡t¡ |  |jd¡ | |d¡ |  t	|j
ƒd	¡ qW d
S )z@Test Squeezer's overriding of the EditorWindow's write() method.r!   ÚTEXTz	LONG TEXTiè  aL  MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
)rA   r   r%   r   N)r@   r   ÚSENTINEL_VALUEÚwriterD   r   r>   Ú
call_countÚassert_called_withÚlenrQ   )r   r>   r   Ú
orig_writerC   r   r   r   Útest_write_no_tagsœ   s    
zSqueezerTest.test_write_no_tagsc             C   s€   xzdddd dgD ]f}|   ¡ }t|j_|j}|  |¡}|  |j |d¡t¡ |  |jd¡ | |d¡ |  t	|j
ƒd¡ qW d	S )
z@Test Squeezer's overriding of the EditorWindow's write() method.r!   rS   z	LONG TEXTiè  aL  MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
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%   r   N)r@   rT   rU   rA   rD   r   r>   rV   rW   rX   rQ   )r   r   r>   rY   rC   r   r   r   Útest_write_not_stdout¨   s    
z"SqueezerTest.test_write_not_stdoutc             C   sè   |   ¡ }xndD ]f}ttd |_}|  |¡}d|_|  |j |d¡t¡ |  |jd¡ | 	|d¡ |  t
|jƒd¡ qW xjdd d	gD ]Z}ttd |_}|  |¡}d|_|  |j |d¡d
¡ |  |jd¡ |  t
|jƒd¡ q†W d
S )z@Test Squeezer's overriding of the EditorWindow's write() method.)r!   rS   )rA   é2   Ústdoutr%   r   z	LONG TEXTiè  aL  MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
MANY_LINES
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@   r   rT   rU   rD   Úauto_squeeze_min_linesr   r>   rV   rW   rX   rQ   )r   r>   r   rY   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)r=   r.   r/   )rA   zTEXT
TEXT
TEXT
TEXT
TEXT
TEXT
r^   z1.0Úendr)   r%   N)r@   r   rD   r_   r   rO   rU   r   ÚgetrX   rQ   )r   r>   r?   rC   r   r   r   Útest_auto_squeezeÎ   s    
zSqueezerTest.test_auto_squeezec             C   s
  x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W dS )z$Test the squeeze_current_text event.)r^   r[   T)r=   r/   )rA   z1.0z
SOME
TEXT
Úinsertra   zSOME
TEXT

r   )ÚeventÚbreakz

r%   z	SOME
TEXTN)r@   r   rD   r   rO   rd   rE   r   rb   rX   rQ   Úsqueeze_current_text_eventÚsÚexpand)r   Ztag_namer>   r?   rC   Ú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.T)r=   r/   )rA   z1.0z
SOME
TEXT
ZTAGrd   ra   zSOME
TEXT

r   )re   rf   N)r@   r   rD   r   rO   rd   rE   r   rb   rX   rQ   rg   )r   r>   r?   rC   rj   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.T)r=   r/   )rA   z1.0z
SOME
TEXT
r^   rd   )re   r%   zMORE
STUFF
rf   ra   z


r#   r   ú<N)r@   r   rD   r   rO   rd   rE   rg   r   rX   rQ   rb   Ú
assertTrueZcompare)r   r>   r?   rC   rj   r   r   r   Ú/test_squeeze_text_before_existing_squeezed_text  s$    
z<SqueezerTest.test_squeeze_text_before_existing_squeezed_textc             C   sd   | j dd}|  |¡}tƒ |_|j}|d }|  dddt|ƒ¡ t ¡  |  	|j|¡ |j 
¡  dS )zTest the reload() class-method.T)r=   r+   Úmainr   zauto-squeeze-min-linesN)r@   rD   r   Z	load_fontr_   rJ   Ústrr   Úreloadr   Zassert_called)r   r>   rC   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   rr   )r   r   r   r   Ú!test_reload_no_squeezer_instances8  s    z.SqueezerTest.test_reload_no_squeezer_instances)F)N)N)r5   r6   r7   r8   r:   r@   rD   r<   rJ   rP   rR   rZ   r\   r`   rc   rk   rl   ro   rs   rt   r   r   r   r   r9   S   s"   


r9   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.r]   )r   r   r   r>   r   r_   )r   r   rC   r   r   r   Úmake_mock_squeezerA  s
    z&ExpandingButtonTest.make_mock_squeezerzidlelib.squeezer.Hovertip)Úautospecc             C   sÖ   |   ¡ }|jj}tddd|ƒ}|  |jd¡ |  |j|¡ |  d| d¡k¡ |  | 	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.rS   ÚTAGSr]   z50 linesr   z1.0ra   r)   z<Double-Button-1>z<Button-%s>Ú2Ú3r%   )Zhover_delayr   zright-clickN)rv   r>   r   r   r   rh   Zmasterrn   Zcgetrb   ZassertInZbindr   ZisAquaTkrV   rW   r
   Ú	call_argsÚlower)r   ZMockHovertiprC   r?   ÚexpandingbuttonZright_button_codeZtooltip_textr   r   r   rR   K  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.rS   rx   r]   z1.0)Úwindow)re   Nra   zTEXT
zend-1cr%   )rv   r   r   Úwindow_createÚ	base_textri   r   r   rb   ÚindexZtag_nextrangerQ   ÚremoverV   rW   )r   rC   r}   r?   rj   Ztext_end_indexr   r   r   Útest_expandh  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
Q R X |  |d¡ |  |j dd¡d¡ tdƒ$}d|j	_
d|j_
|jtƒ d	}W d
Q R X |  |d
¡ |  |j dd¡|¡ d
S )z@Test that expanding very long output asks user for confirmation.Úai † rx   r]   z1.0)r~   zidlelib.squeezer.tkMessageBoxF)re   Nrf   zend-1cr!   T)rv   r   Zset_is_dangerousrn   Zis_dangerousr   r   r€   r   ZaskokcancelrA   Zaskyesnori   r   r   rb   )r   rC   r   r}   r?   Zmock_msgboxrj   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.rS   rx   r]   )re   Nr%   )	rv   r   r   Zclipboard_clearZclipboard_appendÚcopyr   rV   rW   )r   rC   r}   rj   r   r   r   Ú	test_copy°  s    zExpandingButtonTest.test_copyc          	   C   sl   |   ¡ }tddd|ƒ}tƒ |_tdtd8}|jtƒ d |  |jd¡ |  |j	d d	 d¡ W d
Q R X d
S )zTest the view event.rS   rx   r]   zidlelib.squeezer.view_text)rw   )re   r%   r   r#   N)
rv   r   r   Zselection_ownr   r   Zviewr   rV   r{   )r   rC   r}   Zmock_view_textr   r   r   Ú	test_viewÄ  s    zExpandingButtonTest.test_viewc          	   C   s’   |   ¡ }tddd|ƒ}tdƒj}tƒ }||_tƒ }d|_d|_|j|d |  |j	j
t|jƒ¡ x"|jD ]^}}|j	j|td qhW W dQ R X dS )	zTest the context menu.rS   rx   r]   ztkinter.Menur+   )re   )ÚlabelZcommandN)rv   r   r   r   rA   ÚxÚyZcontext_menu_eventr   Zadd_commandrV   rX   Zrmenu_specsZassert_any_callr
   )r   rC   r}   Z	mock_MenuZ	mock_menuZ
mock_eventr‰   Údatar   r   r   Ú
test_rmenuÕ  s    

zExpandingButtonTest.test_rmenuN)r5   r6   r7   r8   rv   r   r   rR   rƒ   r…   r‡   rˆ   r   r   r   r   r   ru   =  s   
 (ru   Ú__main__r#   )Ú	verbosity)'r8   Úcollectionsr   Ú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   rT   r   ZTestCaser   r9   ru   r5   rp   r   r   r   r   Ú<module>   s*   / k *
