a
    $Rîh*1  ã                   @   sÖ   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	m
Z
mZ d dlmZ ej ej e¡d¡Zej ed¡Ze j e¡ ze	 d¡ZW e j ¡  ne j ¡  0 e	 d¡ZG dd	„ d	ejƒZdS )
é    N)ÚrefactorÚpygramÚ
fixer_base)ÚtokenÚdataÚfixersÚmyfixesúlib2to3.fixesc                   @   s  e Zd Zdd„ Zdd„ Zdd„ Zdedf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edddfdd „Zd!d"„ Zd#d$„ Zef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S );ÚTestRefactoringToolc                 C   s   t j t¡ d S ©N)ÚsysÚpathÚappendÚ	FIXER_DIR©Úself© r   úC/opt/python-3.9.24/usr/lib/python3.9/lib2to3/tests/test_refactor.pyÚsetUp   s    zTestRefactoringTool.setUpc                 C   s   t j ¡  d S r   )r   r   Úpopr   r   r   r   ÚtearDown"   s    zTestRefactoringTool.tearDownc                 C   s2   t ||ƒD ]"\}}t||ƒs
|  d| |¡ q
d S )Nz%s are not instances of %s)ÚzipÚ
isinstanceÚfail)r   Z	instancesÚclassesÚinstÚclsr   r   r   Úcheck_instances%   s    
z#TestRefactoringTool.check_instancesNc                 C   s   t  |||¡S r   )r   ÚRefactoringTool)r   Úoptionsr   Úexplicitr   r   r   Úrt*   s    zTestRefactoringTool.rtc                 C   s4   |   ddi¡}|  d|jj¡ |  d|jjj¡ d S )NÚprint_functionTÚprint©r!   ÚassertNotInZgrammarÚkeywordsZdriver©r   r!   r   r   r   Útest_print_function_option-   s    z.TestRefactoringTool.test_print_function_optionc                 C   s4   |   ddi¡}|  d|jj¡ |  d|jjj¡ d S )NZexec_functionTÚexecr$   r'   r   r   r   Útest_exec_function_option2   s    z-TestRefactoringTool.test_exec_function_optionc                 C   s2   |   ¡ }|  |j¡ |   ddi¡}|  |j¡ d S )NÚwrite_unchanged_filesT)r!   ZassertFalser+   Ú
assertTruer'   r   r   r   Ú!test_write_unchanged_files_option7   s    z5TestRefactoringTool.test_write_unchanged_files_optionc                 C   sd   g d¢}t  d¡}t  dd¡}t  d¡}|  |dd„ |D ƒ¡ |  ||¡ |  |dd„ |D ƒ¡ d S )N)r    ÚfirstÚlastZparrotZpreorderr   Fc                 S   s   g | ]}d | ‘qS )Zfix_r   ©Ú.0Únamer   r   r   Ú
<listcomp>B   ó    zBTestRefactoringTool.test_fixer_loading_helpers.<locals>.<listcomp>c                 S   s   g | ]}d | ‘qS )zmyfixes.fix_r   r0   r   r   r   r3   E   r4   )r   Zget_all_fix_namesÚget_fixers_from_packageÚassertEqual)r   ÚcontentsZnon_prefixedZprefixedZ
full_namesr   r   r   Útest_fixer_loading_helpers=   s    

ÿz.TestRefactoringTool.test_fixer_loading_helpersc                 C   s~  t j}t}|ƒ }|  |dƒ|¡ |  |dƒ|dƒ¡ |  |dƒ|dƒ¡ |  |dƒ|dƒ¡ d}|  ||ƒ|d	ƒ¡ d
}|  ||ƒ|dƒ¡ d}|  ||ƒ|dƒ¡ d}|  ||ƒ|d	ƒ¡ d}|  ||ƒ|dƒ¡ d}|  ||ƒ|d	ƒ¡ d}|D ]}|  ||ƒ|¡ qôd}|  ||ƒ|dƒ¡ d}|  ||ƒ|¡ d}|  ||ƒ|dƒ¡ d}|  ||ƒ|dƒ¡ d}|  ||ƒ|¡ d S )NÚ z%from __future__ import print_function)r"   z!from __future__ import generators)Ú
generatorsz*from __future__ import generators, feature)r:   Zfeaturez1from __future__ import generators, print_function)r:   r"   z1from __future__ import print_function, generators)r"   r:   z(from __future__ import (print_function,)z3from __future__ import (generators, print_function)z2from __future__ import (generators, nested_scopes))r:   Znested_scopeszGfrom __future__ import generators
from __future__ import print_function)Úfromzfrom 4zfrom xzfrom x 5z	from x imzfrom x importzfrom x import 4z1'docstring'
from __future__ import print_functionz9'docstring'
'somng'
from __future__ import print_functionz/# comment
from __future__ import print_functionz5# comment
'doc'
from __future__ import print_functionz3class x: pass
from __future__ import print_function)r   Z_detect_future_featuresÚ	frozensetr6   )r   ÚrunÚfsÚemptyÚinpÚinvalidr   r   r   Útest_detect_future_featuresG   sL    
ÿ
ÿ
ÿz/TestRefactoringTool.test_detect_future_featuresc                 C   s¾   G dd„ dt jƒ}G dd„ dt jƒ}G dd„ dt jƒ}|i g ƒ}|i g ƒ}|i g ƒ}t |||g¡}| tjj¡}|  |||g¡ | t	j
¡}	|  |	||g¡ | ¡ D ]}
|  |
|g¡ q¦d S )Nc                   @   s   e Zd ZdS )z;TestRefactoringTool.test_get_headnode_dict.<locals>.NoneFixN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   ÚNoneFixu   s   rF   c                   @   s   e Zd ZdZdS )z@TestRefactoringTool.test_get_headnode_dict.<locals>.FileInputFixzfile_input< any * >N©rC   rD   rE   ZPATTERNr   r   r   r   ÚFileInputFixx   s   rH   c                   @   s   e Zd ZdZdS )z=TestRefactoringTool.test_get_headnode_dict.<locals>.SimpleFixz'name'NrG   r   r   r   r   Ú	SimpleFix{   s   rI   )r   ZBaseFixr   Z_get_headnode_dictr   r   Zpython_symbolsZ
file_inputr6   r   ÚNAMEÚvalues)r   rF   rH   rI   Zno_headZ	with_headÚsimpleÚdZ	top_fixesZ
name_fixesÚfixesr   r   r   Útest_get_headnode_dictt   s    


z*TestRefactoringTool.test_get_headnode_dictc                 C   sh   ddl m} ddlm} ddlm} ddlm} |  ¡ }| 	¡ \}}|  
||g¡ |  
||||g¡ d S )Nr   )ÚFixFirst)ÚFixLast)Ú	FixParrot)ÚFixPreorder)Zmyfixes.fix_firstrP   Zmyfixes.fix_lastrQ   Zmyfixes.fix_parrotrR   Zmyfixes.fix_preorderrS   r!   Z
get_fixersr   )r   rP   rQ   rR   rS   r!   ÚpreZpostr   r   r   Útest_fixer_loading‰   s    z&TestRefactoringTool.test_fixer_loadingc                 C   sD   | j t| jdgd | j tj| jdgd | j tj| jdgd d S )NZnot_here©r   Zno_fixer_clsZ	bad_order)ZassertRaisesÚImportErrorr!   r   Z
FixerErrorr   r   r   r   Útest_naughty_fixers•   s    z'TestRefactoringTool.test_naughty_fixersc                 C   sL   |   ¡ }d}| |d¡}|  t|ƒ|¡ d}| |d¡}|  t|ƒ|¡ d S )Núdef parrot(): pass

ú<test>zdef f(): pass

)r!   Zrefactor_stringÚassertNotEqualÚstrr6   )r   r!   ÚinputÚtreer   r   r   Útest_refactor_stringš   s    z(TestRefactoringTool.test_refactor_stringc                    sh   G ‡ fdd„dt jƒ}g ‰ |tƒ}tj}t d¡t_z| ¡  W |t_n|t_0 g d¢}|  ˆ |¡ d S )Nc                       s   e Zd Z‡ fdd„ZdS )z5TestRefactoringTool.test_refactor_stdin.<locals>.MyRTc                    s   ˆ   ||||g¡ d S r   )Úextend)r   Zold_textZnew_textÚfilenameZequal©Úresultsr   r   Úprint_output¨   s    zBTestRefactoringTool.test_refactor_stdin.<locals>.MyRT.print_outputN)rC   rD   rE   rd   r   rb   r   r   ÚMyRT¦   s   re   rY   )rY   zdef cheese(): pass

z<stdin>F)	r   r   Ú_DEFAULT_FIXERSr   ÚstdinÚioÚStringIOZrefactor_stdinr6   )r   re   r!   ÚsaveÚexpectedr   rb   r   Útest_refactor_stdin¤   s    
z'TestRefactoringTool.test_refactor_stdinTc           	      C   sv   |   |¡}|  |¡}| j||d}|r,||_| |¡ |  ||  |¡¡ |sPd S | |d¡ |  |¡}|  ||¡ |S )N)r   r   T)Úinit_test_fileÚ	read_filer!   Z	log_debugÚrefactor_filer6   r[   )	r   Ú	test_filer   r   Úmock_log_debugÚactually_writeÚold_contentsr!   Únew_contentsr   r   r   Úcheck_file_refactoring¸   s    



z*TestRefactoringTool.check_file_refactoringc                 C   sL   t jdd}|  tj|¡ t ||¡ tj |tj 	|¡¡}t 
|d¡ |S )Nú2to3-test_refactor©Úprefixi¤  )ÚtempfileÚmkdtempZ
addCleanupÚshutilÚrmtreeÚcopyÚosr   ÚjoinÚbasenameÚchmod)r   rp   Ztmpdirr   r   r   rm   Ë   s    z"TestRefactoringTool.init_test_filec                 C   s6   t |dƒ}| ¡ W  d   ƒ S 1 s(0    Y  d S )NÚrb)ÚopenÚread)r   rp   Úfpr   r   r   rn   Ó   s    zTestRefactoringTool.read_filec                 C   s>   |   |¡}|  |¡}| j|d}| |d¡ |  |¡}||fS )NrV   T)rm   rn   r!   ro   )r   rp   r   rs   r!   rt   r   r   r   ro   ×   s    


z!TestRefactoringTool.refactor_filec                 C   s   t j td¡}|  |t¡ d S )Núparrot_example.py)r~   r   r   r   ru   rf   )r   rp   r   r   r   Útest_refactor_fileß   s    z&TestRefactoringTool.test_refactor_filec                    sŠ   t j td¡}g ‰ ‡ fdd„}| j|dddi|dd d	t t jt j |¡ ¡ }ˆ D ]}d
|v rV|  	||¡  q†qV|  
d|ˆ f ¡ d S )Nr†   c                    s   ˆ   | | ¡ d S r   ©r   )ÚmsgÚargs©Zdebug_messagesr   r   Úrecording_log_debugæ   s    zXTestRefactoringTool.test_refactor_file_write_unchanged_file.<locals>.recording_log_debugr   r+   TF)r   r   rq   rr   zNot writing changes to .*%szNot writing changesz%r not matched in %r)r~   r   r   r   ru   ÚreÚescapeÚsepr€   ZassertRegexr   )r   rp   rŒ   Zmessage_regexÚmessager   r‹   r   Ú'test_refactor_file_write_unchanged_fileã   s     ýÿz;TestRefactoringTool.test_refactor_file_write_unchanged_filec                    sN   ‡ fdd„}|g g ƒ g d¢}dg}|||ƒ dt j dd¡g}|||ƒ d S )Nc              	      s¾   ‡fdd„}t jj}|t j_ˆ ¡ }g ‰tjdd‰ zVt tj 	ˆ d¡¡ | D ]}t
tj 	ˆ |¡dƒ ¡  qN| ˆ ¡ W |t j_t ˆ ¡ n|t j_t ˆ ¡ 0 ˆ ˆ‡ fdd„|D ƒ¡ d S )	Nc                    s   ˆ   |¡ d S r   rˆ   )r   ÚfrŠ   )Úgotr   r   Úmock_refactor_fileù   s    zPTestRefactoringTool.test_refactor_dir.<locals>.check.<locals>.mock_refactor_filerv   rw   Úa_dirÚwbc                    s   g | ]}t j ˆ |¡‘qS r   ©r~   r   r   )r1   r   )Údirr   r   r3   	  r4   zHTestRefactoringTool.test_refactor_dir.<locals>.check.<locals>.<listcomp>)r   r   ro   r!   ry   rz   r~   Úmkdirr   r   rƒ   ÚcloseZrefactor_dirr{   r|   r6   )Z	structurerk   r”   Z	save_funcr!   Úfnr   )r˜   r“   r   Úcheckø   s$    ÿÿz4TestRefactoringTool.test_refactor_dir.<locals>.check)Znothingúhi.pyz.dumbz	.after.pyz	notpy.npyZsappyr   r•   zstuff.pyr—   )r   rœ   r^   rk   r   r   r   Útest_refactor_dir÷   s    

ÿz%TestRefactoringTool.test_refactor_dirc                 C   s   t j td¡}|  |¡ d S )Nzdifferent_encoding.py©r~   r   r   ÚTEST_DATA_DIRru   )r   r›   r   r   r   Útest_file_encoding  s    z&TestRefactoringTool.test_file_encodingc                 C   s   t j td¡}|  |¡}d S )Nzfalse_encoding.pyrŸ   ©r   r›   r   r   r   r   Útest_false_file_encoding  s    z,TestRefactoringTool.test_false_file_encodingc                 C   s.   t j td¡}|  |¡}|  | tj¡¡ d S )Nzbom.py)	r~   r   r   r    ru   r,   Ú
startswithÚcodecsÚBOM_UTF8r¢   r   r   r   Útest_bom  s    
zTestRefactoringTool.test_bomc                 C   sH   t j}dt _z.t j td¡}t d¡}|  ||¡ W |t _n|t _0 d S )Nz
úcrlf.pyr	   )r~   Úlinesepr   r   r    r   r5   ru   )r   Zold_sepr›   rN   r   r   r   Útest_crlf_newlines$  s    
z&TestRefactoringTool.test_crlf_newlinesc                 C   sD   t j td¡}|  |¡\}}|  d|¡ |  d|¡ |  d|¡ d S )Nr¨   s   
s   
)r~   r   r   r    ro   ZassertInr%   )r   r›   ÚoldÚnewr   r   r   Útest_crlf_unchanged.  s
    z'TestRefactoringTool.test_crlf_unchangedc                 C   sD   |   ¡ }d}| |d¡}|  ||¡ d}| |d¡}|  ||¡ d S )Nz
>>> example()
42
rZ   z&
>>> def parrot():
...      return 43
)r!   Zrefactor_docstringr6   r[   )r   r!   ÚdocÚoutr   r   r   Útest_refactor_docstring5  s    z+TestRefactoringTool.test_refactor_docstringc                 C   sb   ddl m} | jdgd}|  t|jƒd¡ | jdgd}|jD ]}t||ƒr@ q^q@|  d¡ d S )Nr   )ÚFixExplicitzmyfixes.fix_explicitrV   )r    zexplicit fixer not loaded)Zmyfixes.fix_explicitr±   r!   r6   ÚlenZ
post_orderr   r   )r   r±   r!   Zfixr   r   r   Útest_explicitF  s    

z!TestRefactoringTool.test_explicit)!rC   rD   rE   r   r   r   rf   r!   r(   r*   r-   r8   rB   rO   rU   rX   r_   rl   Ú_2TO3_FIXERSru   rm   rn   ro   r‡   r‘   rž   r¡   r£   r§   rª   r­   r°   r³   r   r   r   r   r
      s>   
-
þ
 
r
   )r   r~   r¥   rh   r   ry   r{   ZunittestZlib2to3r   r   r   Zlib2to3.pgen2r   r   r   ÚdirnameÚ__file__r    r   r   r5   rf   r   r´   ZTestCaser
   r   r   r   r   Ú<module>   s"   
