o
    tfM                     @   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ZddlZddl	m
Z
mZmZmZmZ ddlmZmZmZ ddlmZmZmZmZmZ ddlmZmZmZ ddl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.    )	set_traceN)BeautifulSoupBeautifulStoneSoupGuessedAtParserWarningMarkupResemblesLocatorWarningdammit)builder_registryTreeBuilderParserRejectedMarkup)CommentSoupStrainerPYTHON_SPECIFIC_ENCODINGSTagNavigableString   )default_builderLXML_PRESENTSoupTestc                   @   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   "   d}|  |}d|jjksJ d S )Nu   <h1>éé</h1>u   éésoupZh1stringselfdatar    r   \/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/bs4/tests/test_soup.pytest_short_unicode_input)      
z(TestConstructor.test_short_unicode_inputc                 C   r   )Nz<h1>foo bar</h1>zfoo barr   r   r   r   r   test_embedded_null.   r   z"TestConstructor.test_embedded_nullc                 C   s,   d d}| j|dgd}d|jksJ d S )Nu   Räksmörgåsutf-8)Zexclude_encodingszwindows-1252)encoder   original_encoding)r   	utf8_datar   r   r   r   test_exclude_encodings3   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    n1 s(w   Y  t|j|s5J tdd	|jjks@J d
|jjksHJ |di |}tjdd}td|dd}W d    n1 sgw   Y  t	|d j
}|dszJ ||jksJ ||jksJ 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_withis_xmlZstore_line_numbersZcdata_list_attributesZpreserve_whitespace_tagsstring_containers)r   kwargsr   r   r   __init__<   s   
z@TestConstructor.test_custom_builder_class.<locals>.Mock.__init__c                 S      d S Nr   r   r   r   r   r   initialize_soupC      zGTestConstructor.test_custom_builder_class.<locals>.Mock.initialize_soupc                 S   s
   || _ d S r,   )fed)r   markupr   r   r   feedE   s   
z<TestConstructor.test_custom_builder_class.<locals>.Mock.feedc                 S   r+   r,   r   r   r   r   r   resetG   r/   z=TestConstructor.test_custom_builder_class.<locals>.Mock.resetc                 S   r+   r,   r   )r   ignorer   r   r   r5   I   r/   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_markupL   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   r   )objectdictwarningscatch_warningsr   
isinstancerC   r&   r0   strmessage
startswith)r   r=   r)   r   rC   wmsgr   r   r   test_custom_builder_class8   s*   z)TestConstructor.test_custom_builder_classc                 C   sl   G dd dt }dd }dd l}tt}td|d W d    n1 s&w   Y  dt|jv s4J d S )	Nc                   @      e Zd Zdd ZdS )z:TestConstructor.test_parser_markup_rejection.<locals>.Mockc                 _   s   t d)NzNope.)r
   r7   r   r   r   r2   l   s   z?TestConstructor.test_parser_markup_rejection.<locals>.Mock.feedN)r:   r;   r<   r2   r   r   r   r   r=   k   s    r=   c                    s"    t d d dfV  t d d dfV  d S )NF)r1   r7   r   r   r   r9   o   s   zDTestConstructor.test_parser_markup_rejection.<locals>.prepare_markupr   rB   )rC   zoThe markup you provided was rejected by the parser. Trying a different parser or a different encoding may help.)r	   repytestraisesr
   r   rI   r>   )r   r=   r9   rP   exc_infor   r   r   test_parser_markup_rejectionh   s   z,TestConstructor.test_parser_markup_rejectionc              	   C   s   d}|  |}|j}d|d ksJ ddg|d ksJ | j |td d}d|jd ks-J ddiddifD ]5}tjd	d
}| j |d |d}W d    n1 sPw   Y  |j}ddg|d ksbJ d|d ksjJ q5d S )Nz&<a id=" an id " class=" a class "></a>z an id idaclass)rC   Zmulti_valued_attributesz	 a class *Tr@   an)r   rV   r   rF   rG   )r   r1   r   rV   Z
switcheroorL   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 s6J d S )Nc                   @      e Zd ZdS )z9TestConstructor.test_replacement_classes.<locals>.TagPlusNr:   r;   r<   r   r   r   r   TagPlus       r]   c                   @   r[   )z<TestConstructor.test_replacement_classes.<locals>.StringPlusNr\   r   r   r   r   
StringPlus   r^   r_   c                   @   r[   )z=TestConstructor.test_replacement_classes.<locals>.CommentPlusNr\   r   r   r   r   CommentPlus   r^   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_   r]   r   r   	<genexpr>   s
    
z;TestConstructor.test_replacement_classes.<locals>.<genexpr>)r   r   r   r   allZrecursiveChildGeneratorr-   r   rd   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 s%J t|jjd |s0J |jjD ]	}t||s=J q4g |jksEJ d S )	Nc                   @   r[   )zATestConstructor.test_alternate_string_containers.<locals>.PStringNr\   r   r   r   r   PString   r^   rh   c                   @   r[   )zATestConstructor.test_alternate_string_containers.<locals>.BStringNr\   r   r   r   r   BString   r^   ri   z4<div>Hello.<p>Here is <b>some <i>bolded</i></b> text)bp)r(   r   )	r   r   rH   divcontentsrk   rj   stringsZstring_container_stack)r   rh   ri   r   sr   r   r    test_alternate_string_containers   s   	z0TestConstructor.test_alternate_string_containersN)r:   r;   r<   r   r    r%   rN   rT   rZ   rg   rp   r   r   r   r   r   '   s    0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-16rr   c                 C   s0   |  d}d|_d| d|j|dksJ d S )N<tag></tag>Tz<?xml version="1.0" encoding="z"?>
<tag></tag>eventual_encoding)r   r'   decode)r   ru   Zactual_encodingr   r   r   r   test_decode_xml_declaration   s
   


z&TestOutput.test_decode_xml_declarationru   c                 C   s   g | ]}|qS r   r   ra   r   r   r   
<listcomp>   s    zTestOutput.<listcomp>Nc                 C   s(   t dd}d|_d|j|dksJ d S )Nrs   html.parserTz!<?xml version="1.0"?>
<tag></tag>rt   )r   r'   rv   )r   ru   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J d|jddksJ d| ks!J d| ks)J d S )Nrs   s   <tag></tag>r!   )encodingz<tag>
</tag>
)r   r"   Zencode_contentsZdecode_contentsZprettifyr-   r   r   r   test   s
   
zTestOutput.test)
r:   r;   r<   rQ   markparametrizerw   r   rz   r|   r   r   r   r   rq      s    


	rq   c                   @   s   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g ddd Zejdg ddd Zdd Zdd Zdd Zdd Zd S )!TestWarningsc                 C   s<   |D ]}t |j|r|jtksJ |  S qtd||f )Nz%s warning not found in %r)rH   rJ   filename__file__	Exception)r   rF   clsrL   r   r   r   _assert_warning  s   zTestWarnings._assert_warningc                 C   s2   |  |t}t|j}|tjd d sJ d S )N<   )r   r   rI   rJ   rK   r   ZNO_PARSER_SPECIFIED_WARNING)r   rL   warningrJ   r   r   r   _assert_no_parser_specified  s   
z(TestWarnings._assert_no_parser_specifiedc                 C   sB   t jdd}td}W d    n1 sw   Y  | | d S NTr@   <a><b></b></a>rF   rG   r   r   r   rL   r   r   r   r   #test_warning_if_no_parser_specified  s   
z0TestWarnings.test_warning_if_no_parser_specifiedc                 C   sD   t jdd}tdd}W d    n1 sw   Y  | | 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   sF   t jdd}| d}W d    n1 sw   Y  g |ks!J d S r   rF   rG   r   r   r   r   r   ,test_no_warning_if_explicit_parser_specified  s   z9TestWarnings.test_no_warning_if_explicit_parser_specifiedc                 C   s   t jdd}tddtdd}W d    n1 sw   Y  | |t}t|j}d|v s0J d|v s6J d	| ks>J d S )
NTr@   r   ry   rj   )parseOnlyTheser   
parse_onlys   <b></b>)	rF   rG   r   r   r   DeprecationWarningrI   rJ   r"   )r   rL   r   r   rM   r   r   r   )test_parseOnlyThese_renamed_to_parse_only"  s   
z6TestWarnings.test_parseOnlyThese_renamed_to_parse_onlyc                 C   s~   t jdd}d}t|ddd}W d    n1 sw   Y  | |t}t|j}d|v s0J d|v s6J d|jks=J d S )	NTr@   s   éry   utf8)fromEncodingr   Zfrom_encoding)rF   rG   r   r   r   rI   rJ   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 d    d S 1 sw   Y  d S )Nz<a>T)Zno_such_argument)rQ   rR   	TypeErrorr   r3   r   r   r   "test_unrecognized_keyword_argument:  s   "z/TestWarnings.test_unrecognized_keyword_argument	extension)zmarkup.htmlz
markup.htmzmarkup.HTMLz
markup.txtzmarkup.xhtmlz
markup.xmlz/home/user/filezc:\userilec                 C   s^   t jdd}td| d}| |t}dt|jv sJ W d    d S 1 s(w   Y  d S )NTr@   r1   ry   zlooks more like a filenamerF   rG   r   r   r   rI   rJ   )r   r   rL   r   r   r   r   r   test_resembles_filename_warning>  s
   "z,TestWarnings.test_resembles_filename_warning)Z
markuphtmlz
markup.comrB   z	markup.jsc                 C   sJ   t jdd}| d| }W d    n1 sw   Y  g |ks#J d S )NTr@   r1   r   )r   r   rL   r   r   r   r   "test_resembles_filename_no_warningK  s   z/TestWarnings.test_resembles_filename_no_warningc                 C   st   d}t jdd}t|d}W d    n1 sw   Y  | |t}dt|jv s,J |t|jdvs8J d S )Ns   http://www.crummybytes.com/Tr@   ry   looks more like a URLr   )rF   rG   r   r   r   rI   rJ   r"   r   urlwarning_listr   r   r   r   r   test_url_warning_with_bytes_urlW  s   z,TestWarnings.test_url_warning_with_bytes_urlc                 C   sn   d}t jdd}t|d}W d    n1 sw   Y  | |t}dt|jv s,J |t|jvs5J d S )Nzhttp://www.crummyunicode.com/Tr@   ry   r   r   r   r   r   r   !test_url_warning_with_unicode_urla  s   z.TestWarnings.test_url_warning_with_unicode_urlc                 C   P   t jdd}| d}W d    n1 sw   Y  tdd |D r&J d S )NTr@   s$   http://www.crummybytes.com/ is greatc                 s       | ]
}d t |jv V  qdS r   NrI   rJ   rb   rL   r   r   r   re   r      zETestWarnings.test_url_warning_with_bytes_and_space.<locals>.<genexpr>rF   rG   r   anyr   r   r   r   r   r   %test_url_warning_with_bytes_and_spacem  s   z2TestWarnings.test_url_warning_with_bytes_and_spacec                 C   r   )NTr@   z&http://www.crummyunicode.com/ is greatc                 s   r   r   r   r   r   r   r   re   x  r   zGTestWarnings.test_url_warning_with_unicode_and_space.<locals>.<genexpr>r   r   r   r   r   'test_url_warning_with_unicode_and_spaceu  s   z4TestWarnings.test_url_warning_with_unicode_and_spaceN)r:   r;   r<   r   r   r   r   r   r   r   r   rQ   r}   r~   r   r   r   r   r   r   r   r   r   r   r      s.    


r   c                   @   rO   )TestSelectiveParsingc                 C   s.   d}t d}| j||d}| dksJ d S )Nz&No<b>Yes</b><a>No<b>Yes <c>Yes</c></b>rj   )r   s   <b>Yes</b><b>Yes <c>Yes</c></b>)r   r   r"   )r   r1   Zstrainerr   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   sb   |  d}|jddddid}t|tsJ d|jksJ tddd|jks(J d |jks/J d S )NrB   fooZbaznameza name)barattrs)r   r   )r   new_tagrH   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   B   t dd}|d}|d}d| ksJ d| ksJ d S )NrB   xmlbrrk      <br/>s   <p/>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   r   )NrB   ry   r   rk   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   rQ   r}   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J t|tsJ d S NrB   r   )r   
new_stringrH   r   r   r   ro   r   r   r   'test_new_string_creates_navigablestring  s   

z5TestNewString.test_new_string_creates_navigablestringc                 C   s4   |  d}|dt}d|ksJ t|tsJ d S 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J d S )Nz<a>some markup</a>some markup)r   pickledumpsloadsrV   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sJ d S )Nr   )r   rC   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J 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$   r3   r   r   r   setup_method  s   z#TestEncodingConversion.setup_methodc              	   C   s   t j}ttj z9dd }|t _d}| |}| }t|ts#J || 	| ks.J |j
 dks7J W ttj |t _d S ttj |t _w )Nc                 S   r+   r,   r   )rI   r   r   r   noop  r/   z>TestEncodingConversion.test_ascii_in_unicode_out.<locals>.noops   <foo>a</foo>r!   )r   Zchardet_dammitloggingdisableWARNINGr   rv   rH   rI   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ksJ |jjdksJ |jd ksJ d S Nu   Sacré bleu!)r   r   rv   r   r   r#   r   Zsoup_from_unicoder   r   r   test_unicode_in_unicode_out  s   z2TestEncodingConversion.test_unicode_in_unicode_outc                 C   s2   |  | j}| | jksJ |jjdksJ d S r   )r   r$   rv   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ksJ d S )Nr!   )r   r   r"   r$   r   r   r   r   test_utf8_out  s   z$TestEncodingConversion.test_utf8_outN)r:   r;   r<   r   r   r   r   r   r   r   r   r   r     s    r   )&r   pdbr   r   osr   rQ   systempfileZbs4r   r   r   r   r   Zbs4.builderr   r	   r
   Zbs4.elementr   r   r   r   r   rB   r   r   r   rF   r   rq   r   r   r   r   r   r   r   r   r   r   <module>   s,    0)}	"