o
    g                     @   s   d Z ddlZddlZddlZG dd dejjZG dd deZG dd deZ	G d	d
 d
ej
ZG dd deZG dd deZedkrKe  dS dS )zTests for HTMLParser.py.    Nc                   @   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d Zdd Zdd Zdd ZdS )EventCollectorc                 O   s0   g | _ | j j| _tjjj| g|R i | d S N)eventsappendhtmlparser
HTMLParser__init__)selfargskw r   J/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/test/test_htmlparser.pyr	   
   s   
 zEventCollector.__init__c                 C   sj   g }d }| j D ](}|d }||  krdkr(n nd|d d |d  f|d< n|| |}q|| _ |S )Nr   data   )r   r   )r
   LZprevtypeeventtyper   r   r   
get_events   s   

zEventCollector.get_eventsc                 C      |  d||f d S )Nstarttagr   r
   tagZattrsr   r   r   handle_starttag       zEventCollector.handle_starttagc                 C   r   )Nstartendtagr   r   r   r   r   handle_startendtag#   r   z!EventCollector.handle_startendtagc                 C      |  d|f d S )Nendtagr   )r
   r   r   r   r   handle_endtag&      zEventCollector.handle_endtagc                 C   r   )Ncommentr   r
   r   r   r   r   handle_comment+   r"   zEventCollector.handle_commentc                 C   r   )Ncharrefr   r$   r   r   r   handle_charref.   r"   zEventCollector.handle_charrefc                 C   r   )Nr   r   r$   r   r   r   handle_data1   r"   zEventCollector.handle_datac                 C   r   )Ndeclr   r$   r   r   r   handle_decl4   r"   zEventCollector.handle_declc                 C   r   )N	entityrefr   r$   r   r   r   handle_entityref7   r"   zEventCollector.handle_entityrefc                 C   r   )Npir   r$   r   r   r   	handle_pi:   r"   zEventCollector.handle_pic                 C   r   )Nunknown declr   )r
   r)   r   r   r   unknown_decl=   r"   zEventCollector.unknown_declN)__name__
__module____qualname__r	   r   r   r   r!   r%   r'   r(   r*   r,   r.   r0   r   r   r   r   r      s    r   c                   @      e Zd Zdd ZdS )EventCollectorExtrac                 C   s$   t | || | d|  f d S )Nstarttag_text)r   r   r   Zget_starttag_textr   r   r   r   r   C   s   z#EventCollectorExtra.handle_starttagN)r1   r2   r3   r   r   r   r   r   r5   A   s    r5   c                   @   s   e Zd Zdd Zdd ZdS )EventCollectorCharrefsc                 C      |  d d S Nz6This should never be called with convert_charrefs=Truefailr$   r   r   r   r'   J      z%EventCollectorCharrefs.handle_charrefc                 C   r8   r9   r:   r$   r   r   r   r,   M   r<   z'EventCollectorCharrefs.handle_entityrefN)r1   r2   r3   r'   r,   r   r   r   r   r7   H   s    r7   c                   @   s&   e Zd Zdd ZdddZdd ZdS )	TestCaseBasec                 C   s
   t ddS NFconvert_charrefs)r   r
   r   r   r   get_collectorS   s   
zTestCaseBase.get_collectorNc                 C   sv   |d u r|   }|}|D ]}|| q|  | }||kr9| dt| d t| d t|  d S d S )Nz6received events did not match expected events
Source:
z
Expected:
z
Received:
)rB   feedcloser   r;   reprpprintZpformat)r
   sourceZexpected_events	collectorr   sr   r   r   r   
_run_checkV   s(   
zTestCaseBase._run_checkc                 C   s   |  ||tdd d S r>   )rJ   r5   )r
   rG   r   r   r   r   _run_check_extrad   s   zTestCaseBase._run_check_extrar   )r1   r2   r3   rB   rJ   rK   r   r   r   r   r=   Q   s    
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
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;S )<HTMLParserTestCasec                 C   s    |  ddg |  ddg d S )Nz<?processing instruction>)r-   zprocessing instructionz<?processing instruction ?>)r-   zprocessing instruction ?rJ   rA   r   r   r    test_processing_instruction_onlyk   s   
z3HTMLParserTestCase.test_processing_instruction_onlyc                 C   sB   |  ddddddg fddddddd	d
dgfdddddddg d S )Nz
<!DOCTYPE html PUBLIC 'foo'>
<HTML>&entity;&#32;
<!--comment1a
-></foo><bar>&lt;<?pi?></foo<bar
comment1b-->
<Img sRc='Bar' isMAP>sample
text
&#x201C;
<!--comment2a-- --comment2b-->
</Html>
)r   
)r)   zDOCTYPE html PUBLIC 'foo'r   r   )r+   entity)r&   Z32)r#   z4comment1a
-></foo><bar>&lt;<?pi?></foo<bar
comment1bimg)srcZBar)ZismapN)r   zsample
text
)r&   Zx201C)r#   zcomment2a-- --comment2br    r   rM   rA   r   r   r   test_simple_htmls   s(   z#HTMLParserTestCase.test_simple_htmlc                 C   s6   |  dddg fddg |  dgddg fddg d S )	Nz<p>&#bad;</p>r   p)r   z&#bad;r    rU   z<div>&#bad;</div>divr    rW   rM   rA   r   r   r   test_malformatted_charref   s   
z,HTMLParserTestCase.test_malformatted_charrefc                 C   s   |  dddg d S )Nz&entityref foo)r+   r+   )r   z foorM   rA   r   r   r   test_unclosed_entityref   s   
z*HTMLParserTestCase.test_unclosed_entityrefc                 C   s$   |  dddg fddg fddg d S )Nz<a><b></a></b>r   abr    r[   r    r\   rM   rA   r   r   r   test_bad_nesting   s   
z#HTMLParserTestCase.test_bad_nestingc                 C      |  ddg d S )N#this text & contains & ampersands &)r   ra   rM   rA   r   r   r   test_bare_ampersands      
z'HTMLParserTestCase.test_bare_ampersandsc                 C   r`   )N.this < text > contains < bare>pointy< brackets)r   rd   rM   rA   r   r   r   test_bare_pointy_brackets   rc   z,HTMLParserTestCase.test_bare_pointy_bracketsc                 C   s0   |  ddddgfg |  ddddgfg d S )N	<a b='<'>r   r[   r\   <	<a b='>'>r\   >rM   rA   r   r   r   test_starttag_end_boundary   s   z-HTMLParserTestCase.test_starttag_end_boundaryc                 C   s  dddgfg}|  dg| |  ddg| |  ddg| |  d	d
g| |  ddg| |  ddg| dddgfg}|  dg| |  ddg| |  ddg| |  d	dg| |  ddg| |  ddg| dg}|  ddg| |  ddg| |  ddg| |  ddg| |  dd g| |  d!d"g| |  d#d$g| |  d%d&g| |  d'd(g| |  d)dg| |  ddg| d S )*Nr   r[   rg   rf   z<a zb='<'>z<a bz='<'>z<a b=z'<'>z<a b='<z'>z<a b='<'rk   rj   ri   zb='>'>z='>'>z'>'>z<a b='>z<a b='>')r#   abc z
<!--abc-->rh   z	!--abc--><!z--abc-->z<!-z-abc-->z<!--zabc-->z<!--azbc-->z<!--abzc-->z<!--abcz-->z<!--abc-z->z	<!--abc--rM   r
   outputr   r   r   test_buffer_artefacts   s4   z(HTMLParserTestCase.test_buffer_artefactsc                 C   s0   g d}|D ]}|  d| dd| fg qd S )N)
ZHTMLzOHTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"z[HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"zbhtml PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"zfhtml PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"zYmath PUBLIC "-//W3C//DTD MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/mathml2.dtd"zhtml PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd"zWsvg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"z'html PUBLIC "-//IETF//DTD HTML 2.0//EN"z,html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"z<!DOCTYPE %s>r)   zDOCTYPE rM   )r
   ZdtdsZdtdr   r   r   test_valid_doctypes   s   
z&HTMLParserTestCase.test_valid_doctypesc                 C   sN   |  dddg fg |  dddg fdg |  dddg fddd	gfdg d S )
Nz<p/>r   rU   z<p></p>r   rV   z<p><img src='foo' /></p>rQ   )rR   foorM   rA   r   r   r   test_startendtag   s   

z#HTMLParserTestCase.test_startendtagc                 C   s&   d}|  |ddddgfd|fg d S )Nz <foo:bar   
   one="1"	two=2   >r   zfoo:bar)Zone1)Ztwo2r6   )rK   )r
   rI   r   r   r   test_get_starttag_text  s
   
z)HTMLParserTestCase.test_get_starttag_textc              	   C   s^   g d}g d}|D ]"}|D ]}|  }dj||d}| |d|g fd|fd|fg qq
d S )N)z*<!-- not a comment --> &not-an-entity-ref;z<not a='start tag'>z<a href="" /> <p> <span></span>zfoo = "</scr" + "ipt>";zfoo = "</SCRIPT" + ">";zfoo = <
/script> z*<!-- document.write("</scr" + "ipt>"); -->z
//<![CDATA[
document.write('<s'+'cript type="text/javascript" src="http://www.example.org/r='+new Date().getTime()+'"><\/s'+'cript>');
//]]>z 
<!-- //
var foo = 3.14;
// -->
zfoo = "</sty" + "le>";u   <!-- ☃ -->)scriptstyleZSCRIPTZSTYLEZScriptZStylez <{element}>{content}</{element}>elementcontentr   r   r    )lowerformatrJ   )r
   contentselementsr}   r|   element_lowerrI   r   r   r   test_cdata_content	  s   z%HTMLParserTestCase.test_cdata_contentc                 C   sf   G dd dt }d}dD ]$}|  }dj||d}| j|d|g fd|fd	|fg|d
dd qd S )Nc                   @   r4   )zBHTMLParserTestCase.test_cdata_with_closing_tags.<locals>.Collectorc                 S   s   | j S r   )r   rA   r   r   r   r   .  s   zMHTMLParserTestCase.test_cdata_with_closing_tags.<locals>.Collector.get_eventsN)r1   r2   r3   r   r   r   r   r   	Collector-  s    r   z<!-- not a comment --> &not-an-entity-ref;
                  <a href="" /> </p><p> <span></span></style>
                  '</script' + '>')z scriptzscript z script z
scriptzscript
z
script
z<script>{content}</{element}>r{   r   r   r    Fr?   rH   )r   r~   stripr   rJ   )r
   r   r}   r|   r   rI   r   r   r   test_cdata_with_closing_tags(  s   z/HTMLParserTestCase.test_cdata_with_closing_tagsc                 C      d}g d}|  || d S )Nz<!-- I'm a valid comment --><!--me too!--><!------><!----><!----I have many hyphens----><!-- I have a > in the middle --><!-- and I have -- in the middle! -->))r#   z I'm a valid comment )r#   zme too!)r#   z--r#   rn   )r#   z--I have many hyphens--)r#   z I have a > in the middle )r#   z and I have -- in the middle! rM   r
   r   expectedr   r   r   test_comments>  s   z HTMLParserTestCase.test_commentsc                 C   r   )Nzs<!--[if IE & !(lte IE 8)]>aren't<![endif]--><!--[if IE 8]>condcoms<![endif]--><!--[if lte IE 7]>pretty?<![endif]-->))r#   z%[if IE & !(lte IE 8)]>aren't<![endif])r#   z[if IE 8]>condcoms<![endif])r#   z[if lte IE 7]>pretty?<![endif]rM   r   r   r   r   test_condcomsO  s   z HTMLParserTestCase.test_condcomsc              
   C   sB  dd }|  | j g d}dddgfddg}|D ]}| jd	||| d
 qdddg dfdddg}|D ]}| jd||| d
 q7|D ],}d|gd }dddg fd|fddddg fd|fddg	}| jd|||| d
 qHd}tdt|D ]}| j|d | d|d | fg| d
 q~| jddg| d
 d S )Nc                   S   s   t  S r   )r7   r   r   r   r   <lambda>Z  s    z:HTMLParserTestCase.test_convert_charrefs.<locals>.<lambda>)z&quot;z&#34;z&#x22;z&quotz&#34z&#x22r   r[   )hrefzfoo"zar)r   za"zr]   z<a href="foo{0}zar">a{0}z</a>r   )r   "))xr   )yz"X)zzX"z*{0}<a x="{0}" y="{0}X" z="X{0}">{0}</a>{0}X   ry   r   )r    ry   rz   )r    rz   z/{1}<script>{0}</script>{1}<style>{0}</style>{1}z&quo &# &#xr   no charrefs here)r   r   )Z
assertTruer@   rJ   r   joinrangelen)r
   rH   Zcharrefsr   r&   textr   r   r   r   r   test_convert_charrefsX  sN   


z(HTMLParserTestCase.test_convert_charrefsc                 C   s2   |  ddddgfdddddd	gfd
dddg	 d S )NzF<html <html>te>>xt&a<<bc</a></html>
<img src="URL><//img></html</html>r   r   )z<htmlN)r   zte>>xt)r+   r[   )r   rh   zbc<)r[   NrS   )r   z
<img src="URL>)r#   z/img)r    zhtml<rM   rA   r   r   r   test_tolerant_parsing  s   

z(HTMLParserTestCase.test_tolerant_parsingc                 C   s  |  dg  |  ddg |  ddg |  ddg |  dd	d
g fg |  ddg |  ddg |  ddg |  ddg |  ddg |  ddg |  ddg |  dd	dg fg |  dd	dg fg |  dddg fg |  dd	dg fg |  d ddg fg d S )!Nz</>z</$>)r#   $</)r   r   </a)r   r   z<a<a>r   a<az</a<a>)r    r   ro   )r   ro   <a)r   r   <a foo='bar')r   r   <a foo='bar)r   r   
<a foo='>')r   r   	<a foo='>)r   r   z<a$>za$z<a$b>za$bz<a$b/>r   z<a$b  >z<a$b  />rM   rA   r   r   r   test_starttag_junk_chars  s"   z+HTMLParserTestCase.test_starttag_junk_charsc              
   C   s   |  ddddgfg d}ddg dfg}|  || d}ddg d	fd
dg d	fg}|  || 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dg fddg fg}|  || d S )Nz<a foo="var"/>r   r[   )rt   varzj<img width=902 height=250px src="/sites/default/files/images/homepage/foo.jpg" /*what am I doing here*/ />rQ   ))widthZ902)ZheightZ250px)rR   z,/sites/default/files/images/homepage/foo.jpg)z*whatN)ZamN)iN)ZdoingN)zhere*Nz9<a / /foo/ / /=/ / /bar/ / /><a / /foo/ / /=/ / /bar/ / >))rt   N)=N)barNr   zD<meta><meta / ><meta // ><meta / / ><meta/><meta /><meta //><meta//>metarM   r   r   r   r   test_slashes_in_starttag  s$   z+HTMLParserTestCase.test_slashes_in_starttagc                 C   r`   )Nz<!DOCTYPE foo $ >)r)   zDOCTYPE foo $ rM   rA   r   r   r   test_declaration_junk_chars  r"   z.HTMLParserTestCase.test_declaration_junk_charsc                 C   r`   )Nz"<!spacer type="block" height="25">)r#   zspacer type="block" height="25"rM   rA   r   r   r   test_illegal_declarations  s   z,HTMLParserTestCase.test_illegal_declarationsc                 C   sZ   d}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dg fddg fg}|  || d S )Nzn<br></label</p><br></div end tmAd-leaderBoard><br></<h4><br></li class="unit"><br></li
						</ul><br></><br>r   br)r    zlabel<rX   )r#   z<h4)r    ZlirM   r   r   r   r   test_invalid_end_tags  s   z(HTMLParserTestCase.test_invalid_end_tagsc                 C   s&   d}ddg fdddg}|  || d S )Nz(<b>This</b attr=">"> confuses the parserr   r\   )r   ZThisr^   )r   z"> confuses the parserrM   r   r   r   r   test_broken_invalid_end_tag  s   z.HTMLParserTestCase.test_broken_invalid_end_tagc                 C   s   d}dddgfddg fddddgfd	d
dddg fdddg fddddg}|  || d}ddg dfddg fddddgfd	d
g}|  || d S )Nz[<div style=""    ><b>The <a href="some_url">rain</a> <br /> in <span>Spain</span></b></div>r   rW   rz   rn   r\   )r   zThe r[   )r   Zsome_url)r   Zrainr]   r    r   r   )r   z in span)r   ZSpainr    r   r^   rX   z><div style="", foo = "bar" ><b>The <a href="some_url">rain</a>)r   ,N)rt   r   rM   r   r   r   r   $test_correct_detection_of_start_tags  s4   


z7HTMLParserTestCase.test_correct_detection_of_start_tagsc                 C   sF   ddgfddgfdg dfddd	gfg}|D ]
\}}|  || qd S )
Na&)r   r   za&b)r   abza&b )r   r[   r+   r\   r   za&b;r   r   rM   )r
   r   r   r   r   r   r   test_EOF_in_charref  s   

z&HTMLParserTestCase.test_EOF_in_charrefc                 C   r   )Nz<! not really a comment ><! not a comment either --><! -- close enough --><!><!<-- this was an empty comment><!!! another bogus comment !!!>))r#   z not really a comment )r#   z not a comment either --)r#   z -- close enough --r   )r#   z<-- this was an empty comment)r#   z!! another bogus comment !!!rM   r   r   r   r   test_broken_comments  s   z'HTMLParserTestCase.test_broken_commentsc                 C   sX   d}dddddddgfdd	dd
dgfddddg fdddddd
dgfdg}|  || d S )Nz<![if !(IE)]>broken condcom<![endif]><![if ! IE]><link href="favicon.tiff"/><![endif]><![if !IE 6]><img src="firefox.png" /><![endif]><![if !ie 6]><b>foo</b><![endif]><![if (!IE)|(lt IE 9)]><img src="mammoth.bmp" /><![endif]>)r/   zif !(IE))r   zbroken condcom)r/   Zendif)r/   zif ! IEr   link)r   zfavicon.tiff)r/   zif !IE 6rQ   )rR   zfirefox.png)r/   zif !ie 6r   r\   )r   rt   r^   )r/   zif (!IE)|(lt IE 9))rR   zmammoth.bmprM   r   r   r   r   test_broken_condcoms,  s(   


z'HTMLParserTestCase.test_broken_condcomsc                 C   s8   t dd}|d | | dddg fddd	g d S )
NTr?   zfoo <a>link</a> bar &amp; baz)r   zfoo r   r[   )r   r   r]   )r   z
 bar & baz)r   rC   ZassertEqualr   )r
   r   r   r   r   "test_convert_charrefs_dropped_textM  s   

z5HTMLParserTestCase.test_convert_charrefs_dropped_textN) r1   r2   r3   rN   rT   rY   rZ   r_   rb   re   rl   rr   rs   ru   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rL   i   s<     	)!!rL   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
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 )$AttributesTestCasec                 C   sD   ddg dfg}|  d| |  d| |  d| |  d| d S )Nr   r[   ))r\   v)cr   )dr   )eNz<a b='v' c="v" d=v e>z<a  b = 'v' c = "v" d = v e>z<a
b
=
'v'
c
=
"v"
d
=
v
e>z<a	b	=	'v'	c	=	"v"	d	=	v	e>rM   rp   r   r   r   test_attr_syntax\  s   z#AttributesTestCase.test_attr_syntaxc                 C   s`   |  dddg dfg |  dddddgfg |  ddd	d
gfg |  ddddgfg d S )Nz'<a b='xxx
	xxx' c="yyy	
yyy" d='	xyz
'>r   r[   ))r\   zxxx
	xxx)r   zyyy	
yyy)r   z	xyz
z<a b='' c="">)r\   rn   )r   rn   z<e a=rgb(1,2,3)>r   )r[   z
rgb(1,2,3)z<a href=mailto:xyz@example.com>)r   zmailto:xyz@example.comrM   rA   r   r   r   test_attr_valuese  s   z#AttributesTestCase.test_attr_valuesc                 C   sL   |  dddddgfg |  ddddd	gfg |  d
dddd	gfg d S )Nu!   <img src=/foo/bar.png alt=中文>r   rQ   )rR   z/foo/bar.png)Zaltu   中文u+   <a title='テスト' href='テスト.html'>r[   )titleu	   テスト)r   u   テスト.htmlu+   <a title="テスト" href="テスト.html">rM   rA   r   r   r   test_attr_nonasciit  s$   z%AttributesTestCase.test_attr_nonasciic                 C      |  ddddgfg d S )Nz!<a b='&amp;&gt;&lt;&quot;&apos;'>r   r[   )r\   z&><"'rM   rA   r   r   r   test_attr_entity_replacement     z/AttributesTestCase.test_attr_entity_replacementc                 C   s   |  dddg dfg d S )Nz<a a.b='v' c:d=v e-f=v>r   r[   ))za.br   )zc:dr   )ze-fr   rM   rA   r   r   r   test_attr_funky_names  s   z(AttributesTestCase.test_attr_funky_namesc                 C   r   )Nz0<html foo='&euro;&amp;&#97;&#x61;&unsupported;'>r   r   )rt   u   €&aa&unsupported;rM   rA   r   r   r   test_entityrefs_in_attributes  r   z0AttributesTestCase.test_entityrefs_in_attributesc                 C   s.   |  ddddgfdddgfdddgfg d S )	Nz<a $><b $=%><c \=/>r   r[   )r   Nr\   )r   %r   )\/rM   rA   r   r   r   test_attr_funky_names2  s   


z)AttributesTestCase.test_attr_funky_names2c                 C   s\   dD ])}|  d| dddgfg |  d| dddgfg |  d| dddgfg qd S )N)&z&amp;z&#38;z&#x26;z<a href="%s">r   r[   )r   r   z<a href='%s'>z<a href=%s>rM   )r
   rP   r   r   r    test_entities_in_attribute_value  s   


z3AttributesTestCase.test_entities_in_attribute_valuec                 C   sP   d}dddgfdddddgfddddd	gfd
ddddgfddg}|  || d S )Nz<a href=test'style='color:red;bad1'>test - bad1</a><a href=test'+style='color:red;ba2'>test - bad2</a><a href=test'&nbsp;style='color:red;bad3'>test - bad3</a><a href = test'&nbsp;style='color:red;bad4'  >test - bad4</a>r   r[   )r   ztest'style='color:red;bad1')r   ztest - bad1r]   )r   ztest'+style='color:red;ba2')r   ztest - bad2)r   u   test' style='color:red;bad3')r   ztest - bad3)r   u   test' style='color:red;bad4')r   ztest - bad4rM   r   r   r   r   test_malformed_attributes  s   




z,AttributesTestCase.test_malformed_attributesc                 C   sH   |  dddg fddddgfdg |  d	ddg fdddd
gfdg d S )Nz<x><y z=""o"" /></x>r   r   r   r   )r   rn   )zo""N)r    r   z<x><y z="""" /></x>)z""NrM   rA   r   r   r   "test_malformed_adjacent_attributes  s   z5AttributesTestCase.test_malformed_adjacent_attributesc                 C   s4   |  dddddgfg |  dddddgfg d S )	Nz<a width="100%"cellspacing=0>r   r[   r   z100%Zcellspacing0z<a id="foo"class="bar">)idrt   classr   rM   rA   r   r   r   test_adjacent_attributes  s   z+AttributesTestCase.test_adjacent_attributesc                 C   r   )Nz<a v=>r   r[   )r   rn   rM   rA   r   r   r   test_missing_attribute_value  s   z/AttributesTestCase.test_missing_attribute_valuec                 C   r   )Nz-<a href=javascript:popup('/popup/help.html')>r   r[   )r   z$javascript:popup('/popup/help.html')rM   rA   r   r   r   test_javascript_attribute_value  s
   z2AttributesTestCase.test_javascript_attribute_valuec                 C   s   |  ddddgfddg d S )Nz-<a href='http://www.example.org/">;'>spam</a>r   r[   )r   zhttp://www.example.org/">;)r   Zspamr]   rM   rA   r   r   r   test_end_tag_in_attribute_value  s   z2AttributesTestCase.test_end_tag_in_attribute_valuec                 C   s   d}ddg fddddgfddg dfdd	g fdd
dgfdddgfddddgfdddgfdddddddgfdddgfddddg}|  || d S )Nz<html><body bgcolor=d0ca90 text='181008'><table cellspacing=0 cellpadding=1 width=100% ><tr><td align=left><font size=-1>- <a href=/rabota/><span class=en> software-and-i</span></a>- <a href='/1/'><span class=en> library</span></a></table>r   r   body)ZbgcolorZd0ca90)r   Z181008table)r   )Zcellpaddingrv   r   ZtrZtd)ZalignleftZfont)sizez-1)r   z- r[   )r   z/rabota/r   )r   Zen)r   z software-and-ir   r]   )r   z/1/)r   z library)r    r   rM   r   r   r   r   test_with_unquoted_attributes  s"   

z0AttributesTestCase.test_with_unquoted_attributesc                 C   s   d}dddgfddddgfddddgfddg d	fdddd
gfddddgfddddgfddddgfddddgfg	}|  || d S )Nz<div class=bar,baz=asd><div class="bar",baz="asd"><div class=bar, baz=asd,><div class="bar", baz="asd",><div class="bar",><div class=,bar baz=,asd><div class=,"bar" baz=,"asd"><div ,class=bar ,baz=asd><div class,="bar" baz,="asd">r   rW   )r   zbar,baz=asdr   )z,bazasd)r   zbar,)bazzasd,)r   r   )r   r   r   r   )r   z,bar)r   z,asd)r   z,"bar")r   z,"asd")z,classr   )zclass,r   )zbaz,r   rM   r   r   r   r   test_comma_between_attributes  s   
z0AttributesTestCase.test_comma_between_attributesc                 C   r   )Nz<form action=bogus|&#()value>r   Zform)actionzbogus|&#()valuerM   rA   r   r   r   -test_weird_chars_in_unquoted_attribute_values  s
   
z@AttributesTestCase.test_weird_chars_in_unquoted_attribute_valuesN)r1   r2   r3   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Z  s$    	
	r   __main__)__doc__Zhtml.parserr   rF   Zunittestr   r   r   r5   r7   ZTestCaser=   rL   r   r1   mainr   r   r   r   <module>   s"    9	   t =