U
    n5{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   úB/tmp/pip-unpacked-wheel-mnhg7r0q/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   Ú	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   Zb2r   r   r   Útest_childOpsE   s(    







zElementTests.test_childOpsc                 C   s8   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   s
    

zElementTests.test_characterDatac                 C   s8   t  d¡}| d¡ t|ƒ}|  d|¡ |  |t¡ dS )z<
        Extract ascii character data using L{str}.
        r   r!   Nr.   r1   r   r   r   Útest_characterDataNativeStringq   s
    

z+ElementTests.test_characterDataNativeStringc                 C   s8   t  d¡}| d¡ t|ƒ}|  d|¡ |  |t¡ dS )r-   r   õ   â˜ƒNr.   r1   r   r   r   Útest_characterDataUnicode|   s
    

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   r6   N)r   r	   r)   Úbytesr   Úencoder0   r1   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   r/   ©r   r2   r   r   r   Útest_characterDataMixed’   s
    



z$ElementTests.test_characterDataMixedc                 C   s(   t  d¡}| d¡ |  dt|ƒ¡ dS )zT
        Unicode strings passed to C{addContent} become the character data.
        r   ÚunicodeN©r   r	   r)   r   r/   r<   r   r   r   Útest_addContentœ   s    

zElementTests.test_addContentc                 C   s(   t  d¡}| d¡ |  dt|ƒ¡ dS )zY
        ASCII native strings passed to C{addContent} become the character data.
        r   ZnativeNr?   r<   r   r   r   Ú test_addContentNativeStringASCII¤   s    

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   r/   )r   r2   Ú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c4Z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   rH   rJ   rK   r   N)r   r	   r*   rL   rM   rN   ZassertNotInrO   r   r   r   Útest_elementsWithQNÍ   s    




z ElementTests.test_elementsWithQNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r    r,   r4   r5   r7   r:   r=   r@   rA   rD   rG   rR   rS   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ÚrootrM   ÚstreamClassÚstreamÚ_docStartedZDocumentStartEventÚappendZElementEventÚ	_docEndedZDocumentEndEventr
   r   r   r   ÚsetUpé   s    

zDomishStreamTestsMixin.setUpc                 C   s   || _ d| _d S ©NT)r[   rY   )r   r[   r   r   r   r^   ó   s    z"DomishStreamTestsMixin._docStartedc                 C   s
   d| _ d S rb   )rZ   r
   r   r   r   r`   ÷   s    z DomishStreamTestsMixin._docEndedc                 C   s   | j  |¡ d S )N)r]   Ú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   rF   r   Úchild2)r]   rc   r   rY   r[   r   rM   rZ   rd   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>r]   Úetherxr   ÚmessageZjabberÚtor%   Zxdelayz
some&data>)	r]   rc   r   r[   r   r   rM   Úxr/   rd   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   ri   ©r]   rc   r   r[   r   rM   rd   r   r   r   ÚtestNoRootNS  s    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>ri   r   r   )r]   rc   r   r[   r   r   rM   rd   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   rn   rd   r   r   r   ÚtestChildDefaultNS(  s    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   )r]   rc   r   rM   rg   r   rd   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)r]   rc   r   rM   r   rd   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   )r]   rc   r   r[   ÚlocalPrefixesrM   r   rd   r   r   r   ÚtestChildPrefixG  s    z&DomishStreamTestsMixin.testChildPrefixc                 C   s   |   tj| jjd¡ d S )Ns   <root><error></root>)rB   r   ZParserErrorr]   rc   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   rg   r   N)r]   rc   r   rM   r   r   r   rt   rd   r   r   r   Útest_namespaceReuseS  s    
z*DomishStreamTestsMixin.test_namespaceReuseN)rT   rU   rV   rW   ra   r^   r`   rf   rh   rm   ro   rp   rq   rr   rs   ru   rv   rx   r   r   r   r   rX   à   s   
		rX   c                   @   s*   e Zd ZdZejZeddd�dkr&dZdS )ÚDomishExpatStreamTestszd
    Tests for L{domish.ExpatElementStream}, the expat-based element stream
    implementation.
    ZpyexpatN)Údefaultz1pyexpat is required for ExpatElementStream tests.)	rT   rU   rV   rW   r   ZExpatElementStreamr\   r   Úskipr   r   r   r   ry   m  s   ry   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)rT   rU   rV   rW   r   ZSuxElementStreamr\   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   s(   t  d¡}| d¡ |  | ¡ d¡ d S )Nr   r%   ú <foo xmlns='testns'><bar/></foo>©r   r	   r*   r   r   r   r   r   r   ÚtestChildDefaultNamespace’  s    

z)SerializerTests.testChildDefaultNamespacec                 C   s(   t  d¡}| d¡ |  | ¡ d¡ d S )Nr   ©r   r%   rƒ   r„   r   r   r   r   ÚtestChildSameNamespace—  s    

z&SerializerTests.testChildSameNamespacec                 C   s*   t  d¡}| dd¡ |  | ¡ d¡ d S )Nr   r%   r   rƒ   r„   r   r   r   r   ÚtestChildSameDefaultNamespaceœ  s    
z-SerializerTests.testChildSameDefaultNamespacec                 C   s*   t  d¡}| dd¡ |  | ¡ d¡ d S )Nr   ©r"   r%   r"   z0<foo xmlns='testns'><bar xmlns='testns2'/></foo>r„   r   r   r   r   ÚtestChildOtherDefaultNamespace¡  s    
z.SerializerTests.testChildOtherDefaultNamespacec                 C   s*   t  d¡}| dd¡ |  | ¡ d¡ d S )Nr   )Úns2r%   r‹   z<foo><bar xmlns='ns2'/></foo>r„   r   r   r   r   ÚtestOnlyChildDefaultNamespace¦  s    
z-SerializerTests.testOnlyChildDefaultNamespacec                 C   s(   t  d¡}| d¡ |  | ¡ d¡ d S )Nr   r%   z<foo><bar/></foo>r„   r   r   r   r   ÚtestOnlyChildDefaultNamespace2«  s    

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   s&   t jdddid�}|  | ¡ d¡ d S )Nr   r‰   rI   ©Zattribsz(<foo xmlns:xn0='testns2' xn0:bar='baz'/>r~   r   r   r   r   ÚtestQualifiedAttribute·  s    z&SerializerTests.testQualifiedAttributec                 C   s&   t jdddid�}|  | ¡ d¡ d S )Nr   r†   rI   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"   rJ   )Ztestns3rI   Ztestns4)r   rJ   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   rw   rg   r   r   r   ÚtestTwoChildsÁ  s    


þzSerializerTests.testTwoChildsc                 C   s&   t jdddid�}|  | ¡ d¡ d S )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‰   rI   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‰   rI   r�   ©r"   r–   rJ   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‰   rI   r�   r˜   rJ   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   s&   t jdddid�}|  | ¡ d¡ d S )Nr   r%   r   ©rt   z<bar:foo xmlns:bar='testns'/>r~   r   r   r   r   ÚtestLocalPrefixesõ  s    z!SerializerTests.testLocalPrefixesc                 C   s@   t jdddid�}| d¡ |  |jjd ¡ |  | ¡ d¡ d S )Nr   r%   r   rŸ   rI   z,<bar:foo xmlns:bar='testns'><baz/></bar:foo>)r   r	   r*   ZassertIdenticalrI   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   rJ   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   s(   t  d¡}| d¡ |  | ¡ d¡ d S )Nr   z<abc123>z<foo><abc123></foo>©r   r	   Z	addRawXmlr   r   r   r   r   r   ÚtestRawXMLSerialization  s    

z'SerializerTests.testRawXMLSerializationc                 C   s(   t  d¡}| d¡ |  | ¡ d¡ d S )Nr   u   <degree>Â°</degree>u   <foo><degree>Â°</degree></foo>r£   r   r   r   r   Ú"testRawXMLWithUnicodeSerialization  s    

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)rT   rU   rV   r€   r�   r‚   r…   r‡   rˆ   rŠ   rŒ   r�   rŽ   r�   r‘   r’   r•   r—   r›   rœ   rž   r    r¡   r¢   r¤   r¥   r§   r   r   r   r   r}   ‚  s0   
r}   N)rW   Zzope.interface.verifyr   Ztwisted.python.reflectr   Ztwisted.trialr   Ztwisted.words.xishr   ZTestCaser   rX   ry   r|   r}   r   r   r   r   Ú<module>   s    Q 	