B
    v9až0  ã               @   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 dej ¡  X 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Úmyfixesz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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-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ ZdS )9ÚTestRefactoringToolc             C   s   t j t¡ d S )N)ÚsysÚpathÚappendÚ	FIXER_DIR)Úself© r   ú#/usr/lib/python3.7/test_refactor.pyÚsetUp   s    zTestRefactoringTool.setUpc             C   s   t j ¡  d S )N)r
   r   Úpop)r   r   r   r   ÚtearDown"   s    zTestRefactoringTool.tearDownc             C   s6   x0t ||ƒD ]"\}}t||ƒs|  d| |¡ qW 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 )N)r   ÚRefactoringTool)r   Úoptionsr   Úexplicitr   r   r   Úrt*   s    zTestRefactoringTool.rtc             C   s4   |   ddi¡}|  |jtj¡ |  |jjtj¡ d S )NÚprint_functionT)r   ZassertIsZgrammarr   Z!python_grammar_no_print_statementZdriver)r   r   r   r   r   Útest_print_function_option-   s    
z.TestRefactoringTool.test_print_function_optionc             C   s2   |   ¡ }|  |j¡ |   ddi¡}|  |j¡ d S )NÚwrite_unchanged_filesT)r   ZassertFalser!   Ú
assertTrue)r   r   r   r   r   Ú!test_write_unchanged_files_option3   s    z5TestRefactoringTool.test_write_unchanged_files_optionc             C   sj   dddddg}t  d¡}t  dd¡}t  d¡}|  |dd	„ |D ƒ¡ |  ||¡ |  |d
d	„ |D ƒ¡ d S )Nr   ÚfirstZlastZparrotZpreorderr   Fc             S   s   g | ]}d | ‘qS )Zfix_r   )Ú.0Únamer   r   r   ú
<listcomp>>   s    zBTestRefactoringTool.test_fixer_loading_helpers.<locals>.<listcomp>c             S   s   g | ]}d | ‘qS )zmyfixes.fix_r   )r%   r&   r   r   r   r'   A   s    )r   Zget_all_fix_namesÚget_fixers_from_packageÚassertEqual)r   ÚcontentsZnon_prefixedZprefixedZ
full_namesr   r   r   Útest_fixer_loading_helpers9   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}x|D ]}|  ||ƒ|¡ qöW 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Ú	frozensetr)   )r   ÚrunZfsÚemptyZinpZinvalidr   r   r   Útest_detect_future_featuresC   sF    






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¡ x| ¡ D ]}
|  |
|g¡ q¨W 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   ÚNoneFixq   s   r6   c               @   s   e Zd ZdZdS )z@TestRefactoringTool.test_get_headnode_dict.<locals>.FileInputFixzfile_input< any * >N)r3   r4   r5   ÚPATTERNr   r   r   r   ÚFileInputFixt   s   r8   c               @   s   e Zd ZdZdS )z=TestRefactoringTool.test_get_headnode_dict.<locals>.SimpleFixz'name'N)r3   r4   r5   r7   r   r   r   r   Ú	SimpleFixw   s   r9   )r   ZBaseFixr   Z_get_headnode_dictr   r   Zpython_symbolsZ
file_inputr)   r   ÚNAMEÚvalues)r   r6   r8   r9   Zno_headZ	with_headZsimpleÚdZ	top_fixesZ
name_fixesÚfixesr   r   r   Útest_get_headnode_dictp   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_firstr?   Zmyfixes.fix_lastr@   Zmyfixes.fix_parrotrA   Zmyfixes.fix_preorderrB   r   Z
get_fixersr   )r   r?   r@   rA   rB   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
FixerError)r   r   r   r   Útest_naughty_fixers‘   s    z'TestRefactoringTool.test_naughty_fixersc             C   sL   |   ¡ }d}| |d¡}|  t|ƒ|¡ d}| |d¡}|  t|ƒ|¡ d S )Nzdef parrot(): pass

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

)r   Zrefactor_stringÚassertNotEqualÚstrr)   )r   r   ÚinputÚtreer   r   r   Útest_refactor_string–   s    z(TestRefactoringTool.test_refactor_stringc                sf   G ‡ fdd„dt jƒ}g ‰ |tƒ}tj}t d¡t_z| ¡  W d |t_X ddddg}|  ˆ |¡ d S )Nc                   s   e Zd Z‡ fdd„ZdS )z5TestRefactoringTool.test_refactor_stdin.<locals>.MyRTc                s   ˆ   ||||g¡ d S )N)Úextend)r   Zold_textZnew_textÚfilenameZequal)Úresultsr   r   Úprint_output¤   s    zBTestRefactoringTool.test_refactor_stdin.<locals>.MyRT.print_outputN)r3   r4   r5   rN   r   )rM   r   r   ÚMyRT¢   s   rO   zdef parrot(): pass

zdef cheese(): pass

z<stdin>F)	r   r   Ú_DEFAULT_FIXERSr
   ÚstdinÚioÚStringIOZrefactor_stdinr)   )r   rO   r   ZsaveÚexpectedr   )rM   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_filer)   rF   )	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 )Nz2to3-test_refactor)Úprefixi¤  )ÚtempfileÚmkdtempZ
addCleanupÚshutilÚrmtreeÚcopyÚosr   ÚjoinÚbasenameÚchmod)r   rY   Ztmpdirr   r   r   rV   Ç   s    z"TestRefactoringTool.init_test_filec          	   C   s   t |dƒ
}| ¡ S Q R X d S )NÚrb)ÚopenÚread)r   rY   Úfpr   r   r   rW   Ï   s    zTestRefactoringTool.read_filec             C   s>   |   |¡}|  |¡}| j|d}| |d¡ |  |¡}||fS )N)r   T)rV   rW   r   rX   )r   rY   r   r\   r   r]   r   r   r   rX   Ó   s    


z!TestRefactoringTool.refactor_filec             C   s   t j td¡}|  |t¡ d S )Nzparrot_example.py)re   r   rf   r   r^   rP   )r   rY   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 |¡ ¡ }x4ˆ D ]}d
|krX|  	||¡ P qXW |  
d|ˆ f ¡ d S )Nzparrot_example.pyc                s   ˆ   | | ¡ d S )N)r   )ÚmsgÚargs)Údebug_messagesr   r   Úrecording_log_debugâ   s    zXTestRefactoringTool.test_refactor_file_write_unchanged_file.<locals>.recording_log_debugr   r!   TF)r   r   rZ   r[   zNot writing changes to .*%szNot writing changesz%r not matched in %r)re   r   rf   r   r^   ÚreÚescapeÚseprg   ZassertRegexr   )r   rY   rq   Zmessage_regexÚmessager   )rp   r   Ú'test_refactor_file_write_unchanged_fileß   s    
z;TestRefactoringTool.test_refactor_file_write_unchanged_filec                sV   ‡ fdd„}|g g ƒ ddddddg}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‰ zHt tj 	ˆ d¡¡ x$| D ]}t
tj 	ˆ |¡dƒ ¡  qPW | ˆ ¡ W d |t j_t ˆ ¡ X ˆ ˆ‡ fdd„|D ƒ¡ d S )	Nc                s   ˆ   |¡ d S )N)r   )r   Úfro   )Úgotr   r   Úmock_refactor_fileõ   s    zPTestRefactoringTool.test_refactor_dir.<locals>.check.<locals>.mock_refactor_filez2to3-test_refactor)r_   Úa_dirÚwbc                s   g | ]}t j ˆ |¡‘qS r   )re   r   rf   )r%   r   )Údirr   r   r'     s    zHTestRefactoringTool.test_refactor_dir.<locals>.check.<locals>.<listcomp>)r   r   rX   r   r`   ra   re   Úmkdirr   rf   rj   ÚcloseZrefactor_dirrb   rc   r)   )Z	structurerT   ry   Z	save_funcr   Úfn)r   )r|   rx   r   Úcheckô   s    
z4TestRefactoringTool.test_refactor_dir.<locals>.checkZnothingzhi.pyz.dumbz	.after.pyz	notpy.npyZsappyrz   zstuff.py)re   r   rf   )r   r€   rI   rT   r   )r   r   Útest_refactor_diró   s    

z%TestRefactoringTool.test_refactor_dirc             C   s   t j td¡}|  |¡ d S )Nzdifferent_encoding.py)re   r   rf   ÚTEST_DATA_DIRr^   )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.py)re   r   rf   r‚   r^   )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)	re   r   rf   r‚   r^   r"   Ú
startswithÚcodecsÚBOM_UTF8)r   r   r   r   r   r   Útest_bom  s    
zTestRefactoringTool.test_bomc             C   sB   t j}dt _z(t j td¡}t d¡}|  ||¡ W d |t _X d S )Nz
zcrlf.pyzlib2to3.fixes)re   Úlinesepr   rf   r‚   r   r(   r^   )r   Zold_sepr   r=   r   r   r   Útest_crlf_newlines   s    
z&TestRefactoringTool.test_crlf_newlinesc             C   sD   t j td¡}|  |¡\}}|  d|¡ |  d|¡ |  d|¡ d S )Nzcrlf.pys   
s   
)re   r   rf   r‚   rX   ZassertInZassertNotIn)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
z<test>z&
>>> def parrot():
...      return 43
)r   Zrefactor_docstringr)   rF   )r   r   ÚdocÚoutr   r   r   Útest_refactor_docstring1  s    z+TestRefactoringTool.test_refactor_docstringc             C   sd   ddl m} | jdgd}|  t|jƒd¡ | jdgd}x$|jD ]}t||ƒrBP qBW |  d¡ d S )Nr   )ÚFixExplicitzmyfixes.fix_explicit)r   )r   zexplicit fixer not loaded)Zmyfixes.fix_explicitr‘   r   r)   ÚlenZ
post_orderr   r   )r   r‘   r   Zfixr   r   r   Útest_explicitB  s    
z!TestRefactoringTool.test_explicit) r3   r4   r5   r   r   r   rP   r   r    r#   r+   r2   r>   rC   rE   rJ   rU   Ú_2TO3_FIXERSr^   rV   rW   rX   rm   rv   r   rƒ   r„   rˆ   rŠ   r   r   r“   r   r   r   r   r	      s:   
-
 
r	   )Ú__doc__r
   re   r†   rR   rr   r`   rb   ZunittestZlib2to3r   r   r   Zlib2to3.pgen2r   r   rf   ÚdirnameÚ__file__r‚   r   r   r(   rP   r   r”   ZTestCaser	   r   r   r   r   Ú<module>   s$   
