o
    JAfK                     @   sd   d Z 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r0ej
d
d dS dS )zTest pyparse, coverage 96%.    )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   5/usr/lib/python3.10/idlelib/idle_test/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    n1 sw   Y  d}|D ](}| j|d || ||j| ||jd W d    n1 sIw   Y  q&d S )Nr   ) 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                    s  | j }| j}|j}|j}dd }|d |||d |d |||d |d d\} | t |  W d    n1 sAw   Y  | t |d W d    n1 sZw   Y  | |d	d
 d |||  || fdd
d  || fdd
d| || fdd
dd  |d |||  || fdd
d  || fdd
d| || fdd
d  d S )Nc                 S      dS )NFr   indexr   r   r	   char_in_string_false=       zDPyParseTest.test_find_good_parse_start.<locals>.char_in_string_falsezdef spam():
r   zclass spam(  
k"""This is a module docstring"""
class C:
    def __init__(self, a,
                 b=True):
        pass
)!   *   Fc                 S   r2   )NTr   r3   r   r   r	   <lambda>[   r6   z8PyParseTest.test_find_good_parse_start.<locals>.<lambda>)Zis_char_in_stringc                       |  kS r    r   r3   posr   r	   r:   c       c                       |  kS r    r   r3   r<   r   r	   r:   f   r>   c                       |  k S r    r   r3   r<   r   r	   r:   i   r>   zZ"""This is a module docstring"""
class C:
    def __init__(self, a, b=True):
        pass
c                    r;   r    r   r3   r<   r   r	   r:   s   r>   c                    r?   r    r   r3   r<   r   r	   r:   t   r>   c                    r@   r    r   r3   r<   r   r	   r:   w   r>   )r   r   r'   Zfind_good_parse_startr(   	TypeErrorassertIsNone)r   r-   r.   r/   startr5   Zpos0r   r<   r	   test_find_good_parse_start8   s6   
z&PyParseTest.test_find_good_parse_startc                 C   s   d}d}| j }|| | t |d W d    n1 s!w   Y  |d | |j| || | |j||d   d S )Nr7   r9      r   )r   r'   r(   r)   Zset_lor   r+   )r   r+   r=   r.   r   r   r	   test_set_loy   s   


zPyParseTest.test_set_loc                 C   s  | j }| j}|j}|j}td\}}}}}	t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g||
dg d||
dddg||
dddg|	|
dddg||
dddg||
dg d||
dg d|	|
dg d|	|
dddg||
dddg|	|
dddg|f}|D ]5}| j|jd$ ||j |  ||jd ||j	|j	 ||j
|j
 W d    n1 sw   Y  q| |  d S )NrE   TestInfo)r&   	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.

)r   rJ   rK   z# Comment\
z"("""Complete string in bracket"""
z("""Open string in bracket
a = (1 + 2) - 5 *\
0
   def function1(self, a,
                 b):
)r   rJ      
   def function1(self, a,\

   def function1(self, a,
())
)(
{)(]
r%   )r   r   r'   Z_study1ranger   r*   r&   r,   rH   rI   rB   )r   r-   r.   r/   studyNONE	BACKSLASHFIRSTNEXTBRACKETrG   r0   testr   r   r	   test_study1   sP   
zPyParseTest.test_study1c              	   C   s   | j }| j}|j}|j}td\}}}}}	tdddg}
|
d||
d||
d||
d||
d	|	f}|D ]%}| j|jd
 ||j || |j W d    n1 sTw   Y  q4d S )NrE   rG   r&   rI   r#   z%"""This is a continuation docstring.
z-'''This is a multiline-continued docstring.

rL   rO   r%   )	r   r   r'   Zget_continuation_typerT   r   r*   r&   rI   )r   r-   r.   r/   ZgettyperV   rW   rX   rY   rZ   rG   r0   r[   r   r   r	   test_get_continuation_type   s&   
z&PyParseTest.test_get_continuation_typec                 C   s  | j }| j}|j}|j}t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d)d*dd+|d,dd-d.d d/|d0dd%d1d d|d2dddd df}|D ]J}| j|jd39 ||j |  ||jd4 ||j|j	 ||j
|j ||j|j ||j|j ||j|j W d    n1 sw   Y  q| |  d S )5NrG   )r&   rC   endlastchopenbracket
bracketingr#   r   r   r   z0'''This is a multiline continuation docstring.

0   ')rc   r   rJ   )rd   r   z # Comment\
   )rc   rJ   rJ   )rg   r   z #Comment\
rL      *)rc   r   rJ   )   r   rM   rJ   :)rJ   r      rJ   ).   r   rO      ,rp   )rn   ro   rP      z3
   def function1(self, a,  # End of line comment.
3   )rn   ro   )rr   rK   )ru   rJ   z7  a = ["first item",
  # Comment line
    "next item",
7      )rc   )rw   rJ   )   rK   )ri   rJ   )   rK   )&   rJ   )r9   rK   )5   rJ   rQ   r   ))rc   rf   rK   r   rN   r   rR   rN   ()rc   rn   rh   rS   rE   ]rc   rf   r}   rK   rJ   r   r   z:\a
z\a
r%   rK   )r   r   r'   Z_study2r   r*   r&   r,   Z
stmt_startrC   Zstmt_endr^   r_   Zlastopenbracketposr`   Zstmt_bracketingra   rB   )r   r-   r.   r/   rU   rG   r0   r[   r   r   r	   test_study2   sp   










'
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    n1 sLw   Y  |D ]%}| j|jd ||j || |j	 W d    n1 ssw   Y  qSd S )NrG   r&   linesz[x for x in a]
rJ   z[x
for x in a
rK   z[x\
for x in a\
z[x
for x in a
]
rN   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\
"""
rE   r#   r%   )
r   r   r'   Zget_num_lines_in_stmtr   r(   
IndexErrorr*   r&   r   )r   r-   r.   r/   getlinesrG   r0   r[   r   r   r	   test_get_num_lines_in_stmt  s2   
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    n1 sXw   Y  |D ]}||j || |j q_d S )NrG   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",
rK   z1["first item",
  # Comment line
    "next item",
rJ   z(
r   z(a
zdef function1(self, a, b):
)	r   r   r'   Zcompute_bracket_indentr   r(   r)   r&   r   )r   r-   r.   r/   indentrG   r0   r[   r   r   r	   test_compute_bracket_indent1  s2   
z'PyParseTest.test_compute_bracket_indentc           
      C   s\  | j }| j}|j}|j}d}|D ]4}| j|d$ || | t |  W d    n1 s0w   Y  W d    n1 s?w   Y  q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}|D ]%}	| j|	jd ||	j || |	j	 W d    n1 sw   Y  qd S )N)zdef function1(self, a, b\
z    """ (\
za = #\
r%   rG   )r&   r   rL   r   za = 1 + 2 - 5 *\
z    a = 1 + 2 - 5 *\
r   z  a = "spam"\
rw   z  a = \
"a"\
z  a = #\
"a"\
rE   za == \
rK   za != \
z\
z    \
z	\
za\
rN   z{}\
z(1 + 2) - 5 *\
)
r   r   r'   Zcompute_backslash_indentr*   r(   r)   r   r&   r   )
r   r-   r.   r/   r   errorsr&   rG   r0   r[   r   r   r	   test_compute_backslash_indentQ  sJ   

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}|D ]%}| j|jd ||j || |j W d    n1 sSw   Y  q3d S )NrG   r&   r   r#   	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&   r   )r   r-   r.   r/   Z
baseindentrG   r0   r[   r   r   r	   test_get_base_indent_stringx  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}|D ]$}| j|jd ||j ||  W d    n1 siw   Y  qJd S )NrG   r&   assert_r   rM   z:
za:
z):
z(:
z":
rP   !def function1(self, a):
    pass
z# A comment:
z"""A docstring:
r%   )	
assertTrueassertFalser   r'   Zis_block_openerr   r*   r&   r   )	r   yesnor.   r/   openerrG   r0   r[   r   r   r	   test_is_block_opener  s4   
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}|D ]$}| j|jd ||j ||  W d    n1 smw   Y  qNd S )NrG   r&   r   zreturn
z	break
z  continue
z     raise
z	pass    
zpass	
z	return #
zraised
z
returning
z	# return
z	"""break
z
"continue
r   r%   )	r   r   r   r'   Zis_block_closerr   r*   r&   r   )	r   r   r   r.   r/   ZcloserrG   r0   r[   r   r   r	   test_is_block_closer  s6   
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
}|D ]%}| j|jd ||j || |j W d    n1 s_w   Y  q?d S )NrG   r&   bracketr#   rb   r$   z()()
r   z(
)()
)rc   rf   r~   rN   rJ   rE   r   z()
()
)r~   r   r   z()(
)
)rc   rf   r}   r   r   z(())
)rc   rf   rJ   rK   r   r   z(
())
)rc   rf   )rK   rK   rk   r   rS   z(((())
)rc   rf   r   )rK   rN   )rN   r   )rE   rN   )rw   rK   r%   )r   r   r'   Zget_last_stmt_bracketingr   r*   r&   r   )r   r-   r.   r/   ra   rG   r0   r[   r   r   r	   test_get_last_stmt_bracketing  s2   
z)PyParseTest.test_get_last_stmt_bracketingN)r   r   r   classmethodr   r!   r"   r1   rD   rF   r\   r]   r   r   r   r   r   r   r   r   r   r   r   r	   r      s&    

A2= 'r   __main__rK   )	verbosity)__doc__Zidlelibr   Zunittestcollectionsr   ZTestCaser   r   r   mainr   r   r   r	   <module>   s       M