B
    ê¹`wr  ã            
   @   s˜  d Z ddlm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
mZ ddlmZmZ ddlmZmZmZmZmZmZmZ ddlZddlmZmZmZ ddlmZmZmZ ddlZydd	lm Z m!Z! d
Z"W n& e#k
rò Z$ zdZ"W ddZ$[$X Y nX ej%d dkoej%dk Z&G dd„ deƒZ'G dd„ deƒZ(G dd„ deƒZ)G dd„ dej*ƒZ+G dd„ deƒZ,G dd„ dej*ƒZ-G dd„ deƒZ.G dd„ dej*ƒZ/dS )z#Tests of Beautiful Soup as a whole.é    )Ú	set_traceN)ÚBeautifulSoupÚBeautifulStoneSoupÚGuessedAtParserWarningÚMarkupResemblesLocatorWarning)ÚTreeBuilderÚParserRejectedMarkup)ÚCharsetMetaAttributeValueÚCommentÚContentMetaAttributeValueÚSoupStrainerÚNamespacedAttributeÚTagÚNavigableString)ÚEntitySubstitutionÚUnicodeDammitÚEncodingDetector)Údefault_builderÚSoupTestÚskipIf)ÚLXMLTreeBuilderÚLXMLTreeBuilderForXMLTFé   )r   é   c               @   sL   e 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 )ÚTestConstructorc             C   s"   d}|   |¡}|  d|jj¡ d S )Nu   <h1>Ã©Ã©</h1>u   Ã©Ã©)ÚsoupÚassertEqualÚh1Ústring)ÚselfÚdatar   © r!   ú[/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/site-packages/bs4/tests/test_soup.pyÚtest_short_unicode_input5   s    
z(TestConstructor.test_short_unicode_inputc             C   s"   d}|   |¡}|  d|jj¡ d S )Nz<h1>foo bar</h1>zfoo bar)r   r   r   r   )r   r    r   r!   r!   r"   Útest_embedded_null:   s    
z"TestConstructor.test_embedded_nullc             C   s,   d  d¡}| j|dgd}|  d|j¡ d S )Nu   RÃ¤ksmÃ¶rgÃ¥szutf-8)Úexclude_encodingszwindows-1252)Úencoder   r   Úoriginal_encoding)r   Ú	utf8_datar   r!   r!   r"   Útest_exclude_encodings?   s    
z&TestConstructor.test_exclude_encodingsc          	   C   sè   G dd„ dt ƒ}tddd}tjdd tdd|i|—Ž}W d Q R X t|j|ƒsVt‚|  tdd	|jj	¡ |  d
|jj
¡ |f |Ž}tjdd}td|dd}W d Q R X t|d jƒ}| d¡sÈt‚|  ||j¡ |  ||j	¡ d S )Nc               @   sD   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Ze ZZ	dd„ Z
dS )z7TestConstructor.test_custom_builder_class.<locals>.Mockc             [   s(   || _ d| _d| _g | _g | _i | _d S )NTF)Úcalled_withZis_xmlZstore_line_numbersZcdata_list_attributesZpreserve_whitespace_tagsÚstring_containers)r   Úkwargsr!   r!   r"   Ú__init__H   s    z@TestConstructor.test_custom_builder_class.<locals>.Mock.__init__c             S   s   d S )Nr!   )r   r   r!   r!   r"   Úinitialize_soupO   s    zGTestConstructor.test_custom_builder_class.<locals>.Mock.initialize_soupc             S   s
   || _ d S )N)Úfed)r   Úmarkupr!   r!   r"   ÚfeedQ   s    z<TestConstructor.test_custom_builder_class.<locals>.Mock.feedc             S   s   d S )Nr!   )r   r!   r!   r"   ÚresetS   s    z=TestConstructor.test_custom_builder_class.<locals>.Mock.resetc             S   s   d S )Nr!   )r   Úignorer!   r!   r"   r3   U   s    z>TestConstructor.test_custom_builder_class.<locals>.Mock.ignorec                s
   dV  d S )N)zprepared markupzoriginal encodingzdeclared encodingzcontains replacement charactersr!   )r   Úargsr,   r!   r!   r"   Úprepare_markupX   s    zFTestConstructor.test_custom_builder_class.<locals>.Mock.prepare_markupN)Ú__name__Ú
__module__Ú__qualname__r-   r.   r1   r2   r3   Zset_up_substitutionsZcan_be_empty_elementr5   r!   r!   r!   r"   ÚMockG   s   r9   ÚvalueT)ÚvarZconvertEntities)ÚrecordÚ Úbuilder)r;   zprepared markup)r>   Zignored_valuer   zCKeyword arguments to the BeautifulSoup constructor will be ignored.)r=   )ÚobjectÚdictÚwarningsÚcatch_warningsr   Ú
isinstancer>   ÚAssertionErrorr   r*   r/   ÚstrÚmessageÚ
startswith)r   r9   r,   r   r>   ÚwÚmsgr!   r!   r"   Útest_custom_builder_classD   s"    
z)TestConstructor.test_custom_builder_classc             C   s8   G dd„ dt ƒ}dd„ }dd l}| jtdtd|d d S )	Nc               @   s   e Zd Zdd„ ZdS )z:TestConstructor.test_parser_markup_rejection.<locals>.Mockc             _   s   t dƒ‚d S )NzNope.)r   )r   r4   r,   r!   r!   r"   r1   x   s    z?TestConstructor.test_parser_markup_rejection.<locals>.Mock.feedN)r6   r7   r8   r1   r!   r!   r!   r"   r9   w   s   r9   c                s    t d d dfV  t d d dfV  d S )NF)r0   )r   r4   r,   r!   r!   r"   r5   {   s    zDTestConstructor.test_parser_markup_rejection.<locals>.prepare_markupr   zoThe markup you provided was rejected by the parser. Trying a different parser or a different encoding may help.r=   )r>   )r   ÚreÚassertRaisesRegexr   r   )r   r9   r5   rK   r!   r!   r"   Útest_parser_markup_rejectiont   s    z,TestConstructor.test_parser_markup_rejectionc          
   C   sÊ   d}|   |¡}|j}|  d|d ¡ |  ddg|d ¡ | j |td d}|  d|jd ¡ xjddiddifD ]V}tjd	d
}| j |d |d}W d Q R X |j}|  ddg|d ¡ |  d|d ¡ qlW d S )Nz&<a id=" an id " class=" a class "></a>z an id ÚidÚaÚclass)r>   Zmulti_valued_attributesz	 a class Ú*T)r<   Zan)r   rO   r   r   rA   rB   )r   r0   r   rO   Z
switcheroorH   r!   r!   r"   Útest_cdata_list_attributesˆ   s    
z*TestConstructor.test_cdata_list_attributesc                sp   G dd„ dt ƒ‰G dd„ dtƒ‰G dd„ dtƒ‰ | jdt ˆtˆtˆ id}t‡ ‡‡fd	d
„| ¡ D ƒƒslt‚d S )Nc               @   s   e Zd ZdS )z9TestConstructor.test_replacement_classes.<locals>.TagPlusN)r6   r7   r8   r!   r!   r!   r"   ÚTagPlus¨   s   rS   c               @   s   e Zd ZdS )z<TestConstructor.test_replacement_classes.<locals>.StringPlusN)r6   r7   r8   r!   r!   r!   r"   Ú
StringPlus«   s   rT   c               @   s   e Zd ZdS )z=TestConstructor.test_replacement_classes.<locals>.CommentPlusN)r6   r7   r8   r!   r!   r!   r"   ÚCommentPlus®   s   rU   z<a><b>foo</b>bar</a><!--whee-->)Zelement_classesc             3   s   | ]}t |ˆˆˆ fƒV  qd S )N)rC   )Ú.0Úx)rU   rT   rS   r!   r"   ú	<genexpr>½   s   z;TestConstructor.test_replacement_classes.<locals>.<genexpr>)r   r   r
   r   ÚallZrecursiveChildGeneratorrD   )r   r   r!   )rU   rT   rS   r"   Útest_replacement_classes¥   s    z(TestConstructor.test_replacement_classesc             C   s’   G dd„ dt ƒ}G dd„ dt ƒ}| jd||dœd}t|jjd t ƒsJt‚t|jjd |ƒs`t‚x|jjD ]}t||ƒsjt‚qjW |  	g |j
¡ d S )	Nc               @   s   e Zd ZdS )zATestConstructor.test_alternate_string_containers.<locals>.PStringN)r6   r7   r8   r!   r!   r!   r"   ÚPStringÄ   s   r[   c               @   s   e Zd ZdS )zATestConstructor.test_alternate_string_containers.<locals>.BStringN)r6   r7   r8   r!   r!   r!   r"   ÚBStringÇ   s   r\   z4<div>Hello.<p>Here is <b>some <i>bolded</i></b> text)ÚbÚp)r+   r   )r   r   rC   ÚdivÚcontentsrD   r^   r]   Ústringsr   Zstring_container_stack)r   r[   r\   r   Úsr!   r!   r"   Ú test_alternate_string_containersÁ   s    z0TestConstructor.test_alternate_string_containersN)r6   r7   r8   r#   r$   r)   rJ   rM   rR   rZ   rc   r!   r!   r!   r"   r   3   s   0r   c               @   st   e 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S )ÚTestWarningsc             C   s0   x|D ]}t |j|ƒr|S qW td| |ƒ‚d S )Nz%s warning not found in %r)rC   rF   Ú	Exception)r   rA   ÚclsrH   r!   r!   r"   Ú_assert_warningå   s    
zTestWarnings._assert_warningc             C   s4   |   |t¡}t|jƒ}|  | tjd d… ¡¡ d S )Né<   )rg   r   rE   rF   Ú
assertTruerG   r   ZNO_PARSER_SPECIFIED_WARNING)r   rH   ÚwarningrF   r!   r!   r"   Ú_assert_no_parser_specifiedë   s    
z(TestWarnings._assert_no_parser_specifiedc          	   C   s.   t jdd}tdƒ}W d Q R X |  |¡ d S )NT)r<   z<a><b></b></a>)rA   rB   r   rk   )r   rH   r   r!   r!   r"   Ú#test_warning_if_no_parser_specifiedò   s    z0TestWarnings.test_warning_if_no_parser_specifiedc          	   C   s0   t jdd}tddƒ}W d Q R X |  |¡ d S )NT)r<   z<a><b></b></a>Úhtml)rA   rB   r   rk   )r   rH   r   r!   r!   r"   Ú*test_warning_if_parser_specified_too_vague÷   s    z7TestWarnings.test_warning_if_parser_specified_too_vaguec          	   C   s2   t jdd}tddƒ}W d Q R X |  g |¡ d S )NT)r<   z<a><b></b></a>zhtml.parser)rA   rB   r   r   )r   rH   r   r!   r!   r"   Ú,test_no_warning_if_explicit_parser_specifiedü   s    z9TestWarnings.test_no_warning_if_explicit_parser_specifiedc          	   C   sh   t jdd}| jdtdƒd}W d Q R X t|d jƒ}|  d|k¡ |  d|k¡ |  d	| ¡ ¡ d S )
NT)r<   z<a><b></b></a>r]   )ÚparseOnlyTheser   rp   Ú
parse_onlys   <b></b>)	rA   rB   r   r   rE   rF   ri   r   r&   )r   rH   r   rI   r!   r!   r"   Ú)test_parseOnlyThese_renamed_to_parse_only  s    z6TestWarnings.test_parseOnlyThese_renamed_to_parse_onlyc          	   C   sf   t jdd}d}| j|dd}W d Q R X t|d jƒ}|  d|k¡ |  d|k¡ |  d|j¡ d S )	NT)r<   s   Ã©Úutf8)ÚfromEncodingr   rt   Zfrom_encoding)rA   rB   r   rE   rF   ri   r   r'   )r   rH   rs   r   rI   r!   r!   r"   Ú*test_fromEncoding_renamed_to_from_encoding	  s    z7TestWarnings.test_fromEncoding_renamed_to_from_encodingc             C   s   | j t| jddd d S )Nz<a>T)Zno_such_argument)ÚassertRaisesÚ	TypeErrorr   )r   r!   r!   r"   Ú"test_unrecognized_keyword_argument  s    z/TestWarnings.test_unrecognized_keyword_argumentc          	   C   s’   t  ¡ }|j}zFtjdd}|  |¡}W d Q R X |  |t¡}|  dt	|j
ƒk¡ W d | ¡  X tjdd}|  |¡}W d Q R X |  g |¡ d S )NT)r<   zlooks like a filename)ÚtempfileÚNamedTemporaryFileÚnamerA   rB   r   rg   r   ri   rE   rF   Úcloser   )r   Z
filehandleÚfilenamerH   r   rj   r!   r!   r"   Útest_disk_file_warning  s    
z#TestWarnings.test_disk_file_warningc          	   C   sF   t jdd}|  d¡}W d Q R X |  |t¡}|  dt|jƒk¡ d S )NT)r<   s   http://www.crummybytes.com/zlooks like a URL)rA   rB   r   rg   r   ri   rE   rF   )r   Úwarning_listr   rj   r!   r!   r"   Útest_url_warning_with_bytes_url&  s
    z,TestWarnings.test_url_warning_with_bytes_urlc          	   C   sF   t jdd}|  d¡}W d Q R X |  |t¡}|  dt|jƒk¡ d S )NT)r<   zhttp://www.crummyunicode.com/zlooks like a URL)rA   rB   r   rg   r   ri   rE   rF   )r   r   r   rj   r!   r!   r"   Ú!test_url_warning_with_unicode_url.  s
    z.TestWarnings.test_url_warning_with_unicode_urlc          	   C   s>   t jdd}|  d¡}W d Q R X |  tdd„ |D ƒƒ¡ d S )NT)r<   s$   http://www.crummybytes.com/ is greatc             s   s   | ]}d t |jƒkV  qdS )zlooks like a URLN)rE   rF   )rV   rH   r!   r!   r"   rX   =  s   zETestWarnings.test_url_warning_with_bytes_and_space.<locals>.<genexpr>)rA   rB   r   ÚassertFalseÚany)r   r   r   r!   r!   r"   Ú%test_url_warning_with_bytes_and_space8  s    z2TestWarnings.test_url_warning_with_bytes_and_spacec          	   C   s>   t jdd}|  d¡}W d Q R X |  tdd„ |D ƒƒ¡ d S )NT)r<   z%http://www.crummyuncode.com/ is greatc             s   s   | ]}d t |jƒkV  qdS )zlooks like a URLN)rE   rF   )rV   rH   r!   r!   r"   rX   C  s   zGTestWarnings.test_url_warning_with_unicode_and_space.<locals>.<genexpr>)rA   rB   r   r‚   rƒ   )r   r   r   r!   r!   r"   Ú'test_url_warning_with_unicode_and_space@  s    z4TestWarnings.test_url_warning_with_unicode_and_spaceN)r6   r7   r8   rg   rk   rl   rn   ro   rr   ru   rx   r~   r€   r   r„   r…   r!   r!   r!   r"   rd   ã   s   	
rd   c               @   s   e Zd Zdd„ ZdS )ÚTestSelectiveParsingc             C   s.   d}t dƒ}| j||d}|  | ¡ d¡ d S )Nz&No<b>Yes</b><a>No<b>Yes <c>Yes</c></b>r]   )rq   s   <b>Yes</b><b>Yes <c>Yes</c></b>)r   r   r   r&   )r   r0   Zstrainerr   r!   r!   r"   Útest_parse_with_soupstrainerI  s    z1TestSelectiveParsing.test_parse_with_soupstrainerN)r6   r7   r8   r‡   r!   r!   r!   r"   r†   G  s   r†   c               @   sx   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S )ÚTestEntitySubstitutionz1Standalone tests of the EntitySubstitution class.c             C   s
   t | _d S )N)r   Úsub)r   r!   r!   r"   ÚsetUpR  s    zTestEntitySubstitution.setUpc             C   s   d}|   | j |¡d¡ d S )Nu   fooâˆ€â˜ƒÃµbaru   foo&forall;â˜ƒ&otilde;bar)r   r‰   Úsubstitute_html)r   rb   r!   r!   r"   Útest_simple_html_substitutionU  s    z4TestEntitySubstitution.test_simple_html_substitutionc             C   s&   d}t |ƒ}|  | j |j¡d¡ d S )Ns   ‘’foo“”z&lsquo;&rsquo;foo&ldquo;&rdquo;)r   r   r‰   r‹   r0   )r   ÚquotesÚdammitr!   r!   r"   Útest_smart_quote_substitution\  s    z4TestEntitySubstitution.test_smart_quote_substitutionc             C   s   d}|   | j |d¡|¡ d S )NzWelcome to "my bar"F)r   r‰   Úsubstitute_xml)r   rb   r!   r!   r"   ÚItest_xml_converstion_includes_no_quotes_if_make_quoted_attribute_is_falsed  s    z`TestEntitySubstitution.test_xml_converstion_includes_no_quotes_if_make_quoted_attribute_is_falsec             C   s0   |   | j dd¡d¡ |   | j dd¡d¡ d S )NZWelcomeTz	"Welcome"z	Bob's Barz"Bob's Bar")r   r‰   r   )r   r!   r!   r"   Ú6test_xml_attribute_quoting_normally_uses_double_quotesh  s    zMTestEntitySubstitution.test_xml_attribute_quoting_normally_uses_double_quotesc             C   s   d}|   | j |d¡d¡ d S )NzWelcome to "my bar"Tz'Welcome to "my bar"')r   r‰   r   )r   rb   r!   r!   r"   ÚOtest_xml_attribute_quoting_uses_single_quotes_when_value_contains_double_quotesn  s    zfTestEntitySubstitution.test_xml_attribute_quoting_uses_single_quotes_when_value_contains_double_quotesc             C   s   d}|   | j |d¡d¡ d S )NzWelcome to "Bob's Bar"Tz""Welcome to &quot;Bob's Bar&quot;")r   r‰   r   )r   rb   r!   r!   r"   Úbtest_xml_attribute_quoting_escapes_single_quotes_when_value_contains_both_single_and_double_quotess  s    zyTestEntitySubstitution.test_xml_attribute_quoting_escapes_single_quotes_when_value_contains_both_single_and_double_quotesc             C   s   d}|   | j |¡|¡ d S )NzWelcome to "Bob's Bar")r   r‰   r   )r   Úquotedr!   r!   r"   Ú<test_xml_quotes_arent_escaped_when_value_is_not_being_quotedy  s    zSTestEntitySubstitution.test_xml_quotes_arent_escaped_when_value_is_not_being_quotedc             C   s   |   | j d¡d¡ d S )Nzfoo<bar>zfoo&lt;bar&gt;)r   r‰   r   )r   r!   r!   r"   Ú'test_xml_quoting_handles_angle_brackets}  s    
z>TestEntitySubstitution.test_xml_quoting_handles_angle_bracketsc             C   s   |   | j d¡d¡ d S )NzAT&TzAT&amp;T)r   r‰   r   )r   r!   r!   r"   Ú#test_xml_quoting_handles_ampersands‚  s    z:TestEntitySubstitution.test_xml_quoting_handles_ampersandsc             C   s   |   | j d¡d¡ d S )Nz&Aacute;T&Tz&amp;Aacute;T&amp;T)r   r‰   r   )r   r!   r!   r"   ÚEtest_xml_quoting_including_ampersands_when_they_are_part_of_an_entity…  s    
z\TestEntitySubstitution.test_xml_quoting_including_ampersands_when_they_are_part_of_an_entityc             C   s   |   | j d¡d¡ d S )Nz&Aacute;T&Tz&Aacute;T&amp;T)r   r‰   Z"substitute_xml_containing_entities)r   r!   r!   r"   ÚDtest_xml_quoting_ignoring_ampersands_when_they_are_part_of_an_entityŠ  s    
z[TestEntitySubstitution.test_xml_quoting_ignoring_ampersands_when_they_are_part_of_an_entityc             C   s   d}|   | j |¡|¡ dS )z:There's no need to do this except inside attribute values.zBob's "bar"N)r   r‰   r‹   )r   Útextr!   r!   r"   Ú test_quotes_not_html_substituted  s    z7TestEntitySubstitution.test_quotes_not_html_substitutedN)r6   r7   r8   Ú__doc__rŠ   rŒ   r   r‘   r’   r“   r”   r–   r—   r˜   r™   rš   rœ   r!   r!   r!   r"   rˆ   P  s   rˆ   c                   sN   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Zee	dƒdd„ ƒZ
‡  ZS )ÚTestEncodingConversionc                s4   t t| ƒ ¡  d| _| j d¡| _|  | jd¡ d S )NuU   <html><head><meta charset="utf-8"/></head><body><foo>SacrÃ© bleu!</foo></body></html>zutf-8sU   <html><head><meta charset="utf-8"/></head><body><foo>SacrÃ© bleu!</foo></body></html>)Úsuperrž   rŠ   Úunicode_datar&   r(   r   )r   )Ú	__class__r!   r"   rŠ   ™  s    zTestEncodingConversion.setUpc          	   C   s’   t jj}t tj¡ zbdd„ }|t j_d}|  |¡}| ¡ }|  t	|t
ƒ¡ |  ||  | ¡ ¡¡ |  |j ¡ d¡ W d t tj¡ |t j_X d S )Nc             S   s   d S )Nr!   )rE   r!   r!   r"   Únoop¨  s    z>TestEncodingConversion.test_ascii_in_unicode_out.<locals>.noops   <foo>a</foo>zutf-8)Úbs4rŽ   Úchardet_dammitÚloggingÚdisableÚWARNINGr   Údecoderi   rC   rE   r   Zdocument_forr'   ÚlowerÚNOTSET)r   Úchardetr¢   ÚasciiZsoup_from_asciiZunicode_outputr!   r!   r"   Útest_ascii_in_unicode_out¢  s    
z0TestEncodingConversion.test_ascii_in_unicode_outc             C   s@   |   | j¡}|  | ¡ | j¡ |  |jjd¡ |  |jd ¡ d S )Nu   SacrÃ© bleu!)r   r    r   r¨   Úfoor   r'   )r   Úsoup_from_unicoder!   r!   r"   Útest_unicode_in_unicode_out¶  s    z2TestEncodingConversion.test_unicode_in_unicode_outc             C   s2   |   | j¡}|  | ¡ | j¡ |  |jjd¡ d S )Nu   SacrÃ© bleu!)r   r(   r   r¨   r    r®   r   )r   Zsoup_from_utf8r!   r!   r"   Útest_utf8_in_unicode_out¾  s    z/TestEncodingConversion.test_utf8_in_unicode_outc             C   s$   |   | j¡}|  | d¡| j¡ d S )Nzutf-8)r   r    r   r&   r(   )r   r¯   r!   r!   r"   Útest_utf8_outÅ  s    z$TestEncodingConversion.test_utf8_outzQBad HTMLParser detected; skipping test of non-ASCII characters in attribute name.c             C   s(   d}|   |  |¡j d¡| d¡¡ d S )Nu    <div><a â˜ƒ="snowman"></a></div>rs   )r   r   r_   r&   )r   r0   r!   r!   r"   Ú1test_attribute_name_containing_unicode_charactersÊ  s    zHTestEncodingConversion.test_attribute_name_containing_unicode_characters)r6   r7   r8   rŠ   r­   r°   r±   r²   r   ÚPYTHON_3_PRE_3_2r³   Ú__classcell__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"d#„ Zd$d%„ Zd&S )'ÚTestUnicodeDammitz"Standalone tests of UnicodeDammit.c             C   s   d}t |ƒ}|  |j|¡ d S )Nu   I'm already Unicode! â˜ƒ)r   r   Úunicode_markup)r   r0   rŽ   r!   r!   r"   Útest_unicode_inputÔ  s    z$TestUnicodeDammit.test_unicode_inputc             C   s   d}t |ƒ}|  |jd¡ d S )Ns   <foo>‘’“”</foo>u   <foo>â€˜â€™â€œâ€</foo>)r   r   r·   )r   r0   rŽ   r!   r!   r"   Útest_smart_quotes_to_unicodeÙ  s    z.TestUnicodeDammit.test_smart_quotes_to_unicodec             C   s"   d}t |dd}|  |jd¡ d S )Ns   <foo>‘’“”</foo>Úxml)Úsmart_quotes_toz+<foo>&#x2018;&#x2019;&#x201C;&#x201D;</foo>)r   r   r·   )r   r0   rŽ   r!   r!   r"   Ú!test_smart_quotes_to_xml_entitiesß  s    z3TestUnicodeDammit.test_smart_quotes_to_xml_entitiesc             C   s"   d}t |dd}|  |jd¡ d S )Ns   <foo>‘’“”</foo>rm   )r»   z'<foo>&lsquo;&rsquo;&ldquo;&rdquo;</foo>)r   r   r·   )r   r0   rŽ   r!   r!   r"   Ú"test_smart_quotes_to_html_entitieså  s    z4TestUnicodeDammit.test_smart_quotes_to_html_entitiesc             C   s"   d}t |dd}|  |jd¡ d S )Ns   <foo>‘’“”</foo>r¬   )r»   z<foo>''""</foo>)r   r   r·   )r   r0   rŽ   r!   r!   r"   Útest_smart_quotes_to_asciië  s    z,TestUnicodeDammit.test_smart_quotes_to_asciic             C   s0   d}t |ƒ}|  |j ¡ d¡ |  |jd¡ d S )Ns   SacrÃ© bleu! â˜ƒzutf-8u   SacrÃ© bleu! â˜ƒ)r   r   r'   r©   r·   )r   rs   rŽ   r!   r!   r"   Útest_detect_utf8ñ  s    z"TestUnicodeDammit.test_detect_utf8c             C   s4   d}t |dgƒ}|  |j ¡ d¡ |  |jd¡ d S )Ns   íåìùz
iso-8859-8u   ××•×œ×©)r   r   r'   r©   r·   )r   ÚhebrewrŽ   r!   r!   r"   Útest_convert_hebrewø  s    z%TestUnicodeDammit.test_convert_hebrewc             C   s6   d}t |ƒ}|  |j ¡ d¡ |  |j d¡|¡ d S )Ns   ã‚±ãƒ¼ã‚¿ã‚¤ Watchzutf-8)r   r   r'   r©   r·   r&   )r   Úutf_8rŽ   r!   r!   r"   Ú/test_dont_see_smart_quotes_where_there_are_noneþ  s    zATestUnicodeDammit.test_dont_see_smart_quotes_where_there_are_nonec             C   s,   d  d¡}t|dgƒ}|  |j ¡ d¡ d S )Nu   RÃ¤ksmÃ¶rgÃ¥szutf-8z
iso-8859-8)r&   r   r   r'   r©   )r   r(   rŽ   r!   r!   r"   Ú test_ignore_inappropriate_codecs  s    
z2TestUnicodeDammit.test_ignore_inappropriate_codecsc             C   s:   d  d¡}x*dD ]"}t||gƒ}|  |j ¡ d¡ qW d S )Nu   RÃ¤ksmÃ¶rgÃ¥szutf-8)z.utf8z...z
utF---16.!)r&   r   r   r'   r©   )r   r(   Zbad_encodingrŽ   r!   r!   r"   Útest_ignore_invalid_codecs	  s    

z,TestUnicodeDammit.test_ignore_invalid_codecsc             C   sL   d  d¡}t|dgd}|  |j ¡ d¡ t|ddgd}|  |jd ¡ d S )Nu   RÃ¤ksmÃ¶rgÃ¥szutf-8)r%   zwindows-1252)r&   r   r   r'   r©   )r   r(   rŽ   r!   r!   r"   r)     s    
z(TestUnicodeDammit.test_exclude_encodingsc             C   s"   t dƒ}t|jƒ}d|kst‚d S )Ns'   <?xml version="1.0" encoding="UTF-Û" ?>u   utf-ï¿½)r   ÚlistÚ	encodingsrD   )r   ZdetectedrÇ   r!   r!   r"   ÚPtest_encoding_detector_replaces_junk_in_encoding_name_with_replacement_character  s    
zbTestUnicodeDammit.test_encoding_detector_replaces_junk_in_encoding_name_with_replacement_characterc             C   s,   x&dD ]}t |dd}|  d|j¡ qW d S )N)s&   <html><meta charset="euc-jp" /></html>s&   <html><meta charset='euc-jp' /></html>s$   <html><meta charset=euc-jp /></html>s#   <html><meta charset=euc-jp/></html>T)Úis_htmlzeuc-jp)r   r   r'   )r   r    rŽ   r!   r!   r"   Ú test_detect_html5_style_meta_tag#  s
    z2TestUnicodeDammit.test_detect_html5_style_meta_tagc          	   C   s„   d}t jj}t tj¡ zPdd„ }|t j_t|ƒ}|  d|j¡ |  	d|j
k¡ t|dƒ}|  	|j¡ W d t tj¡ |t j_X d S )NsT   ï»¿<?xml version="1.0" encoding="UTF-8"?>
<html><b>Ø¨ØªØ±</b>
<i>ÈÒÑÊÑíä</i></html>c             S   s   d S )Nr!   )rE   r!   r!   r"   r¢   D  s    zBTestUnicodeDammit.test_last_ditch_entity_replacement.<locals>.noopTu   ï¿½zhtml.parser)r£   rŽ   r¤   r¥   r¦   r§   r   r   Zcontains_replacement_charactersri   r·   r   rª   )r   Údocr«   r¢   rŽ   r   r!   r!   r"   Ú"test_last_ditch_entity_replacement.  s    
z4TestUnicodeDammit.test_last_ditch_entity_replacementc             C   s,   d}t |ƒ}|  d|j¡ |  d|j¡ d S )Ns   ÿþ< a > á é < / a > u   <a>Ã¡Ã©</a>zutf-16le)r   r   r·   r'   )r   r    rŽ   r!   r!   r"   Útest_byte_order_mark_removedQ  s    z.TestUnicodeDammit.test_byte_order_mark_removedc             C   sP   d  d¡}d  d¡}|| | }|  t|jd¡ t |¡}|  d| d¡¡ d S )Nu	   â˜ƒâ˜ƒâ˜ƒrs   u   â€œHi, I like Windows!â€Úwindows_1252u+   â˜ƒâ˜ƒâ˜ƒâ€œHi, I like Windows!â€â˜ƒâ˜ƒâ˜ƒ)r&   rv   ÚUnicodeDecodeErrorr¨   r   Ú	detwingler   )r   rs   rÎ   rË   Zfixedr!   r!   r"   Útest_detwingleX  s    

z TestUnicodeDammit.test_detwinglec             C   sB   x<dD ]4}|  d¡}|  | d¡¡ t |¡}|  ||¡ qW d S )N)u   Å“u   â‚“u   Ã°ÂÂÂ“rs   ó   “)r&   ri   Úendswithr   rÐ   r   )r   Ztricky_unicode_charÚinputÚoutputr!   r!   r"   Ú+test_detwingle_ignores_multibyte_charactersp  s    

z=TestUnicodeDammit.test_detwingle_ignores_multibyte_charactersc             C   sø   d}|  d¡}d}|  d¡}tj}|  d ||dd¡ |  d||dd¡ |  d||dd¡ |  d||ƒ¡ |  d||ƒ¡ d	d
 }|  d ||| ƒ¡ |  d ||| ƒ¡ |  d||| ddd¡ |  d||dd¡ |  d |d| dd¡ d S )Nz0<html><head><meta charset="utf-8"></head></html>r¬   z,<?xml version="1.0" encoding="ISO-8859-1" ?>F)rÉ   zutf-8Tz
iso-8859-1ó    iˆ  )rÉ   Úsearch_entire_document)rØ   ó   a)r&   r   Zfind_declared_encodingr   )r   Zhtml_unicodeZ
html_bytesZxml_unicodeZ	xml_bytesÚmZspacerr!   r!   r"   Útest_find_declared_encoding  s*    

z-TestUnicodeDammit.test_find_declared_encodingN)r6   r7   r8   r   r¸   r¹   r¼   r½   r¾   r¿   rÁ   rÃ   rÄ   rÅ   r)   rÈ   rÊ   rÌ   rÍ   rÑ   rÖ   rÛ   r!   r!   r!   r"   r¶   Ñ  s&   #r¶   c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestNamedspacedAttributec             C   s.   t dd ƒ}|  |d¡ t dƒ}|  |d¡ d S )NÚxmlns)r   r   )r   rO   r!   r!   r"   Ú test_name_may_be_none_or_missing¯  s    
z9TestNamedspacedAttribute.test_name_may_be_none_or_missingc             C   s   t ddƒ}|  d|¡ d S )NrO   r]   za:b)r   r   )r   rO   r!   r!   r"   Ú6test_attribute_is_equivalent_to_colon_separated_string¶  s    
zOTestNamedspacedAttribute.test_attribute_is_equivalent_to_colon_separated_stringc             C   sp   t dddƒ}t dddƒ}|  ||¡ t ddd ƒ}|  ||¡ t dddƒ}|  ||¡ t dddƒ}|  ||¡ d S )NrO   r]   ÚcÚz)r   r   ZassertNotEqual)r   rO   r]   rà   ÚdÚer!   r!   r"   Ú;test_attributes_are_equivalent_if_prefix_and_name_identicalº  s    zTTestNamedspacedAttribute.test_attributes_are_equivalent_if_prefix_and_name_identicalN)r6   r7   r8   rÞ   rß   rä   r!   r!   r!   r"   rÜ   ­  s   rÜ   c               @   s   e Zd Zdd„ Zdd„ ZdS )Ú)TestAttributeValueWithCharsetSubstitutionc             C   s8   t dƒ}|  d|¡ |  d|j¡ |  d| d¡¡ d S )Nzeuc-jprs   )r	   r   Úoriginal_valuer&   )r   r:   r!   r!   r"   Ú!test_content_meta_attribute_valueÍ  s    zKTestAttributeValueWithCharsetSubstitution.test_content_meta_attribute_valuec             C   s8   t dƒ}|  d|¡ |  d|j¡ |  d| d¡¡ d S )Nztext/html; charset=euc-jpztext/html; charset=utf8rs   )r   r   ræ   r&   )r   r:   r!   r!   r"   rç   Ô  s    N)r6   r7   r8   rç   r!   r!   r!   r"   rå   Ë  s   rå   )0r   Úpdbr   r¥   ZunittestÚsysry   r£   r   r   r   r   Zbs4.builderr   r   Zbs4.elementr	   r
   r   r   r   r   r   Z
bs4.dammitr   r   r   Zbs4.testingr   r   r   rA   r   r   ZLXML_PRESENTÚImportErrorrã   Úversion_infor´   r   rd   r†   ZTestCaserˆ   rž   r¶   rÜ   rå   r!   r!   r!   r"   Ú<module>   s8   $
 1d	E< ]