
    ;eK                         	 d dl mZ d dlZd dlmZ  G d dej                  Z G d dej                  Zedk    r ej	        d	
           dS dS )    )pyparseN)
namedtuplec                       e Zd Zd Zd ZdS )ParseMapTestc                 p   d dD             }t          j        |          }|                     |t          d                   t          d                     |                     |t          d                   t          d                     |                     |d         t          d                     d S )Nc                 H    i | ]}t          |          t          |           S  )ord).0cs     5/usr/lib/python3.11/idlelib/idle_test/test_pyparse.py
<dictcomp>z.ParseMapTest.test_parsemap.<locals>.<dictcomp>   s&    777SVVSVV777    z 	
	axi  )r   ParseMapassertEqualr
   )self	keepwhitemappings      r   test_parsemapzParseMapTest.test_parsemap
   s    77Y777	"9--T+SYY777S*CHH555C11111r   c                     t          j        dd          }|                     d                    t           j                  d           d S )N   z	 a([{b}])b"c'd
zxxx(((x)))x"x'x
)r   Parserr   	translatetrans)r   parsers     r   
test_transzParseMapTest.test_trans   sK    1%%.88GG-	/ 	/ 	/ 	/ 	/r   N)__name__
__module____qualname__r   r   r	   r   r   r   r      s2        2 2 2/ / / / /r   r   c                       e Zd Zed             Zed             Zd Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd Zd Zd ZdS )PyParseTestc                 <    t          j        dd          | _        d S )Nr   )indentwidthtabwidth)r   r   r   clss    r   
setUpClasszPyParseTest.setUpClass   s    ^A>>>


r   c                 
    | ` d S N)r   r(   s    r   tearDownClasszPyParseTest.tearDownClass   s    JJJr   c                     |                      | j        j        d           |                      | j        j        d           d S )Nr   )r   r   r&   r'   )r   s    r   	test_initzPyParseTest.test_init"   s>    0!444-q11111r   c                 n   | j         }| j        }|j        }|                     t                    5   |d           d d d            n# 1 swxY w Y   d}|D ]]}|                     |          5   ||            ||j        |            ||j        d           d d d            n# 1 swxY w Y   ^d S )Nr   ) a
stringr   )r   r   set_codeassertRaisesAssertionErrorsubTestcodestudy_level)r   eqpsetcodetestsr4   s         r   test_set_codezPyParseTest.test_set_code&   sQ   K* ~.. 	 	GCLLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	  	% 	%FV,, % %166"""1=!$$$% % % % % % % % % % % % % % %	% 	%s#   AAA/.B))B-	0B-	c                    | j         }| j        }|j        }|j        }d } |d            | ||          d            |d            | ||          d            |d           d\  }|                     t
                    5   |             d d d            n# 1 swxY w Y   |                     t
                    5   |d           d d d            n# 1 swxY w Y   |                      |d 	                      | ||                      | |fd
	                      | |fd	          |            | |fd	          d             |d            | ||                      | |fd	                      | |fd	          |            | |fd	                     d S )Nc                     dS )NFr	   indexs    r   char_in_string_falsezDPyParseTest.test_find_good_parse_start.<locals>.char_in_string_false=   s    r   zdef spam():
r   zclass spam(  
k"""This is a module docstring"""
class C:
    def __init__(self, a,
                 b=True):
        pass
)!   *   Fc                     dS )NTr	   rB   s    r   <lambda>z8PyParseTest.test_find_good_parse_start.<locals>.<lambda>[   s     r   )is_char_in_stringc                     | k    S r,   r	   rC   poss    r   rI   z8PyParseTest.test_find_good_parse_start.<locals>.<lambda>c        r   c                     | k    S r,   r	   rL   s    r   rI   z8PyParseTest.test_find_good_parse_start.<locals>.<lambda>f       # r   c                     | k     S r,   r	   rL   s    r   rI   z8PyParseTest.test_find_good_parse_start.<locals>.<lambda>i   rN   r   zZ"""This is a module docstring"""
class C:
    def __init__(self, a, b=True):
        pass
c                     | k    S r,   r	   rL   s    r   rI   z8PyParseTest.test_find_good_parse_start.<locals>.<lambda>s   rN   r   c                     | k    S r,   r	   rL   s    r   rI   z8PyParseTest.test_find_good_parse_start.<locals>.<lambda>t   rP   r   c                     | k     S r,   r	   rL   s    r   rI   z8PyParseTest.test_find_good_parse_start.<locals>.<lambda>w   rN   r   )r   r   r5   find_good_parse_startr6   	TypeErrorassertIsNone)r   r;   r<   r=   startrD   pos0rM   s          @r   test_find_good_parse_startz&PyParseTest.test_find_good_parse_start8   s   K*'555 	   
55%&&*** 	&'''
55%&&*** 	 ! 	 	 	 	c y)) 	 	EGGG	 	 	 	 	 	 	 	 	 	 	 	 	 	 	y)) 	 	E%LLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
 	%%2D2DEEEFFF 	55%&&,,, 	55#<#<#<#<===sCCC 	55#=#=#=#=>>>EEE 	55#<#<#<#<===tDDD 	 ! 	 	 	
 	55%&&,,,
55#<#<#<#<===sCCC
55#=#=#=#=>>>EEE 	55#<#<#<#<===sCCCCCs$   B""B&)B&CC#&C#c                    d}d}| j         }|                    |           |                     t                    5  |                    d           d d d            n# 1 swxY w Y   |                    d           |                     |j        |           |                    |           |                     |j        ||d                     d S )NrE   rG      r   )r   r5   r6   r7   set_lor   r9   )r   r9   rM   r<   s       r   test_set_lozPyParseTest.test_set_loy   s   ! 	 K	

4 ~.. 	 	HHQKKK	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
&&& 	
cdd,,,,,s   AA!$A!c                 2   | 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 ]}|                     |j                  5   ||j                    |              ||j        d            ||j	        |j	                    ||j
        |j
                   d d d            n# 1 swxY w Y   |                      |                       d S )Nr\   TestInfo)r4   	goodlinescontinuationr1   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   rc   rd   z# Comment\
z"("""Complete string in bracket"""
z("""Open string in bracket
a = (1 + 2) - 5 *\
0
   def function1(self, a,
                 b):
)r   rc      
   def function1(self, a,\

   def function1(self, a,
())
)(
{)(]
r3   )r   r   r5   _study1ranger   r8   r4   r:   ra   rb   rW   )r   r;   r<   r=   studyNONE	BACKSLASHFIRSTNEXTBRACKETr`   r>   tests                r   test_study1zPyParseTest.test_study1   s'   K*	27((/y%wj +; +; +; < < HR!d##H<q!fdKKH<q!fdKKH:QFEJJH:QFEJJH:QFEJJH2QFEBBH<q!fdKKH51vtDDH7!QFFH4iiiFFH_q!fd33H:QFGLLH3aVUCCH,q!fi@@HJYY& &H6			7KKH4iiiIIHWq!fd++HVaVW--HX1vt,,7<  	6 	6DT[11 6 6$$$1=!$$$1;///1>4#45556 6 6 6 6 6 6 6 6 6 6 6 6 6 6 	%%''"""""s   
AG..G2	5G2	c                    | j         }| j        }|j        }|j        }t	          d          \  }}}}}	t          dddg          }
 |
d|           |
d|           |
d|           |
d|           |
d	|	          f}|D ]^}|                     |j        
          5   ||j                    | |            |j                   d d d            n# 1 swxY w Y   _d S )Nr\   r`   r4   rb   r1   z%"""This is a continuation docstring.
z-'''This is a multiline-continued docstring.

re   rh   r3   )	r   r   r5   get_continuation_typern   r   r8   r4   rb   )r   r;   r<   r=   gettyperp   rq   rr   rs   rt   r`   r>   ru   s                r   test_get_continuation_typez&PyParseTest.test_get_continuation_type   sT   K*)27((/y%wj8^*DEEHRH=uEEHFMMH,i88H6@@  	1 	1DT[11 1 1$$$7799d/0001 1 1 1 1 1 1 1 1 1 1 1 1 1 1	1 	1s   *CC	C	c                    | 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        3          5   ||j                    |              ||j        d4            ||j        |j	                    ||j
        |j                    ||j        |j                    ||j        |j                    ||j        |j                   d d d            n# 1 swxY w Y   |                      |                       d S )5Nr`   )r4   rX   endlastchopenbracket
bracketingr1   r   r   r   z0'''This is a multiline continuation docstring.

0   ')r   r   rc   )r   r   z # Comment\
   )r   rc   rc   )r   r   z #Comment\
re      *)r   r   rc   )   r   rf   rc   :)rc   r      rc   ).   r   rh      ,r   )r   r   ri      z3
   def function1(self, a,  # End of line comment.
3   )r   r   )r   rd   )r   rc   z7  a = ["first item",
  # Comment line
    "next item",
7      )r   )r   rc   )   rd   )r   rc   )   rd   )&   rc   )rG   rd   )5   rc   rj   r   ))r   r   rd   r   rg   r   rk   rg   ()r   r   r   rl   r\   ]r   r   r   rd   rc   r   r   z:\a
z\a
r3   rd   )r   r   r5   _study2r   r8   r4   r:   
stmt_startrX   stmt_endr|   r}   lastopenbracketposr~   stmt_bracketingr   rW   )r   r;   r<   r=   ro   r`   r>   ru   s           r   test_study2zPyParseTest.test_study2   sX   K*	j +H +H +H I I HRAr433HIC'@B BH%B&?A A H_2tY0 0 H,C'@B B HJC'AC C H6C%68 8 H4C%68 8 HLC%HJ J HQC %IJ J HW3&FH HHVQ3+CDDHX3&NP P HXq!UD)<<HT1aT955I%N  		7 		7DT[11 7 7$$$1=!$$$1<,,,1:tx(((18T[)))1')9:::1$do6667 7 7 7 7 7 7 7 7 7 7 7 7 7 7 	%%''"""""s   1BGG	G	c                 f   | 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                    5   |             d d d            n# 1 swxY w Y   |D ]^}|                     |j                  5   ||j                    | |            |j	                   d d d            n# 1 swxY w Y   _d S )Nr`   r4   linesz[x for x in a]
rc   z[x
for x in a
rd   z[x\
for x in a\
z[x
for x in a
]
rg   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\
"""
r\   r1   r3   )
r   r   r5   get_num_lines_in_stmtr   r6   
IndexErrorr8   r4   r   )r   r;   r<   r=   getlinesr`   r>   ru   s           r   test_get_num_lines_in_stmtz&PyParseTest.test_get_num_lines_in_stmt  s   K**j8W*=>>H'++H'++H+Q//H*A..HA1EEHA1EEHFJJHMqQQ	 	z** 	 	HJJJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	  	+ 	+DT[11 + +$$$88::tz***+ + + + + + + + + + + + + + +	+ 	+s$   .CC	C	/*D%%D)	,D)	c                 B   | 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                    5   |             d d d            n# 1 swxY w Y   |D ]+} ||j                    | |            |j                   ,d S )Nr`   r4   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",
rd   z1["first item",
  # Comment line
    "next item",
rc   z(
r   z(a
zdef function1(self, a, b):
)	r   r   r5   compute_bracket_indentr   r6   r7   r4   r   )r   r;   r<   r=   indentr`   r>   ru   s           r   test_compute_bracket_indentz'PyParseTest.test_compute_bracket_indent1  s   K*)j8X*>??H/44H5r::H3R88H-q11H+Q//H/33HMqQQHOQRSSHKQOOHUAHVQ" 	.///~.. 	 	FHHH	 	 	 	 	 	 	 	 	 	 	 	 	 	 	  	& 	&DGDK   Bvvxx%%%%	& 	&s   C&&C*-C*c                 P   | j         }| j        }|j        }|j        }d}|D ]w}|                     |          5   ||           |                     t                    5   |             d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   xt          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                  5   ||	j                    | |            |	j	                   d d d            n# 1 swxY w Y   _d S )N)zdef function1(self, a, b\
z    """ (\
za = #\
r3   r`   )r4   r   re   r   za = 1 + 2 - 5 *\
z    a = 1 + 2 - 5 *\
r   z  a = "spam"\
r   z  a = \
"a"\
z  a = #\
"a"\
r\   za == \
rd   za != \
z\
z    \
z	\
za\
rg   z{}\
z(1 + 2) - 5 *\
)
r   r   r5   compute_backslash_indentr8   r6   r7   r   r4   r   )
r   r;   r<   r=   r   errorsr4   r`   r>   ru   s
             r   test_compute_backslash_indentz)PyParseTest.test_compute_backslash_indentQ  s   K*+  	 	FV,,  &&~66  FHHH                            
 j*>??1155/333Q77,a00-q11.22+q))+q))&!$$*a(((A&&'1%%(A&&-q11   	* 	*DT[11 * *$$$6688T[)))* * * * * * * * * * * * * * *	* 	*sG   &BA6*B6A::B=A:>BB	B	$*FF	!F	c           
         | 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                  5   ||j                    | |            |j                   d d d            n# 1 swxY w Y   _d S )Nr`   r4   r   r1   	def a():
z
	def a():
r   z    def a():
z    z    def a(
z	
    def a(
z	
    # Comment.
r3   )r   r   r5   get_base_indent_stringr   r8   r4   r   )r   r;   r<   r=   
baseindentr`   r>   ru   s           r   test_get_base_indent_stringz'PyParseTest.test_get_base_indent_stringx  sZ   K*-
j8X*>??"b!!,++.$//*F33.&11,f550&99  	. 	.DT[11 . .$$$::<<---. . . . . . . . . . . . . . .	. 	.s   *CC	C	c                 F   | j         }| j        }| j        }|j        }|j        }t          dddg          } |d|           |d|           |d|           |d|           |d|           |d	|           |d
|           |d|           |d|           |d|           |d|           |d|          f}|D ]b}|                     |j                  5   ||j                   |                     |                       d d d            n# 1 swxY w Y   cd S )Nr`   r4   assert_r   rf   z:
za:
z):
z(:
z":
ri   !def function1(self, a):
    pass
z# A comment:
z"""A docstring:
r3   )	
assertTrueassertFalser   r5   is_block_openerr   r8   r4   r   )	r   yesnor<   r=   openerr`   r>   ru   s	            r   test_is_block_openerz PyParseTest.test_is_block_opener  s   oK*"j8Y*?@@H\3''HJCPPHUC  HVS!!HVS!!HVS!!HVR  H4b99H:B??H%r**H("--H("--  	' 	'DT[11 ' '$$$VVXX&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' '	' 	's   .DD	D	c                 \   | 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 ]b}|                     |j                  5   ||j                   |                     |                       d d d            n# 1 swxY w Y   cd S )Nr`   r4   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   r3   )	r   r   r   r5   is_block_closerr   r8   r4   r   )	r   r   r   r<   r=   closerr`   r>   ru   s	            r   test_is_block_closerz PyParseTest.test_is_block_closer  s   oK*"j8Y*?@@HZ%%H[#&&H^S))H^S))H\3''HZ%%H\3''HZ$$H]B''H\2&&H\2&&H]B''H:C@@   	' 	'DT[11 ' '$$$VVXX&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' '	' 	's   &.D  D$	'D$	c                    | 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                  5   ||j                    | |            |j                   d d d            n# 1 swxY w Y   _d S )Nr`   r4   bracketr1   r   r2   z()()
r   z(
)()
)r   r   r   rg   rc   r\   r   z()
()
)r   r   r   z()(
)
)r   r   r   r   r   z(())
)r   r   rc   rd   r   r   z(
())
)r   r   )rd   rd   r   r   rl   z(((())
)r   r   r   )rd   rg   )rg   r   )r\   rg   )r   rd   r3   )r   r   r5   get_last_stmt_bracketingr   r8   r4   r   )r   r;   r<   r=   r   r`   r>   ru   s           r   test_get_last_stmt_bracketingz)PyParseTest.test_get_last_stmt_bracketing  s   K*/
j8Y*?@@HR##HUI&&HXGHHHZ!IJJHZ!9::HZ!IJJHXGHHHZ!IJJHXGHHHZMO O  	/ 	/DT[11 / /$$$::<<.../ / / / / / / / / / / / / / /	/ 	/s   >*C44C8	;C8	N)r    r!   r"   classmethodr*   r-   r/   r?   rZ   r^   rv   rz   r   r   r   r   r   r   r   r   r	   r   r   r$   r$      s"       ? ? [?   [2 2 2% % %$?D ?D ?DB- - -00# 0# 0#d1 1 1*;# ;# ;#z+ + +8& & &@%* %* %*N. . .*' ' '8' ' ':/ / / / /r   r$   __main__rd   )	verbosity)
idlelibr   unittestcollectionsr   TestCaser   r$   r    mainr	   r   r   <module>r      s            " " " " " "/ / / / /8$ / / / G/ G/ G/ G/ G/(# G/ G/ G/T zHMA r   