o
    Óó·iÆK  ã                   @   s’   d 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	ƒZG d
d„ deej	ƒZG dd„ deej	ƒZG dd„ dej	ƒZdS )zF
Tests for L{twisted.words.xish.domish}, a DOM-like library for XMPP.
é    )ÚverifyObject)ÚrequireModule)Úunittest)Údomishc                   @   s�   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"S )#ÚElementTestsz&
    Tests for L{domish.Element}.
    c                 C   s   t tjt d¡ƒ dS )zB
        L{domish.Element} implements L{domish.IElement}.
        ©NÚfooN)r   r   ZIElementÚElement©Úself© r   údC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\twisted/words/test/test_domish.pyÚtest_interface   s   zElementTests.test_interfacec                 C   s.   d}|   t |¡d¡ |   t |d¡d¡ dS )zF
        The built-in entity references are properly encoded.
        z&<>'"z&amp;&lt;&gt;'"é   z&amp;&lt;&gt;&apos;&quot;N)ÚassertEqualr   ZescapeToXml)r   Úsr   r   r   Útest_escaping   s   zElementTests.test_escapingc                 C   s   t  d¡}|  |jd¡ dS )zN
        An attribute on L{domish.Namespace} yields a qualified name.
        Útestns©r   r   N)r   Z	Namespacer   r   )r   Únsr   r   r   Útest_namespace#   s   
zElementTests.test_namespacec                 C   s   t  d¡}|  |jd¡ |  |jd¡ |  |jd¡ |  |jd¡ t  d¡}|  |jd¡ |  |jd¡ |  |jd¡ |  |jd¡ t  d¡}|  |jd¡ |  |jd¡ |  |jd¡ |  |jd¡ t  dd¡}|  |jd¡ |  |jd¡ |  |jd¡ dS )	z?
        Basic L{domish.Element} initialization tests.
        r   r   N©Ú r   r   r   r   Ztest2ns)r   r	   r   ÚnameÚuriÚ
defaultUriÚparent©r   Úer   r   r   Útest_elementInit*   s&   


zElementTests.test_elementInitc                 C   s  t  d¡}| d¡ | d¡}d|d< d|d< | d¡ | d¡ | d	¡ | d
¡ |  |jd d¡ |  |j|¡ |j d¡ d|jd< |  |jd |j¡ |  |jd |j¡ |  |d d¡ |d= |  | d¡d¡ |  | d¡d¡ |  |d d¡ dS )z6
        Basic L{domish.Element} child tests.
        r   Úsomecontent)Útestns2Úbar2Zvalue1Zattrib1Zvalue2)r!   Úattrib2ÚbarÚabcZ123éÿÿÿÿZabc123Z
subcontentZ	somevalueZ	bar2valuer   é   r   r#   N)	r   r	   Ú
addContentÚ
addElementr   Úchildrenr"   r$   ZhasAttribute)r   r   Úb2r   r   r   Útest_childOpsE   s(   







zElementTests.test_childOpsc                 C   ó8   t  d¡}| d¡ t|ƒ}|  d|¡ |  |t¡ dS )ú6
        Extract character data using L{str}.
        r   r    N©r   r	   r(   Ústrr   ÚassertIsInstance©r   ÚelementÚtextr   r   r   Útest_characterDataf   ó
   

zElementTests.test_characterDatac                 C   r-   )z<
        Extract ascii character data using L{str}.
        r   r    Nr/   r2   r   r   r   Útest_characterDataNativeStringq   r6   z+ElementTests.test_characterDataNativeStringc                 C   r-   )r.   r   õ   â˜ƒNr/   r2   r   r   r   Útest_characterDataUnicode|   r6   z&ElementTests.test_characterDataUnicodec                 C   s<   t  d¡}| d¡ t|ƒ}|  d ¡ |¡ |  |t¡ dS )zA
        Extract character data as UTF-8 using L{bytes}.
        r   r8   N)r   r	   r(   Úbytesr   Úencoder1   r2   r   r   r   Útest_characterDataBytes‡   s
   

z$ElementTests.test_characterDataBytesc                 C   s<   t  d¡}| d¡ | d¡ | d¡ |  dt|ƒ¡ dS )zV
        Mixing addChild with cdata and element, the first cdata is returned.
        r   r%   r$   ÚdefN)r   r	   ZaddChildr)   r   r0   ©r   r3   r   r   r   Útest_characterDataMixed’   s
   



z$ElementTests.test_characterDataMixedc                 C   ó(   t  d¡}| d¡ |  dt|ƒ¡ dS )zT
        Unicode strings passed to C{addContent} become the character data.
        r   ÚunicodeN©r   r	   r(   r   r0   r>   r   r   r   Útest_addContentœ   ó   

zElementTests.test_addContentc                 C   r@   )zY
        ASCII native strings passed to C{addContent} become the character data.
        r   ZnativeNrB   r>   r   r   r   Ú test_addContentNativeStringASCII¤   rD   z-ElementTests.test_addContentNativeStringASCIIc                 C   s   t  d¡}|  t|jd¡ dS )zV
        Byte strings passed to C{addContent} are not acceptable on Python 3.
        r   s   bytesN)r   r	   ÚassertRaisesÚ	TypeErrorr(   r>   r   r   r   Útest_addContentBytes¬   s   
z!ElementTests.test_addContentBytesc                 C   s,   t  d¡}|jddd�}|  dt|ƒ¡ dS )zW
        Content passed to addElement becomes character data on the new child.
        r   r$   r%   )ÚcontentN)r   r	   r)   r   r0   )r   r3   Úchildr   r   r   Útest_addElementContent³   s   
z#ElementTests.test_addElementContentc                 C   sr   t  d¡}| d¡}| d¡}| d¡}| d¡}t| ¡ ƒ}|  ||¡ |  ||¡ |  ||¡ |  ||¡ dS )z�
        Calling C{elements} without arguments on a L{domish.Element} returns
        all child elements, whatever the qualified name.
        r   r   ©r!   ÚbazÚquux©r   r   N)r   r	   r)   ÚlistÚelementsÚassertIn©r   r   Zc1Úc2Úc3Zc4Úeltsr   r   r   Útest_elements»   s   




zElementTests.test_elementsc                 C   sv   t  d¡}| d¡}| d¡}| d¡}| d¡}t| dd¡ƒ}|  ||¡ |  ||¡ |  ||¡ |  ||¡ dS )z™
        Calling C{elements} with a namespace and local name on a
        L{domish.Element} returns all child elements with that qualified name.
        r   r   rL   rN   rO   r   N)r   r	   r)   rP   rQ   rR   ZassertNotInrS   r   r   r   Útest_elementsWithQNÍ   s   




z ElementTests.test_elementsWithQNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r,   r5   r7   r9   r<   r?   rC   rE   rH   rK   rW   rX   r   r   r   r   r      s$    !
r   c                   @   s€   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚDomishStreamTestsMixinzí
    Mixin defining tests for different stream implementations.

    @ivar streamClass: A no-argument callable which will be used to create an
        XML parser which can produce a stream of elements from incremental
        input.
    c                 C   sF   d| _ d| _d | _g | _|  ¡ | _| j| j_| jj| j_	| j
| j_d S )NF)Údoc_startedÚ	doc_endedÚrootrQ   ÚstreamClassÚstreamÚ_docStartedZDocumentStartEventÚappendZElementEventÚ	_docEndedZDocumentEndEventr
   r   r   r   ÚsetUpé   s   

zDomishStreamTestsMixin.setUpc                 C   s   || _ d| _d S ©NT)r`   r^   )r   r`   r   r   r   rc   ó   s   
z"DomishStreamTestsMixin._docStartedc                 C   s
   d| _ d S rg   )r_   r
   r   r   r   re   ÷   s   
z DomishStreamTestsMixin._docEndedc                 C   s   | j  |¡ d S )N)rb   Úparse©r   Úxmlr   r   r   ÚdoTestú   s   zDomishStreamTestsMixin.doTestc                 C   sh   d}| j  |¡ |  | jd¡ |  | jjd¡ |  | jd jd¡ |  | jd jd¡ |  | jd¡ d S )Ns   <root><child/><child2/></root>Tr`   r   rJ   r   Úchild2)rb   rh   r   r^   r`   r   rQ   r_   ri   r   r   r   ÚtestHarnessý   s   z"DomishStreamTestsMixin.testHarnessc                 C   s    d}| j  |¡ |  | jjd¡ |  | jjd¡ |  | jd jd¡ |  | jd jd¡ |  | jd d d¡ |  | jd jjd	¡ |  t| jd jƒd
¡ d S )Ns�   <stream:stream xmlns:stream='etherx' xmlns='jabber'>
  <message to='bar'>    <x xmlns='xdelay'>some&amp;data&gt;</x>  </message></stream:stream>rb   Úetherxr   ÚmessageZjabberÚtor$   Zxdelayz
some&data>)	rb   rh   r   r`   r   r   rQ   Úxr0   ri   r   r   r   Ú	testBasic  s   ÿz DomishStreamTestsMixin.testBasicc                 C   s8   d}| j  |¡ |  | jjd¡ |  | jd jd¡ d S )Ns(   <stream><error xmlns='etherx'/></stream>r   r   rn   ©rb   rh   r   r`   r   rQ   ri   r   r   r   ÚtestNoRootNS  ó   z#DomishStreamTestsMixin.testNoRootNSc                 C   s\   d}| j  |¡ |  | jjd¡ |  | jjd¡ |  | jd jd¡ |  | jd jd¡ d S )Ns=   <stream:stream xmlns:stream='etherx'><error/></stream:stream>rn   r   r   )rb   rh   r   r`   r   r   rQ   ri   r   r   r   ÚtestNoDefaultNS  s   z&DomishStreamTestsMixin.testNoDefaultNSc                 C   s8   d}| j  |¡ |  | jjd¡ |  | jd jd¡ d S )Ns$   <root xmlns='testns'><child/></root>r   r   rs   ri   r   r   r   ÚtestChildDefaultNS(  ru   z)DomishStreamTestsMixin.testChildDefaultNSc                 C   s*   d}| j  |¡ |  | jd jjd¡ d S )Nsg   <root xmlns='testns'>
                    <child1><child2 xmlns=''/></child1>
                  </root>r   r   )rb   rh   r   rQ   rl   r   ri   r   r   r   ÚtestEmptyChildNS/  s   z'DomishStreamTestsMixin.testEmptyChildNSc                 C   s(   d}| j  |¡ |  | jd jd¡ dS )zŽ
        Attributes with namespace are parsed without Exception.
        (https://twistedmatrix.com/trac/ticket/9730 regression test)
        s~   <root xmlns:test='http://example.org' xml:lang='en'>
                    <test:test>test</test:test>
                  </root>r   zhttp://example.orgN)rb   rh   r   rQ   r   ri   r   r   r   Útest_attributesWithNamespaces7  s   z4DomishStreamTestsMixin.test_attributesWithNamespacesc                 C   s<   d}| j  |¡ |  | jjd d¡ |  | jd jd¡ d S )Ns<   <root xmlns='testns' xmlns:foo='testns2'><foo:child/></root>r   r!   r   )rb   rh   r   r`   ÚlocalPrefixesrQ   r   ri   r   r   r   ÚtestChildPrefixG  s   z&DomishStreamTestsMixin.testChildPrefixc                 C   s   |   tj| jjd¡ d S )Ns   <root><error></root>)rF   r   ZParserErrorrb   rh   r
   r   r   r   ÚtestUnclosedElementN  s   ÿz*DomishStreamTestsMixin.testUnclosedElementc                 C   s¸   d}| j  |¡ |  d| jd j¡ |  d| jd j¡ |  d| jd j¡ |  ddi| jd j¡ |  d| jd j¡ |  d| jd j¡ |  d| jd j¡ |  i | jd j¡ d	S )
at  
        Test that reuse of namespaces does affect an element's serialization.

        When one element uses a prefix for a certain namespace, this is
        stored in the C{localPrefixes} attribute of the element. We want
        to make sure that elements created after such use, won't have this
        prefix end up in their C{localPrefixes} attribute, too.
        s‚   <root>
                    <foo:child1 xmlns:foo='testns'/>
                    <child2 xmlns='testns'/>
                  </root>Úchild1r   r   r   r   rl   r   N)rb   rh   r   rQ   r   r   r   rz   ri   r   r   r   Útest_namespaceReuseS  s   
z*DomishStreamTestsMixin.test_namespaceReuseN)rY   rZ   r[   r\   rf   rc   re   rk   rm   rr   rt   rv   rw   rx   ry   r{   r|   r~   r   r   r   r   r]   à   s     
		r]   c                   @   s.   e Zd ZdZejZeddd�du rdZdS dS )ÚDomishExpatStreamTestszd
    Tests for L{domish.ExpatElementStream}, the expat-based element stream
    implementation.
    ÚpyexpatN)Údefaultz1pyexpat is required for ExpatElementStream tests.)	rY   rZ   r[   r\   r   ZExpatElementStreamra   r   Úskipr   r   r   r   r   m  s    ÿr   c                   @   s   e Zd ZdZejZdS )ÚDomishSuxStreamTestszo
    Tests for L{domish.SuxElementStream}, the L{twisted.web.sux}-based element
    stream implementation.
    N)rY   rZ   r[   r\   r   ZSuxElementStreamra   r   r   r   r   rƒ   y  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d1S )2ÚSerializerTestsc                 C   s2   t  d¡}|  | ¡ d¡ |  |jdd�d¡ d S )Nr   z<foo/>r   )ZcloseElementz<foo>©r   r	   r   ÚtoXmlr   r   r   r   ÚtestNoNamespaceƒ  s   
zSerializerTests.testNoNamespacec                 C   s   t  d¡}|  | ¡ d¡ d S )Nr   z<foo xmlns='testns'/>r…   r   r   r   r   ÚtestDefaultNamespaceˆ  s   
z$SerializerTests.testDefaultNamespacec                 C   s&   t  dd¡}|  | ddi¡d¡ d S )Nr   r!   r   r$   z-<bar:foo xmlns:bar='testns' xmlns='testns2'/>r…   r   r   r   r   ÚtestOtherNamespaceŒ  s   ÿz"SerializerTests.testOtherNamespacec                 C   ó(   t  d¡}| d¡ |  | ¡ d¡ d S )Nr   r$   ú <foo xmlns='testns'><bar/></foo>©r   r	   r)   r   r†   r   r   r   r   ÚtestChildDefaultNamespace’  ó   

z)SerializerTests.testChildDefaultNamespacec                 C   rŠ   )Nr   ©r   r$   r‹   rŒ   r   r   r   r   ÚtestChildSameNamespace—  rŽ   z&SerializerTests.testChildSameNamespacec                 C   ó*   t  d¡}| dd¡ |  | ¡ d¡ d S )Nr   r$   r   r‹   rŒ   r   r   r   r   ÚtestChildSameDefaultNamespaceœ  ó   
z-SerializerTests.testChildSameDefaultNamespacec                 C   r‘   )Nr   ©r!   r$   r!   z0<foo xmlns='testns'><bar xmlns='testns2'/></foo>rŒ   r   r   r   r   ÚtestChildOtherDefaultNamespace¡  r“   z.SerializerTests.testChildOtherDefaultNamespacec                 C   r‘   )Nr   )Úns2r$   r–   z<foo><bar xmlns='ns2'/></foo>rŒ   r   r   r   r   ÚtestOnlyChildDefaultNamespace¦  r“   z-SerializerTests.testOnlyChildDefaultNamespacec                 C   rŠ   )Nr   r$   z<foo><bar/></foo>rŒ   r   r   r   r   ÚtestOnlyChildDefaultNamespace2«  rŽ   z.SerializerTests.testOnlyChildDefaultNamespace2c                 C   s*   t  dd¡}| d¡ |  | ¡ d¡ d S )Nr   r!   r”   z<<xn0:foo xmlns:xn0='testns' xmlns='testns2'><bar/></xn0:foo>rŒ   r   r   r   r   ÚtestChildInDefaultNamespace°  s
   
ÿz+SerializerTests.testChildInDefaultNamespacec                 C   ó&   t jdddid�}|  | ¡ d¡ d S )Nr   r”   rM   ©Zattribsz(<foo xmlns:xn0='testns2' xn0:bar='baz'/>r…   r   r   r   r   ÚtestQualifiedAttribute·  ó   z&SerializerTests.testQualifiedAttributec                 C   rš   )Nr   r�   rM   r›   z6<foo xmlns='testns' xmlns:xn0='testns' xn0:bar='baz'/>r…   r   r   r   r   ÚtestQualifiedAttributeDefaultNS»  s   ÿz/SerializerTests.testQualifiedAttributeDefaultNSc                 C   sJ   t  d¡}| dd¡}| d¡ | dd¡}| d¡ |  | ¡ d¡ d S )	Nr   r�   r!   )r!   rN   )Ztestns3rM   Ztestns4)r   rN   z�<foo><xn0:bar xmlns:xn0='testns' xmlns='testns2'><quux/></xn0:bar><xn1:baz xmlns:xn1='testns3' xmlns='testns4'><xn0:quux xmlns:xn0='testns'/></xn1:baz></foo>rŒ   )r   r   r}   rl   r   r   r   ÚtestTwoChildsÁ  s   


þzSerializerTests.testTwoChildsc                 C   rš   )Nr   )z$http://www.w3.org/XML/1998/namespaceÚlangÚen_USr›   z<foo xml:lang='en_US'/>r…   r   r   r   r   ÚtestXMLNamespaceÌ  s
   þz SerializerTests.testXMLNamespacec                 C   s,   t jdddid�}|  | ddi¡d¡ d S )Nr   r”   rM   r›   r!   Úquxz(<foo xmlns:qux='testns2' qux:bar='baz'/>r…   r   r   r   r   Ú)testQualifiedAttributeGivenListOfPrefixesÓ  s   ÿz9SerializerTests.testQualifiedAttributeGivenListOfPrefixesc                 C   s8   t jdddid�}| d¡}d|d< |  | ¡ d¡ d S )Nr   r”   rM   r›   ©r!   r£   rN   zF<foo xmlns:xn0='testns2' xn0:bar='baz'><xn0:qux xn0:bar='quux'/></foo>rŒ   ©r   r   Úcr   r   r   ÚtestNSPrefixÙ  s   
þzSerializerTests.testNSPrefixc                 C   sB   t jdddid�}| d¡}d|d< | d¡ |  | ¡ d¡ d S )	Nr   r”   rM   r›   r¥   rN   r   zY<foo xmlns:xn0='testns2' xn0:bar='baz'><xn0:qux xn0:bar='quux'><xn0:foo/></xn0:qux></foo>rŒ   r¦   r   r   r   ÚtestDefaultNSPrefixã  s   

þz#SerializerTests.testDefaultNSPrefixc                 C   s*   t  d¡}|  |jddidgd�d¡ d S )Nr   r   r$   )ÚprefixesZprefixesInScopez
<bar:foo/>r…   r   r   r   r   ÚtestPrefixScopeî  s   
ÿzSerializerTests.testPrefixScopec                 C   rš   )Nr   r$   r   ©rz   z<bar:foo xmlns:bar='testns'/>r…   r   r   r   r   ÚtestLocalPrefixesõ  r�   z!SerializerTests.testLocalPrefixesc                 C   s@   t jdddid�}| d¡ |  |jjd ¡ |  | ¡ d¡ d S )Nr   r$   r   r¬   rM   z,<bar:foo xmlns:bar='testns'><baz/></bar:foo>)r   r	   r)   ZassertIdenticalrM   r   r   r†   r   r   r   r   ÚtestLocalPrefixesWithChildù  s   
z*SerializerTests.testLocalPrefixesWithChildc                 C   sj   ddi}t j|d�}|  ||j¡ t jdddid�}|  d|j|d�¡ t  d¡}|  d	|j|d�¡ d
S )aQ  
        Test that prefixes passed to serialization are not modified.

        This test makes sure that passing a dictionary of prefixes repeatedly
        to C{toXml} of elements does not cause serialization errors. A
        previous implementation changed the passed in dictionary internally,
        causing havoc later on.
        r   r   )rª   )r!   r   rN   r!   r¬   z <quux:foo xmlns:quux='testns2'/>z<foo xmlns='testns2'/>N)r   ZSerializerClassZassertNotIdenticalrª   r	   r   r†   )r   rª   r   r   r   r   r   Útest_prefixesReuseÿ  s   	
z"SerializerTests.test_prefixesReusec                 C   rŠ   )Nr   z<abc123>z<foo><abc123></foo>©r   r	   Z	addRawXmlr   r†   r   r   r   r   ÚtestRawXMLSerialization  s   

z'SerializerTests.testRawXMLSerializationc                 C   rŠ   )Nr   u   <degree>Â°</degree>u   <foo><degree>Â°</degree></foo>r°   r   r   r   r   Ú"testRawXMLWithUnicodeSerialization  rŽ   z2SerializerTests.testRawXMLWithUnicodeSerializationc                 C   s0   t  d¡}d|d< | d¡ |  | ¡ d¡ d S )Nr   u   my valueÈ¡eÚtestu   A degree symbol...Â°u2   <foo test='my valueÈ¡e'>A degree symbol...Â°</foo>)r   r	   r(   r   r†   r   r   r   r   ÚtestUnicodeSerialization!  s   

ÿz(SerializerTests.testUnicodeSerializationN)rY   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   r   r   r„   ‚  s2    
r„   N)r\   Zzope.interface.verifyr   Ztwisted.python.reflectr   Ztwisted.trialr   Ztwisted.words.xishr   ZTestCaser   r]   r   rƒ   r„   r   r   r   r   Ú<module>   s    Q 	