a
    ¾ßúe*1  ã                   @   sÚ   d 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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 )z
Unit tests for refactor.py.
é    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   ú,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    ÚfirstZ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   r/   r   r   r   r2   E   r3   )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)r9   Zfeaturez1from __future__ import generators, print_function)r9   r"   z1from __future__ import print_function, generators)r"   r9   z(from __future__ import (print_function,)z3from __future__ import (generators, print_function)z2from __future__ import (generators, nested_scopes))r9   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Ú	frozensetr5   )r   ÚrunZfsÚemptyZinpZ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   rB   c                   @   s   e Zd ZdZdS )z@TestRefactoringTool.test_get_headnode_dict.<locals>.FileInputFixzfile_input< any * >N©r?   r@   rA   ZPATTERNr   r   r   r   ÚFileInputFixx   s   rD   c                   @   s   e Zd ZdZdS )z=TestRefactoringTool.test_get_headnode_dict.<locals>.SimpleFixz'name'NrC   r   r   r   r   Ú	SimpleFix{   s   rE   )r   ZBaseFixr   Z_get_headnode_dictr   r   Zpython_symbolsZ
file_inputr5   r   ÚNAMEÚvalues)r   rB   rD   rE   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_firstrL   Zmyfixes.fix_lastrM   Zmyfixes.fix_parrotrN   Zmyfixes.fix_preorderrO   r!   Z
get_fixersr   )r   rL   rM   rN   rO   r!   Z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Ústrr5   )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©Zresultsr   r   Úprint_output¨   s    zBTestRefactoringTool.test_refactor_stdin.<locals>.MyRT.print_outputN)r?   r@   rA   r^   r   r]   r   r   ÚMyRT¦   s   r_   rT   )rT   zdef cheese(): pass

z<stdin>F)	r   r   Ú_DEFAULT_FIXERSr   ÚstdinÚioÚStringIOZrefactor_stdinr5   )r   r_   r!   ZsaveÚexpectedr   r]   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_filer5   rV   )	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   ri   Ztmpdirr   r   r   rf   Ë   s    z"TestRefactoringTool.init_test_filec                 C   s6   t |dƒ}| ¡ W  d   ƒ S 1 s(0    Y  d S )NÚrb)ÚopenÚread)r   ri   Úfpr   r   r   rg   Ó   s    zTestRefactoringTool.read_filec                 C   s>   |   |¡}|  |¡}| j|d}| |d¡ |  |¡}||fS )NrQ   T)rf   rg   r!   rh   )r   ri   r   rl   r!   rm   r   r   r   rh   ×   s    


z!TestRefactoringTool.refactor_filec                 C   s   t j td¡}|  |t¡ d S )Núparrot_example.py)rw   r   rx   r   rn   r`   )r   ri   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   rj   rk   zNot writing changes to .*%szNot writing changesz%r not matched in %r)rw   r   rx   r   rn   ÚreÚescapeÚsepry   ZassertRegexr   )r   ri   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_filero   rp   Úa_dirÚwbc                    s   g | ]}t j ˆ |¡‘qS r   ©rw   r   rx   )r0   r   )Údirr   r   r2   	  r3   zHTestRefactoringTool.test_refactor_dir.<locals>.check.<locals>.<listcomp>)r   r   rh   r!   rr   rs   rw   Úmkdirr   rx   r|   ÚcloseZrefactor_dirrt   ru   r5   )Z	structurerd   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•   rY   rd   r   r   r   Útest_refactor_dir÷   s    

ÿz%TestRefactoringTool.test_refactor_dirc                 C   s   t j td¡}|  |¡ d S )Nzdifferent_encoding.py©rw   r   rx   ÚTEST_DATA_DIRrn   )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)	rw   r   rx   r™   rn   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	   )rw   Úlinesepr   rx   r™   r   r4   rn   )r   Zold_sepr”   rJ   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   
)rw   r   rx   r™   rh   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
rU   z&
>>> def parrot():
...      return 43
)r!   Zrefactor_docstringr5   rV   )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_explicitrQ   )r    zexplicit fixer not loaded)Zmyfixes.fix_explicitrª   r!   r5   ÚlenZ
post_orderr   r   )r   rª   r!   Zfixr   r   r   Útest_explicitF  s    

z!TestRefactoringTool.test_explicit)!r?   r@   rA   r   r   r   r`   r!   r(   r*   r-   r7   r>   rK   rP   rS   rZ   re   Ú_2TO3_FIXERSrn   rf   rg   rh   r€   rŠ   r—   rš   rœ   r    r£   r¦   r©   r¬   r   r   r   r   r
      s>   
-
þ
 
r
   )Ú__doc__r   rw   rž   rb   r†   rr   rt   ZunittestZlib2to3r   r   r   Zlib2to3.pgen2r   r   rx   ÚdirnameÚ__file__r™   r   r   r4   r`   r   r­   ZTestCaser
   r   r   r   r   Ú<module>   s$   
