o
    _"<fE                  
   @   sr  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 ddlmZmZmZ ddlZzdd	lmZmZ d
ZW n e yr Z! zdZW Y dZ![!ndZ![!ww 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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TagNavigableString   )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   "   d}|  |}d|jjksJ d S )Nu   <h1>éé</h1>u   éésouph1stringselfdatar    r    J/var/www/html/kck/venv/lib/python3.10/site-packages/bs4/tests/test_soup.pytest_short_unicode_input0      
z(TestConstructor.test_short_unicode_inputc                 C   r   )Nz<h1>foo bar</h1>zfoo barr   r   r    r    r!   test_embedded_null5   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)exclude_encodingszwindows-1252)encoder   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    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_xmlstore_line_numberscdata_list_attributespreserve_whitespace_tagsstring_containers)r   kwargsr    r    r!   __init__C   s   
z@TestConstructor.test_custom_builder_class.<locals>.Mock.__init__c                 S      d S Nr    r   r   r    r    r!   initialize_soupJ      zGTestConstructor.test_custom_builder_class.<locals>.Mock.initialize_soupc                 S   s
   || _ d S r4   )fedr   markupr    r    r!   feedL   s   
z<TestConstructor.test_custom_builder_class.<locals>.Mock.feedc                 S   r3   r4   r    r   r    r    r!   resetN   r7   z=TestConstructor.test_custom_builder_class.<locals>.Mock.resetc                 S   r3   r4   r    )r   ignorer    r    r!   r>   P   r7   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   argsr1   r    r    r!   prepare_markupS   s   
zFTestConstructor.test_custom_builder_class.<locals>.Mock.prepare_markupN)__name__
__module____qualname__r2   r6   r;   r=   r>   set_up_substitutionscan_be_empty_elementrB   r    r    r    r!   MockB   s    rH   valueT)varconvertEntitiesrecord builder)rJ   r?   )rO   ignored_valuer   zCKeyword arguments to the BeautifulSoup constructor will be ignored.)rN   r    )objectdictwarningscatch_warningsr   
isinstancerO   r+   r8   strmessage
startswith)r   rH   r1   r   rO   wmsgr    r    r!   test_custom_builder_class?   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
   r@   r    r    r!   r;   s   s   z?TestConstructor.test_parser_markup_rejection.<locals>.Mock.feedN)rC   rD   rE   r;   r    r    r    r!   rH   r   s    rH   c                    s"    t d d dfV  t d d dfV  d S )NF)r:   r@   r    r    r!   rB   v   s   zDTestConstructor.test_parser_markup_rejection.<locals>.prepare_markupr   rN   )rO   zoThe markup you provided was rejected by the parser. Trying a different parser or a different encoding may help.)r	   repytestraisesr
   r   rV   rI   )r   rH   rB   r]   exc_infor    r    r!   test_parser_markup_rejectiono   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)rO   multi_valued_attributesz	 a class *TrL   an)r   rc   r   rS   rT   )r   r:   r   rc   
switcheroorY   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rC   rD   rE   r    r    r    r!   TagPlus       rl   c                   @   rj   )z<TestConstructor.test_replacement_classes.<locals>.StringPlusNrk   r    r    r    r!   
StringPlus   rm   rn   c                   @   rj   )z=TestConstructor.test_replacement_classes.<locals>.CommentPlusNrk   r    r    r    r!   CommentPlus   rm   ro   z<a><b>foo</b>bar</a><!--whee-->)element_classesc                 3   s     | ]}t | fV  qd S r4   )rU   ).0xro   rn   rl   r    r!   	<genexpr>   s
    
z;TestConstructor.test_replacement_classes.<locals>.<genexpr>)r   r   r   r   allrecursiveChildGeneratorr5   r    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 s%J t|jjd |s0J |jjD ]	}t||s=J q4g |jksEJ d S )	Nc                   @   rj   )zATestConstructor.test_alternate_string_containers.<locals>.PStringNrk   r    r    r    r!   PString   rm   rx   c                   @   rj   )zATestConstructor.test_alternate_string_containers.<locals>.BStringNrk   r    r    r    r!   BString   rm   ry   z4<div>Hello.<p>Here is <b>some <i>bolded</i></b> text)bp)r0   r   )	r   r   rU   divcontentsr{   rz   stringsstring_container_stack)r   rx   ry   r   sr    r    r!    test_alternate_string_containers   s   	z0TestConstructor.test_alternate_string_containersN)rC   rD   rE   r"   r$   r*   r[   ra   ri   rw   r   r    r    r    r!   r   .   s    0r   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|  S qtd||f )Nz%s warning not found in %r)rU   rW   	Exception)r   rS   clsrY   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   rV   rW   rX   r   NO_PARSER_SPECIFIED_WARNING)r   rY   warningrW   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 )NTrL   <a><b></b></a>rS   rT   r   r   r   rY   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 )NTrL   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}tdd}W d    n1 sw   Y  g |ks!J d S )NTrL   r   html.parser)rS   rT   r   r   r    r    r!   ,test_no_warning_if_explicit_parser_specified   s   z9TestWarnings.test_no_warning_if_explicit_parser_specifiedc                 C   sx   t jdd}| jdtdd}W d    n1 sw   Y  t|d j}d|v s,J d|v s2J d	| ks:J d S )
NTrL   r   rz   )parseOnlyTheser   r   
parse_onlys   <b></b>)rS   rT   r   r   rV   rW   r'   )r   rY   r   rZ   r    r    r!   )test_parseOnlyThese_renamed_to_parse_only   s   z6TestWarnings.test_parseOnlyThese_renamed_to_parse_onlyc                 C   sv   t jdd}d}| j|dd}W d    n1 sw   Y  t|d j}d|v s,J d|v s2J d|jks9J d S )	NTrL   s   éutf8)fromEncodingr   r   from_encoding)rS   rT   r   rV   rW   r(   )r   rY   r   r   rZ   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)no_such_argument)r^   r_   	TypeErrorr   r<   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}| d| }| |t}dt|jv sJ W d    d S 1 s(w   Y  d S )NTrL   r:   zlooks more like a filenamerS   rT   r   r   r   rV   rW   )r   r   rY   r   r   r    r    r!   test_resembles_filename_warning  s
   "z,TestWarnings.test_resembles_filename_warning)
markuphtmlz
markup.comrN   z	markup.jsc                 C   sJ   t jdd}| d| }W d    n1 sw   Y  g |ks#J d S )NTrL   r:   )rS   rT   r   )r   r   rY   r   r    r    r!   "test_resembles_filename_no_warning  s   z/TestWarnings.test_resembles_filename_no_warningc                 C   st   d}t jd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/TrL   looks more like a URLr   )rS   rT   r   r   r   rV   rW   r'   r   urlwarning_listr   r   r    r    r!   test_url_warning_with_bytes_url'  s   z,TestWarnings.test_url_warning_with_bytes_urlc                 C   sn   d}t jd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/TrL   r   r   r   r    r    r!   !test_url_warning_with_unicode_url1  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 )NTrL   s$   http://www.crummybytes.com/ is greatc                 s       | ]
}d t |jv V  qdS r   NrV   rW   rq   rY   r    r    r!   rt   B      zETestWarnings.test_url_warning_with_bytes_and_space.<locals>.<genexpr>rS   rT   r   anyr   r   r   r    r    r!   %test_url_warning_with_bytes_and_space=  s   z2TestWarnings.test_url_warning_with_bytes_and_spacec                 C   r   )NTrL   z&http://www.crummyunicode.com/ is greatc                 s   r   r   r   r   r    r    r!   rt   H  r   zGTestWarnings.test_url_warning_with_unicode_and_space.<locals>.<genexpr>r   r   r    r    r!   'test_url_warning_with_unicode_and_spaceE  s   z4TestWarnings.test_url_warning_with_unicode_and_spaceN)rC   rD   rE   r   r   r   r   r   r   r   r   r^   markparametrizer   r   r   r   r   r   r    r    r    r!   r      s.    	


r   c                   @   r\   )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>rz   )r   s   <b>Yes</b><b>Yes <c>Yes</c></b>)r   r   r'   )r   r:   strainerr   r    r    r!   test_parse_with_soupstrainerN  s   z1TestSelectiveParsing.test_parse_with_soupstrainerN)rC   rD   rE   r   r    r    r    r!   r   L  s    r   c                   @       e Zd ZdZ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 )NrN   foobaznameza name)barattrs)r   r   )r   new_tagrU   r   r   rR   r   parent)r   r   r   r    r    r!   test_new_tagW  s   
zTestNewTag.test_new_tagc                 C   s   t r!tdd}|d}|d}d| ksJ d| ks!J tdd}|d}|d}d| ks8J d| ks@J d S )	NrN   zlxml-xmlbrr{   s   <br/>s   <p/>r   s   <p></p>)LXML_PRESENTr   r   r'   )r   xml_soupxml_brxml_p	html_souphtml_brhtml_pr    r    r!   1test_tag_inherits_self_closing_rules_from_builder_  s   





z<TestNewTag.test_tag_inherits_self_closing_rules_from_builderN)rC   rD   rE   __doc__r   r   r    r    r    r!   r   U  s    r   c                   @   r   )TestNewStringz+Test the BeautifulSoup.new_string() method.c                 C   s2   |  d}|d}d|ksJ t|tsJ d S NrN   r   )r   
new_stringrU   r   r   r   r   r    r    r!   'test_new_string_creates_navigablestringu  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   rU   r   r    r    r!   3test_new_string_can_create_navigablestring_subclass{  s   
zATestNewString.test_new_string_can_create_navigablestring_subclassN)rC   rD   rE   r   r   r   r    r    r    r!   r   s  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loadsrc   r   r   r   pickled	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   rO   r   r   r   r   r   r    r    r!   test_pickle_with_no_builder  s
   


z&TestPickle.test_pickle_with_no_builderN)rC   rD   rE   r   r   r    r    r    r!   r     s    r   c                   @   sF   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zee	d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)   r<   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   r3   r4   r    )rV   r    r    r!   noop  r7   z>TestEncodingConversion.test_ascii_in_unicode_out.<locals>.noops   <foo>a</foo>r%   )r   chardet_dammitloggingdisableWARNINGr   decoderU   rV   document_forr(   lowerNOTSET)r   chardetr   asciisoup_from_ascii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   r   r   r   r(   r   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)   r   r   r   r   )r   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_outzQBad HTMLParser detected; skipping test of non-ASCII characters in attribute name.c                 C   s(   d}|  |jd|dksJ d S )Nu    <div><a ☃="snowman"></a></div>r   )r   r|   r'   r9   r    r    r!   1test_attribute_name_containing_unicode_characters  s   $zHTestEncodingConversion.test_attribute_name_containing_unicode_charactersN)rC   rD   rE   r   r   r   r   r   r   PYTHON_3_PRE_3_2r   r    r    r    r!   r     s    r   )+r   pdbr   r   osr   r^   systempfilebs4r   r   r   r   r   bs4.builderr   r	   r
   bs4.elementr   r   r   r   rN   r   r   r   rS   r   r   r   ImportErroreversion_infor   r   r   r   r   r   r   r   r    r    r    r!   <module>   s:    0o	