U
    
W[_+  ã                   @   sn   d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	 G dd„ dƒZ
G dd	„ d	e
eƒZG d
d„ de
eƒZdS )zH
Specific tests for (some of) the methods in L{twisted.web.domhelpers}.
é    )Úminidom)Úunicode)ÚTestCase)Ú
domhelpersÚmicrodomc                   @   s|   e Zd 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S )ÚDOMHelpersTestsMixinz¥
    A mixin for L{TestCase} subclasses which defines test methods for
    domhelpers functionality based on a DOM creation function provided by a
    subclass.
    Nc                 C   s”  | j  d¡}t |d¡d j}d}|  ||¡ |j}t |d¡d j}|  ||¡ d}| j  |¡}t |d¡}d dd„ |D ƒ¡}d}|  ||¡ |j}t |d¡}d d	d„ |D ƒ¡}|  ||¡ d
}	| j  |	¡}
t |
d¡}d dd„ |D ƒ¡}d}|  ||¡ |
j}t |d¡}d dd„ |D ƒ¡}|  ||¡ d}| j  |¡}t |d¡}|j}||jd jd g}|  ||¡ t |d¡}|  ||¡ d S )Nz<foo/>Úfoor   z<a><foo in="a"/><b><foo in="b"/></b><c><foo in="c"/></c><foo in="d"/><foo in="ef"/><g><foo in="g"/><h><foo in="h"/></h></g></a>Ú c                 S   s   g | ]}|  d ¡‘qS ©Úin©ZgetAttribute©Ú.0Únode© r   úB/usr/lib/python3/dist-packages/twisted/web/test/test_domhelpers.pyÚ
<listcomp>$   s     zBDOMHelpersTestsMixin.test_getElementsByTagName.<locals>.<listcomp>Úabcdefghc                 S   s   g | ]}|  d ¡‘qS r
   r   r   r   r   r   r   )   s     aH  
<a><foo in="a"/>
    <b><foo in="b"/>
        <d><foo in="d"/>
            <g><foo in="g"/></g>
            <h><foo in="h"/></h>
        </d>
        <e><foo in="e"/>
            <i><foo in="i"/></i>
        </e>
    </b>
    <c><foo in="c"/>
        <f><foo in="f"/>
            <j><foo in="j"/></j>
        </f>
    </c>
</a>c                 S   s   g | ]}|  d ¡‘qS r
   r   r   r   r   r   r   ?   s     Ú
abdgheicfjc                 S   s   g | ]}|  d ¡‘qS r
   r   r   r   r   r   r   D   s     z'<foo><bar></bar><baz><foo/></baz></foo>éÿÿÿÿ)	ÚdomÚparseStringr   ZgetElementsByTagNameZnodeNameÚassertEqualÚdocumentElementÚjoinÚ
childNodes)ÚselfÚdoc1ÚactualÚexpectedZel1Údoc2_xmlÚdoc2Ztag_listZel2Údoc3_xmlÚdoc3Zel3Údoc4_xmlÚdoc4Úrootr   r   r   Útest_getElementsByTagName   sF    z.DOMHelpersTestsMixin.test_getElementsByTagNamec                 C   sÆ   | j  d¡}t |¡}d}|  ||¡ t |j¡}|  ||¡ d}| j  |¡}t |¡}d}|  ||¡ t |j¡}|  ||¡ d}| j  |¡}t |¡}d}|  ||¡ t |j¡}|  ||¡ d S )Nz
<a>foo</a>r   z+<a>a<b>b</b><c>c</c>def<g>g<h>h</h></g></a>r   zP<a>a<b>b<d>d<g>g</g><h>h</h></d><e>e<i>i</i></e></b><c>c<f>f<j>j</j></f></c></a>r   ©r   r   r   ZgatherTextNodesr   r   )r   r   r   r   r    r!   r"   r#   r   r   r   Útest_gatherTextNodesQ   s(    


z)DOMHelpersTestsMixin.test_gatherTextNodesc                 C   s–   | j  d¡}|j}t |¡ |  | ¡ | j  d¡ ¡ ¡ | j  d¡}|jjd }t |¡ |j ¡ }| j  d¡}| 	| j  d¡¡ |  || ¡ ¡ d S )Nz<a><b><c><d/></c></b></a>Úar   Úb)
r   r   r   r   Z	clearNoder   ÚtoxmlZElementr   ÚappendChild)r   r   Za_noder!   Zb_noder   r   r   r   r   Útest_clearNodek   s    
þ

z#DOMHelpersTestsMixin.test_clearNodec                 C   s¢   | j  d¡}| j  ¡ }t |d¡}| ¡ }| d¡}| dd¡ |  || ¡ ¡ t |d¡}| ¡ }| d¡}| dd¡ |  || ¡ ¡ |  	tj
tj|d¡ d S )	Nú$<a><b id="bar"/><c class="foo"/></a>r   ÚcÚclassÚbarr+   ÚidÚpzork)r   r   ÚDocumentr   Úgetr,   ÚcreateElementÚsetAttributer   ZassertRaisesZNodeLookupError©r   r   Údocr   r   r   r   r   r   Útest_get|   s"    


ýzDOMHelpersTestsMixin.test_getc                 C   sl   | j  d¡}| j  ¡ }t |d¡}| ¡ }| d¡}| dd¡ |  || ¡ ¡ t |d¡}|  	|d ¡ d S )Nr/   r   r0   r1   r4   )
r   r   r5   r   ZgetIfExistsr,   r7   r8   r   ZassertIdenticalr9   r   r   r   Útest_getIfExists‘   s    

z%DOMHelpersTestsMixin.test_getIfExistsc                 C   sT   | j  d¡}| j  ¡ }t |d¡}| ¡ }| d¡}| dd¡ |  || ¡ ¡ d S )Nz<a><b id="foo"><c></c></b></a>r   r+   r3   )	r   r   r5   r   ZgetAndClearr,   r7   r8   r   r9   r   r   r   Útest_getAndClearž   s    

z%DOMHelpersTestsMixin.test_getAndClearc                 C   sÈ   | j  d¡}| j  ¡ }tj|jdddd}d dd„ |D ƒ¡}| d	¡}| dd¡ | d
¡}| dd¡ | 	|¡ |  
|| ¡ ¡ tj|jdddd}d dd„ |D ƒ¡}|  
|| ¡ | ¡  ¡ d S )Nz:<a><b foo="olive"><c foo="olive"/></b><d foo="poopy"/></a>r   Zoliveé   )Z	noNestingr	   c                 S   s   g | ]}|  ¡ ‘qS r   ©r,   r   r   r   r   r   ­   s     z9DOMHelpersTestsMixin.test_locateNodes.<locals>.<listcomp>r+   r0   r   c                 S   s   g | ]}|  ¡ ‘qS r   r?   r   r   r   r   r   ¸   s     )r   r   r5   r   ZlocateNodesr   r   r7   r8   r-   r   r,   )r   r   r:   Ú	node_listr   r   r0   r   r   r   Útest_locateNodes¨   s.    
   ÿ


   ÿz%DOMHelpersTestsMixin.test_locateNodesc                 C   sL   | j  d¡}t |jd jd jd ¡}d dd„ |D ƒ¡}|  |d¡ d S )Nz!<a><b><c><d/></c><e/></b><f/></a>r   r	   c                 S   s   g | ]}t |d ƒr|j‘qS ©ÚtagName)ÚhasattrrC   r   r   r   r   r   À   s    
ÿz8DOMHelpersTestsMixin.test_getParents.<locals>.<listcomp>Zcba)r   r   r   Z
getParentsr   r   r   ©r   r   r@   r   r   r   r   Útest_getParents¼   s    ÿz$DOMHelpersTestsMixin.test_getParentsc                 C   sj   | j  d¡}t |d¡}d dd„ |D ƒ¡}|  |d¡ t |dd¡}d dd„ |D ƒ¡}|  |d	¡ d S )
Nz+<a foo="1"><b foo="2"/><c foo="1"/><d/></a>r   r	   c                 S   s   g | ]
}|j ‘qS r   rB   r   r   r   r   r   È   s     zGDOMHelpersTestsMixin.test_findElementsWithAttribute.<locals>.<listcomp>ÚabcÚ1c                 S   s   g | ]
}|j ‘qS r   rB   r   r   r   r   r   Ì   s     Zac)r   r   r   ZfindElementsWithAttributer   r   rE   r   r   r   Útest_findElementsWithAttributeÅ   s    z3DOMHelpersTestsMixin.test_findElementsWithAttributec                 C   s0   | j  d¡}t |d¡}t|ƒ}|  |d¡ d S )Nz#<doc><foo/><bar/><foo>a</foo></doc>r   é   )r   r   r   ZfindNodesNamedÚlenr   rE   r   r   r   Útest_findNodesNamedÐ   s    z(DOMHelpersTestsMixin.test_findNodesNamedc                 C   s   d}d}|   t |¡|¡ d S )Nz9this string " contains many & characters> xml< won't likezHthis string &quot; contains many &amp; characters&gt; xml&lt; won't like)r   r   Úescape©r   Újr   r   r   r   Útest_escape×   s    z DOMHelpersTestsMixin.test_escapec                 C   s   d}d}|   t |¡|¡ d S )NzTthis string &quot; has &&amp; entities &gt; &lt; and some characters xml won't like<zEthis string " has && entities > < and some characters xml won't like<)r   r   ZunescaperN   r   r   r   Útest_unescapeÝ   s    z"DOMHelpersTestsMixin.test_unescapec                 C   s"   | j  d¡}|  t |¡d¡ dS )z|
        L{getNodeText} returns the concatenation of all the text data at or
        beneath the node passed to it.
        z(<foo><bar>baz</bar><bar>quux</bar></foo>ZbazquuxN)r   r   r   r   ÚgetNodeText)r   r   r   r   r   Útest_getNodeTextã   s    z%DOMHelpersTestsMixin.test_getNodeText)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r'   r)   r.   r;   r<   r=   rA   rF   rI   rL   rP   rQ   rS   r   r   r   r   r      s   9
	r   c                   @   s    e Zd ZeZdd„ Zdd„ ZdS )ÚMicroDOMHelpersTestsc                 C   sF   d}| j  |¡}t |¡}d}|  ||¡ t |j¡}|  ||¡ dS )z£
        Microdom discards whitespace-only text nodes, so L{gatherTextNodes}
        returns only the text from nodes which had non-whitespace characters.
        z?<html>
  <head>
  </head>
  <body>
    stuff
  </body>
</html>
z
    stuff
  Nr(   )r   r$   r%   r   r   r   r   r   Ú#test_gatherTextNodesDropsWhitespaceð   s    
z8MicroDOMHelpersTests.test_gatherTextNodesDropsWhitespacec                 C   sF   d}| j  |¡}t |¡}d}|  ||¡ t |j¡}|  ||¡ dS )zB
        Microdom does not decode entities in text nodes.
        ú<x>Souffl&amp;</x>zSouffl&amp;Nr(   ©r   Zdoc5_xmlZdoc5r   r   r   r   r   Útest_textEntitiesNotDecoded  s    
z0MicroDOMHelpersTests.test_textEntitiesNotDecodedN)rT   rU   rV   r   r   rY   r\   r   r   r   r   rX   í   s   rX   c                   @   s    e Zd ZeZdd„ Zdd„ ZdS )ÚMiniDOMHelpersTestsc                 C   sF   d}| j  |¡}t |¡}d}|  ||¡ t |j¡}|  ||¡ dS )z=
        Minidom does decode entities in text nodes.
        rZ   zSouffl&Nr(   r[   r   r   r   Útest_textEntitiesDecoded  s    
z,MiniDOMHelpersTests.test_textEntitiesDecodedc                 C   sf   | j  d¡}t |¡}|  |d¡ |  |t¡ | j  d d¡¡}t |¡}|  |d¡ |  |t¡ dS )zÇ
        L{domhelpers.getNodeText} returns a C{unicode} string when text
        nodes are represented in the DOM with unicode, whether or not there
        are non-ASCII characters present.
        z<foo>bar</foo>r2   u   <foo>â˜ƒ</foo>zutf-8u   â˜ƒN)r   r   r   rR   r   ZassertIsInstancer   Úencode)r   r   Útextr   r   r   Útest_getNodeUnicodeText#  s    

z+MiniDOMHelpersTests.test_getNodeUnicodeTextN)rT   rU   rV   r   r   r^   ra   r   r   r   r   r]     s   r]   N)rW   Zxml.domr   Ztwisted.python.compatr   Ztwisted.trial.unittestr   Ztwisted.webr   r   r   rX   r]   r   r   r   r   Ú<module>   s    ^&