B
    u9aöT  ã               @   sŒ  d dl mZ d dlmZ d dlZd dlZd dlZd dlZd dlZej	 
ej	 e¡dddd¡Zej	 e¡Zej	 e¡s„e e›d¡‚ej	 e¡ zd dlZd dlmZ W dej	d	= X G d
d„ dƒZG dd„ dƒZG dd„ dƒZejdddZG dd„ dƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ dƒZG dd„ dƒZG dd „ d eƒZG d!d"„ d"eƒZ G d#d$„ d$eƒZ!e"d%krˆe #¡  dS )&é    )Úsupport)ÚTestCaseNz..ZToolsÚclinicz path does not exist)Ú	DSLParseréÿÿÿÿc               @   s   e Zd Zdd„ ZdS )ÚFakeConverterc             C   s   || _ || _d S )N)ÚnameÚargs)Úselfr   r	   © r   ú!/usr/lib/python3.7/test_clinic.pyÚ__init__   s    zFakeConverter.__init__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r      s   r   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚFakeConverterFactoryc             C   s
   || _ d S )N)r   )r
   r   r   r   r   r   !   s    zFakeConverterFactory.__init__c             K   s   t | j|ƒS )N)r   r   )r
   r   ÚdefaultÚkwargsr   r   r   Ú__call__$   s    zFakeConverterFactory.__call__N)r   r   r   r   r   r   r   r   r   r       s   r   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚFakeConvertersDictc             C   s
   i | _ d S )N)Úused_converters)r
   r   r   r   r   )   s    zFakeConvertersDict.__init__c             C   s   | j  |t|ƒ¡S )N)r   Ú
setdefaultr   )r
   r   r   r   r   r   Úget,   s    zFakeConvertersDict.getN)r   r   r   r   r   r   r   r   r   r   (   s   r   ÚCÚfile)ÚlanguageÚfilenamec               @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zej	j
Z
dS )Ú
FakeClinicc             C   sì   t ƒ | _t ƒ | _t d ¡| _d | _i | _t d| j¡| _	t
 ¡ | _t
 ¡ | _| t_d| _d | _| _i | _|  dd¡ |  dd¡ |  dd¡ | jj}t
 d|dƒfd|dƒfd	|dƒfd
|dƒfd|dƒfd|dƒfd|dƒff¡| _d S )NÚ r   ÚblockÚbufferr   ÚsuppressZdocstring_prototypeZdocstring_definitionZmethoddef_defineZimpl_prototypeZparser_prototypeZparser_definitionZimpl_definition)r   Z
convertersZlegacy_convertersr   Ú	CLanguager   r   Zdestination_buffersÚBlockParserZblock_parserÚcollectionsÚOrderedDictÚmodulesÚclassesr   Zline_prefixZline_suffixÚdestinationsÚadd_destinationr   Zfield_destinations)r
   Údr   r   r   r   2   s0    







zFakeClinic.__init__c             C   s&   | j  |¡}|s"t dt|ƒ ¡ |S )NzDestination does not exist: )r(   r   ÚsysÚexitÚrepr)r
   r   r*   r   r   r   Úget_destinationM   s    zFakeClinic.get_destinationc             G   s:   || j krt dt|ƒ ¡ tj||| f|žŽ | j |< d S )NzDestination already exists: )r(   r+   r,   r-   r   ZDestination)r
   r   Útyper	   r   r   r   r)   S   s    
zFakeClinic.add_destinationc             C   s   |dkS )NÚmoduler   )r
   r   r   r   r   Úis_directiveX   s    zFakeClinic.is_directivec             C   s   || j |< d S )N)Zcalled_directives)r
   r   r	   r   r   r   Ú	directive[   s    zFakeClinic.directiveN)r   r   r   r   r.   r)   r1   r2   r   ÚClinicZ_module_and_classr   r   r   r   r   1   s   r   c               @   s   e Zd Zdd„ ZdS )ÚClinicWholeFileTestc             C   sN   t jt  d ¡dd}d}| |¡ ¡ }|d  ¡ }|  |d¡ |  |d¡ d S )Nr   )r   z/*[clinic]
foo
[clinic]*/é   z[clinic]*/[clinic]*/z
[clinic]*/)r   r3   r"   ÚparseÚ
splitlinesÚrstripZassertNotEqualÚassertEqual)r
   ÚcÚrawZcookedZend_liner   r   r   Útest_eola   s    	zClinicWholeFileTest.test_eolN)r   r   r   r<   r   r   r   r   r4   `   s   r4   c               @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚClinicGroupPermuterTestc             C   s   t  |||¡}|  ||¡ d S )N)r   Úpermute_optional_groupsr9   )r
   ÚlÚmÚrÚoutputÚcomputedr   r   r   Ú_testv   s    zClinicGroupPermuterTest._testc             C   s   |   dggdgdggd¡ d S )NÚstartÚstopÚstep))rF   )rE   rF   )rE   rF   rG   )rD   )r
   r   r   r   Ú
test_rangez   s    z"ClinicGroupPermuterTest.test_rangec             C   s    |   ddggdgdggd¡ d S )NÚxÚyÚchÚattr))rK   )rK   rL   )rI   rJ   rK   )rI   rJ   rK   rL   )rD   )r
   r   r   r   Útest_add_window‚   s    z'ClinicGroupPermuterTest.test_add_windowc             C   s2   |   dddgddggdgddgd	d
dggd¡ d S )NÚa1Úa2Úa3Úb1Úb2Úc1Úd1Úd2Úe1Úe2Úe3))rS   )rQ   rR   rS   )rQ   rR   rS   rT   rU   )rN   rO   rP   rQ   rR   rS   )rN   rO   rP   rQ   rR   rS   rT   rU   )rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   )rD   )r
   r   r   r   Útest_ludicrous‹   s    (z&ClinicGroupPermuterTest.test_ludicrousc             C   s    |   g g dgdgdggd¡ d S )NÚaÚbr:   )r   )rZ   )rZ   r[   )rZ   r[   r:   )rD   )r
   r   r   r   Útest_right_only–   s    z'ClinicGroupPermuterTest.test_right_onlyc             C   s   dd„ }|   t|¡ d S )Nc               S   s   t  dgg g ¡ d S )NrZ   )r   r>   r   r   r   r   Úfn    s    zPClinicGroupPermuterTest.test_have_left_options_but_required_is_empty.<locals>.fn)ÚassertRaisesÚAssertionError)r
   r]   r   r   r   Ú,test_have_left_options_but_required_is_emptyŸ   s    zDClinicGroupPermuterTest.test_have_left_options_but_required_is_emptyN)	r   r   r   rD   rH   rM   rY   r\   r`   r   r   r   r   r=   u   s   		r=   c               @   sD   e 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S )ÚClinicLinearFormatTestc             K   s   t j|f|Ž}|  ||¡ d S )N)r   Zlinear_formatr9   )r
   ÚinputrB   r   rC   r   r   r   rD   ¦   s    zClinicLinearFormatTest._testc             C   s   |   dd¡ d S )Nr   )rD   )r
   r   r   r   Útest_empty_stringsª   s    z)ClinicLinearFormatTest.test_empty_stringsc             C   s   |   dd¡ d S )NÚ
)rD   )r
   r   r   r   Útest_solo_newline­   s    z(ClinicLinearFormatTest.test_solo_newlinec             C   s   |   dd¡ d S )Nz
          abc
          )rD   )r
   r   r   r   Útest_no_substitution°   s    z+ClinicLinearFormatTest.test_no_substitutionc             C   s   | j dddd d S )Nz8
          abc
          {name}
          def
          z'
          abc
          def
          r   )r   )rD   )r
   r   r   r   Útest_empty_substitution·   s    z.ClinicLinearFormatTest.test_empty_substitutionc             C   s   | j dddd d S )Nz8
          abc
          {name}
          def
          z8
          abc
          GARGLE
          def
          ZGARGLE)r   )rD   )r
   r   r   r   Útest_single_line_substitutionÁ   s    z4ClinicLinearFormatTest.test_single_line_substitutionc             C   s   | j dddd d S )Nz8
          abc
          {name}
          def
          zJ
          abc
          bingle
          bungle

          def
          zbingle
bungle
)r   )rD   )r
   r   r   r   Útest_multiline_substitutionÌ   s    z2ClinicLinearFormatTest.test_multiline_substitutionN)
r   r   r   rD   rc   re   rf   rg   rh   ri   r   r   r   r   ra   ¥   s   
ra   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚInertParserc             C   s   d S )Nr   )r
   r   r   r   r   r   Ú   s    zInertParser.__init__c             C   s   d S )Nr   )r
   r   r   r   r   r6   Ý   s    zInertParser.parseN)r   r   r   r   r6   r   r   r   r   rj   Ù   s   rj   c               @   s   e Zd Zdd„ Zdd„ ZdS )Ú
CopyParserc             C   s   d S )Nr   )r
   r   r   r   r   r   á   s    zCopyParser.__init__c             C   s   |j |_d S )N)rb   rB   )r
   r   r   r   r   r6   ä   s    zCopyParser.parseN)r   r   r   r   r6   r   r   r   r   rk   à   s   rk   c               @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚClinicBlockParserTestc             C   sn   t  d ¡}tt  ||¡ƒ}t  |¡}x|D ]}| |¡ q*W |j ¡ }||ksjtdt	|ƒ d t	|ƒ ƒ‚d S )Nzoutput != input!

output z	

 input )
r   r"   Úlistr#   ZBlockPrinterZprint_blockÚfÚgetvaluer_   r-   )r
   rb   rB   r   ZblocksÚwriterr   r   r   r   rD   é   s    



zClinicBlockParserTest._testc             C   s   |   ||¡S )N)rD   )r
   rb   r   r   r   Ú
round_tripó   s    z ClinicBlockParserTest.round_tripc             C   s   |   d¡ d S )Nz(
    verbatim text here
    lah dee dah
)rq   )r
   r   r   r   Útest_round_trip_1ö   s    z'ClinicBlockParserTest.test_round_trip_1c             C   s   |   d¡ d S )Nz‡
    verbatim text here
    lah dee dah
/*[inert]
abc
[inert]*/
def
/*[inert checksum: 7b18d017f89f61cf17d47f92749ea6930a3f1deb]*/
xyz
)rq   )r
   r   r   r   Útest_round_trip_2û   s    	z'ClinicBlockParserTest.test_round_trip_2c             C   sN   t  d ¡}t j|dd}t|ƒ|jd< t|ƒ|jd< | |¡}|  ||¡ d S )Nr   )r   ZinertÚcopy)r   r"   r3   rj   Úparsersrk   r6   r9   )r
   rb   rB   r   r:   rC   r   r   r   Ú_test_clinic  s    

z"ClinicBlockParserTest._test_clinicc             C   s   |   dd¡ d S )Nz¯
    verbatim text here
    lah dee dah
/*[copy input]
def
[copy start generated code]*/
abc
/*[copy end generated code: output=03cfd743661f0797 input=7b18d017f89f61cf]*/
xyz
z¯
    verbatim text here
    lah dee dah
/*[copy input]
def
[copy start generated code]*/
def
/*[copy end generated code: output=7b18d017f89f61cf input=7b18d017f89f61cf]*/
xyz
)rv   )r
   r   r   r   Útest_clinic_1  s    		z#ClinicBlockParserTest.test_clinic_1N)	r   r   r   rD   rq   rr   rs   rv   rw   r   r   r   r   rl   è   s   
rl   c               @   sf  e 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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+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Z d=d>„ Z!d?d@„ Z"dAdB„ Z#dCdD„ Z$dEdF„ Z%dGdH„ Z&dIdJ„ Z'dKdL„ Z(dMdN„ Z)dOdP„ Z*dQdR„ Z+dZdUdV„Z,dWdX„ Z-dYS )[ÚClinicParserTestc             C   sH   t tƒ ƒ}t d¡}| |¡ |j\}}|  d|j¡ |  d|j¡ d S )Nzmodule os
os.accessÚaccessÚos)r   r   r   ÚBlockr6   Ú
signaturesr9   r   )r
   Úparserr   r0   Úfunctionr   r   r   Útest_trivial&  s    



zClinicParserTest.test_trivialc             C   s4   |   d¡}|j\}}|  d|j¡ |  d|j¡ d S )Nz#
module os
os.accessry   rz   )r6   r|   r9   r   )r
   r   r0   r~   r   r   r   Útest_ignore_line.  s    

z!ClinicParserTest.test_ignore_linec             C   sV   |   d¡}|  d|j¡ |  dt|jƒ¡ |jd }|  d|j¡ |  |jtj¡ d S )Nz module os
os.access
   path: intry   r5   Úpath)	Úparse_functionr9   r   ÚlenÚ
parametersÚassertIsInstanceÚ	converterr   Zint_converter)r
   r~   Úpr   r   r   Ú
test_param4  s    

zClinicParserTest.test_paramc             C   s&   |   d¡}|jd }|  d|j¡ d S )Nz4module os
os.access
    follow_symlinks: bool = TrueÚfollow_symlinksT)r‚   r„   r9   r   )r
   r~   r‡   r   r   r   Útest_param_default<  s    

z#ClinicParserTest.test_param_defaultc             C   s&   |   d¡}|jd }|  d|j¡ d S )NzCmodule os
os.access
    follow_symlinks: \
   bool \
   =\
    Truer‰   T)r‚   r„   r9   r   )r
   r~   r‡   r   r   r   Útest_param_with_continuationsA  s    

z.ClinicParserTest.test_param_with_continuationsc             C   sN   |   d¡}|jd }|  tj|j¡ |  d|jj¡ |  d¡}|  |d¡ d S )NzOmodule os
os.access
    follow_symlinks: int(c_default='MAXSIZE') = sys.maxsizer‰   ZMAXSIZEz:module os
os.access
    follow_symlinks: int = sys.maxsizez~Error on line 0:
When you specify a named constant ('sys.maxsize') as your default value,
you MUST specify a valid c_default.
)	r‚   r„   r9   r+   Úmaxsizer   r†   Z	c_defaultÚparse_function_should_fail)r
   r~   r‡   Úsr   r   r   Útest_param_default_expressionF  s    


z.ClinicParserTest.test_param_default_expressionc             C   s@   |   d¡}|jd }|  dt|jƒ¡ |  |jd jtj¡ d S )NzR
module os
os.access
    follow_symlinks: bool = True
    something_else: str = ''r‰   é   Zsomething_else)r‚   r„   r9   rƒ   r…   r†   r   Ústr_converter)r
   r~   r‡   r   r   r   Útest_param_no_docstringO  s
    
z(ClinicParserTest.test_param_no_docstringc             C   s   |   d¡}|  |d¡ d S )NzM
module os
os.access
    follow_symlinks: bool = True
    something_else: strzoError on line 0:
Can't have a parameter without a default ('something_else')
after a parameter with a default!
)r   r9   )r
   rŽ   r   r   r   Ú*test_param_default_parameters_out_of_orderY  s    z;ClinicParserTest.test_param_default_parameters_out_of_orderc             C   s,   |   d¡}|jd }|  d|jjd ¡ d S )Nz0module os
os.access
    path: path_t(allow_fd=1)r   é   Zallow_fd)r‚   r„   r9   r†   r	   )r
   r~   r‡   r   r   r   Ú!disabled_test_converter_argumentsd  s    

z2ClinicParserTest.disabled_test_converter_argumentsc             C   s    |   d¡}|  d ¡ |j¡ d S )Nzx
module os
os.stat as os_stat_fn

   path: str
       Path to be examined

Perform a stat system call on the given path.zj
stat($module, /, path)
--

Perform a stat system call on the given path.

  path
    Path to be examined
)r‚   r9   ÚstripÚ	docstring)r
   r~   r   r   r   Útest_function_docstringi  s    z(ClinicParserTest.test_function_docstringc             C   s    |   d¡}|  d ¡ |j¡ d S )Nz|
module foo
foo.bar
  x: int
     Documentation for x.
  y: int

This is the documentation for foo.

Okay, we're done here.
zt
bar($module, /, x, y)
--

This is the documentation for foo.

  x
    Documentation for x.

Okay, we're done here.
)r‚   r9   r–   r—   )r
   r~   r   r   r   Ú%test_explicit_parameters_in_docstring|  s    

z6ClinicParserTest.test_explicit_parameters_in_docstringc             C   s   |   d¡}|  d|j¡ d S )Nz<
module os
os.stat
    path: str
This/used to break Clinic!
z5stat($module, /, path)
--

This/used to break Clinic!)r‚   r9   r—   )r
   r~   r   r   r   ÚTtest_parser_regression_special_character_in_parameter_column_of_docstring_first_line”  s    zeClinicParserTest.test_parser_regression_special_character_in_parameter_column_of_docstring_first_linec             C   s   |   d¡}|  d|j¡ d S )Nzmodule os
os.stat as os_stat_fnZ
os_stat_fn)r‚   r9   Z
c_basename)r
   r~   r   r   r   Útest_c_name  s    
zClinicParserTest.test_c_namec             C   s   |   d¡}|  |jtj¡ d S )Nzmodule os
os.stat -> int)r‚   r…   Zreturn_converterr   Zint_return_converter)r
   r~   r   r   r   Útest_return_converter¡  s    
z&ClinicParserTest.test_return_converterc             C   s8   |   d¡}|jd }|  tjj|j¡ |  d|j¡ d S )Nz:module os
os.access
    *
    follow_symlinks: bool = Truer‰   r   )r‚   r„   r9   ÚinspectÚ	ParameterZKEYWORD_ONLYÚkindÚgroup)r
   r~   r‡   r   r   r   Ú	test_star¥  s    

zClinicParserTest.test_starc             C   s&   |   d¡}|jd }|  d|j¡ d S )Nz/module window
window.border
 [
 ls : int
 ]
 /
Zlsr”   )r‚   r„   r9   r    )r
   r~   r‡   r   r   r   Ú
test_group«  s    

zClinicParserTest.test_groupc             C   s`   |   d¡}x:dD ]2\}}|j| }|  |j|¡ |  |jtjj¡ qW |  |j 	¡ d 	¡ ¡ d S )NzÃ
module curses
curses.addch
   [
   y: int
     Y-coordinate.
   x: int
     X-coordinate.
   ]
   ch: char
     Character to add.
   [
   attr: long
     Attributes for the character.
   ]
   /
))rJ   r   )rI   r   )rK   r   )rL   r”   z™
addch([y, x,] ch, [attr])


  y
    Y-coordinate.
  x
    X-coordinate.
  ch
    Character to add.
  attr
    Attributes for the character.
            )
r‚   r„   r9   r    rŸ   r   rž   ÚPOSITIONAL_ONLYr—   r–   )r
   r~   r   r    r‡   r   r   r   Útest_left_group°  s    
z ClinicParserTest.test_left_groupc             C   s`   |   d¡}x:dD ]2\}}|j| }|  |j|¡ |  |jtjj¡ qW |  |j 	¡ d 	¡ ¡ d S )Na  
module curses
curses.imaginary
   [
   [
   y1: int
     Y-coordinate.
   y2: int
     Y-coordinate.
   ]
   x1: int
     X-coordinate.
   x2: int
     X-coordinate.
   ]
   ch: char
     Character to add.
   [
   attr1: long
     Attributes for the character.
   attr2: long
     Attributes for the character.
   attr3: long
     Attributes for the character.
   [
   attr4: long
     Attributes for the character.
   attr5: long
     Attributes for the character.
   attr6: long
     Attributes for the character.
   ]
   ]
   /
))Zy1éþÿÿÿ)Zy2r¥   )Zx1r   )Zx2r   )rK   r   )Zattr1r”   )Zattr2r”   )Zattr3r”   )Zattr4r5   )Zattr5r5   )Zattr6r5   aà  
imaginary([[y1, y2,] x1, x2,] ch, [attr1, attr2, attr3, [attr4, attr5,
          attr6]])


  y1
    Y-coordinate.
  y2
    Y-coordinate.
  x1
    X-coordinate.
  x2
    X-coordinate.
  ch
    Character to add.
  attr1
    Attributes for the character.
  attr2
    Attributes for the character.
  attr3
    Attributes for the character.
  attr4
    Attributes for the character.
  attr5
    Attributes for the character.
  attr6
    Attributes for the character.
                )
r‚   r„   r9   r    rŸ   r   rž   r£   r—   r–   )r
   r~   r   r    r‡   r   r   r   Útest_nested_groupsØ  s    "
z#ClinicParserTest.test_nested_groupsc          
   C   s<   t  ¡ &}|  t¡ |  |¡ W d Q R X W d Q R X | ¡ S )N)r   Úcaptured_stdoutr^   Ú
SystemExitr‚   ro   )r
   rŽ   Ústdoutr   r   r   r   $  s    
z+ClinicParserTest.parse_function_should_failc             C   s   |   d¡}|  |d¡ d S )Nz|
module foo
foo.two_top_groups_on_left
    [
    group1 : int
    ]
    [
    group2 : int
    ]
    param: int
            zpError on line 0:
Function two_top_groups_on_left has an unsupported group configuration. (Unexpected state 2.b)
)r   r9   )r
   rŽ   r   r   r   Ú0test_disallowed_grouping__two_top_groups_on_left*  s    
zAClinicParserTest.test_disallowed_grouping__two_top_groups_on_leftc             C   s   |   d¡ d S )Nz}
module foo
foo.two_top_groups_on_right
    param: int
    [
    group1 : int
    ]
    [
    group2 : int
    ]
            )r   )r
   r   r   r   Ú1test_disallowed_grouping__two_top_groups_on_right:  s    
zBClinicParserTest.test_disallowed_grouping__two_top_groups_on_rightc             C   s   |   d¡ d S )Nz„
module foo
foo.parameter_after_group_on_right
    param: int
    [
    [
    group1 : int
    ]
    group2 : int
    ]
            )r   )r
   r   r   r   Ú8test_disallowed_grouping__parameter_after_group_on_rightG  s    
zIClinicParserTest.test_disallowed_grouping__parameter_after_group_on_rightc             C   s   |   d¡ d S )Nzƒ
module foo
foo.group_after_parameter_on_left
    [
    group2 : int
    [
    group1 : int
    ]
    ]
    param: int
            )r   )r
   r   r   r   Ú7test_disallowed_grouping__group_after_parameter_on_leftT  s    
zHClinicParserTest.test_disallowed_grouping__group_after_parameter_on_leftc             C   s   |   d¡ d S )Nz`
module foo
foo.empty_group
    [
    [
    ]
    group2 : int
    ]
    param: int
            )r   )r
   r   r   r   Ú-test_disallowed_grouping__empty_group_on_lefta  s    	z>ClinicParserTest.test_disallowed_grouping__empty_group_on_leftc             C   s   |   d¡ d S )Nz`
module foo
foo.empty_group
    param: int
    [
    [
    ]
    group2 : int
    ]
            )r   )r
   r   r   r   Ú.test_disallowed_grouping__empty_group_on_rightm  s    	z?ClinicParserTest.test_disallowed_grouping__empty_group_on_rightc             C   s.   |   d¡}|  d|j¡ |  dt|jƒ¡ d S )Nz 
module foo
foo.bar

Docstring

zbar($module, /)
--

Docstringr”   )r‚   r9   r—   rƒ   r„   )r
   r~   r   r   r   Útest_no_parametersy  s    z#ClinicParserTest.test_no_parametersc             C   s4   | j dddd}|  d|j¡ |  dt|jƒ¡ d S )NzL
module foo
class foo.Bar "unused" "notneeded"
foo.Bar.__init__

Docstring

r   r5   )Úsignatures_in_blockÚfunction_indexzBar()
--

Docstringr”   )r‚   r9   r—   rƒ   r„   )r
   r~   r   r   r   Útest_init_with_no_parameters„  s    z-ClinicParserTest.test_init_with_no_parametersc             C   s   |   d¡ d S )Nz!
module foo
foo.bar => int
    /
)r   )r
   r   r   r   Útest_illegal_module_line’  s    z)ClinicParserTest.test_illegal_module_linec             C   s   |   d¡ d S )Nz!
module foo
foo.bar as 935
    /
)r   )r
   r   r   r   Útest_illegal_c_basename™  s    z(ClinicParserTest.test_illegal_c_basenamec             C   s   |   d¡ d S )Nz 
module foo
foo.bar
    *
    *
)r   )r
   r   r   r   Útest_single_star   s    z!ClinicParserTest.test_single_starc             C   s   |   d¡ d S )Nz
module foo
foo.bar
    *
)r   )r
   r   r   r   ÚKtest_parameters_required_after_star_without_initial_parameters_or_docstring¨  s    z\ClinicParserTest.test_parameters_required_after_star_without_initial_parameters_or_docstringc             C   s   |   d¡ d S )Nz*
module foo
foo.bar
    *
Docstring here.
)r   )r
   r   r   r   ÚMtest_parameters_required_after_star_without_initial_parameters_with_docstring¯  s    z^ClinicParserTest.test_parameters_required_after_star_without_initial_parameters_with_docstringc             C   s   |   d¡ d S )Nz(
module foo
foo.bar
    this: int
    *
)r   )r
   r   r   r   ÚMtest_parameters_required_after_star_with_initial_parameters_without_docstring·  s    z^ClinicParserTest.test_parameters_required_after_star_with_initial_parameters_without_docstringc             C   s   |   d¡ d S )Nz3
module foo
foo.bar
    this: int
    *
Docstring.
)r   )r
   r   r   r   ÚItest_parameters_required_after_star_with_initial_parameters_and_docstring¿  s    zZClinicParserTest.test_parameters_required_after_star_with_initial_parameters_and_docstringc             C   s   |   d¡ d S )Nz 
module foo
foo.bar
    /
    /
)r   )r
   r   r   r   Útest_single_slashÈ  s    z"ClinicParserTest.test_single_slashc             C   s   |   d¡ d S )Nz<
module foo
foo.bar
   x: int
   y: int
   *
   z: int
   /
)r   )r
   r   r   r   Útest_mix_star_and_slashÐ  s    z(ClinicParserTest.test_mix_star_and_slashc             C   s   |   d¡ d S )Nz%
module foo
foo.bar
    /
    x: int
)r   )r
   r   r   r   Ú1test_parameters_not_permitted_after_slash_for_nowÛ  s    zBClinicParserTest.test_parameters_not_permitted_after_slash_for_nowc             C   s    |   d¡}|  d ¡ |j¡ d S )Nzk
  module foo
  foo.bar
    x: int
      Nested docstring here, goeth.
    *
    y: str
  Not at column 0!
zV
bar($module, /, x, *, y)
--

Not at column 0!

  x
    Nested docstring here, goeth.
)r‚   r9   r–   r—   )r
   r~   r   r   r   Útest_function_not_at_column_0ã  s    z.ClinicParserTest.test_function_not_at_column_0c                sJ   t ƒ }t|ƒ‰ dˆ _‡ fdd„ˆ jd< t d¡}ˆ  |¡ |  ˆ j¡ d S )NFc                  s   t ˆ ddƒS )NÚflagT)Úsetattrr   )r}   r   r   Ú<lambda>û  ó    z1ClinicParserTest.test_directive.<locals>.<lambda>Zsetflag)r   r   r¿   Z
directivesr   r{   r6   Z
assertTrue)r
   r:   r   r   )r}   r   Útest_directive÷  s    

zClinicParserTest.test_directivec             C   s.   |   d¡}|j\}}|  |jd jtj¡ d S )Nz module os
os.access
   path: "s"r   )r6   r|   r…   r„   r†   r   r‘   )r
   r   r0   r~   r   r   r   Útest_legacy_converters   s    

z'ClinicParserTest.test_legacy_convertersc             C   s&   t ƒ }t|ƒ}t |¡}| |¡ |S )N)r   r   r   r{   r6   )r
   Útextr:   r}   r   r   r   r   r6     s
    

zClinicParserTest.parser5   r”   c             C   sP   |   |¡}|j}|  t|ƒ|¡ t|d tjƒs4t‚t|| tjƒsHt‚|| S )Nr   )	r6   r|   r9   rƒ   Ú
isinstancer   ZModuler_   ZFunction)r
   rÅ   r±   r²   r   rŽ   r   r   r   r‚     s    
zClinicParserTest.parse_functionc          
   C   sr   |   ttjƒd¡ |   ttjƒd¡ t ¡ ,}|  t¡ tj	dddd W d Q R X W d Q R X |   | 
¡ d¡ d S )Nz<Unspecified>z<Null>zThe igloos are melting!z	clown.txtéE   )r   Zline_numberz>Error in file "clown.txt" on line 69:
The igloos are melting!
)r9   r-   r   ZunspecifiedZNULLr   r§   r^   r¨   Zfailro   )r
   r©   r   r   r   Útest_scaffolding  s    
$z!ClinicParserTest.test_scaffoldingN)r5   r”   ).r   r   r   r   r€   rˆ   rŠ   r‹   r   r’   r“   r•   r˜   r™   rš   r›   rœ   r¡   r¢   r¤   r¦   r   rª   r«   r¬   r­   r®   r¯   r°   r³   r´   rµ   r¶   r·   r¸   r¹   rº   r»   r¼   r½   r¾   rÃ   rÄ   r6   r‚   rÈ   r   r   r   r   rx   %  sV   	
	(L		
rx   c               @   s   e Zd ZdZdd„ ZdS )ÚClinicExternalTestNc          
   C   s²   t  d¡}t|ddd}| ¡ }W d Q R X t  ¡ t}tj |d¡}t|ddd}| |¡ W d Q R X t	j
|dd t|ddd}| ¡ }W d Q R X |  ||¡ W d Q R X d S )	Nzclinic.testrA   zutf-8)Úencodingzclinic.test.cÚwT)Úforce)r   ZfindfileÚopenÚreadZtemp_dirrz   r   ÚjoinÚwriter   Z
parse_filer9   )r
   Úsourcern   ZoriginalZtestdirZtestfileÚresultr   r   r   Útest_external#  s    

z ClinicExternalTest.test_external)r   r   r   ZmaxDiffrÓ   r   r   r   r   rÉ      s   rÉ   Ú__main__)$Ztestr   Zunittestr   r$   r   Zos.pathrz   r+   r   rÏ   ÚdirnameÚ__file__Zclinic_pathÚnormpathÚexistsZSkipTestÚappendr   r   r   r   r   r3   r:   r   r4   r=   ra   rj   rk   rl   rx   rÉ   r   Úmainr   r   r   r   Ú<module>   sB   
/04=   ~
