B
    u9aT1  ã               @   sÔ   d dl Z d dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZ edddZd	ZG d
d„ dejƒZG dd„ dejƒZG dd„ deƒZG dd„ deƒZG dd„ de	jƒZG dd„ dejƒZedkrÐe ¡  dS )é    N)ÚAttributesImpl)Úfeature_external_ges)Úpulldom)Úfindfileztest.xmlZxmltestdata)Zsubdira  <?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xdc="http://www.xml.com/books">
<!-- A comment -->
<title>Introduction to XSL</title>
<hr/>
<p><xdc:author xdc:attrib="prefixed attribute" attrib="other attrib">A. Namespace</xdc:author></p>
</html>c               @   sH   e Zd Zdd„ Zdd„ Zdd„ Zejdd„ ƒZejd	d
„ ƒZ	dd„ Z
dS )ÚPullDOMTestCasec          	   C   sH   t  t¡}|  |jj¡ t|ƒ ttdƒ}tt  |¡ƒ W dQ R X dS )z&Minimal test of DOMEventStream.parse()ÚrbN)r   ÚparseÚtstfileZ
addCleanupÚstreamÚcloseÚlistÚopen)ÚselfÚhandlerÚfin© r   ú"/usr/lib/python3.7/test_pulldom.pyÚ
test_parse   s
    
zPullDOMTestCase.test_parsec             C   sœ  t  t¡}t|ƒ\}}|  t|dƒ¡ |  t j|¡ t|ƒ\}}|  t j|¡ |  d|j	¡ |  dt
|jƒ¡ |  |j d¡jd¡ t|ƒ\}}|  t j|¡ t|ƒ\}}|  t j|¡ t|ƒ\}}|  d|j	¡ |}t|ƒ\}}|  t j|¡ |  d|j¡ t|ƒ\}}|  t j|¡ |  d|j	¡ |  ||k¡ t|ƒ\}}|  t j|¡ t|ƒ\}}|  t j|¡ |  d|j	¡ t|ƒ\}}|  t j|¡ |  d|j	¡ t|ƒ\}}|  t j|¡ t|ƒ\}}|  t j|¡ |  d	|j	¡ t|ƒ\}}|  t j|¡ |  d
|j	¡ t|ƒ\}}|  t j|¡ t|ƒ\}}|  t j|¡ |  d
|j	¡ t|ƒ\}}|  t j|¡ t|ƒ\}}|  t j|¡ t|ƒ\}}|  t j|¡ dS )z&Test DOMEventStream parsing semantics.ÚcreateElementÚhtmlé   z	xmlns:xdczhttp://www.xml.com/booksÚtitlezIntroduction to XSLÚhrÚpz
xdc:authorN)r   ÚparseStringÚSMALL_SAMPLEÚnextÚ
assertTrueÚhasattrÚassertEqualÚSTART_DOCUMENTÚSTART_ELEMENTÚtagNameÚlenZ
attributesZgetNamedItemÚvalueÚ
CHARACTERSÚdataÚEND_ELEMENT)r   ÚitemsÚevtÚnodeZ
title_noder   r   r   Útest_parse_semantics+   sf    
z$PullDOMTestCase.test_parse_semanticsc          	   C   s.  t  t¡}xL|D ]:\}}|t jkr|jdkr| |¡ |  dt|jƒ¡ P qW |  	d¡ x|D ]\}}|t jkr^P q^W |  d|jd¡ | |¡ |  t
|ƒd t j¡ t
|ƒ\}}|  |jd¡ | |¡ t
|ƒ t
|ƒ\}}|  |jd¡ |  t¡ t
|ƒ W d	Q R X | ¡  |  |j¡ |  |j¡ d	S )
z$Ensure expandItem works as expected.r   é   z,No "title" element detected in SMALL_SAMPLE!r   z=expandNode did not leave DOMEventStream in the correct state.r   r   r   N)r   r   r   r!   r"   Z
expandNoder   r#   Ú
childNodesÚfailr   r%   ZassertRaisesÚStopIterationÚclearÚassertIsNoneÚparserr
   )r   r(   r)   Úitemr*   r   r   r   Útest_expandItemi   s2    






zPullDOMTestCase.test_expandItemc             C   s6   t  t¡}x&|D ]\}}|t jkrP qW |  d¡ dS )z*PullDOM does not receive "comment" events.zNo comment was encounteredN)r   r   r   ÚCOMMENTr.   )r   r(   r)   Ú_r   r   r   Útest_comment‰   s
    

zPullDOMTestCase.test_commentc             C   st   t  t¡}x&|D ]\}}|t jkr|jdkrP qW yt|ƒ\}}|  t j|¡ W n tk
rn   |  	d¡ Y nX dS )z/PullDOM does not receive "end-document" events.r   z8Ran out of events, but should have received END_DOCUMENTN)
r   r   r   r'   r"   r   r   ÚEND_DOCUMENTr/   r.   )r   r(   r)   r*   r   r   r   Útest_end_document“   s    
z!PullDOMTestCase.test_end_documentc             C   s*   t  t¡}|j}| t¡}|  |d¡ d S )NF)r   r   r   r2   Z
getFeaturer   r   )r   r2   Z	saxparserZgesr   r   r   Útest_external_ges_default£   s    

z)PullDOMTestCase.test_external_ges_defaultN)Ú__name__Ú
__module__Ú__qualname__r   r+   r4   ÚunittestÚexpectedFailurer7   r9   r:   r   r   r   r   r      s   > 
r   c               @   s8   e Zd ZdZdd„ Zejdd„ ƒZdd„ Zdd	d
„Z	dS )ÚThoroughTestCasez(Test the hard-to-reach parts of pulldom.c             C   s   |   tjdtƒ d¡ dS )z0Test some of the hard-to-reach parts of PullDOM.N)r2   )Ú_test_thoroughr   r   ÚSAXExerciser)r   r   r   r   Útest_thorough_parse­   s    z$ThoroughTestCase.test_thorough_parsec             C   s   t dtƒ dƒ}|  |¡ dS )z2SAX2DOM can"t handle a PI before the root element.Né   )ÚSAX2DOMTestHelperrB   rA   )r   Úpdr   r   r   Útest_sax2dom_fail±   s    z"ThoroughTestCase.test_sax2dom_failc             C   s   t dtƒ dƒ}|  |d¡ dS )z0Test some of the hard-to-reach parts of SAX2DOM.NrD   F)rE   ÚSAX2DOMExerciserrA   )r   rF   r   r   r   Útest_thorough_sax2dom·   s    z&ThoroughTestCase.test_thorough_sax2domTc             C   sÐ  t |ƒ\}}|  tj|¡ |  t|dƒ¡ |rŒt |ƒ\}}|  tj|¡ |  d|j¡ t |ƒ\}}|  tj|¡ |  d|j	¡ |  d|j¡ t |ƒ\}}|  tj
|¡ |  d|j¡ t |ƒ\}}|  tj|¡ |  d|j¡ t |ƒ\}}|  tj|¡ |  d|j	¡ |  d|j¡ t |ƒ\}}|  tj
|¡ |  d|j¡ t |ƒ\}}|  tj|¡ |  d|j¡ t |ƒ\}}|  tj|¡ |  d|j¡ t |ƒ\}}|  tj|¡ |  d|j¡ t |ƒ\}}|  tj|¡ dS )	zPTest some of the hard-to-reach parts of the parser, using a mock
        parser.r   z	a commentÚtargetr&   r   r   ÚtextN)r   r   r   r    r   r   r5   r&   ZPROCESSING_INSTRUCTIONrJ   r!   r"   r%   r'   r8   )r   rF   Zbefore_rootr)   r*   r   r   r   rA   ¼   sF    zThoroughTestCase._test_thoroughN)T)
r;   r<   r=   Ú__doc__rC   r>   r?   rG   rI   rA   r   r   r   r   r@   ª   s
   r@   c               @   s0   e Zd ZdZdd„ Zdd„ Zdd„ ZeZeZdS )	rB   znA fake sax parser that calls some of the harder-to-reach sax methods to
    ensure it emits the correct eventsc             C   s
   || _ d S )N)Ú_handler)r   r   r   r   r   ÚsetContentHandlerï   s    zSAXExerciser.setContentHandlerc             C   sˆ   | j }| ¡  | d¡ | dd¡ | dti ƒ¡ | d¡ | dd¡ | dtddiƒ¡ | d¡ | d¡ | d¡ | ¡  d S )	Nz	a commentrJ   r&   r   r   ÚclassÚ	paraclassrK   )	rM   ÚstartDocumentÚcommentÚprocessingInstructionÚstartElementr   Ú
charactersÚ
endElementÚendDocument)r   r6   Úhr   r   r   r   ò   s    




zSAXExerciser.parsec             O   s   dS )zStub method. Does nothing.Nr   )r   ÚargsÚkwargsr   r   r   Ústub  s    zSAXExerciser.stubN)	r;   r<   r=   rL   rN   r   r[   ZsetPropertyÚ
setFeaturer   r   r   r   rB   ë   s   rB   c               @   s   e Zd ZdZdd„ ZdS )rH   z…The same as SAXExerciser, but without the processing instruction and
    comment before the root element, because S2D can"t handle itc             C   sr   | j }| ¡  | dti ƒ¡ | d¡ | dd¡ | dtddiƒ¡ | d¡ | d¡ | d¡ | ¡  d S )	Nr   z	a commentrJ   r&   r   rO   rP   rK   )	rM   rQ   rT   r   rR   rS   rU   rV   rW   )r   r6   rX   r   r   r   r     s    



zSAX2DOMExerciser.parseN)r;   r<   r=   rL   r   r   r   r   r   rH     s   rH   c               @   s   e Zd ZdZdd„ ZdS )rE   z1Allows us to drive SAX2DOM from a DOMEventStream.c             C   s0   t  ¡ | _ | j tjjjd¡ | j | j ¡ d S )Nr,   )	r   ÚSAX2DOMr2   r\   ÚxmlÚsaxr   Zfeature_namespacesrN   )r   r   r   r   Úreset!  s    
zSAX2DOMTestHelper.resetN)r;   r<   r=   rL   r`   r   r   r   r   rE     s   rE   c               @   s&   e Zd Zd	dd„Zdd„ Zdd„ ZdS )
ÚSAX2DOMTestCaseÚTestc             C   s   |   ||¡ d S )N)r   )r   ZtestZtestnamer   r   r   Úconfirm*  s    zSAX2DOMTestCase.confirmc          	   C   sj   t  t¡V}t|tj ¡ ttƒƒ}x&|D ]\}}|tj	kr(|j
dkr(P q(W |  t|jƒd¡ W dQ R X dS )z'Ensure SAX2DOM can parse from a stream.r   r   N)ÚioÚStringIOr   rE   r^   r_   Zmake_parserr#   r   r!   r"   ZassertGreaterr-   )r   r   Úsdr)   r*   r   r   r   Ú
test_basic-  s    
zSAX2DOMTestCase.test_basicc             C   s>  t  ¡ }| ¡  | di ¡ | d¡ | di ¡ | d¡ | d¡ | d¡ | d¡ | ¡  |j}|j}|j	\}}}|j	d }|  
|j¡ |  |j|¡ |  |j|¡ |  |j|¡ |  |j|¡ |  
|j¡ |  
|j¡ |  
|j¡ |  |j|¡ |  |j|¡ |  |j|¡ |  |j|¡ |  |j|¡ | ¡  dS )z)Ensure SAX2DOM expands nodes as expected.ÚdocrK   Zsubelmr   N)r   r]   rQ   rT   rU   rV   rW   ZdocumentZdocumentElementr-   r1   ZpreviousSiblingZassertIsZnextSiblingZ
parentNodeÚunlink)r   Zsax2domrh   ÚrootZtext1Zelm1Ztext2Ztext3r   r   r   ÚtestSAX2DOM9  s8    





zSAX2DOMTestCase.testSAX2DOMN)rb   )r;   r<   r=   rc   rg   rk   r   r   r   r   ra   (  s   
ra   Ú__main__)rd   r>   Zxml.saxr^   Zxml.sax.xmlreaderr   Zxml.sax.handlerr   Zxml.domr   Ztest.supportr   r	   r   ZTestCaser   r@   ÚobjectrB   rH   ZDOMEventStreamrE   ra   r;   Úmainr   r   r   r   Ú<module>   s"   
 A"
4