3
d0                 @   s|   d Z ddlZddlZddlZddlmZ ddlmZmZm	Z	 ddl
mZ G dd deZG d	d
 d
eZG dd deZdS )z*Tests of the bs4.element.PageElement class    N)BeautifulSoup)Comment	ResultSetSoupStrainer   )SoupTestc               @   sP   e 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S )TestEncodingz0Test the ability to encode objects into strings.c             C   s.   d}| j |}|jjjddjdks*td S )Nu
   <b>☃</b>zutf-8u   ☃)soupbstringencodeAssertionError)selfhtmlr	    r   D/tmp/pip-build-8z3xcdsh/beautifulsoup4/bs4/tests/test_pageelement.py"test_unicode_string_can_be_encoded   s    
z/TestEncoding.test_unicode_string_can_be_encodedc             C   s,   d}| j |}|jjd|jdks(td S )Nu
   <b>☃</b>zutf-8)r	   r
   r   r   )r   r   r	   r   r   r   1test_tag_containing_unicode_string_can_be_encoded   s    
z>TestEncoding.test_tag_containing_unicode_string_can_be_encodedc             C   s&   d}| j |}|jjddks"td S )Nu
   <b>☃</b>asciis   <b>&#9731;</b>)r	   r
   r   r   )r   r   r	   r   r   r   <test_encoding_substitutes_unrecognized_characters_by_default   s    
zITestEncoding.test_encoding_substitutes_unrecognized_characters_by_defaultc             C   s6   d}| j |}tjt |jddd W d Q R X d S )Nu
   <b>☃</b>r   strict)errors)r	   pytestZraisesUnicodeEncodeErrorr   )r   r   r	   r   r   r    test_encoding_can_be_made_strict"   s    
z-TestEncoding.test_encoding_can_be_made_strictc             C   s$   d}| j |}d|jj ks td S )Nu
   <b>☃</b>u   ☃)r	   r
   Zdecode_contentsr   )r   r   r	   r   r   r   test_decode_contents(   s    
z!TestEncoding.test_decode_contentsc             C   s.   d}| j |}djd|jjddks*td S )Nu
   <b>☃</b>u   ☃utf8)encoding)r	   r   r
   Zencode_contentsr   )r   r   r	   r   r   r   test_encode_contents-   s    
z!TestEncoding.test_encode_contentsc             C   s*   d}| j |}djd|jj ks&td S )Nu
   <b>☃</b>u   ☃r   )r	   r   r
   ZrenderContentsr   )r   r   r	   r   r   r   test_deprecated_renderContents4   s    
z+TestEncoding.test_deprecated_renderContentsc             C   s"   d}| j |}|t|kstd S )Nu
   <b>☃</b>)r	   reprr   )r   r   r	   r   r   r   	test_repr9   s    
zTestEncoding.test_reprN)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r!   r   r   r   r   r      s   r   c               @   s   e 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"S )#TestFormatterszrTest the formatting feature, used by methods like decode() and
    prettify(), and the formatters themselves.
    c             C   s0   d}| j |}|jdd}|| jdks,td S )Nu#   <b>&lt;&lt;Sacré bleu!&gt;&gt;</b>minimal)	formatter)r	   decodedocument_forr   )r   markupr	   decodedr   r   r   !test_default_formatter_is_minimalD   s
    
z0TestFormatters.test_default_formatter_is_minimalc             C   s0   d}| j |}|jdd}|| jdks,td S )Nu'   <br><b>&lt;&lt;Sacré bleu!&gt;&gt;</b>r   )r(   z.<br/><b>&lt;&lt;Sacr&eacute; bleu!&gt;&gt;</b>)r	   r)   r*   r   )r   r+   r	   r,   r   r   r   test_formatter_htmlM   s
    
z"TestFormatters.test_formatter_htmlc             C   s0   d}| j |}|jdd}|| jdks,td S )Nu'   <br><b>&lt;&lt;Sacré bleu!&gt;&gt;</b>html5)r(   z-<br><b>&lt;&lt;Sacr&eacute; bleu!&gt;&gt;</b>)r	   r)   r*   r   )r   r+   r	   r,   r   r   r   test_formatter_html5U   s
    
z#TestFormatters.test_formatter_html5c             C   s0   d}| j |}|jdd}|| jdks,td S )Nu#   <b>&lt;&lt;Sacré bleu!&gt;&gt;</b>r'   )r(   )r	   r)   r*   r   )r   r+   r	   r,   r   r   r   test_formatter_minimal]   s
    
z%TestFormatters.test_formatter_minimalc             C   s0   d}| j |}|jd d}|| jdks,td S )Nu#   <b>&lt;&lt;Sacré bleu!&gt;&gt;</b>)r(   u   <b><<Sacré bleu!>></b>)r	   r)   r*   r   )r   r+   r	   r,   r   r   r   test_formatter_nullf   s
    
z"TestFormatters.test_formatter_nullc             C   s4   d}| j |}|jdd d}|| jdks0td S )Nz!<b>&lt;foo&gt;</b><b>bar</b><br/>c             S   s   | j  S )N)upper)xr   r   r   <lambda>s   s    z6TestFormatters.test_formatter_custom.<locals>.<lambda>)r(   z<b><FOO></b><b>BAR</b><br/>)r	   r)   r*   r   )r   r+   r	   r,   r   r   r   test_formatter_customp   s    
z$TestFormatters.test_formatter_customc             C   s   d}| j |}|j}d}||j ks(t||jddks<td}||jddksTt||jd dkshtd}||jdd	 dkstd S )
Nu%   <a href="http://a.com?a=b&c=é">e</a>u)   <a href="http://a.com?a=b&amp;c=é">e</a>r'   )r(   z/<a href="http://a.com?a=b&amp;c=&eacute;">e</a>r   u%   <a href="HTTP://A.COM?A=B&C=É">E</a>c             S   s   | j  S )N)r3   )r4   r   r   r   r5      s    zJTestFormatters.test_formatter_is_run_on_attribute_values.<locals>.<lambda>)r	   ar)   r   )r   r+   r	   r7   Zexpect_minimalZexpect_htmlZexpect_upperr   r   r   )test_formatter_is_run_on_attribute_valuesx   s    
z8TestFormatters.test_formatter_is_run_on_attribute_valuesc             C   s"   d}t |dj }d|kstd S )NzO
  <script type="text/javascript">
   console.log("< < hey > > ");
  </script>
zhtml.parsers   < < hey > >)r   r   r   )r   docencodedr   r   r   2test_formatter_skips_script_tag_for_html_documents   s    zATestFormatters.test_formatter_skips_script_tag_for_html_documentsc             C   s"   d}t |dj }d|kstd S )NzF
  <style type="text/css">
   console.log("< < hey > > ");
  </style>
zhtml.parsers   < < hey > >)r   r   r   )r   r9   r:   r   r   r   1test_formatter_skips_style_tag_for_html_documents   s    z@TestFormatters.test_formatter_skips_style_tag_for_html_documentsc             C   s    | j d}d|jj kstd S )NzN<div>  foo  <pre>  	bar
  
  </pre>  baz  <textarea> eee
fff	</textarea></div>zO<div>
 foo
 <pre>  	bar
  
  </pre>
 baz
 <textarea> eee
fff	</textarea>
</div>)r	   divprettifyr   )r   r	   r   r   r   ,test_prettify_leaves_preformatted_text_alone   s    
z;TestFormatters.test_prettify_leaves_preformatted_text_alonec             C   s*   t dd}|jdd d}d|ks&td S )Nz<html><body>foo</body></html>zhtml.parserc             S   s   | j  S )N)r3   )r4   r   r   r   r5      s    zITestFormatters.test_prettify_accepts_formatter_function.<locals>.<lambda>)r(   ZFOO)r   r>   r   )r   r	   prettyr   r   r   (test_prettify_accepts_formatter_function   s    
z7TestFormatters.test_prettify_accepts_formatter_functionc             C   s"   | j d}tt|j kstd S )Nz<a></a>)r	   strtyper>   r   )r   r	   r   r   r   (test_prettify_outputs_unicode_by_default   s    
z7TestFormatters.test_prettify_outputs_unicode_by_defaultc             C   s$   | j d}tt|jdks td S )Nz<a></a>zutf-8)r	   bytesrC   r>   r   )r   r	   r   r   r   test_prettify_can_encode_data   s    
z,TestFormatters.test_prettify_can_encode_datac             C   s0   d}| j |}|jjd}||jdks,td S )Nu   <b>Sacré bleu!</b>zutf-8)r	   r
   r   r   )r   r+   r	   r:   r   r   r   ,test_html_entity_substitution_off_by_default   s    
z;TestFormatters.test_html_entity_substitution_off_by_defaultc             C   s   d}| j |}|jd dks t|jd}d|ks6t|jd}d|ksLt|jd}d	|ksbt|jd
jd
}d|ks~td S )NzE<meta content="text/html; charset=x-sjis" http-equiv="Content-type"/>contentztext/html; charset=x-sjiszutf-8s   charset=utf-8euc_jps   charset=euc_jpz	shift-jiss   charset=shift-jiszutf-16zcharset=utf-16)r	   metar   r   r)   )r   Zmeta_tagr	   utf_8rI   	shift_jisZutf_16_ur   r   r   test_encoding_substitution   s    



z)TestFormatters.test_encoding_substitutionc             C   s2   d}t d}| j||d}|jd jdks.td S )Nz`<head><meta content="text/html; charset=x-sjis" http-equiv="Content-type"/></head><pre>foo</pre>pre)Z
parse_onlyr   )r   r	   contentsnamer   )r   r+   Zstrainerr	   r   r   r   ;test_encoding_substitution_doesnt_happen_if_tag_is_strained   s    zJTestFormatters.test_encoding_substitution_doesnt_happen_if_tag_is_strainedN)r"   r#   r$   r%   r-   r.   r0   r1   r2   r6   r8   r;   r<   r?   rA   rD   rF   rG   rM   rQ   r   r   r   r   r&   ?   s"   		
		r&   c               @   s`   e 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S )TestPersistencez*Testing features like pickle and deepcopy.c             C   s   d| _ | j| j | _d S )Nay  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Beautiful Soup: We called him Tortoise because he taught us.</title>
<link rev="made" href="mailto:leonardr@segfault.org">
<meta name="Description" content="Beautiful Soup: an HTML parser optimized for screen-scraping.">
<meta name="generator" content="Markov Approximation 1.4 (module: leonardr)">
<meta name="author" content="Leonard Richardson">
</head>
<body>
<a href="foo">foo</a>
<a href="foo"><b>bar</b></a>
</body>
</html>)pager	   tree)r   r   r   r   setup_method   s    zTestPersistence.setup_methodc             C   s@   t j| jd}t j|}|jtks&t|j | jj ks<td S )N   )pickledumpsrT   loads	__class__r   r   r)   )r   dumpedloadedr   r   r   !test_pickle_and_unpickle_identity   s    
z1TestPersistence.test_pickle_and_unpickle_identityc             C   s&   t j| j}|j | jj ks"td S )N)copydeepcopyrT   r)   r   )r   copiedr   r   r   test_deepcopy_identity   s    z&TestPersistence.test_deepcopy_identityc             C   s:   t dd}|j}|j }dt|ks(t||jks6td S )Ns   <p>&nbsp;</p>zhtml.parseru	   <p> </p>)r   Zoriginal_encoding__copy__rB   r   )r   r	   r   r^   r   r   r   test_copy_preserves_encoding   s
    
z,TestPersistence.test_copy_preserves_encodingc             C   s   | j dj}d|_d|_|j }|j|jks0t|j|jks@t|j|jksPt|j|jks`t|j|jkspt|j	|j	kstd S )Nz<p></p>
   !   )
r	   pZ
sourcelineZ	sourceposrb   r   Zcan_be_empty_elementZcdata_list_attributesZpreserve_whitespace_tagsZinteresting_string_types)r   tagr`   r   r   r   'test_copy_preserves_builder_information  s    z7TestPersistence.test_copy_preserves_builder_informationc             C   s>   d}| j |}tj|tj}tj|}|j |j ks:td S )Nu
   <b>☃</b>)r	   rW   rX   HIGHEST_PROTOCOLrY   r)   r   )r   r   r	   r[   r\   r   r   r   test_unicode_pickle  s
    

z#TestPersistence.test_unicode_picklec             C   sz   d}| j |}|jdd}tj|}||ks0td |jks>td |jksLtd |jksZtd |jkshtd |jksvtd S )Nz<b>Foo<a></a></b><b>Bar</b>ZFoo)r   )r	   findr^   r   parentnext_elementZnext_siblingprevious_element)r   r   r	   s1s2r   r   r   1test_copy_navigablestring_is_not_attached_to_tree  s    

zATestPersistence.test_copy_navigablestring_is_not_attached_to_treec             C   s<   d}| j |}|j}tj|}||ks*tt|ts8td S )Nz<b><!--Foo--></b>)r	   r   r^   r   
isinstancer   )r   r   r	   ro   rp   r   r   r   0test_copy_navigablestring_subclass_has_same_type)  s    

z@TestPersistence.test_copy_navigablestring_subclass_has_same_typec             C   s(   d}| j |}tj|}||ks$td S )Nz)<div><b>Foo<a></a></b><b>Bar</b></div>end)r	   r^   r   )r   r   r	   Z	soup_copyr   r   r   test_copy_entire_soup1  s    

z%TestPersistence.test_copy_entire_soupc             C   s   d}| j |}|j}tj|}t|t|ks2t||ks>t||k	sJtd |jksXtd |jksftd |jddjks|td |jddjkstd S )Nz)<div><b>Foo<a></a></b><b>Bar</b></div>endBar)r   )	r	   r=   r^   rB   r   rl   rn   rk   rm   )r   r   r	   r=   Zdiv_copyr   r   r   test_copy_tag_copies_contents7  s    

z-TestPersistence.test_copy_tag_copies_contentsN)r"   r#   r$   r%   rU   r]   ra   rc   rh   rj   rq   rs   rt   rv   r   r   r   r   rR      s   rR   )r%   r^   rW   r   Zbs4r   Zbs4.elementr   r   r    r   r   r&   rR   r   r   r   r   <module>   s   / 