B
    u9aN:  ã               @   sx   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 d dlmZ d dl	m
Z
 G dd„ dƒZG dd„ dejƒZd	d
„ ZdS )é    N)ÚHTTPException)Úsupport)ÚBytesIOc               @   sÄ   e Zd ZdZdZdZdZdZdZdZ	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"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ ZdS ),ÚTestBaseÚ Né   r   u   í»®c             C   sX   | j d krt | j¡| _ | j j| _| j j| _| j j| _| j j| _	| j j
| _
| j j| _d S )N)ÚcodecÚcodecsÚlookupÚencodingÚencodeÚdecodeÚstreamreaderÚreaderÚstreamwriterÚwriterÚincrementalencoderÚincrementaldecoder)Úself© r   ú,/usr/lib/python3.7/multibytecodec_support.pyÚsetUp   s    





zTestBase.setUpc             C   s    g }xD| j D ]:}| d¡}| ¡ }|dks.t‚dd„ |D ƒ}| |¡ qW xPt|Ž D ]D\}}|  |¡d }|  || d¡¡ | jrT|  ||  	|¡d ¡ qTW d S )Nó   
ó    c             S   s   g | ]}|d  ‘qS )r   r   )Ú.0Úliner   r   r   ú
<listcomp>*   s    z-TestBase.test_chunkcoding.<locals>.<listcomp>r   zutf-8)
ÚtstringÚsplitÚpopÚAssertionErrorÚappendÚzipr   ÚassertEqualÚroundtriptestr   )r   Ztstring_linesÚbÚlinesZlastZnativeÚutf8Úur   r   r   Útest_chunkcoding$   s    
zTestBase.test_chunkcodingc             C   sÎ   xÈ| j D ]¾\}}}t|tƒr$| j}n| j}|r¶|||ƒd }|| jkr~|  t|ƒtkt|ƒ¡ |  ||d|| j	|||f ¡ qÆ|  t|ƒtkt|ƒ¡ |  ||d|| j	|||f ¡ q|  
t|||¡ qW d S )Nr   z%a.decode(%r, %r)=%a != %az%a.encode(%r, %r)=%a != %a)Ú
codectestsÚ
isinstanceÚbytesr   r   Ú
assertTrueÚtypeÚstrr#   r   ÚassertRaisesÚUnicodeError)r   ÚsourceÚschemeÚexpectedÚfuncÚresultr   r   r   Útest_errorhandle2   s$    



zTestBase.test_errorhandlec             C   s0   | j r|  d¡ d}|  |  |d¡d d¡ d S )Nz$encoding contains full ISO 10646 mapu   à¬“à¬£à­  nd eggsÚxmlcharrefreplacer   s   &#2835;&#2851;&#2912; nd eggs)Úhas_iso10646ÚskipTestr#   r   )r   Úsr   r   r   Útest_xmlcharrefreplaceI   s    
zTestBase.test_xmlcharrefreplacec                sj   | j r|  d¡ ddlm‰  ‡ fdd„}t d|¡ | jrF| j\}}nd}d}|  |  |d¡d |¡ d S )	Nz$encoding contains full ISO 10646 mapr   )Úcodepoint2namec                s|   t | tƒstd|  ƒ‚g }xP| j| j| j… D ]:}t|ƒˆ krV| dˆ t|ƒ  ¡ q.| dt|ƒ ¡ q.W d |¡| jfS )Nzdon't know how to handle %rz&%s;z&#%d;r   )	r+   ÚUnicodeEncodeErrorÚ	TypeErrorÚobjectÚstartÚendÚordr!   Újoin)ÚexcÚlÚc)r=   r   r   ÚxmlcharnamereplaceY   s    
z>TestBase.test_customreplace_encode.<locals>.xmlcharnamereplaceztest.xmlcharnamereplaceu   Â«â„œÂ» = âŒ©áˆ´âŒªs*   &laquo;&real;&raquo; = &lang;&#4660;&rang;)	r9   r:   Zhtml.entitiesr=   r	   Úregister_errorÚxmlcharnametestr#   r   )r   rH   ZsinZsoutr   )r=   r   Útest_customreplace_encodeS   s    

z"TestBase.test_customreplace_encodec             C   s>   dd„ }t  d|¡ |  d| j d d¡d }|  |d¡ d S )Nc             S   s
   d| j fS )Ns   1234)rB   )rE   r   r   r   Ú	myreplaceo   s    z7TestBase.test_callback_returns_bytes.<locals>.myreplaceztest.cjktestÚabcÚdefr   s
   abc1234def)r	   rI   r   Úunmappedunicoder#   )r   rL   Úencr   r   r   Útest_callback_returns_bytesn   s    z$TestBase.test_callback_returns_bytesc                sN   ‡ fdd„}t  d|¡ x0dddgg d tƒ fD ]‰ |  t| j| jd¡ q.W d S )Nc                s
   ˆ | j fS )N)rB   )rE   )Úretr   r   rL   v   s    z7TestBase.test_callback_wrong_objects.<locals>.myreplaceztest.cjktestr   é   é   )r	   rI   r@   r0   r?   r   rO   )r   rL   r   )rR   r   Útest_callback_wrong_objectsu   s
    z$TestBase.test_callback_wrong_objectsc             C   s^   dd„ }t  d|¡ |  |  d| j d d¡d¡ dd„ }t  d|¡ |  t| j| jd¡ d S )Nc             S   s   dt | jƒfS )NÚx)ÚintrB   )rE   r   r   r   rL      s    z4TestBase.test_callback_long_index.<locals>.myreplaceztest.cjktestÚabcdÚefgh)s	   abcdxefghé	   c             S   s   dt jd fS )NrV   r   )ÚsysÚmaxsize)rE   r   r   r   rL   …   s    )r	   rI   r#   r   rO   r0   Ú
IndexError)r   rL   r   r   r   Útest_callback_long_index~   s    
z!TestBase.test_callback_long_indexc             C   s,   dd„ }t  d|¡ |  t| j| jd¡ d S )Nc             S   s   dS )N)rV   Nr   )rE   r   r   r   rL   Œ   s    z4TestBase.test_callback_None_index.<locals>.myreplaceztest.cjktest)r	   rI   r0   r?   r   rO   )r   rL   r   r   r   Útest_callback_None_index‹   s    z!TestBase.test_callback_None_indexc                s@   ‡ fdd„‰ dˆ _ t dˆ ¡ |  |  d| j d d¡d¡ d S )Nc                s*   ˆ j dkrˆ  j d8  _ dS d| jfS d S )Nr   r   )ÚREPLACEDr   ZTERMINAL)ÚlimitrB   )rE   )rL   r   r   rL   “   s    
z8TestBase.test_callback_backward_index.<locals>.myreplacerT   ztest.cjktestrX   rY   )s4   abcdREPLACEDabcdREPLACEDabcdREPLACEDabcdTERMINALefghrZ   )ra   r	   rI   r#   r   rO   )r   r   )rL   r   Útest_callback_backward_index’   s    z%TestBase.test_callback_backward_indexc             C   s6   dd„ }t  d|¡ |  |  d| j d d¡d¡ d S )Nc             S   s   d| j d fS )Nr`   rS   )rB   )rE   r   r   r   rL       s    z7TestBase.test_callback_forward_index.<locals>.myreplaceztest.cjktestrX   rY   )s   abcdREPLACEDghrZ   )r	   rI   r#   r   rO   )r   rL   r   r   r   Útest_callback_forward_indexŸ   s    z$TestBase.test_callback_forward_indexc             C   s,   dd„ }t  d|¡ |  t| j| jd¡ d S )Nc             S   s   dS )N)ZTERMéd   r   )rE   r   r   r   rL   §   s    z:TestBase.test_callback_index_outofbound.<locals>.myreplaceztest.cjktest)r	   rI   r0   r]   r   rO   )r   rL   r   r   r   Útest_callback_index_outofbound¦   s    z'TestBase.test_callback_index_outofboundc             C   s¬   t  d¡}xœd gttddƒƒ dddddg D ]v}|t| jd ƒƒ}tƒ }|  ¡ }x:|d k	rh| |¡}n| ¡ }|svP | |¡}| 	|¡ qTW |  
| ¡ | jd	 ¡ q.W d S )
Nzutf-8r   é!   é@   é€   é   i   i   r   )r	   Ú	getreaderÚlistÚranger   r   r   Úreadr   Úwriter#   Úgetvalue)r   Ú
UTF8ReaderÚsizehintÚistreamÚostreamÚencoderÚdataÚer   r   r   Útest_incrementalencoder­   s    

z TestBase.test_incrementalencoderc             C   sž   t  d¡}xŽd dgttddƒƒ ddddd	g D ]f}t| jd
 ƒ}|tƒ ƒ}|  ¡ }x*| |¡}|shP qV| |¡}| 	|¡ qVW |  
| ¡ | jd ¡ q0W d S )Nzutf-8éÿÿÿÿr   rf   rg   rh   ri   i   i   r   )r	   Ú	getwriterrk   rl   r   r   r   rm   r   rn   r#   ro   )r   Ú
UTF8Writerrq   rr   rs   Údecoderru   r(   r   r   r   Útest_incrementaldecoderÁ   s    



z TestBase.test_incrementaldecoderc             C   sŽ   | j }|  ¡ }|  t|j|d¡ d|_|  | |d¡d¡ | ¡  dd„ }t 	d|¡ d|_|  | |d¡d¡ d|_|  | |d¡d¡ d S )NTÚignorer   c             S   s
   d| j fS )NZcalled)rB   )rE   r   r   r   ÚtempreplaceÜ   s    zDTestBase.test_incrementalencoder_error_callback.<locals>.tempreplaceztest.incremental_error_callbacks   called)
rO   r   r0   r>   r   Úerrorsr#   Úresetr	   rI   )r   Úinvrv   r~   r   r   r   Ú&test_incrementalencoder_error_callbackÒ   s    z/TestBase.test_incrementalencoder_error_callbackc             C   sº   t  d¡}xªdD ]¢}xœd dgttddƒƒ dddd	d
g D ]t}|  t| jd ƒ¡}|tƒ ƒ}t||ƒ}x0||ƒ}|svP |dkrŠ| |¡ qh| 	|¡ qhW |  
| ¡ | jd ¡ q:W qW d S )Nzutf-8)rm   ÚreadlineÚ	readlinesrx   r   rf   rg   rh   ri   i   i   r   r„   )r	   ry   rk   rl   r   r   r   ÚgetattrÚ
writelinesrn   r#   ro   )r   rz   Únamerq   rr   rs   r5   ru   r   r   r   Útest_streamreaderæ   s    



zTestBase.test_streamreaderc       	      C   sÌ   d}t  d¡}x¸|D ]°}xªd gttddƒƒ ddddd	g D ]„}|t| jd ƒƒ}|  tƒ ¡}t||ƒ}x@|d k	r|||ƒ}n|ƒ }|sˆP |d
krœ| |¡ qj| 	|¡ qjW |  
| ¡ | jd ¡ q<W qW d S )N)rm   rƒ   r„   zutf-8r   rf   rg   rh   ri   i   i   r„   r   )r	   rj   rk   rl   r   r   r   r…   r†   rn   r#   ro   )	r   Z	readfuncsrp   r‡   rq   rr   rs   r5   ru   r   r   r   Útest_streamwriterù   s$    



zTestBase.test_streamwriterc             C   s   t ƒ }|  |¡}| ¡  d S )N)r   r   r€   )r   Ústreamr   r   r   r   Ú"test_streamwriter_reset_no_pending  s    
z+TestBase.test_streamwriter_reset_no_pendingc          	   C   s&   |   ¡ }|  t¡
 |`W d Q R X d S )N)r   r0   ÚAttributeErrorr   )r   rv   r   r   r   Ú$test_incrementalencoder_del_segfault  s    z-TestBase.test_incrementalencoder_del_segfault)Ú__name__Ú
__module__Ú__qualname__r   r   r   r*   r$   r9   rJ   rO   r   r)   r7   r<   rK   rQ   rU   r^   r_   rb   rc   re   rw   r|   r‚   rˆ   r‰   r‹   r   r   r   r   r   r      s6   

	r   c               @   s\   e Zd Zg Zg Zg Zg 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 )ÚTestBase_Mappingc          	   C   s>   y|   ¡  ¡  W n( ttfk
r8   |  d| j ¡ Y nX d S )NzCould not retrieve )Úopen_mapping_fileÚcloseÚOSErrorr   r:   Ú
mapfileurl)r   r   r   r   r   $  s    zTestBase_Mapping.setUpc             C   s   t  | j¡S )N)r   Zopen_urlresourcer•   )r   r   r   r   r’   *  s    z"TestBase_Mapping.open_mapping_filec             C   s"   | j  d¡r|  ¡  n|  ¡  d S )Nz.xml)r•   ÚendswithÚ_test_mapping_file_ucmÚ_test_mapping_file_plain)r   r   r   r   Útest_mapping_file-  s    
z"TestBase_Mapping.test_mapping_filec       	   	   C   s8  dd„ }i }|   ¡ }x|D ]}|s,P | d¡d  ¡  ¡ }t|ƒdkrPq t|d ƒ}|dkrtt|d@ gƒ}nz|dkr¦t|d	? |d
? d@ |d? d@ |d@ gƒ}nH|dkrÎt|d
? |d? d@ |d@ gƒ}n |dkr t|d? |d@ gƒ}nq ||d ƒ}t|ƒdks ||krq |||< |  ||¡ q W W d Q R X d S )Nc          	   S   s   d  tttt|  d¡ƒƒ¡S )Nr   ú+)rD   ÚmapÚchrÚevalr   )r;   r   r   r   Ú<lambda>4  r   z;TestBase_Mapping._test_mapping_file_plain.<locals>.<lambda>ú#r   rS   é   éÿ   i   é   é   é   i   ri   r   iýÿ  )r’   r   ÚstripÚlenr   r,   rC   Ú
_testpoint)	r   ZunichrsZurt_waÚfr   ru   ZcsetvalÚcsetchÚunichr   r   r   r˜   3  s4    z)TestBase_Mapping._test_mapping_file_plainc          	   C   sb   |   ¡ }| ¡ }W d Q R X t d|¡}x4|D ],\}}tt|dƒƒ}t |¡}|  ||¡ q.W d S )Nz'<a u="([A-F0-9]{4})" b="([0-9A-F ]+)"/>r£   )	r’   rm   ÚreÚfindallrœ   rW   r,   Úfromhexr§   )r   r¨   ZucmdataZucZuniZcodedrª   Zcodechr   r   r   r—   T  s    

z'TestBase_Mapping._test_mapping_file_ucmc             C   s   x| j D ]}| j|Ž  qW d S )N)Úsupmapsr§   )r   Úmappingr   r   r   Útest_mapping_supplemental]  s    z*TestBase_Mapping.test_mapping_supplementalc             C   sH   ||f| j kr"|  | | j¡|¡ ||f| jkrD|  t|| jƒ|¡ d S )N)Úpass_enctestr#   r   r   Úpass_dectestr/   )r   r©   rª   r   r   r   r§   a  s    zTestBase_Mapping._testpointc             C   sÚ   xÔ| j D ]Ê\}}}t|tƒr$|j}n|j}|rÀt|tƒr||| j|ƒ}|  t|ƒtkt|ƒ¡ |  	||d|| j|||f ¡ qÒ|| j|ƒ}|  t|ƒtkt|ƒ¡ |  	||d|| j|||f ¡ q|  
t|| j|¡ qW d S )Nz%a.decode(%r, %r)=%a != %az%a.encode(%r, %r)=%a != %a)r*   r+   r,   r   r   r   r-   r.   r/   r#   r0   r1   )r   r2   r3   r4   r5   r6   r   r   r   r7   g  s&    



z!TestBase_Mapping.test_errorhandleN)rŽ   r   r   r±   r²   r®   r*   r   r’   r™   r˜   r—   r°   r§   r7   r   r   r   r   r‘     s   !	r‘   c          	   C   sv   t j t j t¡d¡}tt j || d ¡dƒ}| ¡ }W d Q R X tt j || d ¡dƒ}| ¡ }W d Q R X ||fS )NZcjkencodingsz.txtÚrbz	-utf8.txt)ÚosÚpathrD   ÚdirnameÚ__file__Úopenrm   )r‡   Údirr¨   Zencodedr'   r   r   r   Úload_teststring  s    rº   )r	   r´   r«   r[   ZunittestZhttp.clientr   Ztestr   Úior   r   ZTestCaser‘   rº   r   r   r   r   Ú<module>   s     a