
    n9dC                         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	m
Z
 e
rd dlmZ e j                            e
 d           G d	 d
e	                      ZdS )    N)	MagicMock)CSSBeautifulSoup	ResultSet   )SoupTestSOUP_SIEVE_PRESENT)SelectorSyntaxErrorzSoup Sieve not installed)reasonc                      e Zd ZdZdZd Zd ZeZd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d  Z#d! Z$d" Z%d# Z&d$ Z'd% Z(d& Z)d' Z*d( Z+d) Z,d* Z-d+ Z.d, Z/d- Z0d. Z1d/ Z2d0 Z3d1 Z4d2 Z5d3 Z6d4 Z7d5 Z8d6 Z9d7 Z:d8 Z;d9 Z<d: Z=d; Z>d< Z?d= Z@d> ZAd? ZBd@ ZCdA ZDdBS )C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                 :    t          | j        d          | _        d S )Nhtml.parser)r   HTMLsoupselfs    2lib/python3.11/site-packages/bs4/tests/test_css.pysetup_methodzTestCSSSelectors.setup_methodN   s    !$)];;			    c           	      B    | j         j        |fi |}t          |t                    sJ d |D             }|                                 |                                 ||k    s:J d|dd                    |          dd                    |          d            d S )Nc                     g | ]
}|d          S id ).0els     r   
<listcomp>z3TestCSSSelectors.assert_selects.<locals>.<listcomp>T   s    ---r"T(---r   z	Selector z, expected [z, z], got [])r   select
isinstancer   sortjoin)r   selectorexpected_idskwargsresultsel_idss         r   assert_selectszTestCSSSelectors.assert_selectsQ   s    "$)"866v66'9-------W---v%%%%$))L1111499V3D3D3D3D(
%%%%%r   c                 B    |D ]\  }}|                      ||           d S )Nr)   )r   testsr$   r%   s       r   assert_select_multiplez'TestCSSSelectors.assert_select_multiple]   s9    &+ 	8 	8"Hl,7777	8 	8r   c                    | j         j                            d          }| j                             |          }t	          |          dk    sJ |D ]}|j        dk    sJ | j                             |          }d|d         k    sJ d S Ndiv   mainr   )r   csscompiler    lenname
select_one)r   selelsr0   r   s        r   test_precompiledz!TestCSSSelectors.test_precompileda   s    im##E**is##3xx1}}}} 	% 	%C8u$$$$$Y!!#&&D!!!!!!r   c                     | j                             d          }t          |          dk    sJ |d         j        dk    sJ |d         j        dgk    sJ d S )Ntitler   r   z	The title)r   r    r5   r6   contentsr   r9   s     r   test_one_tag_onez!TestCSSSelectors.test_one_tag_onel   s`    iw''3xx1}}}}1v{g%%%%1v;-//////r   c                     | j                             d          }t          |          dk    sJ |D ]}|j        dk    sJ | j                             d          }d|d         k    sJ d S r/   )r   r    r5   r6   r7   )r   r9   r0   r   s       r   test_one_tag_manyz"TestCSSSelectors.test_one_tag_manyr   s    iu%%3xx1}}}} 	% 	%C8u$$$$$Y!!%((D!!!!!!r   c                 J    | j                             d          }d |k    sJ d S )Nnonexistenttag)r   r7   )r   matchs     r   (test_select_one_returns_none_if_no_matchz9TestCSSSelectors.test_select_one_returns_none_if_no_match{   s)    	$$%566u}}}}}}r   c                 j    | j                             d          }|                     dddg           d S )Nzdiv divinnerdata1)r   r    r)   r>   s     r   test_tag_in_tag_onez$TestCSSSelectors.test_tag_in_tag_one   s8    iy))I'9:::::r   c                 @    dD ]}|                      |g d           d S )N)html divhtml body divbody divrH   r2   rG   footerr+   r   r$   s     r   test_tag_in_tag_manyz%TestCSSSelectors.test_tag_in_tag_many   s?    A 	P 	PH*N*N*NOOOO	P 	Pr   c                     |                      ddgd           |                      dddgd           |                      dg d	d
           d S )NrK   r2   r   )limitrL   rG      rM   rN   
   r+   r   s    r   
test_limitzTestCSSSelectors.test_limit   st    J:::Ogv->aHHHJ(L(L(L!# 	 	% 	% 	% 	% 	%r   c                 `    t          | j                            d                    dk    sJ d S )Ndelr   r5   r   r    r   s    r   test_tag_no_matchz"TestCSSSelectors.test_tag_no_match   s1    49##E**++q000000r   c                     t          j        t                    5  | j                            d           d d d            d S # 1 swxY w Y   d S )Nztag%tpytestraisesr
   r   r    r   s    r   test_invalid_tagz!TestCSSSelectors.test_invalid_tag   s    ].// 	& 	&IW%%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&   AA	Ac                 6    |                      dddg           d S )Ncustom-dashed-tagdash1dash2r+   r   s    r   test_select_dashed_tag_idsz+TestCSSSelectors.test_select_dashed_tag_ids   s$    /'71CDDDDDr   c                     | j                             d          }|d         j        dk    sJ |d         d         dk    sJ d S )Nzcustom-dashed-tag[id="dash2"]r   rb   r   rd   )r   r    r6   )r   dasheds     r   test_select_dashed_by_idz)TestCSSSelectors.test_select_dashed_by_id   sO    !!"CDDay~!44444ay'))))))r   c                 \    | j                             d          d         j        dk    sJ d S )Nzbody > custom-dashed-tagr   zHello there.)r   r    textr   s    r   test_dashed_tag_textz%TestCSSSelectors.test_dashed_tag_text   s2    y :;;A>C~UUUUUUr   c                 v    | j                             d          | j                             d          k    sJ d S )Nrb   )r   r    find_allr   s    r   #test_select_dashed_matches_find_allz4TestCSSSelectors.test_select_dashed_matches_find_all   s;    y 344	8J8JK^8_8_______r   c                 @    |                      ddgfdddgf           d S )Nh1header1h2header2header3r-   r   s    r   test_header_tagsz!TestCSSSelectors.test_header_tags   s;    ##I;Iy)*	
 	
 	
 	
 	
r   c                     dD ]Y}| j                             |          }t          |          dk    sJ |d         j        dk    sJ |d         d         dgk    sJ Zd S )N)z.onepzp.onepzhtml p.onepr   r   pclassonep)r   r    r5   r6   )r   r$   r9   s      r   test_class_onezTestCSSSelectors.test_class_one   sx    : 	/ 	/H)""8,,Cs88q====q6;#%%%%q6'?vh.....		/ 	/r   c                 d    | j                             d          }t          |          dk    sJ d S )Nzdiv.onepr   r   r    r5   r>   s     r   test_class_mismatched_tagz*TestCSSSelectors.test_class_mismatched_tag   s.    iz**3xx1}}}}}}r   c                 >    dD ]}|                      |dg           d S )N)z	div#innerz#innerzdiv div#innerrG   r+   rP   s     r   test_one_idzTestCSSSelectors.test_one_id   s6    @ 	5 	5H7)4444	5 	5r   c                 d    | j                             d          }t          |          dk    sJ d S )Nz#doesnotexistr   r}   r>   s     r   test_bad_idzTestCSSSelectors.test_bad_id   s.    i//3xx1}}}}}}r   c                     | j                             d          }t          |          dk    sJ |D ]}|j        dk    sJ |d         d         dgk    sJ |d                             d          rJ d S )Nzdiv#inner p   rx   r   ry   rz   r   )r   r    r5   r6   has_attr)r   r9   r   s      r   test_items_in_idz!TestCSSSelectors.test_items_in_id   s    i}--3xx1}}}} 	" 	"B7c>>>>>1vg6(****q6??7+++++++r   c                 j    dD ]/}t          | j                            |                    dk    sJ 0d S )N)zdiv#main delzdiv#main div.oopszdiv div#mainr   rY   rP   s     r   test_a_bunch_of_emptysz'TestCSSSelectors.test_a_bunch_of_emptys   sG    M 	8 	8Hty''1122a77777	8 	8r   c                 >    dD ]}|                      |dg           d S )N)z.class1zp.class1z.class2zp.class2z.class3zp.class3zhtml p.class2zdiv#inner .class2pmultir+   rP   s     r   test_multi_class_supportz)TestCSSSelectors.test_multi_class_support   s9    I 	6 	6H8*5555	6 	6r   c                 >    dD ]}|                      |dg           d S )N)z.class1.class3z.class3.class2z.class1.class2.class3r   r+   rP   s     r   test_multi_class_selectionz+TestCSSSelectors.test_multi_class_selection   s8    2 	6 	6H8*5555	6 	6r   c                 d    |                      dddg           |                      ddg           d S )Nz.s1 > as1a1s1a2z.s1 > a spans1a2s1r+   r   s    r   test_child_selectorz$TestCSSSelectors.test_child_selector   s;    I'7888NXJ77777r   c                 4    |                      ddg           d S )Nz.s1 > a#s1a2 spanr   r+   r   s    r   test_child_selector_idz'TestCSSSelectors.test_child_selector_id   s!    /(<<<<<r   c                     |                      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"]ru   r   s    r   test_attribute_equalsz&TestCSSSelectors.test_attribute_equals   s    ##'D6"v&4&!%v.$tf-$tf-',!D6* 4&) 4&)#R($b)#R(	
 	
 	
 	
 	
r   c                 ~    |                      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"]ru   r   s    r   test_attribute_tildez%TestCSSSelectors.test_attribute_tilde   s    ##!H:.!H:.!H:. 8*- 8*- 8*-%)ug&(eW%	
 	
 	
 	
 	
r   c                     |                      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"]r2   zdiv[id^="m"]z
a[id^="m"]zdiv[data-tag^="dashed"]rH   ru   r   s    r   test_attribute_startswithz*TestCSSSelectors.test_attribute_startswith   s    ##v&!D6*', "%$b) 4&)!E4=1 5$-08T*+4.)fX&D6"&	2	
 	
 	
 	
 	
r   c           	      ^    |                      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"])rH   r   r   rq   r   s2a1r   rc   zdiv[id$="1"]rH   z[id$="noending"]ru   r   s    r   test_attribute_endswithz(TestCSSSelectors.test_attribute_endswith  sc    ##v&!D6*tf%]]]^gY'$	
 	
 	
 	
 	
r   c                     |                      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"]r2   z
a[id*="m"]z[href*=".css"]zlink[href*=".css"]zlink[id*="1"]z	[id*="1"])	rH   r   r   rq   r   r   r   r   rc   zdiv[id*="1"]rH   z[id*="noending"]z[href*="."])r   r   r   za[href*="."]zlink[href*="."]zdiv[id*="n"]rG   zdiv[id*="nn"]zdiv[data-tag*="edval"]ru   r   s    r   test_attribute_containsz(TestCSSSelectors.test_attribute_contains  s   ##v&!D6*', "%$b) 4&) 5$-08T*+fX&D6"v&!D6*tf%eeefgY'$///0eT]+'fg./wi(%y13	
 	
 	
 	
 	
r   c                 P    |                      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"]ru   r   s    r   test_attribute_exact_or_hypenz.TestCSSSelectors.test_attribute_exact_or_hypen2  sT    ##EEEFDDDEyk*b!		
 	
 	
 	
 	
r   c                 r    |                      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]rH   ru   r   s    r   test_attribute_existsz&TestCSSSelectors.test_attribute_exists:  s}    ##)))*4&!t}%IIIJ$)*rNOwi(		
 		
 		
 		
 		
r   c                 r    d}t          |d          }|                    d          \  }d|j        k    sJ d S )Nz]<div style="display: wrong">nope</div>
        <div style="display: right">yes</div>
        r   zdiv[style="display: right"]yes)r   r    string)r   htmlr   chosens       r   "test_quoted_space_in_selector_namez3TestCSSSelectors.test_quoted_space_in_selector_nameF  sG     T=11;;<==%%%%%%r   c                 4   t          j        t                    5  | j                            d           d d d            n# 1 swxY w Y   t          j        t
                    5  | j                            d           d d d            d S # 1 swxY w Y   d S )Nza:no-such-pseudoclassza:nth-of-type(a))r]   r^   NotImplementedErrorr   r    r
   r   s    r   test_unsupported_pseudoclassz-TestCSSSelectors.test_unsupported_pseudoclassN  s   ].// 	6 	6I4555	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 ].// 	1 	1I/000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1#   AAA%BBBc                    | j                             d          }t          |          dk    sJ |d         j        dk    sJ | j                             d          }t          |          dk    sJ |d         j        dk    sJ | j                             d          }t          |          dk    sJ | j                             d          }t          |          dk    sJ d S )	Nzdiv#inner p:nth-of-type(1)r   r   	Some textzdiv#inner p:nth-of-type(3)Anotherzdiv#inner p:nth-of-type(4)zdiv p:nth-of-type(0)r   r    r5   r   r>   s     r   test_nth_of_typez!TestCSSSelectors.test_nth_of_typeU  s    i;<<3xx1}}}}1v}++++ i;<<3xx1}}}}1v}	)))) i;<<3xx1}}}} i5663xx1}}}}}}r   c                     | 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>   s     r   "test_nth_of_type_direct_descendantz3TestCSSSelectors.test_nth_of_type_direct_descendanth  sH    i=>>3xx1}}}}1v}++++++r   c                 4    |                      ddg           d S )Nz#inner > p:nth-of-type(2)r   r+   r   s    r   "test_id_child_selector_nth_of_typez3TestCSSSelectors.test_id_child_selector_nth_of_typem  s!    7$@@@@@r   c                     | j                             dd          }|                    d          }|                     |ddg           d S )Nr0   r2   r   rG   rH   )r   findr    assert_selects_ids)r   rG   selecteds      r   test_select_on_elementz'TestCSSSelectors.test_select_on_elementp  sO     	u00<<&& 	7G*<=====r   c                 `    |                      ddg           |                      dg            d S )Nz.fancy #innerrG   z.normal #innerr+   r   s    r   test_overspecified_child_idz,TestCSSSelectors.test_overspecified_child_idy  s7    OgY777,b11111r   c                     |                      ddg           |                      ddg           |                      ddg           g | j                            d          k    sJ d S )Nz#p1 + h2rs   z#p1 + h2 + pr   z#p1 + #header2 + .class1z#p1 + pr)   r   r    r   s    r   test_adjacent_sibling_selectorz/TestCSSSelectors.test_adjacent_sibling_selector}  sr    J444NXJ7776
CCCTY%%i00000000r   c                     |                      dddg           |                      ddg           |                      ddg           |                      ddg           g | j                            d          k    sJ d S )	Nz#p1 ~ h2rs   rt   z#p1 ~ #header2z#p1 ~ h2 + ar   z#p1 ~ h2 + [rel="me"]z#inner ~ h2r   r   s    r   test_general_sibling_selectorz.TestCSSSelectors.test_general_sibling_selector  s    JI(>???,yk:::NTF3333dV<<<TY%%m44444444r   c                     t          j        t                    5  | j                            d           d d d            d S # 1 swxY w Y   d S )Nzh1 >r\   r   s    r   test_dangling_combinatorz)TestCSSSelectors.test_dangling_combinator  s    ].// 	% 	%IV$$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%r`   c                 6    |                      dg d           d S )Nzp[lang] ~ p)r   r   r   r+   r   s    r   2test_sibling_combinator_wont_select_same_tag_twicezCTestCSSSelectors.test_sibling_combinator_wont_select_same_tag_twice  s%    M+R+R+RSSSSSr   c                 6    |                      dddg           d S )Nzx, yxidyidr+   r   s    r   test_multiple_selectz%TestCSSSelectors.test_multiple_select  s"    FUEN33333r   c                 6    |                      dddg           d S )Nzx,yr   r   r+   r   s    r   "test_multiple_select_with_no_spacez3TestCSSSelectors.test_multiple_select_with_no_space  s"    EE5>22222r   c                 6    |                      dddg           d S )Nzx,    yr   r   r+   r   s    r   $test_multiple_select_with_more_spacez5TestCSSSelectors.test_multiple_select_with_more_space  s"    Iu~66666r   c                 4    |                      ddg           d S )Nzx, xr   r+   r   s    r   test_multiple_select_duplicatedz0TestCSSSelectors.test_multiple_select_duplicated  s     FUG,,,,,r   c                 6    |                      dddg           d S )Nzx, y ~ p[lang=fr]r   r   r+   r   s    r   test_multiple_select_siblingz-TestCSSSelectors.test_multiple_select_sibling  s$    /%1CDDDDDr   c                 6    |                      dddg           d S )Nzx, y > zr   zidbr+   r   s    r   .test_multiple_select_tag_and_direct_descendantz?TestCSSSelectors.test_multiple_select_tag_and_direct_descendant  s"    J88888r   c                 6    |                      dg d           d S )Nzdiv > x, y, zr   r   zidar   zidabzidacr+   r   s    r   /test_multiple_select_direct_descendant_and_tagsz@TestCSSSelectors.test_multiple_select_direct_descendant_and_tags  s%    O-]-]-]^^^^^r   c                 6    |                      dg d           d S )Nzdiv x,y,  zr   r+   r   s    r   (test_multiple_select_indirect_descendantz9TestCSSSelectors.test_multiple_select_indirect_descendant  s%    M+[+[+[\\\\\r   c                 4   t          j        t                    5  | j                            d           d d d            n# 1 swxY w Y   t          j        t                    5  | j                            d           d d d            d S # 1 swxY w Y   d S )Nz,x, yzx,,yr\   r   s    r   test_invalid_multiple_selectz-TestCSSSelectors.test_invalid_multiple_select  s	   ].// 	& 	&IW%%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&].// 	% 	%IV$$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%r   c                 6    |                      dddg           d S )Nzp[lang=en], p[lang=en-gb]r   r   r+   r   s    r   test_multiple_select_attrsz+TestCSSSelectors.test_multiple_select_attrs  s$    7)\9RSSSSSr   c                 6    |                      dg d           d S )Nz*x, y > z[id=zida], z[id=zidab], z[id=zidb])r   r   r   r+   r   s    r   test_multiple_select_idsz)TestCSSSelectors.test_multiple_select_ids  s&    HJbJbJbcccccr   c                 6    |                      dddg           d S )Nzbody > div > x, y > zr   r   r+   r   s    r   test_multiple_select_nestedz,TestCSSSelectors.test_multiple_select_nested  s#    3eV_EEEEEr   c                     d}t          |d          }|                    d          }dt          |          k    sJ |                    ddg          D ]}||v sJ 	d S )Nz3<div class="c1"/><div class="c2"/><div class="c1"/>r   z.c1, .c2r   c1c2)class_)r   r    r5   rm   )r   markupr   r   elements        r   test_select_duplicate_elementsz/TestCSSSelectors.test_select_duplicate_elements  s     GV]33;;z**CMM!!!!
 }}T4L}99 	' 	'Gh&&&&&	' 	'r   c                     | j                             dd          }|j                            d          }|| j                             dd          k    sJ d S )Nr0   rG   r   div[id=main]r2   )r   r   r3   closest)r   rG   r   s      r   test_closestzTestCSSSelectors.test_closest  sW    	u11)##N33$)..6.::::::::r   c                     | j                             dd          }| j                             dd          }|j                            d          dk    sJ |j                            d          dk    sJ d S )Nr0   rG   r   r2   r   FT)r   r   r3   rD   )r   rG   r2   s      r   
test_matchzTestCSSSelectors.test_match  st    	u11y~~e~//y~..%7777x~~n--555555r   c                     | j         j                            d          }t          |t          j                  sJ |\  }}|d         dk    sJ |d         dk    sJ d S )Nrr   r   rs   rt   )r   r3   iselectr!   typesGeneratorType)r   genrs   rt   s       r   test_iselectzTestCSSSelectors.test_iselect  sl    im##D))#u233333 't}	))))t}	))))))r   c                 R   | j                             dd          }|j                            d          }t	          |j                            d                    dk    sJ |j                            d          }t          |t                    sJ |\  }|d         dk    sJ d S )	Nr0   rG   r   rr   rT   zh2[id=header3]r   rt   )r   r   r3   filterr5   r!   r   )r   rG   r'   results       r   test_filterzTestCSSSelectors.test_filter  s    	u11)""4((59##D))**a////)""#344'9-----d|y((((((r   c                     | j         j        j        } |d          dk    sJ  |d          dk    sJ  |d          | j         j                            d          k    sJ d S )Nz.foo#barz
\.foo\#barz()[]{}z\(\)\[\]\{\}z.foo)r   r3   escape)r   ms     r   test_escapezTestCSSSelectors.test_escape  sr    IM q}}....q{{22222qyyDIM0088888888r   N)E__name__
__module____qualname____doc__r   r   r)   assertSelectr-   r:   r?   rA   rE   rI   rQ   rV   rZ   r_   re   rh   rk   rn   rv   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      s        /Db< < <
 
 
 "L8 8 8	" 	" 	"0 0 0" " "  
; ; ;P P P
% % %1 1 1& & &E E E* * *
V V V` ` `
 
 
/ / /  5 5 5  , , ,8 8 86 6 6
6 6 6
8 8 8= = =
 
 
$
 
 

 
 
"
 
 

 
 
:
 
 


 

 

& & &1 1 1  &, , ,
A A A> > >2 2 21 1 15 5 5% % %T T T4 4 43 3 37 7 7- - -E E E9 9 9_ _ _] ] ]% % %T T Td d dF F F' ' '; ; ;
6 6 6* * *) ) )9 9 9 9 9r   r   )r]   r   unittest.mockr   bs4r   r   r    r   r	   	soupsiever
   markskipifr   r   r   r   <module>r     s     # # # # # #                
  .------ **3MNNR9 R9 R9 R9 R9x R9 R9 ONR9 R9 R9r   