U
    
W[ÌN  ã                   @   s²   d Z ddlmZmZ ddlmZ ddlmZ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.
é    )Úabsolute_importÚdivision)ÚverifyObject)Ú_PY3Úunicode)Ú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es~de_dd„ Zerde_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   ú@/usr/lib/python3/dist-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   Zchildrenr&   r(   ZhasAttribute)r   r"   Zb2r   r   r   Útest_childOpsK   s(    







zElementTests.test_childOpsc                 C   s8   t  d¡}| d¡ t|ƒ}|  d|¡ |  |t¡ dS )ú:
        Extract character data using L{unicode}.
        r   r$   N©r	   r   r,   r   r   ÚassertIsInstance©r   ÚelementÚtextr   r   r   Útest_characterDatam   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$   N)r	   r   r,   Ústrr   r1   r2   r   r   r   Útest_characterDataNativeStringy   s
    

z+ElementTests.test_characterDataNativeStringc                 C   s8   t  d¡}| d¡ t|ƒ}|  d|¡ |  |t¡ dS )r/   r   õ   â˜ƒNr0   r2   r   r   r   Útest_characterDataUnicode…   s
    

z&ElementTests.test_characterDataUnicodec                 C   s>   t  d¡}| d¡ t|ƒ}|  d d¡|¡ |  |t¡ dS )zA
        Extract character data as UTF-8 using L{bytes}.
        r   r8   zutf-8N)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   r   ©r   r3   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   r   N©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_addContentBytesz7Bytes behavior of addContent only provided on Python 3.c                 C   s   t  d¡}|  t|jd¡ dS )zW
        Non-ASCII byte strings passed to C{addContent} yield L{UnicodeError}.
        r   s   â˜ƒN)r	   r   rC   ÚUnicodeErrorr,   r>   r   r   r   Útest_addContentBytesNonASCIIÅ   s    
z)ElementTests.test_addContentBytesNonASCIIz7Bytes behavior of addContent only provided on Python 2.c                 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)   )ZcontentN)r	   r   r-   r   r   )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c1Zc2Z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   rJ   rL   rM   r   N)r	   r   r-   rN   rO   rP   ZassertNotInrQ   r   r   r   Útest_elementsWithQNì   s    




z ElementTests.test_elementsWithQNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r#   r.   r5   r7   r9   r<   r?   rA   rB   rE   r   ÚskiprG   rI   rR   rS   r   r   r   r   r
      s0   	"		ÿÿ	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ÚrootrO   ÚstreamClassÚstreamÚ_docStartedZDocumentStartEventÚappendZElementEventÚ	_docEndedZDocumentEndEventr   r   r   r   ÚsetUp  s    

zDomishStreamTestsMixin.setUpc                 C   s   || _ d| _d S ©NT)r\   rZ   )r   r\   r   r   r   r_     s    z"DomishStreamTestsMixin._docStartedc                 C   s
   d| _ d S rc   )r[   r   r   r   r   ra     s    z DomishStreamTestsMixin._docEndedc                 C   s   | j  |¡ d S )N)r^   Úparse©r   Z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   rH   r   Úchild2)r^   rd   r   rZ   r\   r   rO   r[   re   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^   rd   r   r\   r   r   rO   Úxr   re   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^   rd   r   r\   r   rO   re   r   r   r   ÚtestNoRootNS5  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^   rd   r   r\   r   r   rO   re   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   re   r   r   r   ÚtestChildDefaultNSE  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^   rd   r   rO   rg   r   re   r   r   r   ÚtestEmptyChildNSL  s    z'DomishStreamTestsMixin.testEmptyChildNSc                 C   s@   d}| j  |¡ |  | jd jd¡ |  | jd jddi¡ dS )zm
        Whitespace in an xmlns value is preserved in the resulting node's C{uri}
        attribute.
        s<   <root xmlns:foo=' bar baz '><foo:bar foo:baz='quux'/></root>r   ú	 bar baz )rs   rK   rL   N)r^   rd   r   rO   r   Z
attributesre   r   r   r   Útest_namespaceWithWhitespaceU  s    
 ÿz3DomishStreamTestsMixin.test_namespaceWithWhitespacec                 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^   rd   r   r\   ÚlocalPrefixesrO   r   re   r   r   r   ÚtestChildPrefixa  s    z&DomishStreamTestsMixin.testChildPrefixc                 C   s   |   tj| jjd¡ d S )Ns   <root><error></root>)rC   r	   ZParserErrorr^   rd   r   r   r   r   ÚtestUnclosedElementh  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^   rd   r   rO   r   r   r   ru   re   r   r   r   Útest_namespaceReusel  s    
z*DomishStreamTestsMixin.test_namespaceReuseN)rT   rU   rV   rW   rb   r_   ra   rf   rh   rm   ro   rp   rq   rr   rt   rv   rw   ry   r   r   r   r   rY      s   
			rY   c                   @   s0   e Zd ZdZejZeddddkr(dZn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   rX   r   r   r   r   rz   ‡  s
   rz   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|   •  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‰   rK   ©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†   rK   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%   rL   )Ztestns3rK   Ztestns4)r   rL   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"   rx   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/namespaceZlangZ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‰   rK   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‰   rK   r   ©r%   r”   rL   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‰   rK   r   r–   rL   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   ©ru   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   rK   z,<bar:foo xmlns:bar='testns'><baz/></bar:foo>)r	   r   r-   ZassertIdenticalrK   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   rL   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   Ú"testRawXMLWithUnicodeSerialization0  s    

z2SerializerTests.testRawXMLWithUnicodeSerializationc                 C   s0   t  d¡}d|d< | d¡ |  | ¡ d¡ d S )Nr   u   my valueÈ¡eZtestu   A degree symbol...Â°u2   <foo test='my valueÈ¡e'>A degree symbol...Â°</foo>)r	   r   r,   r   r   r!   r   r   r   ÚtestUnicodeSerialization5  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
__future__r   r   Zzope.interface.verifyr   Ztwisted.python.compatr   r   Ztwisted.python.reflectr   Ztwisted.trialr   Ztwisted.words.xishr	   ZTestCaser
   rY   rz   r|   r}   r   r   r   r   Ú<module>   s    o 	