
    Vh*                    t   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
 ddlmZmZmZ  G d d	ej                        Z G d
 de
      Z G d de
      Z G d de
      Z G d de
      Z G d de
      Z G d de
      Z G d de
      Z G d de
      Z G d de
      Z G d de
      Z G d de
      Zy )!z;
Some fairly inadequate testcases for Twisted XML support.
    )annotations)reload)BytesIO)Literal)TestCase)
domhelpersmicrodomsuxc                  ,    e Zd ZddZddZddZd	dZy)
Sux0rc                    g | _         y )Ntokensselfs    I/home/dcms/DCMS/lib/python3.12/site-packages/twisted/web/test/test_xml.py__init__zSux0r.__init__   s      	    c                R    | j                   D cg c]  }|d   dk(  s| c}S c c}w )Nr   startr   )r   tokens     r   getTagStartszSux0r.getTagStarts   s%    #';;F%%(g2EFFFs   $$c                @    | j                   j                  d||f       y )Nr   r   append)r   nameattrss      r   gotTagStartzSux0r.gotTagStart   s    GT512r   c                >    | j                   j                  d|f       y )Ntextr   )r   r    s     r   gotTextzSux0r.gotText   s    FD>*r   NreturnNone)r#   z2list[tuple[Literal['start'], str, dict[str, str]]])r   strr   zdict[str, str]r#   r$   )r    r%   r#   r$   )__name__
__module____qualname__r   r   r   r!    r   r   r   r      s    
G3+r   r   c                      e Zd ZddZy)SUXTestsc                    d}t               }|j                          |j                  |       | j                  t	        |j                               d       y )Ns   <bork><bork><bork>   )r   connectionMadedataReceivedassertEquallenr   )r   smss      r   	test_borkzSUXTests.test_bork$   sB    !W

R__./3r   Nr"   )r&   r'   r(   r4   r)   r   r   r+   r+   #   s    4r   r+   c                     e Zd Zd5dZd5dZd5dZd5dZd5dZd5dZd5dZ	d5dZ
d5d	Zd5d
Zd5dZd5dZd5dZd5dZd5dZd5dZd5dZd5dZd5dZd5dZd5dZd5dZd5dZd5dZd5dZd5dZd5dZd5dZg dZd5dZ d5dZ!d5d Z"d5d!Z#d5d"Z$d5d#Z%d5d$Z&d5d%Z'd5d&Z(d5d'Z)d5d(Z*d5d)Z+d5d*Z,d5d+Z-d5d,Z.d5d-Z/d5d.Z0d5d/Z1d5d0Z2d5d1Z3d5d2Z4d5d3Z5y4)6MicroDOMTestsc           	     0   d}t        j                  |d      }| j                  |j                         j	                         d       t               }|j                         j                  |ddddi d       | j                  |j                         d       y)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	   parseStringr0   
firstChildtoxmlr   writexmlgetvaluer   r2   d
byteStreams       r   test_leadingTextDroppingz&MicroDOMTests.test_leadingTextDropping-   s    
 (  t<LLN  "$P	
 Y
	
BBBC!#P	
r   c           	     0   d}t        j                  |d      }| j                  |j                         j	                         d       t               }|j                         j                  |ddddi d       | j                  |j                         d       y)z~
        Ensure that no *trailing* text in a mal-formed
        no-top-level-element document(s) will not be dropped.
        z<br>Hi orders!Tr8   z<html><br />Hi orders!</html>r:   s   <html><br />Hi orders!</html>Nr;   rA   s       r   test_trailingTextDroppingz'MicroDOMTests.test_trailingTextDropping=   s|    
   t<--/1PQY
	
BBBC,,.0PQr   c                    d}t        j                  |d      }| j                  |j                         j	                         d       y)zp
        A string with nothing that looks like a tag at all should just
        be parsed as body text.
        z
Hi orders!Tr8   z<html>Hi orders!</html>Nr	   r<   r0   r=   r>   r   r2   rB   s      r   test_noTagszMicroDOMTests.test_noTagsI   s;    
   t<--/1JKr   c                    d}t        j                  |d      }| j                  |j                         j	                         d       y)zl
        If a document is surrounded by non-xml text, the text should
        be remain in the XML.
        zHi<br> orders!Tr8   z<html>Hi<br /> orders!</html>NrH   rI   s      r   test_surroundingCrapz"MicroDOMTests.test_surroundingCrapR   s;    
   t<--/1PQr   c                
   d}t        j                  |d      }t        j                  |j                  d      }t        j
                  |d   d      j                  dd      }| j                  |j                  d      d	       y )
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>
               r8   ar   z&nbsp; insane)	r	   r<   r   findNodesNameddocumentElementgatherTextNodesreplacer0   find)r   r2   rB   lns        r   test_caseSensitiveSoonCloserz*MicroDOMTests.test_caseSensitiveSoonCloser[   sq       q9%%a&7&7=&&qtQ/77#F)2.r   c                    d}t        j                  |d      }| j                  |j                  |j                  j	                         j
                         y)z
        Test that C{parentNode} attributes are set to meaningful values when
        we are parsing HTML that lacks a root node.
        z
<br/><br/>rN   r8   Nr	   r<   assertIdenticalrT   r=   
parentNoderI   s      r   test_lenientParentingz#MicroDOMTests.test_lenientParentingm   sI       q9q00;;=HH	
r   c                    d}t        j                  |d      }| j                  |j                  |j                  j	                         j
                         y)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.
        HellorN   r8   Nr\   rI   s      r   test_lenientParentSinglez&MicroDOMTests.test_lenientParentSingley   sI    
   q9q00;;=HH	
r   c                    d}t        j                  |d      }t        j                  |      }| j	                  |j                  d      d       y )Nz
                <HTML>
                    This HTML goes between Stupid <=CrAzY!=> Dumb.
                </HTML>
            rN   r8   >rR   )r	   r<   r   rU   assertNotEqualrW   r   r2   rB   rY   s       r   test_unEntitieszMicroDOMTests.test_unEntities   sE    
   q9&&q)AFF3K,r   c                b    | j                  t        j                  t        j                  d       y )Nr:   )assertRaisesr
   
ParseErrorr	   r<   r   s    r   test_emptyErrorzMicroDOMTests.test_emptyError   s    #..(*>*>Cr   c                    d}t        j                  |      }| j                  t        j                  |j
                        j                         d       y )Nz
        <test>
         <it>
          <is>
           <a>
            test
           </a>
          </is>
         </it>
        </test>
        test)r	   r<   r0   r   rU   rT   striprI   s      r   test_tameDocumentzMicroDOMTests.test_tameDocument   sF    
   #33A4E4EFLLNPVWr   c                    d}t        j                  |d      }t        j                  |j                  d      }| j                  t        |      d       y )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>
        rN   r8   blink)r	   r<   r   rS   rT   r0   r1   )r   r2   rB   rX   s       r   test_awfulTagSoupzMicroDOMTests.test_awfulTagSoup   sI    *   q9%%a&7&7AQ#r   c                V   d}t        j                  |d      }| j                  |j                         j                         j                         j                  d       | j                  |j                         j                  d      d   j                         j                  d       y )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>
        rN   r8   z(foo < bar) and (bar > foo)scriptzfoo </scrip bar )r	   r<   r0   r=   datagetElementsByTagNamerI   s      r   test_scriptLeniencyz!MicroDOMTests.test_scriptLeniency   s       q9LLN%%'22499;X	
 	LLN//9!<GGINN	
r   c                   d}| j                  t        j                  |d      j                         j	                         |       d}| j                  t        j                  |d      j                         j	                         |       d}| j                  t        j                  |d      j                         j	                         |       y )Nz<script><!-- lalal --></script>rN   r8   z"<script><![CDATA[lalal]]></script>z:<script> // <![CDATA[
        lalal
        //]]></script>)r0   r	   r<   r=   r>   r   r2   s     r   test_scriptLeniencyIntelligencez-MicroDOMTests.test_scriptLeniencyIntelligence   s     2  q9DDFLLNPQ	
 5  q9DDFLLNPQ	
 	  q9DDFLLNPQ	
r   c                   d}|j                         j                  dd      }t        j                  |dd      }t        j                  |dd      }t        j                  |dd      }t        j                  |dd      }t        j                  |dd      }| j	                  |j
                  j                         |       | j                  |j                  |      |j                         d|j                                | j                  |j                  |      |j                         d|j                                | j                  |j                  |      |j                         d|j                                | j                  |j                  |      |j                         d|j                                y )NzH<eNcApSuLaTe><sUxor></sUxor><bOrk><w00T>TeXt</W00t></BoRk></EnCaPsUlAtE>r    TeXtrN   caseInsensitivepreserveCaser   z != )	lowerrV   r	   r<   r0   rT   r>   
assertTrueisEqualToDocument)r   r2   s2rB   d2d3d4d5s           r   test_preserveCasezMicroDOMTests.test_preserveCase   sh   VWWYvv.  AAF!!!QQG !!"aaH!!"aaH!!"aaH
 	**002A6++B/AGGI=RXXZN1ST,,R0RXXZN$rxxzn2UV 	,,R0RXXZN$rxxzn2UV,,R0RXXZN$rxxzn2UVr   c                    d}t        j                  |      }|j                  }| j                  |j	                  d      d       | j                  |j	                  d      d       y )Nz<test a="a" b='b' />rO   br	   r<   rT   r0   getAttributer   r2   rB   es       r   test_differentQuotesz"MicroDOMTests.test_differentQuotes   sT    $  #,c2,c2r   c                    d}t        j                  |      }|j                  }| j                  |j	                  d      d       | j                  |j	                  d      d       y )Nz<test 
a="a"
	b="#b" />rO   r   z#br   r   s       r   test_LinebreakszMicroDOMTests.test_Linebreaks   sT    (  #,c2,d3r   c                p    dD ]1  }| j                  t        j                  t        j                  |       3 y )N)z<test>z<test> </tset>z</test>)ri   r	   MismatchedTagsr<   ry   s     r   test_mismatchedTagsz!MicroDOMTests.test_mismatchedTags  s1    6 	PAh55x7K7KQO	Pr   c                   d}t        j                  |      }|j                  }| j                  |j                  d       |j
                  d   }| j                  t        |t         j                               | j                  |j                  d       |j                         }| j                  ||u       | j                  |j                         d       y )Nz<bar><!--<foo />--></bar>barr   <foo />z<!--<foo />-->)r	   r<   rT   r0   nodeName
childNodesr   
isinstanceCommentvalue	cloneNoder>   )r   r2   rB   r   cc2s         r   test_commentzMicroDOMTests.test_comment  s    '  #U+LLO
1h&6&678),[[]$%56r   c                p   t        j                  d      j                  }|j                  d   }| j	                  t        |t         j                               | j                  |j                  d       |j                         }| j	                  ||u       | j                  |j                         d       y )Nz<bar>xxxx</bar>r   xxxx)r	   r<   rT   r   r   r   Textr0   r   r   r>   )r   rB   r    clones       r   	test_textzMicroDOMTests.test_text  s      !23CC||A
478V, T)*/r   c                   t        j                  d      j                  j                  }| j	                  t        |      d       | j	                  |d   j                  d       | j	                  |d   j                  d       | j	                  |d   j                         j                         d       |D ]+  }| j                  t        |t         j                               - y )Nz<b>&amp;&#12AB;</b>   r   &amp;rN   z&#12AB;)r	   r<   rT   r   r0   r1   ru   r   r>   r   r   EntityReference)r   nodesrY   s      r   test_entitieszMicroDOMTests.test_entities  s    $$%:;KKVVUQ'q0q	2q++-335w? 	EAOOJq(*B*BCD	Er   c                F   d}t        j                  |      j                  j                  d   }| j	                  t        |t         j                               | j                  |j                  d       | j                  |j                         j                         d       y )Nz<x><![CDATA[</x>
 & foo]]></x>r   z</x>
 & fooz<![CDATA[</x>
 & foo]]>)r	   r<   rT   r   r   r   CDATASectionr0   ru   r   r>   )r   r2   cdatas      r   
test_CDatazMicroDOMTests.test_CData%  sw    /$$Q'77BB1E
5(*?*?@A%56*0024PQr   c                   d}d}t        j                  |      j                  j                  }t        j                  |      j                  j                  }| j	                  t        |      d       t        ||      D ]j  \  }}| j                  t        |t         j                               | j	                  |j                  d       | j                  |j                  |             l y )Nz<foo><b/><b /><b
/></foo>z<foo><b/><b/><b/></foo>r-   r   )r	   r<   rT   r   r0   r1   zipr   r   Elementr   isEqualToNode)r   r2   r   r   nodes2rY   n2s          r   test_singletonszMicroDOMTests.test_singletons,  s    (&$$Q'77BB%%b)99DDUQ'' 	1EArOOJq(*:*:;<QZZ-OOAOOB/0	1r   c                   d}t        j                  |      j                  }| j                  |j	                  d      d       | j                  |j	                  d      d        | j                  |j                  d             | j                  |j                  d              |j                  d      }| j                  |j                  d       |j                  dd       | j                  |j	                  d      d       y )Nz<foo a="b" />rO   r   r   foor   )
r	   r<   rT   r0   r   r   hasAttributegetAttributeNoder   setAttribute)r   r2   noderO   s       r   test_attributeszMicroDOMTests.test_attributes7  s    ##A&66**3/5**3/6))#./D--c223!!#&#&%'**5159r   c                   d}t        j                  |      j                  }| j                  |j                  D cg c]  }|j
                   c}g d       | j                  |j                         j
                  d       | j                  |j                         j
                  d       | j                  |j                                | j                  |j                         j                                 y c c}w )Nz'<foo><bar /><baz /><bax>foo</bax></foo>)r   bazbaxr   r   )
r	   r<   rT   r0   r   r   	lastChildr=   r   hasChildNodesrf   s       r   test_childrenzMicroDOMTests.test_childrenE  s    5  #33all;!**;=RS//700%8)*ALLN88::;	 <s   C:c                   d}d}d}t        j                  |      j                  }t        j                  |      j                  }t        j                  |      j                  }|j                  |j	                                |j                  dd       |j                  d   }| j                  |j                  d      d        | j                  |j                  d       |j                  t        j                  d      |       | j                  |j                  d   j                  d       | j                  |j                  d	   |       |j                  D ]  }| j                  |j                  |         | j                  |j                  |             |j                  |       | j                  t!        |j                        d	       | j                  |j                  d   j                  d       t        j"                  d      }	|j%                  |	|j'                                | j                  |j'                         |	       | j                  |j                  |             y )
Nr   z<foo a="b"><bar/><foo/></foo>z<foo a="b">foo</foo>rO   r   r   r   r   rN   )r	   r<   rT   appendChildr   r   r   r0   r   r   insertBeforer   r^   r   r   removeChildr1   r   replaceChildr=   )
r   r2   s1r   rB   d1r   childrY   ts
             r   test_mutatezMicroDOMTests.test_mutateN  s   ,#  #33!!"%55!!"%55	akkm$	sC Q++C0$7/	x''.6a1159a%0 	.AQ\\1-	.+,	eQ\\*A.a1159MM% 	q!,,.)++,r   c                    t        j                  d      }t        j                  d      }t        j                  d      }| j                  t        |j                  ||       y)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.
        r   z<bar />z<baz />N)r	   r<   ri   
ValueErrorr   )r   parentorphanreplacements       r   test_replaceNonChildz"MicroDOMTests.test_replaceNonChildl  sN    
 %%i0%%i0**95*f&9&9;Or   c                t   d}d}t        j                  |      }t        j                  |dd      }t        j                  |dd      }|j                  }| j                  |j	                         |j                  d             | j                  |j                  d      ||j                         j	                         g       |j                  }| j                  |j	                         |j                  d             | j                  |j                  d      |g       | j                  |j                  d	      |j                         j	                         g       | j                  |j                  d      g        |j                  }| j                  |j	                         |j                  d             | j                  |j                  d
      ||j                         j	                         g       | j                  |j                  d      ||j                         j	                         g       y )Nz,<foo><bar id='me' /><baz><foo /></baz></foo>z,<fOo><bAr id='me' /><bAz><fOO /></bAz></fOo>r   rN   r}   mer   fOofOOFOO)r	   r<   rT   r0   r=   getElementByIdrv   r   )r   r2   r   rB   r   r   roots          r   test_searchzMicroDOMTests.test_searchw  s   :;  #!!"aaH!!"aaH  *A,<,<T,BC""5)D$..2B2M2M2O+P	
 !!*B,=,=d,CD007$@##E*T^^-=-H-H-J,K	
 	007<!!*B,=,=d,CD##E*T4>>3C3N3N3P,Q	
 	##E*T4>>3C3N3N3P,Q	
r   c                   d}d}t        j                  |      }t        j                  |      }| j                  |j                  d       | j                  |j	                         |       | j                  |j                  |             | j                  |j                  j                  |j                               y )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<   r0   doctyper>   assertFalser   r   rT   r   )r   r2   r   rB   r   s        r   test_doctypezMicroDOMTests.test_doctype  s     	

   #!!"%IIN	
 	A&,,R01))778J8JKLr   ))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                    | j                   D ]  \  }}t        j                  |d      }t        j                  |d      }|j                  j	                         }| j                  ||       | j                  |j                  |              y )Nr   r~   )samplesr	   r<   rT   r>   r0   r   r   )r   r2   outrB   r   testOuts         r   test_outputzMicroDOMTests.test_output  sx    ll 	5FAs$$Q:A%%c1=B''--/GS'*OOA//34	5r   c                \    dD ]'  }| j                  t        t        j                  |       ) y )N)z<foo>&am</foo>z<fooz<f>&</f>z<() />)ri   	Exceptionr	   r<   ry   s     r   test_errorszMicroDOMTests.test_errors  s+    A 	BAi)=)=qA	Br   c                   d}d}d}d}t        j                  |      }t        j                  |      }t        j                  |d      }t        j                  |dd      }t        j                  |dd      }	t        j                  |dd      }
t        j                  |      j                  j                         }| j	                  t         j
                  t         j                  |d       | j                  ||       | j                  |j                  |             | j                  |j                  |             | j                  |j                  j                  d	             | j                  |
j                  j                  d	             | j                  |j                  j                         d
       | j                  |	j                  j                         d       y )Nz<foo a='b'><BAx>x</bax></FOO><foo a="b"><bax>x</bax></foo>z<FOO a='b'><BAx>x</BAx></FOO>r   rN   r   r}   r   rO   r   z<foo a="b">x</foo>)r	   r<   rT   r>   ri   r   r0   r   r   r   r   )r   r2   r   s3s4rB   r   r   r   r   d6r   s               r   test_caseInsensitivez"MicroDOMTests.test_caseInsensitive  s   +,,!  #!!"%!!"a8!!"aaH!!"aaH!!"aaH""1%55;;=##X%9%91a 	 	
 	b!++B/0++B/0**77<=++88=>++1135IJ++1135IJr   c                   d}t        j                  |      }| j                  |j                  j	                          |j                  j
                         | j                  |j                  t        j                  d                   y )Nz<hello>
        </hello>z<hello></hello>)r	   r<   r   rT   r   r   r   rI   s      r   test_eatingWhitespacez#MicroDOMTests.test_eatingWhitespace  sm      #!!//1113D3D3O3O	
 	++H,@,@AR,STUr   c                2   d}dD ]O  \  }}t        j                  | d| dd      }| j                  |j                  j	                         d|z         Q t        j                  dd      }| j                  |j                  j	                         d	       y )
Nz<?xml version='1.0'?>))&r   )z& z&amp; )r   r   )z&hello monkeyz&amp;hello monkeyz<pre>z</pre>rN   r8   z<pre>%s</pre>z<t>hello & there</t>z<t>hello &amp; there</t>r	   r<   r0   rT   r>   )r   prefixiorB   s        r   test_lenientAmpersandz#MicroDOMTests.test_lenientAmpersand  s    (
 	MDAq $$xuQCv%>STUAQ..446!8KL	M   !7AN**0024NOr   c                    t        j                  dd      }| j                  |j                  j	                         j                         d       y )Nz3<?xml version='1.0'?><bar><xA><y>c</Xa> <foo></bar>rN   r8   z<xa><y>c</y></xa>)r	   r<   r0   rT   r=   r>   )r   rB   s     r   test_insensitiveLenientz%MicroDOMTests.test_insensitiveLenient  sC      AVW
 	**557==?ATUr   c                    d}t        j                  |d      }d}|j                  j                         }| j	                  ||       y )Nz<ul><li>foo<li>bar<li>baz</ul>rN   r8   z-<ul><li>foo</li><li>bar</li><li>baz</li></ul>r	   r<   rT   r>   r0   r   r2   rB   expectedactuals        r   test_laterCloserSimplez$MicroDOMTests.test_laterCloserSimple  sB    ,  q9B""((*6*r   c                    d}t        j                  |d      }d}|j                  j                         }| j	                  ||       y )Nz<DL><p><DT>foo<DD>bar</DL>rN   r8   z(<dl><p></p><dt>foo</dt><dd>bar</dd></dl>r   r  s        r   test_laterCloserCaseInsensitivez-MicroDOMTests.test_laterCloserCaseInsensitive  sB    (  q9=""((*6*r   c                    d}d}t        j                  |d      }|j                  j                         }| j	                  ||       y )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>rN   r8   r   )r   r2   r  rB   r  s        r   test_laterCloserDLz MicroDOMTests.test_laterCloserDL  sN     	
 	   q9""((*6*r   c                   dd l d}d}d}dfd}t        j                   ||j                  d                  }t        j                  |j                  d            }t        j                  |      }| j	                  |j                  |             | j	                  |j                  |             t        j                  |      }t        j                   ||            }t        j                  |      }| j	                  |j                  |             | j	                  |j                  |             t        j                  d      }d}	t        j                         j                  d	d
      j                  }
|j                  }|j                  |
       |j                  |j                  d	             | j                  |j                         |	dz          y )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 > \[000  < / T I T L E > < / J A P A N E S E > c                    t        t        |       dz        dz   } j                  d|z   gj                  d|z   |        S )Nr   H<rd   )r%   r1   packunpack)r2   fmtstructs     r   reverseBytesz9MicroDOMTests.test_unicodeTolerance.<locals>.reverseBytes  sC    c!fk"S(C6;;sSyG6==sA+FGGr   zUTF-16r   z<?xml version="1.0"?>u   √rN   rawu#   <foo><div>√</div><!--√--></foo>)r2   bytesr#   r  )r  r	   r<   encoder   r   lmxr    r   rT   r   createCommentr0   r>   )r   r2   jj2r  urdudsdj3hdrdivder  s               @r   test_unicodeTolerancez#MicroDOMTests.test_unicodeTolerance  s   +N 	

P 		H ""<0B#CD!!!((8"45!!!$,,R01,,S12!!!$""<#34!!"%,,R01,,S12 !!(+%lln!!(!277
s
r''12HHJJJ	
r   c                "   dddd}|j                         D ]v  }t        j                  |      j                  }t	        j
                  |d      }| j                  t        |      ||          |sY| j                  t        |d   d             x y )Nr-   r   rN   )z:<foo><bar /><bar unf='1' /><bar>asdfadsf</bar><bam/></foo>z<foo>asdf</foo>z!<foo><bar><bar></bar></bar></foo>r   tagName)
keysr	   r<   rT   r   namedChildrenr0   r1   r   hasattr)r   testsr   r   results        r   test_namedChildrenz MicroDOMTests.test_namedChildren:  s    MN 12

  	?A''*::D--dE:FS[%(3q	9 =>	?r   c                   d}t        j                  |      j                  }|j                  d      }| j	                  ||       | j                  t        |j                        t        |j                               |j                         |j                         }}| j	                  ||       | j                  t        |j                        t        |j                               | j	                  |j                         |j                                | j                  ||j                                | j                  |j                  |j                         y )Nr   rN   deep)r	   r<   rT   r   failIfEqualsr0   r1   r   r=   r>   	namespace)r   r2   r   r   c1r   s         r   test_cloneNodezMicroDOMTests.test_cloneNodeG  s    +##A&66A&$&T__-s53C3C/DE"E$4$4$6B"b!R]]+S-?@"--/2==?;EKKM*9r   c                   d}t        j                  |      }|j                  d      }| j                  ||       | j	                  t        |j                        t        |j                               | j	                  ||j                                | j                  |j                  |             | j                  |j                  |             y )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>rN   r+  )
r	   r<   r   r-  r0   r1   r   r>   r   r   )r   r2   r   r   s       r   test_cloneDocumentz MicroDOMTests.test_cloneDocumentT  s    T 	
 ##A&A&$&T__-s53C3C/DEEKKM*//56..u56r   c                N   t        j                  d      }t        j                  |      }|j                  d       |j	                  d      }d|j                         d<   |j                          |j                  dd       d	}| j                  ||j                                y )
Npr   r   )rO   zr   y)r   zF<p>foo<b a="c"><foo z="foo"></foo><foo></foo><bar c="y"></bar></b></p>)	r	   r   r  r    r   r   addr0   r>   )r   rY   r  r   r2   s        r   test_LMXzMicroDOMTests.test_LMXd  s|    S!ll1oEECEL		esTAGGI&r   c                D    t        j                  d      }t        |       y)z9
        Returns a dictionary which is hashable.
        r4  N)r	   r   hash)r   rY   s     r   	test_dictzMicroDOMTests.test_dictp  s     S!Qr   c                    d}d}t        j                  |      }| j                  ||       | j                  t        j                  |      |       y )Nz&'some "stuff"', <what up?>z/&amp;'some &quot;stuff&quot;', &lt;what up?&gt;)r	   escaper0   unescape)r   r  cookedesc1s       r   test_escapingzMicroDOMTests.test_escapingw  sE    -Bs#v&**40#6r   c                   d}t        j                  |      }|j                         }| j                  |j                  j
                  d       | j                  |j                  j                  d      d   j
                  d       | j                  |j                  j                  d      d   j                  dd      d       t        j                  |      }| j                  |j                  j
                  d       | j                  |j                  j                  d      d   j
                  d       | j                  |j                  j                  d      d   j                  dd      d       y )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>
        baser6  r   rN   q1)r	   r<   toprettyxmlr0   rT   r.  rv   getAttributeNS)r   r2   rB   r   r   s        r   test_namespaceszMicroDOMTests.test_namespaces  sB      #]]_**44f=2237:DDf	
 	2237:II&RUV	

 !!"%++55v>33C8;EEv	
 	33C8;JJ6SVW	
r   c                r    d}t        j                  |      j                         }| j                  ||       y)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>   r0   )r   r   r   s      r   test_namespaceDeletez"MicroDOMTests.test_namespaceDelete  s7    
, 	 !!"%++-R r   c                    t        j                  d      }t        j                  dd      }|g|_        | j                  |j	                         d       y)z
        Check that unspecified namespace is a thing separate from undefined
        namespace. This test added after discovering some weirdness in Lore.
        olr  zhttp://www.w3.org/1999/xhtmlr.  z9<div xmlns="http://www.w3.org/1999/xhtml"><ol></ol></div>N)r	   r   r   r0   r>   )r   r   r   s      r   test_namespaceInheritancez'MicroDOMTests.test_namespaceInheritance  sK       &!!%3QR"GLLNW	
r   c                z   d}d}t        j                         }|j                  d|      }|j                  |di       |j                  d|      }|j                  d|      }|j	                  |       |j	                  |       |j	                  |       d}|j                         }| j                  ||       y	)
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   rM  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>   r0   )	r   outerNamespaceinnerNamespacedocumentr   rS  r   xmlOkxmlOuts	            r   test_prefixedTagszMicroDOMTests.test_prefixedTags  s     43$$& %%f%G 	.'23 $$Un$E &&w.&IT" 	 !'r   c                z   d}d}t        j                         }|j                  d|      }|j                  |       |j	                  |di       |j                  d|      }|j                  |       |j                  d|      }|j                  |       d}|j                         }| j                  ||       y	)
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>
        rP  rQ  r   rM  rR  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	   rT  rU  r   rV  r>   r0   )	r   rW  rX  rY  r   r^  r_  rZ  r[  s	            r   test_prefixPropagationz$MicroDOMTests.test_prefixPropagation  s    < 43$$&%%f%GT" 	.'23&&w.&I ))*)O(# 	 !'r   c                    t        t               | j                  | j                  g      }| j	                  dt        |             | j	                  d|d   d          y)z?
        An import will raise the deprecation warning.
        rN   z6twisted.web.microdom was deprecated at Twisted 23.10.0r   messageN)r   r	   flushWarningstest_deprecationr0   r1   )r   warningss     r   rd  zMicroDOMTests.test_deprecation  sV     	x%%t'<'<&=>CM*DQK	"	
r   Nr"   )6r&   r'   r(   rD   rF   rJ   rL   rZ   r_   rb   rg   rk   ro   rr   rw   rz   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)  r0  r2  r8  r;  rA  rH  rJ  rN  r\  r`  rd  r)   r   r   r6   r6   ,   s   
 
RLR/$

	
-DX$4
"
$W034P
70ER	1:<-<	P
<M G5BK.VPV+++"+
Z?:7 
'7
@	!
)(V9(v

r   r6   c                  R    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	y)BrokenHTMLTestsaC  
    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 '!\n '.
    The expected behaviour is loosely modelled on the way Firefox treats very
    bad HTML.
    c                    t        j                  ||      }| j                  |j                  j	                         |       y)z
        Check that C{input}, when parsed, produces a DOM where the XML
        of the document element is equal to C{expected}.
        r8   Nr   )r   inputr  r9   outputs        r   checkParsedzBrokenHTMLTests.checkParsed3  s6     %%e@RS//557Br   c                0    d}d}| j                  ||       y)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rk  r   ri  r  s      r   test_brokenAttributeNamez(BrokenHTMLTests.test_brokenAttributeName=  s    
 JS)r   c                0    d}d}| j                  ||       y)zJ
        Check that microdom encompasses broken attribute values.
        z6<body><h1><div align="cen!
 ter">Foo</div></h1></body>Nrm  rn  s      r   test_brokenAttributeValuez)BrokenHTMLTests.test_brokenAttributeValueF  s     JL)r   c                0    d}d}| j                  ||       y)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>Nrm  rn  s      r   test_brokenOpeningTagz%BrokenHTMLTests.test_brokenOpeningTagN  s    
 FJ)r   c                L    | j                  dd       | j                  dd       y)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>Nrm  r   s    r   test_brokenSelfClosingTagz)BrokenHTMLTests.test_brokenSelfClosingTagW  s&    
 	35QR8r   c                    d}d}| j                  ||       d}| j                  ||       d}| j                  ||       d}d}| j                  ||       y)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>Nrm  rn  s      r   test_brokenClosingTagz%BrokenHTMLTests.test_brokenClosingTag_  sc    
 ED)D)D)DK)r   N)rN   )ri  r%   r  r%   r9   intr#   r$   r"   )
r&   r'   r(   __doc__rk  ro  rq  rs  ru  rw  r)   r   r   rg  rg  *  sQ     DECC$'C=@C	C***9*r   rg  c                       e Zd ZdZddZddZy)	NodeTestsz
    Tests for L{Node}.
    c                   t        j                  t                     }| j                  |j	                  |             t        j                  t                     }| j                  |j	                  |             |j                  t        j                  t                            | j                  |j	                  |             |j                  t        j                  t                            | j                  |j	                  |             |j                         j                  t        j                  t                            | j                  |j	                  |             |j                         j                  t        j                  t                            | j                  |j	                  |             y)zw
        L{Node.isEqualToNode} returns C{True} if and only if passed a L{Node}
        with the same children.
        N)r	   Nodeobjectr   r   r   r   r=   )r   r   anothers      r   test_isNodeEqualTozNodeTests.test_isNodeEqualTou  s,    }}VX&**401--)**734vx01++G45HMM&(34 	**734 	%%hmmFH&=>++G45 	((vx)@A**734r   c                   t        j                         }t        j                         }|j                  |       | j                  t        |j                  d       | j                  t        |j
                  |d       | j                  t        |j
                  d|       | j                  t        |j
                  dd       |j                  |       | j                  t        |j                  d       | j                  t        |j                  |d       | j                  t        |j                  d|       | j                  t        |j                  dd       y)zO
        Children of L{Node} instances must also be L{Node} instances.
        N)r	   r}  r   ri   	TypeErrorr   r   r   )r   r   r   s      r   test_validChildInstancez!NodeTests.test_validChildInstance  s    }})T%5%5t<)T%6%6tD)T%6%6eD)T%6%6dC)T%5%5t<)T%6%6tD)T%6%6eD)T%6%6dCr   Nr"   )r&   r'   r(   ry  r  r  r)   r   r   r{  r{  p  s    56Dr   r{  c                  $    e Zd ZdZdZddZddZy)DocumentTestsz 
    Tests for L{Document}.
    r   c                t   t        j                         }| j                  |j                  |             t        j                         }| j                  |j                  |             | j                  |_        | j                  |j                  |             | j                  |_        | j                  |j                  |             |j                  t        j                  t                            | j                  |j                  |             |j                  t        j                  t                            | j                  |j                  |             |j                  j                  t        j                  t                            | j                  |j                  |             y)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	   rT  r   r   r   r   r   r}  r~  rT   )r   rY  r  s      r   test_isEqualToNodez DocumentTests.test_isEqualToNode  s7    $$&..x89 ##%..w78  <<//89,,..w78 	X]]6845//89HMM&(34..w78 	  ,,X]]68-DE//89r   c                    t        j                         }t        j                         }t        j                         }|j                  |       | j	                  t
        |j                  |       y)zk
        L{Document.appendChild} raises L{ValueError} if the document already
        has a child.
        N)r	   rT  r}  r   ri   r   )r   rY  r   r  s       r   test_childRestrictionz#DocumentTests.test_childRestriction  sN    
 $$&--/U#*h&:&:GDr   Nr"   )r&   r'   r(   ry  r   r  r  r)   r   r   r  r    s     FG:>	Er   r  c                      e Zd ZdZddZy)EntityReferenceTestsz'
    Tests for L{EntityReference}.
    c                   | j                  t        j                  d      j                  t        j                  d                   | j	                  t        j                  d      j                  t        j                  d                   y)z
        L{EntityReference.isEqualToNode} returns C{True} if and only if passed
        a L{EntityReference} with the same C{eref}.
        quotaposN)r   r	   r   r   r   r   s    r   r  z'EntityReferenceTests.test_isEqualToNode  sn    
 	$$V,::((0	

 	$$V,::((0	
r   Nr"   r&   r'   r(   ry  r  r)   r   r   r  r    s    
r   r  c                      e Zd ZdZddZy)CharacterDataTestsz%
    Tests for L{CharacterData}.
    c                   | j                  t        j                  d      j                  t        j                  d                   | j	                  t        j                  d      j                  t        j                  d                   y)z
        L{CharacterData.isEqualToNode} returns C{True} if and only if passed a
        L{CharacterData} with the same value.
        r   r   N)r   r	   CharacterDatar   r   r   s    r   r  z%CharacterDataTests.test_isEqualToNode  sh    
 	""5)778N8Nu8UV	
 	""5)778N8Nu8UV	
r   Nr"   r  r)   r   r   r  r        

r   r  c                      e Zd ZdZddZy)CommentTestsz
    Tests for L{Comment}.
    c                   | j                  t        j                  d      j                  t        j                  d                   | j	                  t        j                  d      j                  t        j                  d                   y)zz
        L{Comment.isEqualToNode} returns C{True} if and only if passed a
        L{Comment} with the same value.
        r   r   N)r   r	   r   r   r   r   s    r   r  zCommentTests.test_isEqualToNode  sa    
 	((/==h>N>Nu>UVW))%0>>x?O?OPU?VWXr   Nr"   r  r)   r   r   r  r     s    Yr   r  c                      e Zd ZdZddZy)	TextTestsz
    Tests for L{Text}.
    c                   | j                  t        j                  dd      j                  t        j                  dd                   | j	                  t        j                  dd      j                  t        j                  dd                   | j	                  t        j                  dd      j                  t        j                  dd                   y)z
        L{Text.isEqualToNode} returns C{True} if and only if passed a L{Text}
        which represents the same data.
        r   Tr  Fr   N)r   r	   r   r   r   r   s    r   r  zTextTests.test_isEqualToNode  s    
 	MM%T*88uRV9WX	
 	MM%T*88e/	

 	MM%T*88uRV9WX	
r   Nr"   r  r)   r   r   r  r    s    
r   r  c                      e Zd ZdZddZy)CDATASectionTestsz$
    Tests for L{CDATASection}.
    c                   | j                  t        j                  d      j                  t        j                  d                   | j	                  t        j                  d      j                  t        j                  d                   y)z
        L{CDATASection.isEqualToNode} returns C{True} if and only if passed a
        L{CDATASection} which represents the same data.
        r   r   N)r   r	   r   r   r   r   s    r   r  z$CDATASectionTests.test_isEqualToNode*  sh    
 	!!%(66x7L7LU7ST	
 	!!%(66x7L7LU7ST	
r   Nr"   r  r)   r   r   r  r  %  r  r   r  c                      e Zd ZdZddZy)ElementTestsz
    Tests for L{Element}.
    c           
     8   | j                  t        j                  dddit               d      j	                  t        j                  dddit               d                   | j                  t        j                  dddit               d      j	                  t        j                  dddit               d                   | j                  t        j                  dddit               d      j	                  t        j                  dddit               d                   t        j                  dddit               d      }t        j                  dddit               d      }|j                  t        j                  t                            | j                  |j	                  |             | j                  t        j                  dddit               d      j	                  t        j                  dddit               d                   y)	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   rO   r   r   rM  r   r   N)r   r	   r   r~  r   r   r   r}  )r   onetwos      r   r  zElementTests.test_isEqualToNode<  s    	Sz68um  c
FHN	
 	Sz68um  c
FHN	
 	Sz68um  c
FHN	
 usCj&(eLusCj&(eLfh/0**3/0 	Sz68um  c
FHN	
r   Nr"   r  r)   r   r   r  r  7  s    -
r   r  N)ry  
__future__r   	importlibr   ior   typing_extensionsr   twisted.trial.unittestr   twisted.webr   r	   r
   	XMLParserr   r+   r6   rg  r{  r  r  r  r  r  r  r  r)   r   r   <module>r     s   
 #   % + 1 1+CMM + 4x 4{
H {
|C*h C*L3D 3Dl/EH /Ed
8 
,
 
$Y8 Y
 
.
 
$2
8 2
r   