a
    #.cl                     @   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 ddl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G dd deZdS )z*Tests of the bs4.element.PageElement class    N)SelectorSyntaxError)BeautifulSoup)Comment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dddks*J d S )N
   <b>☃</b>utf-8   ☃)soupbstringencodeselfhtmlr    r   T/var/www/brookimports/venv/lib/python3.9/site-packages/bs4/tests/test_pageelement.py"test_unicode_string_can_be_encoded   s    
z/TestEncoding.test_unicode_string_can_be_encodedc                 C   s,   d}|  |}|jd|dks(J d S )Nr	   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ddks"J d S )Nr	   asciis   <b>&#9731;</b>r   r   r   r   r   <test_encoding_substitutes_unrecognized_characters_by_default   s    
zITestEncoding.test_encoding_substitutes_unrecognized_characters_by_defaultc                 C   sJ   d}|  |}tt |jddd W d    n1 s<0    Y  d S )Nr	   r   strict)errors)r   pytestraisesUnicodeEncodeErrorr   r   r   r   r    test_encoding_can_be_made_strict"   s    
z-TestEncoding.test_encoding_can_be_made_strictc                 C   s$   d}|  |}d|j ks J d S )Nr	   r   )r   r   Zdecode_contentsr   r   r   r   test_decode_contents(   s    
z!TestEncoding.test_decode_contentsc                 C   s.   d}|  |}dd|jjddks*J d S )Nr	   r   utf8)encoding)r   r   r   Zencode_contentsr   r   r   r   test_encode_contents-   s
    
z!TestEncoding.test_encode_contentsc                 C   s*   d}|  |}dd|j ks&J d S )Nr	   r   r!   )r   r   r   ZrenderContentsr   r   r   r   test_deprecated_renderContents4   s    
z+TestEncoding.test_deprecated_renderContentsc                 C   s"   d}|  |}|t|ksJ d S Nr	   )r   reprr   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dd}|| dks,J d S N#   <b>&lt;&lt;Sacré bleu!&gt;&gt;</b>minimal	formatterr   decodeZdocument_forr   markupr   decodedr   r   r   !test_default_formatter_is_minimalD   s    
z0TestFormatters.test_default_formatter_is_minimalc                 C   s0   d}|  |}|jdd}|| dks,J d S )N'   <br><b>&lt;&lt;Sacré bleu!&gt;&gt;</b>r   r0   z.<br/><b>&lt;&lt;Sacr&eacute; bleu!&gt;&gt;</b>r2   r4   r   r   r   test_formatter_htmlM   s    
z"TestFormatters.test_formatter_htmlc                 C   s0   d}|  |}|jdd}|| dks,J d S )Nr8   html5r0   z-<br><b>&lt;&lt;Sacr&eacute; bleu!&gt;&gt;</b>r2   r4   r   r   r   test_formatter_html5U   s    
z#TestFormatters.test_formatter_html5c                 C   s0   d}|  |}|jdd}|| dks,J d S r-   r2   r4   r   r   r   test_formatter_minimal]   s    
z%TestFormatters.test_formatter_minimalc                 C   s0   d}|  |}|jd d}|| dks,J d S )Nr.   r0   u   <b><<Sacré bleu!>></b>r2   r4   r   r   r   test_formatter_nullf   s    
z"TestFormatters.test_formatter_nullc                 C   s4   d}|  |}|jdd d}|| dks0J d S )Nz!<b>&lt;foo&gt;</b><b>bar</b><br/>c                 S   s   |   S Nupperxr   r   r   <lambda>s       z6TestFormatters.test_formatter_custom.<locals>.<lambda>r0   z<b><FOO></b><b>BAR</b><br/>r2   r4   r   r   r   test_formatter_customp   s    
z$TestFormatters.test_formatter_customc                 C   s   d}|  |}|j}d}|| ks(J ||jddks<J d}||jddksTJ ||jd dkshJ d}||jdd	 dksJ 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/   r0   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   |   S r>   r?   rA   r   r   r   rC      rD   zJTestFormatters.test_formatter_is_run_on_attribute_values.<locals>.<lambda>)r   ar3   )r   r5   r   rF   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 }d|v sJ d S )NzO
  <script type="text/javascript">
   console.log("< < hey > > ");
  </script>
html.parser   < < hey > >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 }d|v sJ d S )NzF
  <style type="text/css">
   console.log("< < hey > > ");
  </style>
rH   rI   rJ   rK   r   r   r   1test_formatter_skips_style_tag_for_html_documents   s    z@TestFormatters.test_formatter_skips_style_tag_for_html_documentsc                 C   s    |  d}d|j ksJ 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prettify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|v s&J d S )Nz<html><body>foo</body></html>rH   c                 S   s   |   S r>   r?   rA   r   r   r   rC      rD   zITestFormatters.test_prettify_accepts_formatter_function.<locals>.<lambda>r0   ZFOO)r   rQ   )r   r   prettyr   r   r   (test_prettify_accepts_formatter_function   s    
z7TestFormatters.test_prettify_accepts_formatter_functionc                 C   s"   |  d}tt| ksJ d S )N<a></a>)r   strtyperQ   rR   r   r   r   (test_prettify_outputs_unicode_by_default   s    
z7TestFormatters.test_prettify_outputs_unicode_by_defaultc                 C   s$   |  d}tt|dks J d S )NrV   r
   )r   bytesrX   rQ   rR   r   r   r   test_prettify_can_encode_data   s    
z,TestFormatters.test_prettify_can_encode_datac                 C   s0   d}|  |}|jd}||dks,J d S )Nu   <b>Sacré bleu!</b>r
   r   )r   r5   r   rM   r   r   r   ,test_html_entity_substitution_off_by_default   s    
z;TestFormatters.test_html_entity_substitution_off_by_defaultc                 C   s   d}|  |}|jd dks J |d}d|v s6J |d}d|v sLJ |d}d	|v sbJ |d
d
}d|v s~J d S )NzE<meta content="text/html; charset=x-sjis" http-equiv="Content-type"/>contentztext/html; charset=x-sjisr
   s   charset=utf-8euc_jps   charset=euc_jpz	shift-jiss   charset=shift-jiszutf-16zcharset=utf-16)r   metar   r3   )r   Zmeta_tagr   utf_8r^   	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.J 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name)r   r5   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+   r7   r9   r;   r<   r=   rE   rG   rN   rO   rS   rU   rY   r[   r\   rb   rf   r   r   r   r   r,   ?   s"   		
		r,   c                   @   s  e Zd ZdZdZdd Zdd Ze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+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Z d9d: Z!d;d< Z"d=d> Z#d?d@ Z$dAdB Z%dCdD Z&dEdF Z'dGdH Z(dIdJ Z)dKdL Z*dMdN Z+dOdP Z,dQdR Z-dSdT Z.dUdV Z/dWdX Z0dYdZ Z1d[d\ Z2d]d^ Z3d_d` Z4dadb Z5dcdd Z6dedf Z7dgdh Z8didj Z9dkdl Z:dmdn Z;dodp Z<dqdr Z=dsdt Z>duS )vTestCSSSelectorszTest basic CSS selector functionality.

    This functionality is implemented in soupsieve, which has a much
    more comprehensive test suite, so this is basically an extra check
    that soupsieve works as expected.
    a  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>The title</title>
<link rel="stylesheet" href="blah.css" type="text/css" id="l1">
</head>
<body>
<custom-dashed-tag class="dashed" id="dash1">Hello there.</custom-dashed-tag>
<div id="main" class="fancy">
<div id="inner">
<h1 id="header1">An H1</h1>
<p>Some text</p>
<p class="onep" id="p1">Some more text</p>
<h2 id="header2">An H2</h2>
<p class="class1 class2 class3" id="pmulti">Another</p>
<a href="http://bob.example.org/" rel="friend met" id="bob">Bob</a>
<h2 id="header3">Another H2</h2>
<a id="me" href="http://simonwillison.net/" rel="me">me</a>
<span class="s1">
<a href="#" id="s1a1">span1a1</a>
<a href="#" id="s1a2">span1a2 <span id="s1a2s1">test</span></a>
<span class="span2">
<a href="#" id="s2a1">span2a1</a>
</span>
<span class="span3"></span>
<custom-dashed-tag class="dashed" id="dash2"/>
<div data-tag="dashedvalue" id="data1"/>
</span>
</div>
<x id="xid">
<z id="zida"/>
<z id="zidab"/>
<z id="zidac"/>
</x>
<y id="yid">
<z id="zidb"/>
</y>
<p lang="en" id="lang-en">English</p>
<p lang="en-gb" id="lang-en-gb">English UK</p>
<p lang="en-us" id="lang-en-us">English US</p>
<p lang="fr" id="lang-fr">French</p>
</div>

<div id="footer">
</div>
c                 C   s   t | jd| _d S )NrH   )r   HTMLr   r   r   r   r   setup_method  s    zTestCSSSelectors.setup_methodc                 K   sX   dd | j j|fi |D }|  |  ||ksTJ d|d|d|f d S )Nc                 S   s   g | ]}|d  qS idr   ).0elr   r   r   
<listcomp>  rD   z3TestCSSSelectors.assert_selects.<locals>.<listcomp>z$Selector %s, expected [%s], got [%s]z, )r   selectsortjoin)r   selectorexpected_idskwargsZel_idsr   r   r   assert_selects  s    zTestCSSSelectors.assert_selectsc                 G   s   |D ]\}}|  || qd S r>   rv   )r   testsrs   rt   r   r   r   assert_select_multiple  s    z'TestCSSSelectors.assert_select_multiplec                 C   sF   | j d}t|dksJ |d jdks.J |d jdgksBJ d S )Ntitler   r   z	The title)r   rp   lenre   rd   r   elsr   r   r   test_one_tag_one"  s    z!TestCSSSelectors.test_one_tag_onec                 C   sT   | j d}t|dksJ |D ]}|jdks J q | j d}d|d ksPJ d S )NrP      mainrl   )r   rp   r{   re   
select_one)r   r}   rP   rn   r   r   r   test_one_tag_many(  s    z"TestCSSSelectors.test_one_tag_manyc                 C   s   | j d}d |ksJ d S )NZnonexistenttag)r   r   )r   matchr   r   r   (test_select_one_returns_none_if_no_match1  s    z9TestCSSSelectors.test_select_one_returns_none_if_no_matchc                 C   s    | j d}| dddg d S )Nzdiv divinnerdata1)r   rp   rv   r|   r   r   r   test_tag_in_tag_one6  s    z$TestCSSSelectors.test_tag_in_tag_onec                 C   s   dD ]}|  |g d qd S )N)html divhtml body divbody divr   r   r   footerrw   r   rs   r   r   r   test_tag_in_tag_many:  s    z%TestCSSSelectors.test_tag_in_tag_manyc                 C   s>   | j ddgdd | j dddgdd | j dg d	d
d d S )Nr   r   r   )limitr   r      r   r   
   rw   ri   r   r   r   
test_limit?  s
    zTestCSSSelectors.test_limitc                 C   s   t | jddksJ d S )Ndelr   r{   r   rp   ri   r   r   r   test_tag_no_matchE  s    z"TestCSSSelectors.test_tag_no_matchc                 C   s:   t t | jd W d    n1 s,0    Y  d S )Nztag%tr   r   r   r   rp   ri   r   r   r   test_invalid_tagH  s    z!TestCSSSelectors.test_invalid_tagc                 C   s   |  dddg d S )Ncustom-dashed-tagdash1dash2rw   ri   r   r   r   test_select_dashed_tag_idsL  s    z+TestCSSSelectors.test_select_dashed_tag_idsc                 C   s6   | j d}|d jdksJ |d d dks2J d S )Nzcustom-dashed-tag[id="dash2"]r   r   rl   r   )r   rp   re   )r   Zdashedr   r   r   test_select_dashed_by_idO  s    z)TestCSSSelectors.test_select_dashed_by_idc                 C   s   | j dd jdksJ d S )Nzbody > custom-dashed-tagr   zHello there.)r   rp   textri   r   r   r   test_dashed_tag_textT  s    z%TestCSSSelectors.test_dashed_tag_textc                 C   s    | j d| j dksJ d S )Nr   )r   rp   find_allri   r   r   r   #test_select_dashed_matches_find_allW  s    z4TestCSSSelectors.test_select_dashed_matches_find_allc                 C   s   |  ddgfdddgf d S )NZh1header1Zh2header2header3ry   ri   r   r   r   test_header_tagsZ  s    
z!TestCSSSelectors.test_header_tagsc                 C   sR   dD ]H}| j |}t|dks$J |d jdks6J |d d dgksJ qd S )N)z.onepzp.onepzhtml p.onepr   r   pclassonep)r   rp   r{   re   )r   rs   r}   r   r   r   test_class_one`  s
    zTestCSSSelectors.test_class_onec                 C   s    | j d}t|dksJ d S )Nzdiv.onepr   r   rp   r{   r|   r   r   r   test_class_mismatched_tagg  s    z*TestCSSSelectors.test_class_mismatched_tagc                 C   s   dD ]}|  |dg qd S )N)z	div#innerz#innerzdiv div#innerr   rw   r   r   r   r   test_one_idk  s    zTestCSSSelectors.test_one_idc                 C   s    | j d}t|dksJ d S )Nz#doesnotexistr   r   r|   r   r   r   test_bad_ido  s    zTestCSSSelectors.test_bad_idc                 C   s`   | j d}t|dksJ |D ]}|jdks J q |d d dgksJJ |d dr\J d S )Nzdiv#inner p   r   r   r   r   r   )r   rp   r{   re   Zhas_attr)r   r}   rn   r   r   r   test_items_in_ids  s    z!TestCSSSelectors.test_items_in_idc                 C   s&   dD ]}t | j|dksJ qd S )N)zdiv#main delzdiv#main div.oopszdiv div#mainr   r   r   r   r   r   test_a_bunch_of_emptys{  s    z'TestCSSSelectors.test_a_bunch_of_emptysc                 C   s   dD ]}|  |dg qd S )N)z.class1zp.class1z.class2zp.class2z.class3zp.class3zhtml p.class2zdiv#inner .class2pmultirw   r   r   r   r   test_multi_class_support  s    z)TestCSSSelectors.test_multi_class_supportc                 C   s   dD ]}|  |dg qd S )N)z.class1.class3z.class3.class2z.class1.class2.class3r   rw   r   r   r   r   test_multi_class_selection  s    z+TestCSSSelectors.test_multi_class_selectionc                 C   s"   |  dddg |  ddg d S )Nz.s1 > as1a1s1a2z.s1 > a spans1a2s1rw   ri   r   r   r   test_child_selector  s    z$TestCSSSelectors.test_child_selectorc                 C   s   |  ddg d S )Nz.s1 > a#s1a2 spanr   rw   ri   r   r   r   test_child_selector_id  s    z'TestCSSSelectors.test_child_selector_idc                 C   st   |  ddgfddgfddgfddgfddgfddgfd	dgfd
g fddgfddgfddgfdg fdg fdg f d S )Nzp[class="onep"]p1z
p[id="p1"]z[class="onep"]z	[id="p1"]zlink[rel="stylesheet"]l1zlink[type="text/css"]zlink[href="blah.css"]zlink[href="no-blah.css"]z[rel="stylesheet"]z[type="text/css"]z[href="blah.css"]z[href="no-blah.css"]zp[href="no-blah.css"]r   ri   r   r   r   test_attribute_equals  s     z&TestCSSSelectors.test_attribute_equalsc                 C   s\   |  ddgfddgfddgfddgfddgfddgfdd	gfd
d	gfdd	gfdd	gf
 d S )Nzp[class~="class1"]r   zp[class~="class2"]zp[class~="class3"]z[class~="class1"]z[class~="class2"]z[class~="class3"]za[rel~="friend"]bobza[rel~="met"]z[rel~="friend"]z[rel~="met"]r   ri   r   r   r   test_attribute_tilde  s    z%TestCSSSelectors.test_attribute_tildec                 C   sv   |  ddgfddgfdg fdg fdg fddgfdd	d
gfdd	d
gfdddgfdd
dgfddgfdd
gfddgf d S )Nz[rel^="style"]r   zlink[rel^="style"]znotlink[rel^="notstyle"]z[rel^="notstyle"]zlink[rel^="notstyle"]zlink[href^="bla"]za[href^="http://"]r   mez[href^="http://"]z	[id^="p"]r   r   z	[id^="m"]r   zdiv[id^="m"]z
a[id^="m"]zdiv[data-tag^="dashed"]r   r   ri   r   r   r   test_attribute_startswith  s    



z*TestCSSSelectors.test_attribute_startswithc              	   C   s<   |  ddgfddgfddgfdg dfddgfd	g f d S )
Nz[href$=".css"]r   zlink[href$=".css"]zlink[id$="1"]z	[id$="1"])r   r   r   r   r   s2a1r   r   zdiv[id$="1"]r   z[id$="noending"]r   ri   r   r   r   test_attribute_endswith  s    
z(TestCSSSelectors.test_attribute_endswithc                 C   s   |  ddgfddgfdg fdg fdg fddgfdd	d
gfdddgfddgfdd
gfddgfddgfddgfdg dfddgfdg fdg dfdd	d
gfddgfdddgfddgfd dgf d S )!Nz[rel*="style"]r   zlink[rel*="style"]znotlink[rel*="notstyle"]z[rel*="notstyle"]zlink[rel*="notstyle"]zlink[href*="bla"]z[href*="http://"]r   r   z	[id*="p"]r   r   zdiv[id*="m"]r   z
a[id*="m"]z[href*=".css"]zlink[href*=".css"]zlink[id*="1"]z	[id*="1"])	r   r   r   r   r   r   r   r   r   zdiv[id*="1"]r   z[id*="noending"]z[href*="."])r   r   r   za[href*="."]zlink[href*="."]zdiv[id*="n"]r   zdiv[id*="nn"]zdiv[data-tag*="edval"]r   ri   r   r   r   test_attribute_contains  s0    





z(TestCSSSelectors.test_attribute_containsc                 C   s.   |  dg dfdg dfddgfdg f d S )Nzp[lang|="en"])lang-en
lang-en-gb
lang-en-usz[lang|="en"]zp[lang|="fr"]lang-frzp[lang|="gb"]r   ri   r   r   r   test_attribute_exact_or_hypen  s    

z.TestCSSSelectors.test_attribute_exact_or_hypenc                 C   sP   |  dg dfddgfdddgfdg d	fd
ddgfdg fdg fddgf d S )Nz[rel])r   r   r   z	link[rel]r   za[rel]r   r   z[lang])r   r   r   r   zp[class]r   r   z[blah]zp[blah]zdiv[data-tag]r   r   ri   r   r   r   test_attribute_exists  s    



z&TestCSSSelectors.test_attribute_existsc                 C   s,   d}t |d}|d\}d|jks(J d S )Nz]<div style="display: wrong">nope</div>
        <div style="display: right">yes</div>
        rH   zdiv[style="display: right"]yes)r   rp   r   )r   r   r   Zchosenr   r   r   "test_quoted_space_in_selector_name  s    
z3TestCSSSelectors.test_quoted_space_in_selector_namec                 C   sp   t t | jd W d    n1 s,0    Y  t t | jd W d    n1 sb0    Y  d S )Nza:no-such-pseudoclassza:nth-of-type(a))r   r   NotImplementedErrorr   rp   r   ri   r   r   r   test_unsupported_pseudoclass  s    *z-TestCSSSelectors.test_unsupported_pseudoclassc                 C   s   | j d}t|dksJ |d jdks.J | j d}t|dksJJ |d jdks\J | j d}t|dksxJ | j d}t|dksJ d S )	Nzdiv#inner p:nth-of-type(1)r   r   	Some textzdiv#inner p:nth-of-type(3)ZAnotherzdiv#inner p:nth-of-type(4)zdiv p:nth-of-type(0)r   rp   r{   r   r|   r   r   r   test_nth_of_type  s    z!TestCSSSelectors.test_nth_of_typec                 C   s2   | j d}t|dksJ |d jdks.J d S )Nzdiv#inner > p:nth-of-type(1)r   r   r   r   r|   r   r   r   "test_nth_of_type_direct_descendant  s    z3TestCSSSelectors.test_nth_of_type_direct_descendantc                 C   s   |  ddg d S )Nz#inner > p:nth-of-type(2)r   rw   ri   r   r   r   "test_id_child_selector_nth_of_type#  s    z3TestCSSSelectors.test_id_child_selector_nth_of_typec                 C   s.   | j jddd}|d}| |ddg d S )NrP   r   rk   r   r   )r   findrp   Zassert_selects_ids)r   r   selectedr   r   r   test_select_on_element&  s    
z'TestCSSSelectors.test_select_on_elementc                 C   s   |  ddg |  dg  d S )Nz.fancy #innerr   z.normal #innerrw   ri   r   r   r   test_overspecified_child_id/  s    z,TestCSSSelectors.test_overspecified_child_idc                 C   sB   |  ddg |  ddg |  ddg g | jdks>J d S )Nz#p1 + h2r   z#p1 + h2 + pr   z#p1 + #header2 + .class1z#p1 + prv   r   rp   ri   r   r   r   test_adjacent_sibling_selector3  s    z/TestCSSSelectors.test_adjacent_sibling_selectorc                 C   sR   |  dddg |  ddg |  ddg |  ddg g | jdksNJ d S )	Nz#p1 ~ h2r   r   z#p1 ~ #header2z#p1 ~ h2 + ar   z#p1 ~ h2 + [rel="me"]z#inner ~ h2r   ri   r   r   r   test_general_sibling_selector9  s
    z.TestCSSSelectors.test_general_sibling_selectorc                 C   s:   t t | jd W d    n1 s,0    Y  d S )Nzh1 >r   ri   r   r   r   test_dangling_combinator@  s    z)TestCSSSelectors.test_dangling_combinatorc                 C   s   |  dg d d S )Nzp[lang] ~ p)r   r   r   rw   ri   r   r   r   2test_sibling_combinator_wont_select_same_tag_twiceD  s    zCTestCSSSelectors.test_sibling_combinator_wont_select_same_tag_twicec                 C   s   |  dddg d S )Nzx, yxidyidrw   ri   r   r   r   test_multiple_selectH  s    z%TestCSSSelectors.test_multiple_selectc                 C   s   |  dddg d S )Nzx,yr   r   rw   ri   r   r   r   "test_multiple_select_with_no_spaceK  s    z3TestCSSSelectors.test_multiple_select_with_no_spacec                 C   s   |  dddg d S )Nzx,    yr   r   rw   ri   r   r   r   $test_multiple_select_with_more_spaceN  s    z5TestCSSSelectors.test_multiple_select_with_more_spacec                 C   s   |  ddg d S )Nzx, xr   rw   ri   r   r   r   test_multiple_select_duplicatedQ  s    z0TestCSSSelectors.test_multiple_select_duplicatedc                 C   s   |  dddg d S )Nzx, y ~ p[lang=fr]r   r   rw   ri   r   r   r   test_multiple_select_siblingT  s    z-TestCSSSelectors.test_multiple_select_siblingc                 C   s   |  dddg d S )Nzx, y > zr   zidbrw   ri   r   r   r   .test_multiple_select_tag_and_direct_descendantW  s    z?TestCSSSelectors.test_multiple_select_tag_and_direct_descendantc                 C   s   |  dg d d S )Nzdiv > x, y, zr   r   Zzidar   zidabZzidacrw   ri   r   r   r   /test_multiple_select_direct_descendant_and_tagsZ  s    z@TestCSSSelectors.test_multiple_select_direct_descendant_and_tagsc                 C   s   |  dg d d S )Nzdiv x,y,  zr   rw   ri   r   r   r   (test_multiple_select_indirect_descendant]  s    z9TestCSSSelectors.test_multiple_select_indirect_descendantc                 C   sp   t t | jd W d    n1 s,0    Y  t t | jd W d    n1 sb0    Y  d S )Nz,x, yzx,,yr   ri   r   r   r   test_invalid_multiple_select`  s    *z-TestCSSSelectors.test_invalid_multiple_selectc                 C   s   |  dddg d S )Nzp[lang=en], p[lang=en-gb]r   r   rw   ri   r   r   r   test_multiple_select_attrsf  s    z+TestCSSSelectors.test_multiple_select_attrsc                 C   s   |  dg d d S )Nz*x, y > z[id=zida], z[id=zidab], z[id=zidb])r   r   r   rw   ri   r   r   r   test_multiple_select_idsi  s    z)TestCSSSelectors.test_multiple_select_idsc                 C   s   |  dddg d S )Nzbody > div > x, y > zr   r   rw   ri   r   r   r   test_multiple_select_nestedl  s    z,TestCSSSelectors.test_multiple_select_nestedc                 C   sN   d}t |d}|d}dt|ks(J |jddgdD ]}||v s8J q8d S )Nz3<div class="c1"/><div class="c2"/><div class="c1"/>rH   z.c1, .c2r   c1c2)class_)r   rp   r{   r   )r   r5   r   r   elementr   r   r   test_select_duplicate_elementso  s    

z/TestCSSSelectors.test_select_duplicate_elementsN)?r(   r)   r*   r+   rh   rj   rv   ZassertSelectry   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rg      sx   1	
	rg   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 | _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   treeri   r   r   r   rj     s    zTestPersistence.setup_methodc                 C   s@   t | jd}t |}|jtks&J | | j ks<J d S )Nr   )pickledumpsr   loads	__class__r   r3   )r   dumpedloadedr   r   r   !test_pickle_and_unpickle_identity  s    
z1TestPersistence.test_pickle_and_unpickle_identityc                 C   s&   t | j}| | j ks"J d S r>   )copydeepcopyr   r3   )r   copiedr   r   r   test_deepcopy_identity  s    z&TestPersistence.test_deepcopy_identityc                 C   s:   t dd}|j}| }dt|ks(J ||jks6J d S )Ns   <p>&nbsp;</p>rH   u	   <p> </p>)r   Zoriginal_encoding__copy__rW   )r   r   r"   r   r   r   r   test_copy_preserves_encoding  s
    
z,TestPersistence.test_copy_preserves_encodingc                 C   st   |  dj}d|_d|_| }|j|jks0J |j|jks@J |j|jksPJ |j|jks`J |j|jkspJ d S )Nz<p></p>r   !   )r   r   Z
sourcelineZ	sourceposr   Zcan_be_empty_elementZcdata_list_attributesZpreserve_whitespace_tags)r   tagr   r   r   r   'test_copy_preserves_builder_information  s    z7TestPersistence.test_copy_preserves_builder_informationc                 C   s>   d}|  |}t|tj}t|}| | ks:J d S r%   )r   r   r   HIGHEST_PROTOCOLr   r3   )r   r   r   r   r   r   r   r   test_unicode_pickle  s
    

z#TestPersistence.test_unicode_picklec                 C   sz   d}|  |}|jdd}t|}||ks0J d |jks>J d |jksLJ d |jksZJ d |jkshJ d |jksvJ d S )Nz<b>Foo<a></a></b><b>Bar</b>ZFoor   )r   r   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}t|}||ks*J t|ts8J d S )Nz<b><!--Foo--></b>)r   r   r   
isinstancer   r
  r   r   r   0test_copy_navigablestring_subclass_has_same_type  s    

z@TestPersistence.test_copy_navigablestring_subclass_has_same_typec                 C   s(   d}|  |}t|}||ks$J d S )N)<div><b>Foo<a></a></b><b>Bar</b></div>end)r   r   )r   r   r   Z	soup_copyr   r   r   test_copy_entire_soup  s    

z%TestPersistence.test_copy_entire_soupc                 C   s   d}|  |}|j}t|}t|t|ks2J ||ks>J ||usJJ d |jksXJ d |jksfJ d |jddjks|J d |jddjksJ d S )Nr  ZBarr  )r   rP   r   rW   r  r	  r   r  )r   r   r   rP   Zdiv_copyr   r   r   test_copy_tag_copies_contents  s    

z-TestPersistence.test_copy_tag_copies_contentsN)r(   r)   r*   r+   rj   r   r   r   r  r  r  r  r  r  r   r   r   r   r   ~  s   r   )r+   r   r   r   Z	soupsiever   Zbs4r   Zbs4.elementr   r    r   r   r,   rg   r   r   r   r   r   <module>   s   /    )