U
    }g                     @   s`   d Z ddlZddlZddlmZmZmZ ddlmZ ddl	m
Z
 ddlmZ G dd	 d	eZdS )
zGTests to ensure that the html.parser tree builder generates good
trees.    N)_DuplicateAttributeHandlerBeautifulSoupHTMLParserHTMLParserTreeBuilder)ParserRejectedMarkup)Any   )HTMLTreeBuilderSmokeTestc                   @   s`   e Zd Ze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 )TestHTMLParserTreeBuilderc              
   C   s8   dddg}|D ]$}t t | | W 5 Q R X qd S )Ns	   
<![ s   <![n s   <![UNKNOWN[]]>)pytestZraisesr   soup)selfZ
bad_markupmarkup r   =/tmp/pip-unpacked-wheel-kgiupv3k/bs4/tests/test_htmlparser.pytest_rejected_input   s    
z-TestHTMLParserTreeBuilder.test_rejected_inputc                 C   s   d S Nr   r   r   r   r   test_namespaced_system_doctype(   s    z8TestHTMLParserTreeBuilder.test_namespaced_system_doctypec                 C   s   d S r   r   r   r   r   r   test_namespaced_public_doctype,   s    z8TestHTMLParserTreeBuilder.test_namespaced_public_doctypec                 C   s:   |  d}t|d}t|}t|jt|js6tdS )zfUnlike most tree builders, HTMLParserTreeBuilder and will
        be restored after pickling.
        z<a><b>foo</a>   N)r   pickledumpsloads
isinstanceZbuildertypeAssertionError)r   treeZdumpedZloadedr   r   r   test_builder_is_pickled0   s    

z1TestHTMLParserTreeBuilder.test_builder_is_pickledc                 C   s   |  dd |  dd d S )Nz<br></br><br></br><br></br>z<br/><br/><br/>z</br></br></br> Zassert_soupr   r   r   r   )test_redundant_empty_element_closing_tags9   s    zCTestHTMLParserTreeBuilder.test_redundant_empty_element_closing_tagsc                 C   s   |  dd d S )Nz
foo &# barzfoo &amp;# barr   r   r   r   r   test_empty_element=   s    z,TestHTMLParserTreeBuilder.test_empty_elementc                 C   sv   d}|  |}d|jjkstd|jjks.td|jdjksDt| j |dd}d |jjksbtd |jjksrtd S )Nz=
   <p>

<sourceline>
<b>text</b></sourceline><sourcepos></p>r      
sourcelineF)Zstore_line_numbers)r   pr#   r   Z	sourceposfindnamer   r   r   r   r   r   test_tracking_line_numbersB   s    
z4TestHTMLParserTreeBuilder.test_tracking_line_numbersc                    s   d   }d|jd ks tdg|jd ks4td|jd ksFtttd d fdd	}|d d |tjd |tjd
 dd }||d
ddg d S )Nz;<a class="cls" href="url1" href="url2" href="url3" id="id">Zurl3hrefclsclassid)on_duplicate_attributeexpectedreturnc                    sX   j  | d}|jd k	st||jd ks.tdg|jd ksBtd|jd ksTtd S )N)r-   r)   r*   r+   r,   )r   ar   )r-   r.   r   r   r   r   r   assert_attribute^   s
    zOTestHTMLParserTreeBuilder.test_on_duplicate_attribute.<locals>.assert_attributeurl1c                 S   s.   t | | ts| | g| |< | | | d S r   )r   listappend)attrskeyvaluer   r   r   
accumulatep   s    zITestHTMLParserTreeBuilder.test_on_duplicate_attribute.<locals>.accumulateurl2)r   r0   r   r   r   r   ZREPLACEZIGNORE)r   r   r2   r9   r   r1   r   test_on_duplicate_attributeP   s    
 
z5TestHTMLParserTreeBuilder.test_on_duplicate_attributec           	      C   sj   dD ]`\}}}d| }|  |j}| }d|d }||ksDt|jdd}d| }||kstqd S )N))z&RightArrowLeftArrow;u   ⇄s   &rlarr;)z&models;u   ⊧s   &models;)z&Nfr;u   𝔑s   &Nfr;)z&ngeqq;u   ≧̸s   &ngeqq;)z&not;   ¬s   &not;)z&Not;u   ⫬s   &Not;)z&quot;"   ")z&there4;   ∴   &there4;)z&Therefore;r?   r@   )z&therefore;r?   r@   )z&fjlig;fjs   fj)z&sqcup;u   ⊔s   &sqcup;)z&sqcups;u   ⊔︀s   &sqcups;)z&apos;'   ')z&verbar;|   |z<div>%s</div>s   <div>%s</div>utf8html)	formatter)r   divencoder   )	r   Zinput_elementZoutput_unicodeZoutput_elementr   rI   Zwithout_elementexpectZwith_elementr   r   r   test_html5_attributesw   s    z/TestHTMLParserTreeBuilder.test_html5_attributesc                 C   sD   d}|  |}d|j ks td}|  |}d|j ks@td S )Nz<p>a &nosuchentity b</p>z<p>a &amp;nosuchentity b</p>z<p>a &nosuchentity; b</p>)r   r$   decoder   r'   r   r   r   test_invalid_html_entity   s    

z2TestHTMLParserTreeBuilder.test_invalid_html_entityN)__name__
__module____qualname__r   Zdefault_builderr   r   r   r   r    r!   r(   r;   rL   rN   r   r   r   r   r	      s   	' r	   )__doc__r   r
   Zbs4.builder._htmlparserr   r   r   Zbs4.exceptionsr   typingr   r   r   r	   r   r   r   r   <module>   s   