U
    }gX                     @   s8  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 ddlmZmZmZmZmZmZ ddlmZ ddlmZ dd	lmZ d
dlmZmZmZ ddlZddlmZ G dd deZG dd deZ G dd deZ!G dd deZ"G dd deZ#G dd deZ$G dd deZ%G dd deZ&dS )z#Tests of Beautiful Soup as a whole.    N)Iterable)BeautifulSoupGuessedAtParserWarningdammit)TreeBuilder)AttributeValueListXMLAttributeDictCommentPYTHON_SPECIFIC_ENCODINGSTagNavigableString)SoupStrainerParserRejectedMarkup)MarkupResemblesLocatorWarning   )default_builderLXML_PRESENTSoupTest)Typec                   @   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
ejddddd gdd ZdS )TestConstructorc                 C   s"   d}|  |}d|jjkstd S )Nu   <h1>éé</h1>u   éésouph1stringAssertionErrorselfdatar    r   7/tmp/pip-unpacked-wheel-kgiupv3k/bs4/tests/test_soup.pytest_short_unicode_input,   s    
z(TestConstructor.test_short_unicode_inputc                 C   s"   d}|  |}d|jjkstd S )Nz<h1>foo bar</h1>zfoo barr   r   r   r   r    test_embedded_null1   s    
z"TestConstructor.test_embedded_nullc                 C   s,   d d}| j|dgd}d|jks(td S )Nu   Räksmörgåsutf-8)Zexclude_encodingszwindows-1252)encoder   original_encodingr   )r   	utf8_datar   r   r   r    test_exclude_encodings6   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 5 Q R X t|j|sVttdd	|jjksltd
|jj	ks|t|f |}tjdd}td|dd}W 5 Q R X t
|d j}|dst||jkst||jkst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                 [   s4   || _ d| _d| _g | _g | _i | _t| _t| _	d S )NTF)
called_withis_xmlZstore_line_numbersZcdata_list_attributesZpreserve_whitespace_tagsstring_containersr   Zattribute_dict_classr   Zattribute_value_list_class)r   kwargsr   r   r    __init__?   s    z@TestConstructor.test_custom_builder_class.<locals>.Mock.__init__c                 S   s   d S Nr   r   r   r   r   r    initialize_soupI   s    zGTestConstructor.test_custom_builder_class.<locals>.Mock.initialize_soupc                 S   s
   || _ d S r-   )fed)r   markupr   r   r    feedL   s    z<TestConstructor.test_custom_builder_class.<locals>.Mock.feedc                 S   s   d S r-   r   r   r   r   r    resetO   s    z=TestConstructor.test_custom_builder_class.<locals>.Mock.resetc                 S   s   d S r-   r   )r   ignorer   r   r    r5   R   s    z>TestConstructor.test_custom_builder_class.<locals>.Mock.ignorec                    s
   dV  d S )N)prepared markupzoriginal encodingzdeclared encodingzcontains replacement charactersr   r   argsr+   r   r   r    prepare_markupW   s    zFTestConstructor.test_custom_builder_class.<locals>.Mock.prepare_markupN)__name__
__module____qualname__r,   r/   r2   r4   r5   Zset_up_substitutionsZcan_be_empty_elementr9   r   r   r   r    Mock>   s   
r=   valueT)varZconvertEntitiesrecord builder)r?   r6   )rC   Zignored_valuer   zCKeyword arguments to the BeautifulSoup constructor will be ignored.)rB   )objectdictwarningscatch_warningsr   
isinstancerC   r   r(   r0   strmessage
startswith)r   r=   r+   r   rC   wmsgr   r   r    test_custom_builder_class;   s.    !
z)TestConstructor.test_custom_builder_classc              	   C   sP   G dd dt }dd }tt}td|d W 5 Q R X dt|jksLt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   r7   r   r   r    r2      s    z?TestConstructor.test_parser_markup_rejection.<locals>.Mock.feedN)r:   r;   r<   r2   r   r   r   r    r=      s   r=   c                    s    |d d dfV  |d d dfV  d S NFr   )r   r1   r8   r+   r   r   r    r9      s    zDTestConstructor.test_parser_markup_rejection.<locals>.prepare_markuprB   )rC   zoThe markup you provided was rejected by the parser. Trying a different parser or a different encoding may help.)r   pytestraisesr   r   rI   r>   r   )r   r=   r9   exc_infor   r   r    test_parser_markup_rejection|   s    z,TestConstructor.test_parser_markup_rejectionc              
   C   s   d}|  |}|j}d|d ks$tddg|d ks8t| j |td d}d|jd ksZtddiddifD ]V}tjd	d
 | j |d |d}W 5 Q R X |j}ddg|d kstd|d ksjtqjd S )Nz&<a id=" an id " class=" a class "></a>z an id idaclass)rC   Zmulti_valued_attributesz	 a class *Tr@   Zan)r   rU   r   r   rF   rG   )r   r1   r   rU   Z
switcheroor   r   r    test_cdata_list_attributes   s"    
  z*TestConstructor.test_cdata_list_attributesc                    sn   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
|jD sjtd S )Nc                   @   s   e Zd ZdS )z9TestConstructor.test_replacement_classes.<locals>.TagPlusNr:   r;   r<   r   r   r   r    TagPlus   s   rZ   c                   @   s   e Zd ZdS )z<TestConstructor.test_replacement_classes.<locals>.StringPlusNrY   r   r   r   r    
StringPlus   s   r[   c                   @   s   e Zd ZdS )z=TestConstructor.test_replacement_classes.<locals>.CommentPlusNrY   r   r   r   r    CommentPlus   s   r\   z<a><b>foo</b>bar</a><!--whee-->)Zelement_classesc                 3   s   | ]}t | fV  qd S r-   )rH   .0xr\   r[   rZ   r   r    	<genexpr>   s    z;TestConstructor.test_replacement_classes.<locals>.<genexpr>)r   r   r	   r   allZdescendantsr   r.   r   r`   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|jjD ]}t||shtqhg |j	kstd S )	Nc                   @   s   e Zd ZdS )zATestConstructor.test_alternate_string_containers.<locals>.PStringNrY   r   r   r   r    PString   s   rd   c                   @   s   e Zd ZdS )zATestConstructor.test_alternate_string_containers.<locals>.BStringNrY   r   r   r   r    BString   s   re   z4<div>Hello.<p>Here is <b>some <i>bolded</i></b> text)bp)r*   r   )
r   r   rH   divcontentsr   rg   rf   stringsZstring_container_stack)r   rd   re   r   sr   r   r     test_alternate_string_containers   s    	z0TestConstructor.test_alternate_string_containers
bad_markupr   Fc                 C   s   dS rO   r   )r_   r   r   r    <lambda>       zTestConstructor.<lambda>c              	   C   s>   t t}t|d W 5 Q R X d|dt|jks:td S )Nhtml.parserz'Incoming markup is of an invalid type: z?. Markup must be a string, a bytestring, or an open filehandle.)rP   rQ   	TypeErrorr   rI   r>   r   )r   rm   rR   r   r   r    test_invalid_markup_type   s    
z(TestConstructor.test_invalid_markup_typeN)r:   r;   r<   r!   r"   r'   rN   rS   rX   rc   rl   rP   markparametrizerr   r   r   r   r    r   +   s   A!r   c                   @   sT   e Zd Zejdddgdd Zejddd eD d	g d
d Zdd Z	d	S )
TestOutputz!eventual_encoding,actual_encoding)r#   r#   )utf-16rv   c                 C   s0   |  d}d|_d| d|j|dks,td S )N<tag></tag>Tz<?xml version="1.0" encoding="z"?>
<tag></tag>eventual_encoding)r   r)   decoder   )r   ry   Zactual_encodingr   r   r   r    test_decode_xml_declaration   s    


z&TestOutput.test_decode_xml_declarationry   c                 C   s   g | ]}|qS r   r   r]   r   r   r    
<listcomp>  s     zTestOutput.<listcomp>Nc                 C   s(   t dd}d|_d|j|dks$td S )Nrw   rp   Tz!<?xml version="1.0"?>
<tag></tag>rx   )r   r)   rz   r   )r   ry   r   r   r   r    Mtest_decode_xml_declaration_with_missing_or_python_internal_eventual_encoding
  s
    	
zXTestOutput.test_decode_xml_declaration_with_missing_or_python_internal_eventual_encodingc                 C   sV   |  d}d|jddkstd|jddks2td| ksBtd| ksRtd S )Nrw   s   <tag></tag>r#   )encodingz<tag>
</tag>
)r   r$   r   Zencode_contentsZdecode_contentsZprettifyr.   r   r   r    test  s
    
zTestOutput.test)
r:   r;   r<   rP   rs   rt   r{   r
   r}   r   r   r   r   r    ru      s   
 
ru   c                   @   s  e Zd Zeej ee ejdddZeej dd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jdddddddddgdd  Zejdd!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9gd:d; Zd<d= Zd>d? Zd@dA ZdBdC ZdS )DTestWarnings)rF   clsreturnc                 C   s@   |D ]&}t |j|r|jtks"t|  S qtd||f d S )Nz%s warning not found in %r)rH   rJ   filename__file__r   	Exception)r   rF   r   rL   r   r   r    _assert_warning,  s
    
zTestWarnings._assert_warningN)rL   r   c                 C   s2   |  |t}t|j}|tjd d s.td S )N<   )r   r   rI   rJ   rK   ZMESSAGEr   )r   rL   warningrJ   r   r   r    _assert_no_parser_specified5  s    
z(TestWarnings._assert_no_parser_specifiedc              	   C   s.   t jdd}td W 5 Q R X | | d S NTr@   <a><b></b></a>rF   rG   r   r   r   rL   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 5 Q R X | | d S )NTr@   r   htmlr   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}| d W 5 Q R X g |ks.td S r   rF   rG   r   r   r   r   r   r    ,test_no_warning_if_explicit_parser_specifiedD  s    z9TestWarnings.test_no_warning_if_explicit_parser_specifiedc              	   C   sZ   t ddd}tjdd}| jd|d W 5 Q R X | |t}t|j}|dsVt	d S )	NrU   rf   )namer   Tr@   r   
parse_onlyz7The given value for parse_only will exclude everything:)
r   rF   rG   r   r   UserWarningrI   rJ   rK   r   )r   strainerrL   r   rM   r   r   r    +test_warning_if_strainer_filters_everythingI  s    
z8TestWarnings.test_warning_if_strainer_filters_everythingc              	   C   sl   t jdd}tddtdd}W 5 Q R X | |t}t|j}d|ksLtd|ksXtd	|	 kshtd S )
NTr@   r   rp   rf   )parseOnlyTheser   r   s   <b></b>)
rF   rG   r   r   r   DeprecationWarningrI   rJ   r   r$   )r   rL   r   r   rM   r   r   r    )test_parseOnlyThese_renamed_to_parse_onlyQ  s    
z6TestWarnings.test_parseOnlyThese_renamed_to_parse_onlyc              	   C   sj   t jdd}d}t|ddd}W 5 Q R X | |t}t|j}d|ksLtd|ksXtd|jksftd S )	NTr@   s   érp   utf8)fromEncodingr   Zfrom_encoding)	rF   rG   r   r   r   rI   rJ   r   r%   )r   rL   r   r   r   rM   r   r   r    *test_fromEncoding_renamed_to_from_encoding^  s    
z7TestWarnings.test_fromEncoding_renamed_to_from_encodingc              	   C   s(   t t | jddd W 5 Q R X d S )Nz<a>T)Zno_such_argument)rP   rQ   rq   r   r3   r   r   r    "test_unrecognized_keyword_argumenth  s    z/TestWarnings.test_unrecognized_keyword_argumentr1   zmarkup.htmlz
markup.htmzmarkup.HTMLz
markup.txtzmarkup.xhtmlz
markup.xmlz/home/user/file.txtz/c:\user\file.html\\server\share\path\file.XhTmlc              	   C   sD   t jdd.}t|d | |t}dt|jks6tW 5 Q R X d S )NTr@   rp   zlooks more like a filenamerF   rG   r   r   r   rI   rJ   r   )r   r1   rL   r   r   r   r    test_resembles_filename_warningl  s    
z,TestWarnings.test_resembles_filename_warningr   Z
markuphtmlz
markup.comrB   z	markup.jsz
markup.jpgzmarkup.markupz/home/user/filez)c:\user\file.html\\server\share\path\filezAlog message containing a url http://www.url.com/ right there.htmlztwo  consecutive  spaces.htmlztwo//consecutive//slashes.htmlz4looks/like/a/filename/but/oops/theres/a#comment.htmlztwo
lines.htmlzcontains?.htmlzcontains*.htmlzcontains#.htmlzcontains&.htmlzcontains;.htmlzcontains>.htmlzcontains<.htmlzcontains$.htmlzcontains|.htmlzcontains:.htmlz:-at-the-front.htmlc              	   C   s2   t jdd}| | W 5 Q R X g |ks.td S )NTr@   r   )r   r1   rL   r   r   r    "test_resembles_filename_no_warning  s    (z/TestWarnings.test_resembles_filename_no_warningc              	   C   s`   d}t jdd}t|d W 5 Q R X | |t}dt|jksDt|t|jdks\td S )Ns   http://www.crummybytes.com/Tr@   rp   looks more like a URLr   )	rF   rG   r   r   r   rI   rJ   r   r$   r   urlwarning_listr   r   r   r    test_url_warning_with_bytes_url  s    z,TestWarnings.test_url_warning_with_bytes_urlc              	   C   sZ   d}t jdd}t|d W 5 Q R X | |t}dt|jksDt|t|jksVtd S )Nzhttp://www.crummyunicode.com/Tr@   rp   r   r   r   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 5 Q R X tdd |D r8td S )NTr@   s$   http://www.crummybytes.com/ is greatc                 s   s   | ]}d t |jkV  qdS r   NrI   rJ   r^   rL   r   r   r    ra     s     zETestWarnings.test_url_warning_with_bytes_and_space.<locals>.<genexpr>rF   rG   r   anyr   r   r   r   r   r    %test_url_warning_with_bytes_and_space  s    z2TestWarnings.test_url_warning_with_bytes_and_spacec              	   C   s<   t jdd}| d W 5 Q R X tdd |D r8td S )NTr@   z&http://www.crummyunicode.com/ is greatc                 s   s   | ]}d t |jkV  qdS r   r   r   r   r   r    ra     s     zGTestWarnings.test_url_warning_with_unicode_and_space.<locals>.<genexpr>r   r   r   r   r    'test_url_warning_with_unicode_and_space  s    z4TestWarnings.test_url_warning_with_unicode_and_space)r:   r;   r<   r   rF   WarningMessager   Warningr   r   r   r   r   r   r   r   r   rP   rs   rt   r   r   r   r   r   r   r   r   r   r    r   $  sv   	 	

$

r   c                   @   s   e Zd Zdd ZdS )TestSelectiveParsingc                 C   s.   d}t d}| j||d}| dks*td S )Nz&No<b>Yes</b><a>No<b>Yes <c>Yes</c></b>rf   r   s   <b>Yes</b><b>Yes <c>Yes</c></b>)r   r   r$   r   )r   r1   r   r   r   r   r    test_parse_with_soupstrainer  s    z1TestSelectiveParsing.test_parse_with_soupstrainerN)r:   r;   r<   r   r   r   r   r    r     s   r   c                   @   s:   e Zd ZdZdd Zejje dddd Z	dd	 Z
d
S )
TestNewTagz(Test the BeautifulSoup.new_tag() method.c                 C   s   |  d}|jdddddid}t|ts.td|jks<t|jdksJttddd|jks`td |j	ksnt|d}d |jkst|jdd d	}d |jkst|jddd	}d|jkstd S )
NrB   footxtZbazr   za name)r   barattrs)r   r   )r   )
r   new_tagrH   r   r   r   r   rE   r   parent)r   r   r   r   r   r    test_new_tag  s    

zTestNewTag.test_new_tagz-lxml not installed, cannot parse XML document)reasonc                 C   sB   t dd}|d}|d}d| ks.td| ks>td S )NrB   xmlbrrg      <br/>s   <p/>r   r   r$   r   )r   Zxml_soupZxml_brZxml_pr   r   r    5test_xml_tag_inherits_self_closing_rules_from_builder  s
    


z@TestNewTag.test_xml_tag_inherits_self_closing_rules_from_builderc                 C   sB   t dd}|d}|d}d| ks.td| ks>td S )NrB   rp   r   rg   r   s   <p></p>r   )r   Z	html_soupZhtml_brZhtml_pr   r   r    1test_tag_inherits_self_closing_rules_from_builder  s
    


z<TestNewTag.test_tag_inherits_self_closing_rules_from_builderN)r:   r;   r<   __doc__r   rP   rs   Zskipifr   r   r   r   r   r   r    r     s    

r   c                   @   s    e Zd ZdZdd Zdd ZdS )TestNewStringz+Test the BeautifulSoup.new_string() method.c                 C   s2   |  d}|d}d|ks tt|ts.td S NrB   r   )r   
new_stringr   rH   r   r   r   rk   r   r   r    'test_new_string_creates_navigablestring  s    

z5TestNewString.test_new_string_creates_navigablestringc                 C   s4   |  d}|dt}d|ks"tt|ts0td S r   )r   r   r	   r   rH   r   r   r   r    3test_new_string_can_create_navigablestring_subclass  s    
zATestNewString.test_new_string_can_create_navigablestring_subclassN)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S )
TestPicklec                 C   s2   |  d}t|}t|}d|jjks.td S )Nz<a>some markup</a>some markup)r   pickledumpsloadsrU   r   r   r   r   ZpickledZ	unpickledr   r   r    test_normal_pickle  s    


zTestPickle.test_normal_picklec                 C   s6   |  d}d |_t|}t|}d|jks2td S )Nr   )r   rC   r   r   r   r   r   r   r   r   r    test_pickle_with_no_builder  s
    


z&TestPickle.test_pickle_with_no_builderN)r:   r;   r<   r   r   r   r   r   r    r     s   r   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TestEncodingConversionc                 C   s&   d| _ | j d| _| jdks"td S )NuU   <html><head><meta charset="utf-8"/></head><body><foo>Sacré bleu!</foo></body></html>r#   sU   <html><head><meta charset="utf-8"/></head><body><foo>Sacré bleu!</foo></body></html>)unicode_datar$   r&   r   r3   r   r   r    setup_method)  s    z#TestEncodingConversion.setup_methodc              	   C   s   t j}ttj z^dd }|t _d}| |}| }t|t	sFt
|| | ks\t
|j dksnt
W 5 ttj |t _X d S )Nc                 S   s   d S r-   r   )rI   r   r   r    noop9  s    z>TestEncodingConversion.test_ascii_in_unicode_out.<locals>.noops   <foo>a</foo>r#   )r   Z_chardet_dammitloggingdisableWARNINGNOTSETr   rz   rH   rI   r   Zdocument_forr%   lower)r   chardetr   asciiZsoup_from_asciiZunicode_outputr   r   r    test_ascii_in_unicode_out2  s    
z0TestEncodingConversion.test_ascii_in_unicode_outc                 C   s@   |  | j}| | jkst|jjdks.t|jd ks<td S Nu   Sacré bleu!)r   r   rz   r   r   r   r%   r   Zsoup_from_unicoder   r   r    test_unicode_in_unicode_outH  s    z2TestEncodingConversion.test_unicode_in_unicode_outc                 C   s2   |  | j}| | jkst|jjdks.td S r   )r   r&   rz   r   r   r   r   )r   Zsoup_from_utf8r   r   r    test_utf8_in_unicode_outP  s    z/TestEncodingConversion.test_utf8_in_unicode_outc                 C   s$   |  | j}|d| jks td S )Nr#   )r   r   r$   r&   r   r   r   r   r    test_utf8_outW  s    z$TestEncodingConversion.test_utf8_outN)r:   r;   r<   r   r   r   r   r   r   r   r   r    r   %  s
   	r   )'r   r   r   rP   typingr   Zbs4r   r   r   Zbs4.builderr   Zbs4.elementr   r   r	   r
   r   r   Z
bs4.filterr   Zbs4.exceptionsr   Zbs4._warningsr   rB   r   r   r   rF   r   r   ru   r   r   r   r   r   r   r   r   r   r    <module>   s.     L. ).