U
    
W[u¥  ã                   @   s  d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ G dd„ dej	ƒZ
G d	d
„ d
eƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZdS ) z;
Some fairly inadequate testcases for Twisted XML support.
é    )ÚBytesIO)ÚTestCase)Úsux)Úmicrodom)Ú
domhelpersc                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚSux0rc                 C   s
   g | _ d S )N©Útokens©Úself© r   ú;/usr/lib/python3/dist-packages/twisted/web/test/test_xml.pyÚ__init__   s    zSux0r.__init__c                 C   s   dd„ | j D ƒS )Nc                 S   s   g | ]}|d  dkr|‘qS )r   Ústartr   )Ú.0Útokenr   r   r   Ú
<listcomp>   s      z&Sux0r.getTagStarts.<locals>.<listcomp>r   r
   r   r   r   ÚgetTagStarts   s    zSux0r.getTagStartsc                 C   s   | j  d||f¡ d S )Nr   ©r	   Úappend)r   ÚnameZattrsr   r   r   ÚgotTagStart   s    zSux0r.gotTagStartc                 C   s   | j  d|f¡ d S )NÚtextr   )r   r   r   r   r   ÚgotText   s    zSux0r.gotTextN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r   r      s   r   c                   @   s   e Zd Zdd„ ZdS )ÚSUXTestsc                 C   s4   d}t ƒ }| ¡  | |¡ |  t| ¡ ƒd¡ d S )Ns   <bork><bork><bork>é   )r   ZconnectionMadeZdataReceivedÚassertEqualÚlenr   )r   ÚsZmsr   r   r   Ú	test_bork%   s
    
zSUXTests.test_borkN)r   r   r   r"   r   r   r   r   r   #   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:d;d<g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„ Z-dYdZ„ Z.d[d\„ Z/d]d^„ Z0d_d`„ Z1dadb„ Z2dcdd„ Z3dedf„ Z4dgS )hÚMicroDOMTestsc              	   C   sZ   d}t j|dd}|  | ¡  ¡ d¡ tƒ }| ¡  |ddddi d¡ |  | ¡ d¡ dS )zŠ
        Make sure that if there's no top-level node lenient-mode won't
        drop leading text that's outside of any elements.
        zHi orders! <br>Well. <br>T©ÚbeExtremelyLenientz*<html>Hi orders! <br />Well. <br /></html>Ú s*   <html>Hi orders! <br />Well. <br /></html>N©r   ÚparseStringr   Ú
firstChildÚtoxmlr   ZwritexmlÚgetvalue©r   r!   ÚdZ
byteStreamr   r   r   Útest_leadingTextDropping0   s    ÿ
ÿz&MicroDOMTests.test_leadingTextDroppingc              	   C   sZ   d}t j|dd}|  | ¡  ¡ d¡ tƒ }| ¡  |ddddi d¡ |  | ¡ d¡ dS )z~
        Ensure that no *trailing* text in a mal-formed
        no-top-level-element document(s) will not be dropped.
        z<br>Hi orders!Tr$   z<html><br />Hi orders!</html>r&   s   <html><br />Hi orders!</html>Nr'   r,   r   r   r   Útest_trailingTextDropping?   s    ÿ
ÿz'MicroDOMTests.test_trailingTextDroppingc                 C   s*   d}t j|dd}|  | ¡  ¡ d¡ dS )zp
        A string with nothing that looks like a tag at all should just
        be parsed as body text.
        z
Hi orders!Tr$   z<html>Hi orders!</html>N©r   r(   r   r)   r*   ©r   r!   r-   r   r   r   Útest_noTagsN   s
    ÿzMicroDOMTests.test_noTagsc                 C   s*   d}t j|dd}|  | ¡  ¡ d¡ dS )zl
        If a document is surrounded by non-xml text, the text should
        be remain in the XML.
        zHi<br> orders!Tr$   z<html>Hi<br /> orders!</html>Nr0   r1   r   r   r   Útest_surroundingCrapY   s
    ÿz"MicroDOMTests.test_surroundingCrapc                 C   sN   d}t j|dd}t |jd¡}t |d d¡ dd¡}|  | d¡d	¡ d S )
Nal  
              <HTML><BODY>
              <P ALIGN="CENTER">
                <A HREF="http://www.apache.org/"><IMG SRC="/icons/apache_pb.gif"></A>
              </P>

              <P>
                This is an insane set of text nodes that should NOT be gathered under
                the A tag above.
              </P>
              </BODY></HTML>
            é   r$   Úar   z&nbsp;ú Zinsaneéÿÿÿÿ)	r   r(   r   ÚfindNodesNamedÚdocumentElementÚgatherTextNodesÚreplacer   Úfind)r   r!   r-   ÚlÚnr   r   r   Útest_caseSensitiveSoonCloserd   s
    z*MicroDOMTests.test_caseSensitiveSoonCloserc                 C   s,   d}t j|dd}|  |j|j ¡ j¡ dS )zŠ
        Test that C{parentNode} attributes are set to meaningful values when
        we are parsing HTML that lacks a root node.
        z
<br/><br/>r4   r$   N©r   r(   ZassertIdenticalr9   r)   Ú
parentNoder1   r   r   r   Útest_lenientParentingw   s
    
ÿz#MicroDOMTests.test_lenientParentingc                 C   s,   d}t j|dd}|  |j|j ¡ j¡ dS )z
        Test that the C{parentNode} attribute is set to a meaningful value
        when we parse an HTML document that has a non-Element root node.
        ZHellor4   r$   Nr@   r1   r   r   r   Útest_lenientParentSingleƒ   s
    
ÿz&MicroDOMTests.test_lenientParentSinglec                 C   s2   d}t j|dd}t |¡}|  | d¡d¡ d S )Nz
                <HTML>
                    This HTML goes between Stupid <=CrAzY!=> Dumb.
                </HTML>
            r4   r$   ú>r7   )r   r(   r   r:   ZassertNotEqualr<   )r   r!   r-   r>   r   r   r   Útest_unEntitiesŽ   s    
zMicroDOMTests.test_unEntitiesc                 C   s   |   tjtjd¡ d S )Nr&   )ÚassertRaisesr   Z
ParseErrorr   r(   r
   r   r   r   Útest_emptyError™   s    zMicroDOMTests.test_emptyErrorc                 C   s*   d}t  |¡}|  t |j¡ ¡ d¡ d S )Nz”
        <test>
         <it>
          <is>
           <a>
            test
           </a>
          </is>
         </it>
        </test>
        Ztest)r   r(   r   r   r:   r9   Ústripr1   r   r   r   Útest_tameDocument   s    
 ÿzMicroDOMTests.test_tameDocumentc                 C   s4   d}t j|dd}t |jd¡}|  t|ƒd¡ d S )Na  
        <html>
        <head><title> I send you this message to have your advice!!!!</titl e
        </headd>

        <body bgcolor alink hlink vlink>

        <h1><BLINK>SALE</blINK> TWENTY MILLION EMAILS & FUR COAT NOW
        FREE WITH `ENLARGER'</h1>

        YES THIS WONDERFUL AWFER IS NOW HERER!!!

        <script LANGUAGE="javascript">
function give_answers() {
if (score < 70) {
alert("I hate you");
}}
        </script><a href=/foo.com/lalal name=foo>lalal</a>
        </body>
        </HTML>
        r4   r$   Zblink)r   r(   r   r8   r9   r   r    )r   r!   r-   r=   r   r   r   Útest_awfulTagSoup®   s    zMicroDOMTests.test_awfulTagSoupc                 C   sP   d}t j|dd}|  | ¡  ¡  ¡ jd¡ |  | ¡  d¡d  ¡ jd¡ d S )Nzä
        <script>(foo < bar) and (bar > foo)</script>
        <script language="javascript">foo </scrip bar </script>
        <script src="foo">
        <script src="foo">baz</script>
        <script /><script></script>
        r4   r$   z(foo < bar) and (bar > foo)Zscriptzfoo </scrip bar )r   r(   r   r)   ÚdataÚgetElementsByTagNamer1   r   r   r   Útest_scriptLeniencyÉ   s    ÿþz!MicroDOMTests.test_scriptLeniencyc                 C   sj   d}|   tj|dd ¡  ¡ |¡ d}|   tj|dd ¡  ¡ |¡ d}|   tj|dd ¡  ¡ |¡ d S )Nz<script><!-- lalal --></script>r4   r$   z"<script><![CDATA[lalal]]></script>z:<script> // <![CDATA[
        lalal
        //]]></script>)r   r   r(   r)   r*   ©r   r!   r   r   r   Útest_scriptLeniencyIntelligenceÙ   s     ÿ ÿ ÿz-MicroDOMTests.test_scriptLeniencyIntelligencec                 C   s  d}|  ¡  dd¡}tj|ddd}tj|ddd}tj|ddd}tj|ddd}tj|ddd}|  |j ¡ |¡ |  | |¡d| ¡ | ¡ f ¡ |  | |¡d| ¡ | ¡ f ¡ |  | |¡d| ¡ | ¡ f ¡ |  | |¡d| ¡ | ¡ f ¡ d S )NzH<eNcApSuLaTe><sUxor></sUxor><bOrk><w00T>TeXt</W00t></BoRk></EnCaPsUlAtE>r   ZTeXtr4   ©ÚcaseInsensitiveZpreserveCaser   z%r != %r)	Úlowerr;   r   r(   r   r9   r*   Ú
assertTrueÚisEqualToDocument)r   r!   Ús2r-   Úd2Úd3Úd4Úd5r   r   r   Útest_preserveCaseé   s    """zMicroDOMTests.test_preserveCasec                 C   s<   d}t  |¡}|j}|  | d¡d¡ |  | d¡d¡ d S )Nz<test a="a" b='b' />r5   Úb©r   r(   r9   r   ÚgetAttribute©r   r!   r-   Úer   r   r   Útest_differentQuotes  s
    
z"MicroDOMTests.test_differentQuotesc                 C   s<   d}t  |¡}|j}|  | d¡d¡ |  | d¡d¡ d S )Nz<test 
a="a"
	b="#b" />r5   r[   z#br\   r^   r   r   r   Útest_Linebreaks
  s
    
zMicroDOMTests.test_Linebreaksc                 C   s    dD ]}|   tjtj|¡ qd S )N)z<test>z<test> </tset>z</test>)rF   r   ÚMismatchedTagsr(   rN   r   r   r   Útest_mismatchedTags  s    z!MicroDOMTests.test_mismatchedTagsc                 C   sv   d}t  |¡}|j}|  |jd¡ |jd }|  t|t jƒ¡ |  |j	d¡ | 
¡ }|  ||k	¡ |  | ¡ d¡ d S )Nz<bar><!--<foo />--></bar>Úbarr   ú<foo />z<!--<foo />-->)r   r(   r9   r   ÚnodeNameÚ
childNodesrS   Ú
isinstanceÚCommentÚvalueÚ	cloneNoder*   )r   r!   r-   r_   ÚcÚc2r   r   r   Útest_comment  s    

zMicroDOMTests.test_commentc                 C   s`   t  d¡j}|jd }|  t|t jƒ¡ |  |jd¡ | 	¡ }|  ||k	¡ |  | 
¡ d¡ d S )Nz<bar>xxxx</bar>r   Zxxxx)r   r(   r9   rg   rS   rh   ÚTextr   rj   rk   r*   )r   r-   r   Úcloner   r   r   Ú	test_text$  s    
zMicroDOMTests.test_textc                 C   sz   t  d¡jj}|  t|ƒd¡ |  |d jd¡ |  |d jd¡ |  |d  ¡  ¡ d¡ |D ]}|  	t
|t jƒ¡ q^d S )Nz<b>&amp;&#12AB;</b>é   r   ú&amp;r4   z&#12AB;)r   r(   r9   rg   r   r    rK   rk   r*   rS   rh   ÚEntityReference)r   Únodesr>   r   r   r   Útest_entities.  s    zMicroDOMTests.test_entitiesc                 C   sN   d}t  |¡jjd }|  t|t jƒ¡ |  |jd¡ |  | 	¡  
¡ d¡ d S )Nz<x><![CDATA[</x>
 & foo]]></x>r   z</x>
 & fooz<![CDATA[</x>
 & foo]]>)r   r(   r9   rg   rS   rh   ÚCDATASectionr   rK   rk   r*   )r   r!   Zcdatar   r   r   Ú
test_CData8  s
    zMicroDOMTests.test_CDatac                 C   s|   d}d}t  |¡jj}t  |¡jj}|  t|ƒd¡ t||ƒD ]8\}}|  t|t j	ƒ¡ |  |j
d¡ |  | |¡¡ q>d S )Nz<foo><b/><b /><b
/></foo>z<foo><b/><b/><b/></foo>r   r[   )r   r(   r9   rg   r   r    ÚziprS   rh   ÚElementrf   ÚisEqualToNode)r   r!   rU   ru   Znodes2r>   Zn2r   r   r   Útest_singletons@  s    zMicroDOMTests.test_singletonsc                 C   s   d}t  |¡j}|  | d¡d¡ |  | d¡d ¡ |  | d¡¡ |  | d¡ ¡ | d¡}|  |jd¡ | 	dd¡ |  | d¡d¡ d S )Nz<foo a="b" />r5   r[   rl   Úfoord   )
r   r(   r9   r   r]   rS   ÚhasAttributeZgetAttributeNoderj   ÚsetAttribute)r   r!   Únoder5   r   r   r   Útest_attributesL  s    
zMicroDOMTests.test_attributesc                 C   sx   d}t  |¡j}|  dd„ |jD ƒdddg¡ |  | ¡ jd¡ |  | ¡ jd¡ |  | 	¡ ¡ |  | ¡  	¡  ¡ d S )Nz'<foo><bar /><baz /><bax>foo</bax></foo>c                 S   s   g | ]
}|j ‘qS r   )rf   )r   r>   r   r   r   r   ^  s     z/MicroDOMTests.test_children.<locals>.<listcomp>rd   ÚbazZbax)
r   r(   r9   r   rg   Ú	lastChildrf   r)   rS   ÚhasChildNodesr1   r   r   r   Útest_children[  s    zMicroDOMTests.test_childrenc           
      C   sD  d}d}d}t  |¡j}t  |¡j}t  |¡j}| | ¡ ¡ | dd¡ |jd }|  | d¡d ¡ |  |j	d¡ | 
t  d¡|¡ |  |jd j	d¡ |  |jd	 |¡ |jD ]}|  |j|¡ q²|  | |¡¡ | |¡ |  t|jƒd	¡ |  |jd j	d¡ t  d¡}	| |	| ¡ ¡ |  | ¡ |	¡ |  | |¡¡ d S )
Nre   z<foo a="b"><bar/><foo/></foo>z<foo a="b">foo</foo>r5   r[   r   r}   rd   r4   )r   r(   r9   ÚappendChildrk   r   rg   r   r]   rf   ÚinsertBeforerz   rA   rS   r{   ÚremoveChildr    ro   ÚreplaceChildr)   )
r   r!   Ús1rU   r-   Zd1rV   Úchildr>   Útr   r   r   Útest_mutatee  s0    



zMicroDOMTests.test_mutatec                 C   s4   t  d¡}t  d¡}t  d¡}|  t|j||¡ dS )z
        L{Node.replaceChild} raises L{ValueError} if the node given to be
        replaced is not a child of the node C{replaceChild} is called on.
        re   z<bar />z<baz />N)r   r(   rF   Ú
ValueErrorr‰   )r   ÚparentZorphanZreplacementr   r   r   Útest_replaceNonChild„  s    


   ÿz"MicroDOMTests.test_replaceNonChildc                 C   s&  d}d}t  |¡}t j|ddd}t j|ddd}|j}|  | ¡ | d¡¡ |  | d¡|| ¡  ¡ g¡ |j}|  | ¡ | d¡¡ |  | d¡|g¡ |  | d	¡| ¡  ¡ g¡ |  | d¡g ¡ |j}|  | ¡ | d¡¡ |  | d
¡|| ¡  ¡ g¡ |  | d¡|| ¡  ¡ g¡ d S )Nz,<foo><bar id='me' /><baz><foo /></baz></foo>z,<fOo><bAr id='me' /><bAz><fOO /></bAz></fOo>r   r4   rP   Úmer}   ZfOoZfOOZFOO)r   r(   r9   r   r)   ZgetElementByIdrL   rƒ   )r   r!   rU   r-   rV   rW   Úrootr   r   r   Útest_search‘  s2    
ÿÿÿÿzMicroDOMTests.test_searchc                 C   sb   d}d}t  |¡}t  |¡}|  |jd¡ |  | ¡ |¡ |  | |¡¡ |  |j 	|j¡¡ d S )Nz`<?xml version="1.0"?><!DOCTYPE foo PUBLIC "baz" "http://www.example.com/example.dtd"><foo></foo>ú<foo/>ú5foo PUBLIC "baz" "http://www.example.com/example.dtd")
r   r(   r   Údoctyper*   ÚassertFalserT   rS   r9   r{   )r   r!   rU   r-   rV   r   r   r   Útest_doctype¬  s    

ÿzMicroDOMTests.test_doctype)z<img/>z<img />)ú<foo A='b'>x</foo>ú<foo A="b">x</foo>)z<foo><BAR /></foo>z<foo><BAR></BAR></foo>)ú"<foo>hello there &amp; yoyoy</foo>r›   c                 C   sV   | j D ]J\}}tj|dd}tj|dd}|j ¡ }|  ||¡ |  | |¡¡ qd S )Nr   ©rQ   )Úsamplesr   r(   r9   r*   r   rS   rT   )r   r!   Úoutr-   rV   ZtestOutr   r   r   Útest_outputÀ  s    
zMicroDOMTests.test_outputc                 C   s   dD ]}|   ttj|¡ qd S )N)z<foo>&am</foo>z<fooz<f>&</f>z<() />)rF   Ú	Exceptionr   r(   rN   r   r   r   Útest_errorsÉ  s    zMicroDOMTests.test_errorsc                 C   s   d}d}d}d}t  |¡}t  |¡}t j|dd}t j|ddd}t j|ddd}	t j|ddd}
t  |¡j ¡ }| jt jt j|dd |  ||¡ |  | |¡¡ |  | |¡¡ |  |j 	d	¡¡ |  
|
j 	d	¡¡ |  |j ¡ d
¡ |  |	j ¡ d¡ d S )Nz<foo a='b'><BAx>x</bax></FOO>ú<foo a="b"><bax>x</bax></foo>z<FOO a='b'><BAx>x</BAx></FOO>r™   r4   rœ   rP   r   r5   rš   z<foo a="b">x</foo>)r   r(   r9   r*   rF   rb   r   rS   rT   r~   r—   )r   r!   rU   Zs3Zs4r-   rV   rW   rX   rY   Zd6rž   r   r   r   Útest_caseInsensitiveÎ  s,    

 ÿz"MicroDOMTests.test_caseInsensitivec                 C   s@   d}t  |¡}|  |j ¡  |jj¡ |  | t  d¡¡¡ d S )Nz<hello>
        </hello>z<hello></hello>)r   r(   rS   r9   r„   rg   rT   r1   r   r   r   Útest_eatingWhitespaceå  s    
ÿz#MicroDOMTests.test_eatingWhitespacec                 C   sb   d}dD ]4\}}t jd||f dd}|  |j ¡ d| ¡ qt jddd}|  |j ¡ d¡ d S )	Nz<?xml version='1.0'?>))ú&rs   )z& z&amp; )rs   rs   )z&hello monkeyz&amp;hello monkeyz%s<pre>%s</pre>r4   r$   z<pre>%s</pre>z<t>hello & there</t>z<t>hello &amp; there</t>©r   r(   r   r9   r*   )r   ÚprefixÚiÚor-   r   r   r   Útest_lenientAmpersandî  s    ÿÿz#MicroDOMTests.test_lenientAmpersandc                 C   s(   t jddd}|  |j ¡  ¡ d¡ d S )Nz3<?xml version='1.0'?><bar><xA><y>c</Xa> <foo></bar>r4   r$   z<xa><y>c</y></xa>)r   r(   r   r9   r)   r*   )r   r-   r   r   r   Útest_insensitiveLenientý  s
    þz%MicroDOMTests.test_insensitiveLenientc                 C   s0   d}t j|dd}d}|j ¡ }|  ||¡ d S )Nz<ul><li>foo<li>bar<li>baz</ul>r4   r$   z-<ul><li>foo</li><li>bar</li><li>baz</li></ul>©r   r(   r9   r*   r   ©r   r!   r-   ÚexpectedÚactualr   r   r   Útest_laterCloserSimple  s
    
z$MicroDOMTests.test_laterCloserSimplec                 C   s0   d}t j|dd}d}|j ¡ }|  ||¡ d S )Nz<DL><p><DT>foo<DD>bar</DL>r4   r$   z(<dl><p></p><dt>foo</dt><dd>bar</dd></dl>r¬   r­   r   r   r   Útest_laterCloserCaseInsensitive  s
    
z-MicroDOMTests.test_laterCloserCaseInsensitivec                 C   s0   d}d}t j|dd}|j ¡ }|  ||¡ d S )NzK<dl><dt>word<dd>definition<dt>word<dt>word<dd>definition<dd>definition</dl>zi<dl><dt>word</dt><dd>definition</dd><dt>word</dt><dt>word</dt><dd>definition</dd><dd>definition</dd></dl>r4   r$   r¬   )r   r!   r®   r-   r¯   r   r   r   Útest_laterCloserDL  s
    
z MicroDOMTests.test_laterCloserDLc                    s
  dd l ‰ d}d}d}‡ fdd„}t || d¡ƒ¡}t | d¡¡}t |¡}|  | |¡¡ |  | |¡¡ t |¡}t ||ƒ¡}t |¡}|  | |¡¡ |  | |¡¡ t d¡}d	}	t ¡ jd
ddj}
|j	}| 
|
¡ | 
| d
¡¡ |  | ¡ |	d ¡ d S )Nr   z<foo><bar><baz /></bar></foo>ub   <?xml version="1.0" encoding="UCS-2" ?>
<JAPANESE>
<TITLE>å°‚é–€å®¶ãƒªã‚¹ãƒˆ </TITLE></JAPANESE>s®   ÿþ< ? x m l   v e r s i o n = " 1 . 0 "   e n c o d i n g = " U C S - 2 "   ? >  
 < J A P A N E S E >  
 < T I T L E > \€•¶[ê0¹0È0  < / T I T L E > < / J A P A N E S E > c                    s4   t t| ƒd ƒd }ˆ jd| fˆ  d| | ¡žŽ S )Nrr   ÚHú<rD   )Ústrr    ZpackZunpack)r!   Zfmt©Ústructr   r   ÚreverseBytes/  s    z9MicroDOMTests.test_unicodeTolerance.<locals>.reverseByteszUTF-16r”   z<?xml version="1.0"?>u   âˆšr4   ©Úrawu#   <foo><div>âˆš</div><!--âˆš--></foo>)r·   r   r(   ÚencoderS   rT   Úlmxr   r€   r9   r†   ZcreateCommentr   r*   )r   r!   ÚjZj2r¸   ZurdZudZsdZj3ZhdrÚdivZder   r¶   r   Útest_unicodeTolerance#  s0    




ÿz#MicroDOMTests.test_unicodeTolerancec                 C   sb   ddddœ}|  ¡ D ]H}t |¡j}t |d¡}|  t|ƒ|| ¡ |r|  t	|d dƒ¡ qd S )Nr   r   r4   )z:<foo><bar /><bar unf='1' /><bar>asdfadsf</bar><bam/></foo>z<foo>asdf</foo>z!<foo><bar><bar></bar></bar></foo>rd   ZtagName)
Úkeysr   r(   r9   r   ZnamedChildrenr   r    rS   Úhasattr)r   ZtestsrŒ   r€   Úresultr   r   r   Útest_namedChildrenI  s    ýz MicroDOMTests.test_namedChildrenc                 C   s®   d}t  |¡j}|jdd}|  ||¡ |  t|jƒt|jƒ¡ | ¡ | ¡  }}|  ||¡ |  t|jƒt|jƒ¡ |  | ¡ | ¡ ¡ |  || 	¡ ¡ |  |j
|j
¡ d S )Nr¢   r4   ©Zdeep)r   r(   r9   rk   ÚfailIfEqualsr   r    rg   r)   r*   Ú	namespace)r   r!   r€   rp   Zc1rm   r   r   r   Útest_cloneNodeW  s    zMicroDOMTests.test_cloneNodec                 C   sr   d}t  |¡}|jdd}|  ||¡ |  t|jƒt|jƒ¡ |  || ¡ ¡ |  | 	|¡¡ |  | 	|¡¡ d S )Nz˜<?xml version="1.0"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><foo></foo>r4   rÄ   )
r   r(   rk   rÅ   r   r    rg   r*   rS   rT   )r   r!   r€   rp   r   r   r   Útest_cloneDocumente  s    
z MicroDOMTests.test_cloneDocumentc                 C   sd   t  d¡}t  |¡}| d¡ |jdd}d| ¡ d< | ¡  |jddd d	}|  || ¡ ¡ d S )
NÚpr}   rl   )r5   Úzrd   Úy)rl   zF<p>foo<b a="c"><foo z="foo"></foo><foo></foo><bar c="y"></bar></b></p>)	r   rz   r¼   r   r[   r}   Úaddr   r*   )r   r>   r¼   r[   r!   r   r   r   Útest_LMXt  s    


zMicroDOMTests.test_LMXc                 C   s   t  d¡}t|ƒ dS )z9
        Returns a dictionary which is hashable.
        rÉ   N)r   rz   Úhash)r   r>   r   r   r   Ú	test_dict  s    
zMicroDOMTests.test_dictc                 C   s4   d}d}t  |¡}|  ||¡ |  t  |¡|¡ d S )Nz&'some "stuff"', <what up?>z/&amp;'some &quot;stuff&quot;', &lt;what up?&gt;)r   Úescaper   Zunescape)r   rº   ZcookedZesc1r   r   r   Útest_escaping‰  s
    
zMicroDOMTests.test_escapingc                 C   s¸   d}t  |¡}| ¡ }|  |jjd¡ |  |j d¡d jd¡ |  |j d¡d  dd¡d¡ t  |¡}|  |jjd¡ |  |j d¡d jd¡ |  |j d¡d  dd¡d¡ d S )Nz¹
        <x xmlns="base">
        <y />
        <y q="1" x:q="2" y:q="3" />
        <y:y xml:space="1">here is    some space </y:y>
        <y:y />
        <x:y />
        </x>
        ÚbaserË   r   r4   ÚqÚ1)r   r(   Ztoprettyxmlr   r9   rÆ   rL   ZgetAttributeNS)r   r!   r-   rU   rV   r   r   r   Útest_namespaces’  s0    	

ÿÿþ

ÿÿþzMicroDOMTests.test_namespacesc                 C   s"   d}t  |¡ ¡ }|  ||¡ dS )zW
        Test that C{toxml} can support xml structures that remove namespaces.
        z`<?xml version="1.0"?><html xmlns="http://www.w3.org/TR/REC-html40"><body xmlns=""></body></html>N)r   r(   r*   r   )r   rŠ   rU   r   r   r   Útest_namespaceDelete±  s    z"MicroDOMTests.test_namespaceDeletec                 C   s4   t  d¡}t jddd}|g|_|  | ¡ d¡ dS )z¢
        Check that unspecified namespace is a thing separate from undefined
        namespace. This test added after discovering some weirdness in Lore.
        Zolr¾   zhttp://www.w3.org/1999/xhtml©rÆ   z9<div xmlns="http://www.w3.org/1999/xhtml"><ol></ol></div>N)r   rz   rg   r   r*   )r   r‹   r   r   r   r   Útest_namespaceInheritance»  s    

ÿz'MicroDOMTests.test_namespaceInheritancec           	      C   s‚   d}d}t  ¡ }|jd|d}| |di¡ |jd|d}|jd|d}| |¡ | |¡ | |¡ d}| ¡ }|  ||¡ d	S )
zü
        XML elements with a prefixed name as per upper level tag definition
        have a start-tag of C{"<prefix:tag>"} and an end-tag of
        C{"</prefix:tag>"}.

        Refer to U{http://www.w3.org/TR/xml-names/#ns-using} for details.
        úhttp://example.com/outerúhttp://example.com/innerr’   r×   ÚinnerÚtagr‹   zœ<?xml version="1.0"?><root xmlns="http://example.com/outer" xmlns:inner="http://example.com/inner"><inner:tag><inner:child></inner:child></inner:tag></root>N)r   ÚDocumentÚcreateElementÚaddPrefixesr†   r*   r   )	r   ÚouterNamespaceÚinnerNamespaceÚdocumentr’   rÜ   r‹   ÚxmlOkÚxmlOutr   r   r   Útest_prefixedTagsÈ  s    


ÿzMicroDOMTests.test_prefixedTagsc           	      C   s‚   d}d}t  ¡ }|jd|d}| |¡ | |di¡ |jd|d}| |¡ |jd|d}| |¡ d}| ¡ }|  ||¡ d	S )
a^  
        Children of prefixed tags respect the default namespace at the point
        where they are rendered.  Specifically, they are not influenced by the
        prefix of their parent as that prefix has no bearing on them.

        See U{http://www.w3.org/TR/xml-names/#scoping} for details.

        To further clarify the matter, the following::

            <root xmlns="http://example.com/ns/test">
                <mytag xmlns="http://example.com/ns/mytags">
                    <mysubtag xmlns="http://example.com/ns/mytags">
                        <element xmlns="http://example.com/ns/test"></element>
                    </mysubtag>
                </mytag>
            </root>

        Should become this after all the namespace declarations have been
        I{moved up}::

            <root xmlns="http://example.com/ns/test"
                  xmlns:mytags="http://example.com/ns/mytags">
                <mytags:mytag>
                    <mytags:mysubtag>
                        <element></element>
                    </mytags:mysubtag>
                </mytags:mytag>
            </root>
        rÙ   rÚ   r’   r×   rÛ   ÚmytagÚmysubtagzš<?xml version="1.0"?><root xmlns="http://example.com/outer" xmlns:inner="http://example.com/inner"><inner:mytag><mysubtag></mysubtag></inner:mytag></root>N)r   rÝ   rÞ   r†   rß   r*   r   )	r   rà   rá   râ   r’   ræ   rç   rã   rä   r   r   r   Útest_prefixPropagationó  s    


ÿ	z$MicroDOMTests.test_prefixPropagationN)5r   r   r   r.   r/   r2   r3   r?   rB   rC   rE   rG   rI   rJ   rM   rO   rZ   r`   ra   rc   rn   rq   rv   rx   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#   .   sl   


ý		&	
+r#   c                   @   sB   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )ÚBrokenHTMLTestsa>  
    Tests for when microdom encounters very bad HTML and C{beExtremelyLenient}
    is enabled. These tests are inspired by some HTML generated in by a mailer,
    which breaks up very long lines by splitting them with '!
 '. The expected
    behaviour is loosely modelled on the way Firefox treats very bad HTML.
    r4   c                 C   s$   t j||d}|  |j ¡ |¡ dS )z‰
        Check that C{input}, when parsed, produces a DOM where the XML
        of the document element is equal to C{expected}.
        r$   Nr¦   )r   Úinputr®   r%   Úoutputr   r   r   ÚcheckParsed8  s    ÿzBrokenHTMLTests.checkParsedc                 C   s   d}d}|   ||¡ dS )z˜
        Check that microdom does its best to handle broken attribute names.
        The important thing is that it doesn't raise an exception.
        z6<body><h1><div al!
 ign="center">Foo</div></h1></body>z;<body><h1><div al="True" ign="center">Foo</div></h1></body>N©rì   ©r   rê   r®   r   r   r   Útest_brokenAttributeNameB  s    z(BrokenHTMLTests.test_brokenAttributeNamec                 C   s   d}d}|   ||¡ dS )zJ
        Check that microdom encompasses broken attribute values.
        z6<body><h1><div align="cen!
 ter">Foo</div></h1></body>Nrí   rî   r   r   r   Útest_brokenAttributeValueM  s    z)BrokenHTMLTests.test_brokenAttributeValuec                 C   s   d}d}|   ||¡ dS )z•
        Check that microdom does its best to handle broken opening tags.
        The important thing is that it doesn't raise an exception.
        z2<body><h1><sp!
 an>Hello World!</span></h1></body>z5<body><h1><sp an="True">Hello World!</sp></h1></body>Nrí   rî   r   r   r   Útest_brokenOpeningTagV  s    z%BrokenHTMLTests.test_brokenOpeningTagc                 C   s   |   dd¡ |   dd¡ dS )z™
        Check that microdom does its best to handle broken self-closing tags
        The important thing is that it doesn't raise an exception.
        z<body><span /!
></body>z<body><span></span></body>z
<span!
 />z<span></span>Nrí   r
   r   r   r   Útest_brokenSelfClosingTag`  s    ÿz)BrokenHTMLTests.test_brokenSelfClosingTagc                 C   sL   d}d}|   ||¡ d}|   ||¡ d}|   ||¡ d}d}|   ||¡ dS )z•
        Check that microdom does its best to handle broken closing tags.
        The important thing is that it doesn't raise an exception.
        z1<body><h1><span>Hello World!</sp!
an></h1></body>z/<body><h1><span>Hello World!</span></h1></body>z1<body><h1><span>Hello World!</!
span></h1></body>z1<body><h1><span>Hello World!</span!
></h1></body>z1<body><h1><span>Hello World!<!
/span></h1></body>z6<body><h1><span>Hello World!<!></!></span></h1></body>Nrí   rî   r   r   r   Útest_brokenClosingTagj  s    z%BrokenHTMLTests.test_brokenClosingTagN)r4   )
r   r   r   Ú__doc__rì   rï   rð   rñ   rò   ró   r   r   r   r   ré   0  s   

	

ré   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú	NodeTestsz
    Tests for L{Node}.
    c                 C   sÌ   t  tƒ ¡}|  | |¡¡ t  tƒ ¡}|  | |¡¡ | t  tƒ ¡¡ |  | |¡¡ | t  tƒ ¡¡ |  | |¡¡ | ¡  t  tƒ ¡¡ |  | |¡¡ | ¡  t  tƒ ¡¡ |  | |¡¡ dS )zw
        L{Node.isEqualToNode} returns C{True} if and only if passed a L{Node}
        with the same children.
        N)r   ÚNodeÚobjectrS   r{   r†   r—   r)   )r   r€   Úanotherr   r   r   Útest_isNodeEqualTo€  s    zNodeTests.test_isNodeEqualToc                 C   s´   t  ¡ }t  ¡ }| |¡ |  t|jd¡ |  t|j|d¡ |  t|jd|¡ |  t|jdd¡ | |¡ |  t|jd¡ |  t|j|d¡ |  t|jd|¡ |  t|jdd¡ dS )zO
        Children of L{Node} instances must also be L{Node} instances.
        N)r   rö   r†   rF   Ú	TypeErrorr‡   rˆ   r‰   )r   r€   r‹   r   r   r   Útest_validChildInstanceœ  s    

z!NodeTests.test_validChildInstanceN)r   r   r   rô   rù   rû   r   r   r   r   rõ   |  s   rõ   c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )ÚDocumentTestsz 
    Tests for L{Document}.
    r•   c                 C   sÌ   t  ¡ }|  | |¡¡ t  ¡ }|  | |¡¡ | j|_|  | |¡¡ | j|_|  | |¡¡ | t  tƒ ¡¡ |  | |¡¡ | t  tƒ ¡¡ |  | |¡¡ |j	 t  tƒ ¡¡ |  | |¡¡ dS )z˜
        L{Document.isEqualToNode} returns C{True} if and only if passed a
        L{Document} with the same C{doctype} and C{documentElement}.
        N)
r   rÝ   rS   r{   r–   r—   r†   rö   r÷   r9   )r   râ   rø   r   r   r   Útest_isEqualToNode¹  s    z DocumentTests.test_isEqualToNodec                 C   s6   t  ¡ }t  ¡ }t  ¡ }| |¡ |  t|j|¡ dS )zk
        L{Document.appendChild} raises L{ValueError} if the document already
        has a child.
        N)r   rÝ   rö   r†   rF   rŽ   )r   râ   r‹   rø   r   r   r   Útest_childRestrictionÙ  s
    
z#DocumentTests.test_childRestrictionN)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S )ÚEntityReferenceTestsz'
    Tests for L{EntityReference}.
    c                 C   s<   |   t d¡ t d¡¡¡ |  t d¡ t d¡¡¡ dS )zŒ
        L{EntityReference.isEqualToNode} returns C{True} if and only if passed
        a L{EntityReference} with the same C{eref}.
        ZquotZaposN)rS   r   rt   r{   r—   r
   r   r   r   rý   ê  s    
ÿÿ
ÿÿz'EntityReferenceTests.test_isEqualToNodeN©r   r   r   rô   rý   r   r   r   r   rÿ   æ  s   rÿ   c                   @   s   e Zd ZdZdd„ ZdS )ÚCharacterDataTestsz%
    Tests for L{CharacterData}.
    c                 C   s<   |   t d¡ t d¡¡¡ |  t d¡ t d¡¡¡ dS )z†
        L{CharacterData.isEqualToNode} returns C{True} if and only if passed a
        L{CharacterData} with the same value.
        r}   rd   N)rS   r   ZCharacterDatar{   r—   r
   r   r   r   rý   ü  s    
ÿÿ
ÿÿz%CharacterDataTests.test_isEqualToNodeNr   r   r   r   r   r  ø  s   r  c                   @   s   e Zd ZdZdd„ ZdS )ÚCommentTestsz
    Tests for L{Comment}.
    c                 C   s<   |   t d¡ t d¡¡¡ |  t d¡ t d¡¡¡ dS )zz
        L{Comment.isEqualToNode} returns C{True} if and only if passed a
        L{Comment} with the same value.
        r}   rd   N)rS   r   ri   r{   r—   r
   r   r   r   rý     s    
ÿÿ
ÿÿzCommentTests.test_isEqualToNodeNr   r   r   r   r   r  
  s   r  c                   @   s   e Zd ZdZdd„ ZdS )Ú	TextTestsz
    Tests for L{Text}.
    c                 C   sp   |   tjddd tjddd¡¡ |  tjddd tjddd¡¡ |  tjddd tjddd¡¡ dS )z
        L{Text.isEqualToNode} returns C{True} if and only if passed a L{Text}
        which represents the same data.
        r}   Tr¹   Frd   N)rS   r   ro   r{   r—   r
   r   r   r   rý      s    ÿÿÿÿÿÿzTextTests.test_isEqualToNodeNr   r   r   r   r   r    s   r  c                   @   s   e Zd ZdZdd„ ZdS )ÚCDATASectionTestsz$
    Tests for L{CDATASection}.
    c                 C   s<   |   t d¡ t d¡¡¡ |  t d¡ t d¡¡¡ dS )z
        L{CDATASection.isEqualToNode} returns C{True} if and only if passed a
        L{CDATASection} which represents the same data.
        r}   rd   N)rS   r   rw   r{   r—   r
   r   r   r   rý   5  s    
ÿÿ
ÿÿz$CDATASectionTests.test_isEqualToNodeNr   r   r   r   r   r  1  s   r  c                   @   s   e Zd ZdZdd„ ZdS )ÚElementTestsz
    Tests for L{Element}.
    c              
   C   s6  |   tjddditƒ dd tjddditƒ dd¡¡ |  tjddditƒ dd tjddditƒ dd¡¡ |  tjddditƒ dd tjddditƒ dd¡¡ tjddditƒ dd}tjddditƒ dd}| t tƒ ¡¡ |  | |¡¡ |  tjddditƒ dd tjddditƒ dd¡¡ dS )	z¸
        L{Element.isEqualToNode} returns C{True} if and only if passed a
        L{Element} with the same C{nodeName}, C{namespace}, C{childNodes}, and
        C{attributes}.
        r}   r5   r[   rd   r×   r‚   rl   N)rS   r   rz   r÷   r{   r—   r†   rö   )r   ZoneZtwor   r   r   rý   G  s€       ÿ   ÿþÿ   ÿ   ÿþÿ   ÿ   ÿþÿ   ÿ   ÿþÿzElementTests.test_isEqualToNodeNr   r   r   r   r   r  C  s   r  N)rô   Úior   Ztwisted.trial.unittestr   Ztwisted.webr   r   r   Z	XMLParserr   r   r#   ré   rõ   rü   rÿ   r  r  r  r  r  r   r   r   r   Ú<module>   s.         L73