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 }x8| j D ].}| d¡}| ¡ }dd„ |D ƒ}| |¡ qW xPt|Ž D ]D\}}|  |¡d }|  || d¡¡ | jrH|  ||  |¡d ¡ qHW 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Ú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;)	r7   r8   Zhtml.entitiesr;   r	   Úregister_errorÚxmlcharnametestr!   r   )r   rF   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)r@   )rC   r   r   r   Ú	myreplaceo   s    z7TestBase.test_callback_returns_bytes.<locals>.myreplaceztest.cjktestÚabcÚdefr   s
   abc1234def)r	   rG   r   Úunmappedunicoder!   )r   rJ   Ú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)r@   )rC   )Úretr   r   rJ   v   s    z7TestBase.test_callback_wrong_objects.<locals>.myreplaceztest.cjktestr   é   é   )r	   rG   r>   r.   r=   r   rM   )r   rJ   r   )rP   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)Úintr@   )rC   r   r   r   rJ      s    z4TestBase.test_callback_long_index.<locals>.myreplaceztest.cjktestÚabcdÚefgh)s	   abcdxefghé	   c             S   s   dt jd fS )NrT   r   )ÚsysÚmaxsize)rC   r   r   r   rJ   …   s    )r	   rG   r!   r   rM   r.   Ú
IndexError)r   rJ   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)rT   Nr   )rC   r   r   r   rJ   Œ   s    z4TestBase.test_callback_None_index.<locals>.myreplaceztest.cjktest)r	   rG   r.   r=   r   rM   )r   rJ   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)Úlimitr@   )rC   )rJ   r   r   rJ   “   s    
z8TestBase.test_callback_backward_index.<locals>.myreplacerR   ztest.cjktestrV   rW   )s4   abcdREPLACEDabcdREPLACEDabcdREPLACEDabcdTERMINALefghrX   )r_   r	   rG   r!   r   rM   )r   r   )rJ   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^   rQ   )r@   )rC   r   r   r   rJ       s    z7TestBase.test_callback_forward_index.<locals>.myreplaceztest.cjktestrV   rW   )s   abcdREPLACEDghrX   )r	   rG   r!   r   rM   )r   rJ   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   )rC   r   r   r   rJ   §   s    z:TestBase.test_callback_index_outofbound.<locals>.myreplaceztest.cjktest)r	   rG   r.   r[   r   rM   )r   rJ   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   rd   re   rf   rg   i   i   r   )r	   Ú	getwriterri   rj   r   r   r   rk   r   rl   r!   rm   )r   Ú
UTF8Writerro   rp   rq   Údecoderrs   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Úignoreó    c             S   s
   d| j fS )NZcalled)r@   )rC   r   r   r   ÚtempreplaceÜ   s    zDTestBase.test_incrementalencoder_error_callback.<locals>.tempreplaceztest.incremental_error_callbacks   called)
rM   r   r.   r<   r   Úerrorsr!   Úresetr	   rG   )r   Úinvrt   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)rk   ÚreadlineÚ	readlinesrv   r   rd   re   rf   rg   i   i   r   rƒ   )r	   rw   ri   rj   r   r   r   ÚgetattrÚ
writelinesrl   r!   rm   )r   rx   Únamero   rp   rq   r3   rs   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)rk   r‚   rƒ   zutf-8r   rd   re   rf   rg   i   i   rƒ   r   )r	   rh   ri   rj   r   r   r   r„   r…   rl   r!   rm   )	r   Z	readfuncsrn   r†   ro   rp   rq   r3   rs   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   r.   ÚAttributeErrorr~   )r   rt   r   r   r   Ú$test_incrementalencoder_del_segfault  s    z-TestBase.test_incrementalencoder_del_segfault)Ú__name__Ú
__module__Ú__qualname__r   r   r   r(   r"   r7   rH   rM   r   r'   r5   r:   rI   rO   rS   r\   r]   r`   ra   rc   ru   rz   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   r8   Ú
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   ú+)rB   ÚmapÚchrÚevalr   )r9   r   r   r   Ú<lambda>4  r|   z;TestBase_Mapping._test_mapping_file_plain.<locals>.<lambda>ú#r   rQ   é   éÿ   i   é   é   é   i   rg   r   iýÿ  )r‘   r   ÚstripÚlenrœ   r*   rA   Ú
_testpoint)	r   ZunichrsZurt_waÚfr   rs   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‘   rk   ÚreÚfindallr›   rU   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!   r.   r/   )r   r0   r1   r2   r3   r4   r   r   r   r5   g  s&    



z!TestBase_Mapping.test_errorhandleN)r   rŽ   r   r°   r±   r­   r(   r   r‘   r˜   r—   r–   r¯   r¦   r5   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ÚpathrB   ÚdirnameÚ__file__Úopenrk   )r†   Údirr§   Zencodedr%   r   r   r   Úload_teststring  s    r¹   )r	   r³   rª   rY   ZunittestZhttp.clientr   Ztestr   Úior   r   ZTestCaser   r¹   r   r   r   r   Ú<module>   s     a