B
    v9aH                 @   s\   d dl mZ d dlZd dlmZ G dd dejZG dd dejZedkrXej	d	d
 dS )    )pyparseN)
namedtuplec               @   s   e Zd Zdd Zdd ZdS )ParseMapTestc             C   s`   dd dD }t |}| |td td | |td td | |d td d S )Nc             S   s   i | ]}t |t |qS  )ord).0cr   r   "/usr/lib/python3.7/test_pyparse.py
<dictcomp>   s    z.ParseMapTest.test_parsemap.<locals>.<dictcomp>z 	
	axi  )r   ZParseMapassertEqualr   )selfZ	keepwhitemappingr   r   r	   test_parsemap
   s
    
zParseMapTest.test_parsemapc             C   s$   t dd}| dt jd d S )N   z	 a([{b}])b"c'd
zxxx(((x)))x"x'x
)r   Parserr   	translateZtrans)r   parserr   r   r	   
test_trans   s    zParseMapTest.test_transN)__name__
__module____qualname__r   r   r   r   r   r	   r      s   r   c               @   s   e Zd Zedd Ze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!S )"PyParseTestc             C   s   t jddd| _d S )Nr   )indentwidthtabwidth)r   r   r   )clsr   r   r	   
setUpClass   s    zPyParseTest.setUpClassc             C   s   | ` d S )N)r   )r   r   r   r	   tearDownClass   s    zPyParseTest.tearDownClassc             C   s$   |  | jjd |  | jjd d S )Nr   )r   r   r   r   )r   r   r   r	   	test_init"   s    zPyParseTest.test_initc          
   C   s~   | j }| j}|j}| t |d W d Q R X d}xD|D ]<}| j|d& || ||j| ||jd W d Q R X q:W d S )Nr   ) za
)stringr   )r   r   set_codeassertRaisesAssertionErrorsubTestcodestudy_level)r   eqpsetcodetestsr"   r   r   r	   test_set_code&   s    
zPyParseTest.test_set_codec             C   s   | j }| j}|j}|j}|d | |  | |dd d ||dd dd ||dd dd ||dd dd	 ||d
d dd  |d ||dd dd ||dd dd ||dd dd	 ||dd dd d S )Nzm"""This is a module docstring"""
class C():
    def __init__(self, a,
                 b=True):
        pass
c             S   s   dS )NTr   )indexr   r   r	   <lambda>K       z8PyParseTest.test_find_good_parse_start.<locals>.<lambda>)Zis_char_in_stringc             S   s   dS )NFr   )r.   r   r   r	   r/   O   r0   ,   c             S   s   | dkS )Nr1   r   )r.   r   r   r	   r/   S   r0   c             S   s   | dkS )Nr1   r   )r.   r   r   r	   r/   V   r0   !   c             S   s   | dk S )Nr1   r   )r.   r   r   r	   r/   Y   r0   z\"""This is a module docstring"""
class C():
    def __init__(self, a, b=True):
        pass
c             S   s   dS )NFr   )r.   r   r   r	   r/   b   r0   c             S   s   | dkS )Nr1   r   )r.   r   r   r	   r/   c   r0   c             S   s   | dkS )Nr1   r   )r.   r   r   r	   r/   d   r0   c             S   s   | dk S )Nr1   r   )r.   r   r   r	   r/   g   r0   )r   r   r#   Zfind_good_parse_startassertIsNone)r   r)   r*   r+   startr   r   r	   test_find_good_parse_start8   s     z&PyParseTest.test_find_good_parse_startc          	   C   sp   d}| j }|| | t |d W d Q R X |d | |j| |d | |j|dd   d S )Nzm"""This is a module docstring"""
class C():
    def __init__(self, a,
                 b=True):
        pass
   r   r1   )r   r#   r$   r%   Zset_lor   r'   )r   r'   r*   r   r   r	   test_set_loi   s    


zPyParseTest.test_set_loc             C   s  | j }| j}|j}|j}td\}}}}}	tddddg}
|
ddg||
ddd	g||
d
dd	g||
ddd	g||
ddd	g||
ddd	g||
ddd	g||
dddg||
ddd	g||
ddd	g||
ddd	dg||
ddd	g||
ddd	g|	|
ddd	g||
ddd	g||
ddd	dg||
ddd	dg|	|
ddd	dg|	|
ddd	g||
ddd	g|	|
ddd	g|f}x`|D ]X}| j|jd> ||j |  ||jd	 ||j	|j	 ||j
|j
 W d Q R X qpW | |  d S ) Nr6   TestInfor"   	goodlinescontinuationr!   r   z$"""This is a complete docstring."""
   z$'''This is a complete docstring.'''
z""""This is a continued docstring.
z"'''This is a continued docstring.
z""""Closing quote does not match."
z"""Bracket in docstring [
z#'''Incomplete two line docstring.

   z"This is a complete string."
z"This is an incomplete string.
z'This is more incomplete.

z# Comment\
z"("""Complete string in bracket"""
z("""Open string in bracket
za = (1 + 2) - 5 *\
z0
   def function1(self, a,
                 b):
   z
   def function1(self, a,\
z
   def function1(self, a,
z())
z)(
z{)(]
)r"   )r   r   r#   Z_study1ranger   r&   r"   r(   r9   r:   r3   )r   r)   r*   r+   studyNONE	BACKSLASHFIRSTNEXTBRACKETr8   r,   testr   r   r	   test_study1   sJ    

zPyParseTest.test_study1c          
   C   s   | j }| j}|j}|j}td\}}}}}	tdddg}
|
d||
d||
d||
d||
d	|	f}x>|D ]6}| j|jd
 ||j || |j W d Q R X qjW d S )Nr6   r8   r"   r:   r!   z%"""This is a continuation docstring.
z-'''This is a multiline-continued docstring.

za = (1 + 2) - 5 *\
z
   def function1(self, a,\
)r"   )	r   r   r#   Zget_continuation_typer>   r   r&   r"   r:   )r   r)   r*   r+   Zgettyper@   rA   rB   rC   rD   r8   r,   rE   r   r   r	   test_get_continuation_type   s    

z&PyParseTest.test_get_continuation_typec             C   s  | j }| j}|j}|j}tdddddddg}|dd	d	dd d
|dd	ddd d|dd	ddd d|dd	d	dd d
|dd	ddd d|ddddd d|dddddd |d!dd"ddd |d#dd$ddd%|d&d	d'dd(d)|d*d	d+d,d d-|d.d	d/d0dd1|d2d	d3d4d d5|d6d	d+d7d d
|d8d	d	dd d
f}x|D ]}| j|jd9h ||j |  ||jd: ||j|j	 ||j
|j ||j|j ||j|j ||j|j W d Q R X q(W | |  d S );Nr8   r"   r4   endlastchopenbracket
bracketingr!   r   ))r   r   z1'''This is a multiline continutation docstring.

1   '))r   r   )r   r;   )rL   r   z # Comment\
   ))r   r   )r;   r;   )rN   r   z #Comment\
za = (1 + 2) - 5 *\
   *))r   r   )r   r;   )   r   z0
   def function1(self, a,
                 b):
r;   0   :))r;   r   )   r;   ).   r   z
   def function1(self, a,\
   ,rT   ))r;   r   )rT   r;   z
   def function1(self, a,
   z3
   def function1(self, a,  # End of line comment.
3   ))r;   r   )rT   r;   )rV   r<   )rY   r;   z7  a = ["first item",
  # Comment line
    "next item",
7      ))r   r   )r[   r;   )   r<   )rO   r;   )   r<   )&   r;   )*   r<   )5   r;   z())
r   )))r   r   )r   r;   )r<   r   )r=   r   z)(
r=   ())r   r   )r;   r   )r;   r;   z{)(]
r6   ]))r   r   )r   r;   )r<   r   )r<   r;   )r   r   z:\a
z\a
)r"   r<   )r   r   r#   Z_study2r   r&   r"   r(   Z
stmt_startr4   Zstmt_endrH   rI   ZlastopenbracketposrJ   Zstmt_bracketingrK   r3   )r   r)   r*   r+   r?   r8   r,   rE   r   r   r	   test_study2   sV    


zPyParseTest.test_study2c          
   C   s   | j }| j}|j}|j}tdddg}|dd|dd|dd|d	d
|dd|dd|dd|ddf}|d | t |  W d Q R X x>|D ]6}| j|jd ||j || |j	 W d Q R X qW d S )Nr8   r"   linesz[x for x in a]
r;   z[x
for x in a
r<   z[x\
for x in a\
z[x
for x in a
]
r=   z%
"""Docstring comment L1"""
L2
L3
L4
z%
"""Docstring comment L1
L2"""
L3
L4
z&
"""Docstring comment L1\
L2\
L3\
L4\
r   z+

"""Docstring comment L1\
L2\
L3\
L4\
"""
r6   r!   )r"   )
r   r   r#   Zget_num_lines_in_stmtr   r$   
IndexErrorr&   r"   rf   )r   r)   r*   r+   getlinesr8   r,   rE   r   r   r	   test_get_num_lines_in_stmt  s(    

z&PyParseTest.test_get_num_lines_in_stmtc             C   s   | j }| j}|j}|j}tdddg}|dd|dd|dd|d	d
|dd
|dd
|dd|dd|dd|dd|ddf}|d | t |  W d Q R X x$|D ]}||j || |j qW d S )Nr8   r"   spaceszdef function1(self, a,
   z
    def function1(self, a,
   z
	def function1(self, a,
z
    def function1(
   z
	def function1(
z
    def function1(  
z2[
"first item",
  # Comment line
    "next item",
r   z4[
  "first item",
  # Comment line
    "next item",
r<   z1["first item",
  # Comment line
    "next item",
r;   z(
r   z(a
zdef function1(self, a, b):
)	r   r   r#   Zcompute_bracket_indentr   r$   r%   r"   rj   )r   r)   r*   r+   indentr8   r,   rE   r   r   r	   test_compute_bracket_indent   s,    

z'PyParseTest.test_compute_bracket_indentc       
      C   s(  | j }| j}|j}|j}d}xH|D ]@}| j|d* || | t |  W d Q R X W d Q R X q"W tdd}|dd|dd|dd	|d
d|dd|dd|dd|dd|dd|dd|dd|dd|dd|ddf}x>|D ]6}	| j|	jd ||	j || |	j	 W d Q R X qW d S )N)zdef function1(self, a, b\
z    """ (\
za = #\
)r"   r8   )r"   rj   za = (1 + 2) - 5 *\
r   za = 1 + 2 - 5 *\
z    a = 1 + 2 - 5 *\
rm   z  a = "spam"\
r[   z  a = \
"a"\
z  a = #\
"a"\
r6   za == \
r<   za != \
z\
z    \
z	\
za\
r=   z{}\
z(1 + 2) - 5 *\
)
r   r   r#   Zcompute_backslash_indentr&   r$   r%   r   r"   rj   )
r   r)   r*   r+   rn   errorsr"   r8   r,   rE   r   r   r	   test_compute_backslash_indent@  s:    



z)PyParseTest.test_compute_backslash_indentc          
   C   s   | j }| j}|j}|j}tdddg}|dd|dd|dd|dd	|d
d	|dd	|dd	f}x>|D ]6}| j|jd ||j || |j W d Q R X qhW d S )Nr8   r"   rn   r!   z	def a():
z
	def a():
r   z    def a():
z    z    def a(
z	
    def a(
z	
    # Comment.
)r"   )r   r   r#   Zget_base_indent_stringr   r&   r"   rn   )r   r)   r*   r+   Z
baseindentr8   r,   rE   r   r   r	   test_get_base_indent_stringg  s     

z'PyParseTest.test_get_base_indent_stringc       	      C   s   | j }| j}| j}|j}|j}tdddg}|d||d||d||d||d||d	||d
||d||d||d||d||d|f}x<|D ]4}| j|jd ||j ||  W d Q R X qW d S )Nr8   r"   assert_z	def a():
z0
   def function1(self, a,
                 b):
z:
za:
z):
z(:
z":
z
   def function1(self, a,
z!def function1(self, a):
    pass
z# A comment:
z"""A docstring:
)r"   )	
assertTrueassertFalser   r#   Zis_block_openerr   r&   r"   rs   )	r   yesnor*   r+   openerr8   r,   rE   r   r   r	   test_is_block_opener|  s,    

z PyParseTest.test_is_block_openerc       	      C   s   | j }| j}| j}|j}|j}tdddg}|d||d||d||d||d||d	||d
||d||d||d||d||d||d|f}x<|D ]4}| j|jd ||j ||  W d Q R X qW d S )Nr8   r"   rs   zreturn
z	break
z  continue
z     raise
z	pass    
zpass	
z	return #
zraised
z
returning
z	# return
z	"""break
z
"continue
z!def function1(self, a):
    pass
)r"   )	rt   ru   r   r#   Zis_block_closerr   r&   r"   rs   )	r   rv   rw   r*   r+   Zcloserr8   r,   rE   r   r   r	   test_is_block_closer  s.    

z PyParseTest.test_is_block_closerc             C   s   | j }| j}|j}|j}tdddg}|dd|dd|dd|d	d
|dd|dd|dd|dd|dd|ddf
}x>|D ]6}| j|jd ||j || |j W d Q R X qW d S )Nr8   r"   bracketr!   ))r   r   za
z()()
))r   r   )r   r;   )r<   r   )r<   r;   )r   r   z(
)()
))r   r   )r   r;   )r=   r   )r=   r;   )r6   r   z()
()
))r=   r   )r=   r;   )r6   r   z()(
)
))r   r   )r   r;   )r<   r   )r<   r;   )r6   r   z(())
))r   r   )r   r;   )r;   r<   )r=   r;   )r   r   z(
())
))r   r   )r   r;   )r<   r<   )r   r;   )r6   r   z{)(]
z(((())
))r   r   )r   r;   )r;   r<   )r<   r=   )r=   r   )r6   r=   )r[   r<   )r"   )r   r   r#   Zget_last_stmt_bracketingr   r&   r"   r{   )r   r)   r*   r+   rK   r8   r,   rE   r   r   r	   test_get_last_stmt_bracketing  s(    

z)PyParseTest.test_get_last_stmt_bracketingN)r   r   r   classmethodr   r   r    r-   r5   r7   rF   rG   re   ri   ro   rq   rr   ry   rz   r|   r   r   r   r	   r      s    12= 'r   __main__r<   )	verbosity)
Zidlelibr   Zunittestcollectionsr   ZTestCaser   r   r   mainr   r   r   r	   <module>   s      <