o
    ¶Th¼  ã                   @   sˆ  d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	m
Z
 ddlmZmZmZmZmZmZmZmZmZmZmZ ddlmZ G d	d
„ d
eƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZ G dd„ deƒZ!G dd„ de!ƒZ"G dd„ de!ƒZ#G dd „ d eƒZ$G d!d"„ d"e$ƒZ%G d#d$„ d$e$ƒZ&G d%d&„ d&eƒZ'G d'd(„ d(eƒZ(dS ))a8  Tests for Beautiful Soup's tree traversal methods.

The tree traversal methods are the main advantage of using Beautiful
Soup over just using a parser.

Different parsers will build different Beautiful Soup trees given the
same markup, but all Beautiful Soup trees can be traversed with the
methods tested here.
é    )Ú	set_traceN)ÚBeautifulSoup)Úbuilder_registryÚHTMLParserTreeBuilder)ÚCDataÚCommentÚDeclarationÚDoctypeÚ	FormatterÚNavigableStringÚScriptÚSoupStrainerÚ
StylesheetÚTagÚTemplateStringé   )ÚSoupTestc                   @   ó8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚTestFindzˆBasic tests of the find() method.

    find() just calls find_all() with limit=1, so it's not tested all
    that thouroughly here.
    c                 C   s"   |   d¡}| d¡jdksJ ‚d S )Nz <a>1</a><b>2</b><a>3</a><b>4</b>ÚbÚ2)ÚsoupÚfindÚstring©Úselfr   © r   úS/home/air/segue/gpt/backup/venv/lib/python3.10/site-packages/bs4/tests/test_tree.pyÚtest_find_tag-   ó   
zTestFind.test_find_tagc                 C   s"   |   d¡}|jdddksJ ‚d S )Nu   <h1>RÃ¤ksmÃ¶rgÃ¥s</h1>õ   RÃ¤ksmÃ¶rgÃ¥s©r   )r   r   r   r   r   r   Útest_unicode_text_find1   r   zTestFind.test_unicode_text_findc                 C   s,   |   d¡}t|ƒ d|jddjksJ ‚d S )Nu&   <h1 id="RÃ¤ksmÃ¶rgÃ¥s">here it is</h1>z
here it isr    ©Úid)r   Ústrr   Útextr   r   r   r   Útest_unicode_attribute_find5   s   
z$TestFind.test_unicode_attribute_findc                 C   s"   |   d¡}dt| ¡ ƒksJ ‚dS )z)Test an optimization that finds all tags.ú<a>foo</a><b>bar</b>é   N©r   ÚlenÚfind_allr   r   r   r   Útest_find_everything;   s   
zTestFind.test_find_everythingc                 C   s$   |   d¡}dt| d¡ƒksJ ‚dS )z;Test an optimization that finds all tags with a given name.z<a>foo</a><b>bar</b><a>baz</a>r)   ÚaNr*   r   r   r   r   Útest_find_everything_with_name@   s   
z'TestFind.test_find_everything_with_nameN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r"   r'   r-   r/   r   r   r   r   r   &   s    r   c                   @   r   )ÚTestFindAllz%Basic tests of the find_all() method.c                 C   sv   |   d¡}|jdddgksJ ‚|jddgdddgksJ ‚|jt d¡dg d¢ks-J ‚|jddg d¢ks9J ‚dS )	z'You can search the tree for text nodes.u   <html>Foo<b>bar</b>Â»</html>Úbarr!   ÚFooz.*)r6   r5   õ   Â»TN)r   r,   ÚreÚcompiler   r   r   r   Útest_find_all_text_nodesH   s
   
z$TestFindAll.test_find_all_text_nodesc                 C   st   |   d¡}|  |jdddg d¢¡ |  |jddddg¡ |  |jdddg d	¢¡ |  |jdd
dg d	¢¡ dS )z7You can limit the number of items returned by find_all.z(<a>1</a><a>2</a><a>3</a><a>4</a><a>5</a>r.   é   ©Úlimit)Ú1r   Ú3r   r>   é
   )r>   r   r?   Ú4Ú5r   N©r   Úassert_selectsr,   r   r   r   r   Útest_find_all_limitV   s   
ÿÿzTestFindAll.test_find_all_limitc                 C   s:   |   d¡}|  |ddddg¡ |  |jdddg¡ d S )	Nz!<a>1</a><b>2<a id='foo'>3</a></b>r.   r   r<   r>   Úfoor#   r?   )r   rD   r   r   r   r   r   Ú%test_calling_a_tag_is_calling_findallb   s   
z1TestFindAll.test_calling_a_tag_is_calling_findallc                 C   s.   |   d¡}g }| |¡ g | |¡ksJ ‚d S )Nú<a></a>)r   Úappendr,   )r   r   Úlr   r   r   ÚTtest_find_all_with_self_referential_data_structure_does_not_cause_infinite_recursiong   s   

z`TestFindAll.test_find_all_with_self_referential_data_structure_does_not_cause_infinite_recursionc                 C   sX   |   d¡}| d¡}t|dƒsJ ‚| d¡}t|dƒsJ ‚|jdd}t|dƒs*J ‚dS )z%All find_all calls return a ResultSetrH   r.   ÚsourceTrF   r!   N)r   r,   Úhasattr)r   r   Úresultr   r   r   Útest_find_all_resultsetq   s   


z#TestFindAll.test_find_all_resultsetN)	r0   r1   r2   r3   r:   rE   rG   rK   rO   r   r   r   r   r4   E   s    
r4   c                   @   ó   e Zd Zdd„ ZdS )ÚTestFindAllBasicNamespacesc                 C   s<   |   d¡}d| d¡jksJ ‚d|jddidjksJ ‚d S )Nz0<mathml:msqrt>4</mathml:msqrt><a svg:fill="red">rA   zmathml:msqrtr.   zsvg:fillÚred©Úattrs)r   r   r   Únamer   r   r   r   Útest_find_by_namespaced_name€   s   
z7TestFindAllBasicNamespaces.test_find_by_namespaced_nameN)r0   r1   r2   rV   r   r   r   r   rQ   ~   ó    rQ   c                   @   sh   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S )ÚTestFindAllByNamez&Test ways of finding tags by tag name.c                 C   ó   |   d¡| _d S )Nz<a>First tag.</a>
                                  <b>Second tag.</b>
                                  <c>Third <a>Nested tag.</a> tag.</c>©r   Útree©r   r   r   r   Úsetup_method‰   ó   zTestFindAllByName.setup_methodc                 C   s   |   | j d¡ddg¡ d S ©Nr.   ú
First tag.úNested tag.©rD   r[   r,   r\   r   r   r   Útest_find_all_by_tag_nameŽ   s   ÿz+TestFindAllByName.test_find_all_by_tag_namec                 C   s\   |   | jjddddg¡ |   | jjdddddg¡ |   | jjdt d¡dddg¡ d S )Nr.   r`   r!   Tra   Útag©rD   r[   r,   r8   r9   r\   r   r   r   Útest_find_all_by_name_and_text“   s   ÿÿþz0TestFindAllByName.test_find_all_by_name_and_textc                 C   s   |   | jj d¡dg¡ d S )Nr.   ra   )rD   r[   Úcr,   r\   r   r   r   Ú!test_find_all_on_non_root_elementŸ   s   z3TestFindAllByName.test_find_all_on_non_root_elementc                 C   s   |   |  d¡ddg¡ d S r_   )rD   r[   r\   r   r   r   Ú%test_calling_element_invokes_find_all£   s   z7TestFindAllByName.test_calling_element_invokes_find_allc                 C   s    |   | j tdƒ¡ddg¡ d S r_   )rD   r[   r,   r   r\   r   r   r   Útest_find_all_by_tag_strainer¦   ó   þz/TestFindAllByName.test_find_all_by_tag_strainerc                 C   s    |   | j ddg¡g d¢¡ d S )Nr.   r   ©r`   zSecond tag.ra   rb   r\   r   r   r   Útest_find_all_by_tag_names«   rk   z,TestFindAllByName.test_find_all_by_tag_namesc                 C   s"   |   | j dddœ¡g d¢¡ d S )NT)r.   r   rl   rb   r\   r   r   r   Útest_find_all_by_tag_dict°   ó   þz+TestFindAllByName.test_find_all_by_tag_dictc                 C   s"   |   | j t d¡¡g d¢¡ d S )Nz^[ab]$rl   re   r\   r   r   r   Útest_find_all_by_tag_reµ   ro   z)TestFindAllByName.test_find_all_by_tag_rec                 C   s,   dd„ }|   d¡}|  | |¡ddg¡ d S )Nc                 S   s   | j |  d¡kS ©Nr$   )rU   Úget©rd   r   r   r   Úid_matches_name½   r^   zRTestFindAllByName.test_find_all_with_tags_matching_method.<locals>.id_matches_namezƒ<a id="a">Match 1.</a>
                            <a id="1">Does not match.</a>
                            <b id="b">Match 2.</a>zMatch 1.zMatch 2.rC   )r   rt   r[   r   r   r   Ú'test_find_all_with_tags_matching_methodº   s
   
ÿz9TestFindAllByName.test_find_all_with_tags_matching_methodc                 C   sx   |   d¡}| dd¡}| dt d¡¡}| dddg¡\}}d|jks%J ‚d|jks,J ‚d|jks3J ‚d|jks:J ‚d S )NzH<div class='a b'>1</div><div class='a c'>2</div><div class='a d'>3</div>Údivza dza br?   r>   )r   r   r8   r9   r,   r   )r   r   Úr1Úr2Úr3Úr4r   r   r   Ú%test_find_with_multi_valued_attributeÇ   s   ÿz7TestFindAllByName.test_find_with_multi_valued_attributeN)r0   r1   r2   r3   r]   rc   rf   rh   ri   rj   rm   rn   rp   ru   r{   r   r   r   r   rX   †   s    rX   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!S )"ÚTestFindAllByAttributec                 C   ó&   |   d¡}|  |jddddg¡ d S )NzÅ
                         <a id="first">Matching a.</a>
                         <a id="second">
                          Non-matching <b id="first">Matching b.</b>a.
                         </a>Úfirstr#   zMatching a.zMatching b.rC   ©r   r[   r   r   r   Útest_find_all_by_attribute_nameÖ   s   
ÿz6TestFindAllByAttribute.test_find_all_by_attribute_namec                 C   st   d  d¡}d  d¡}|  |¡}|jg|j|dksJ ‚|jg|j| d¡dks*J ‚|jgs8J |j|dgdƒ‚d S )Nu   ××•×œ×©Úutf8u   <a title="××•×œ×©"></a>)Útitlezsomething else)Úencoder   r.   r,   Údecode)r   ÚpeaceÚdatar   r   r   r   Ú%test_find_all_by_utf8_attribute_valueá   s   


 z<TestFindAllByAttribute.test_find_all_by_utf8_attribute_valuec                 C   sX   |   d¡}|  |jdddg¡ |  |jddiddg¡ |  |jdd	idd
g¡ d S )Na0  
                         <a name="name1" class="class1">Name match.</a>
                         <a name="name2" class="class2">Class match.</a>
                         <a name="name3" class="class3">Non-match.</a>
                         <name1>A tag called 'name1'.</name1>
                         Úname1©rU   zA tag called 'name1'.rU   rS   zName match.ÚclassÚclass2zClass match.rC   r   r   r   r   Útest_find_all_by_attribute_dicté   s   
ÿÿÿz6TestFindAllByAttribute.test_find_all_by_attribute_dictc                 C   s°   |   d¡}|  |jddddg¡ |  |jddddg¡ |  |jdd	ddg¡ |  | dd¡dg¡ |  |jdd
ddg¡ |  | dd¡dg¡ |  | dd	¡dg¡ d S )Nzî
                         <a class="1">Class 1.</a>
                         <a class="2">Class 2.</a>
                         <b class="1">Class 1.</b>
                         <c class="3 4">Class 3 and 4.</c>
                         r.   r>   ©Úclass_zClass 1.rg   r?   zClass 3 and 4.rA   rS   rC   r   r   r   r   Útest_find_all_by_classþ   s   
	z-TestFindAllByAttribute.test_find_all_by_classc                 C   st   |   d¡}|jdt d¡d}|  |dg¡ |jdt d¡d}|  |dg¡ |jdt d¡d}|  |dg¡ d S )Nz#<gar class='foo bar'>Found it</gar>ÚgarÚor   úFound itr.   zo b)r   r,   r8   r9   rD   )r   r[   Úfr   r   r   Ú0test_find_by_class_when_multiple_classes_present  s   
zGTestFindAllByAttribute.test_find_by_class_when_multiple_classes_presentc                 C   sd   |   d¡}|  | dt d¡¡dg¡ dd„ }|  | d|¡g ¡ dd„ }|  | d|¡dg¡ d S )	Nz<a class='bar'>Found it</a>r.   Úbar’   c                 S   s   t | ƒdkS ©Nr;   ©r+   ©Úvaluer   r   r   Úbig_attribute_value%  ó   znTestFindAllByAttribute.test_find_all_with_non_dictionary_for_attrs_finds_by_class.<locals>.big_attribute_valuec                 S   s   t | ƒdkS r–   r—   r˜   r   r   r   Úsmall_attribute_value*  r›   zpTestFindAllByAttribute.test_find_all_with_non_dictionary_for_attrs_finds_by_class.<locals>.small_attribute_value©r   rD   r,   r8   r9   )r   r   rš   rœ   r   r   r   Ú:test_find_all_with_non_dictionary_for_attrs_finds_by_class   s   
ÿzQTestFindAllByAttribute.test_find_all_with_non_dictionary_for_attrs_finds_by_classc                 C   sŒ   |   d¡}| d¡\}}||gsJ | dd¡ƒ‚|gs#J | dd¡ƒ‚|g|jdddks/J ‚|g| dd¡ks:J ‚g | dd¡ksDJ ‚d S )Nz*<a class="foo bar"></a><a class="foo"></a>r.   rF   r5   zfoo barr   zbar foo©r   r,   )r   r   r.   Úa2r   r   r   Ú:test_find_all_with_string_for_attrs_finds_multiple_classes0  s   
zQTestFindAllByAttribute.test_find_all_with_string_for_attrs_finds_multiple_classesc                 C   s0   |   d¡}tddid}|  | |¡dg¡ d S )Nzi
                         <a id="first">Match.</a>
                         <a id="second">Non-match.</a>r$   r~   rS   zMatch.)r   r   rD   r,   )r   r[   Ústrainerr   r   r   Ú'test_find_all_by_attribute_soupstrainer<  s   
z>TestFindAllByAttribute.test_find_all_by_attribute_soupstrainerc                 C   s&   |   d¡}|  |jdd ddg¡ d S )Nú<a id="1">ID present.</a>
                            <a>No ID present.</a>
                            <a id="">ID is empty.</a>r.   r#   zNo ID present.rC   r   r   r   r   Ú$test_find_all_with_missing_attributeD  s   
z;TestFindAllByAttribute.test_find_all_with_missing_attributec                 C   r}   )Nr¤   Tr#   zID present.zID is empty.rC   r   r   r   r   Ú$test_find_all_with_defined_attributeL  s   
ÿz;TestFindAllByAttribute.test_find_all_with_defined_attributec                 C   s>   |   d¡}ddg}|  |jdd|¡ |  |jdd|¡ d S )Nz[<a id=1>Unquoted attribute.</a>
                            <a id="1">Quoted attribute.</a>zUnquoted attribute.zQuoted attribute.r   r#   r>   rC   )r   r[   Úexpectedr   r   r   Ú$test_find_all_with_numeric_attributeU  s   
z;TestFindAllByAttribute.test_find_all_with_numeric_attributec                 C   s*   |   d¡}|  |jg d¢dddg¡ d S )Nz‘<a id="1">1</a>
                            <a id="2">2</a>
                            <a id="3">3</a>
                            <a>No ID.</a>)r>   r?   rA   r#   r>   r?   rC   r   r   r   r   Ú(test_find_all_with_list_attribute_values^  s   
ÿz?TestFindAllByAttribute.test_find_all_with_list_attribute_valuesc                 C   s,   |   d¡}|  |jt d¡dddg¡ d S )NzÞ<a id="a">One a.</a>
                            <a id="aa">Two as.</a>
                            <a id="ab">Mixed as and bs.</a>
                            <a id="b">One b.</a>
                            <a>No ID.</a>z^a+$r#   zOne a.zTwo as.r   r   r   r   r   Ú5test_find_all_with_regular_expression_attribute_valueh  s   
ÿzLTestFindAllByAttribute.test_find_all_with_regular_expression_attribute_valuec                 C   sB   |   d¡}|j}|g|jdddksJ ‚g |jdddksJ ‚d S )Nz<b>foo</b><b>bar</b><a>foo</a>r.   rF   r!   r5   ©r   r.   r,   ©r   r   r.   r   r   r   Ú'test_find_by_name_and_containing_stringu  ó   
z>TestFindAllByAttribute.test_find_by_name_and_containing_stringc                 C   s*   |   d¡}| d¡|jdddksJ ‚d S )Nz"<a>foo</a><a><b><c>foo</c></b></a>r.   rF   r!   rŸ   r   r   r   r   Ú=test_find_by_name_and_containing_string_when_string_is_buried|  s   
 zTTestFindAllByAttribute.test_find_by_name_and_containing_string_when_string_is_buriedc                 C   sB   |   d¡}|j}|g|jdddksJ ‚g |jdddksJ ‚d S )Nz"<b id="1">foo</b><a id="2">foo</a>r)   rF   )r$   r   r   r5   r«   r¬   r   r   r   Ú,test_find_by_attribute_and_containing_string€  r®   zCTestFindAllByAttribute.test_find_by_attribute_and_containing_stringN)r0   r1   r2   r€   r‡   rŒ   r   r”   rž   r¡   r£   r¥   r¦   r¨   r©   rª   r­   r¯   r°   r   r   r   r   r|   Ô   s"    		
r|   c                   @   ó   e Zd ZdZdd„ ZdS )Ú
TestSmoothzTest Tag.smooth.c                 C   s  |   d¡}|j}| d¡ | d¡ | tdƒ¡ | tdƒ¡ | d¡ |  ¡ }t||dƒ}| d¡ | d	¡ | |¡ d |jjksFJ ‚d
t|j	ƒksOJ ‚| 
¡  dt|j	ƒks\J ‚d|j	d kseJ ‚d|jjksmJ ‚d|j	d ksvJ ‚d|j	d ksJ ‚d S )Nz<div>a</div>r   rg   z	Comment 1z	Comment 2ÚdÚspanr>   r   é   é   Úabcr   Ú12r   r)   )r   rv   rI   r   Údefault_builderr   r´   r   r+   ÚcontentsÚsmooth)r   r   rv   Úbuilderr´   r   r   r   Útest_smooth‹  s(   






zTestSmooth.test_smoothN)r0   r1   r2   r3   r½   r   r   r   r   r²   ˆ  s    r²   c                   @   r±   )Ú	TestIndexzTest Tag.indexc                 C   sp   |   d¡}|j}t|jƒD ]\}}|| |¡ksJ ‚qt t¡ | d¡ W d   ƒ d S 1 s1w   Y  d S )Nah  <div>
                            <a>Identical</a>
                            <b>Not identical</b>
                            <a>Identical</a>

                            <c><d>Identical with child</d></c>
                            <b>Also not identical</b>
                            <c><d>Identical with child</d></c>
                            </div>r   )r   rv   Ú	enumeraterº   ÚindexÚpytestÚraisesÚ
ValueError)r   r[   rv   ÚiÚelementr   r   r   Ú
test_index¶  s   
	"ÿzTestIndex.test_indexN)r0   r1   r2   r3   rÆ   r   r   r   r   r¾   ´  s    r¾   c                   @   sX   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S )ÚTestParentOperationsz;Test navigation and searching through an element's parents.c                 C   s   |   d¡| _| jj| _d S )Na1  <ul id="empty"></ul>
                                 <ul id="top">
                                  <ul id="middle">
                                   <ul id="bottom">
                                    <b>Start here</b>
                                   </ul>
                                  </ul>)r   r[   r   Ústartr\   r   r   r   r]   Ê  s   z!TestParentOperations.setup_methodc                 C   sF   | j jd dks
J ‚| j jjd dksJ ‚| j jjjd dks!J ‚d S )Nr$   ÚbottomÚmiddleÚtop)rÈ   Úparentr\   r   r   r   Útest_parentÕ  s   z TestParentOperations.test_parentc                 C   s    | j jd }|j| j ksJ ‚d S )Nr   )r[   rº   rÌ   )r   Útop_tagr   r   r   Ú%test_parent_of_top_tag_is_soup_objectÚ  s   z:TestParentOperations.test_parent_of_top_tag_is_soup_objectc                 C   s   d | j jksJ ‚d S ©N)r[   rÌ   r\   r   r   r   Útest_soup_object_has_no_parentÞ  ó   z3TestParentOperations.test_soup_object_has_no_parentc                 C   s6   |   | j d¡g d¢¡ |   | jjddddg¡ d S )NÚul)rÉ   rÊ   rË   rÊ   r#   )Úassert_selects_idsrÈ   Úfind_parentsr\   r   r   r   Útest_find_parentsá  s   ÿÿz&TestParentOperations.test_find_parentsc                 C   s8   | j  d¡d dksJ ‚| j jdddd dksJ ‚d S )NrÓ   r$   rÉ   rË   r#   )rÈ   Úfind_parentr\   r   r   r   Útest_find_parentç  s    z%TestParentOperations.test_find_parentc                 C   s"   | j jdd}|jjdksJ ‚d S )Nú
Start herer!   r   )r[   r   rÌ   rU   ©r   r&   r   r   r   Útest_parent_of_text_elementë  ó   z0TestParentOperations.test_parent_of_text_elementc                 C   s(   | j jdd}| d¡d dksJ ‚d S )NrÙ   r!   rÓ   r$   rÉ   )r[   r   r×   rÚ   r   r   r   Útest_text_element_find_parentï  s   z2TestParentOperations.test_text_element_find_parentc                 C   s*   dd„ | j jD ƒ}|sJ dddkgƒ‚d S )Nc                 S   s&   g | ]}|d urd|j v r|d ‘qS rq   rS   )Ú.0rÌ   r   r   r   Ú
<listcomp>ô  s    ÿz>TestParentOperations.test_parent_generator.<locals>.<listcomp>rÉ   rÊ   rË   )rÈ   Úparents)r   rà   r   r   r   Útest_parent_generatoró  s   z*TestParentOperations.test_parent_generatorN)r0   r1   r2   r3   r]   rÍ   rÏ   rÑ   rÖ   rØ   rÛ   rÝ   rá   r   r   r   r   rÇ   Ç  s    rÇ   c                   @   rP   )ÚProximityTestc                 C   rY   )Nzg<html id="start"><head></head><body><b id="1">One</b><b id="2">Two</b><b id="3">Three</b></body></html>rZ   r\   r   r   r   r]   û  s   
ÿzProximityTest.setup_methodN©r0   r1   r2   r]   r   r   r   r   râ   ù  rW   râ   c                       óT   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
‡  ZS )ÚTestNextOperationsc                    s   t t| ƒ ¡  | jj| _d S rÐ   )Úsuperrå   r]   r[   r   rÈ   r\   ©Ú	__class__r   r   r]     s   zTestNextOperations.setup_methodc                 C   s*   | j jdksJ ‚| j jjd dksJ ‚d S )NÚOner$   r   )rÈ   Únext_elementr\   r   r   r   Ú	test_next  s   zTestNextOperations.test_nextc                 C   s    | j jdd}|jd ksJ ‚d S ©NÚThreer!   )r[   r   rê   )r   Úlastr   r   r   Útest_next_of_last_item_is_none
  s   z1TestNextOperations.test_next_of_last_item_is_nonec                 C   ó   | j jd ksJ ‚d S rÐ   )r[   rê   r\   r   r   r   Útest_next_of_root_is_none  ó   z,TestNextOperations.test_next_of_root_is_nonec                 C   sB   |   | j d¡ddg¡ | jjdd |   | jjdddg¡ d S )Nr   ÚTworí   r;   r#   )rD   rÈ   Úfind_all_nextr\   r   r   r   Útest_find_all_next  s   z%TestNextOperations.test_find_all_nextc                 C   ó2   | j  d¡d dksJ ‚| j jdddksJ ‚d S )Nr   r$   r   rí   r!   )rÈ   Ú	find_nextr\   r   r   r   Útest_find_next  ó   z!TestNextOperations.test_find_nextc                 C   s<   | j jdd}| d¡jdksJ ‚|  | d¡ddg¡ d S )Nré   r!   r   ró   rí   )r[   r   r÷   r   rD   rô   rÚ   r   r   r   Útest_find_next_for_text_element  s   z2TestNextOperations.test_find_next_for_text_elementc                 C   sF   | j jdd}dd„ |jD ƒ}|\}}|d dksJ ‚|dks!J ‚d S )Nró   r!   c                 S   ó   g | ]}|‘qS r   r   ©rÞ   Únoder   r   r   rß   "  ó    z:TestNextOperations.test_next_generator.<locals>.<listcomp>r$   r?   rí   )r[   r   Únext_elements)r   rÈ   Ú
successorsrd   rº   r   r   r   Útest_next_generator   s
   z&TestNextOperations.test_next_generator)r0   r1   r2   r]   rë   rï   rñ   rõ   rø   rú   r  Ú__classcell__r   r   rç   r   rå      s    rå   c                       rä   )ÚTestPreviousOperationsc                    ó"   t t| ƒ ¡  | jjdd| _d S rì   )ræ   r  r]   r[   r   Úendr\   rç   r   r   r]   *  rÜ   z#TestPreviousOperations.setup_methodc                 C   s*   | j jd dks
J ‚| j jjdksJ ‚d S )Nr$   r?   ró   )r  Úprevious_elementr\   r   r   r   Útest_previous.  s   z$TestPreviousOperations.test_previousc                 C   s   | j  d¡}|jd ksJ ‚d S )NÚhtml)r[   r   r  )r   r~   r   r   r   Ú#test_previous_of_first_item_is_none2  s   z:TestPreviousOperations.test_previous_of_first_item_is_nonec                 C   rð   rÐ   )r[   r  r\   r   r   r   Útest_previous_of_root_is_none6  rò   z4TestPreviousOperations.test_previous_of_root_is_nonec                 C   s4   |   | j d¡g d¢¡ |   | jjdddg¡ d S )Nr   ©rí   ró   ré   r   r#   ré   )rD   r  Úfind_all_previousr\   r   r   r   Útest_find_all_previous:  s   ÿz-TestPreviousOperations.test_find_all_previousc                 C   rö   )Nr   r$   r?   ré   r!   )r  Úfind_previousr\   r   r   r   Útest_find_previousB  rù   z)TestPreviousOperations.test_find_previousc                 C   s<   | j jdd}| d¡jdksJ ‚|  | d¡g d¢¡ d S )Nrí   r!   r   r  )r[   r   r  r   rD   r  rÚ   r   r   r   Ú#test_find_previous_for_text_elementF  s
   ÿz:TestPreviousOperations.test_find_previous_for_text_elementc                 C   sh   | j jdd}dd„ |jD ƒ}|\}}}}|d dksJ ‚|jdks$J ‚|jdks+J ‚|jd	ks2J ‚d S )
Nré   r!   c                 S   rû   r   r   rü   r   r   r   rß   N  rþ   zBTestPreviousOperations.test_previous_generator.<locals>.<listcomp>r$   r>   ÚbodyÚheadr  )r[   r   Úprevious_elementsrU   )r   rÈ   Úpredecessorsr   r  r  r  r   r   r   Útest_previous_generatorL  s   z.TestPreviousOperations.test_previous_generator)r0   r1   r2   r]   r  r	  r
  r  r  r  r  r  r   r   rç   r   r  (  s    r  c                   @   rP   )ÚSiblingTestc                 C   s&   d}t  d¡ d|¡}|  |¡| _d S )Na‰  <html>
                    <span id="1">
                     <span id="1.1"></span>
                    </span>
                    <span id="2">
                     <span id="2.1"></span>
                    </span>
                    <span id="3">
                     <span id="3.1"></span>
                    </span>
                    <span id="4"></span>
                    </html>z\n\s*Ú )r8   r9   Úsubr   r[   )r   Úmarkupr   r   r   r]   [  s   zSiblingTest.setup_methodNrã   r   r   r   r   r  Y  rW   r  c                       óL   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	‡  Z
S )ÚTestNextSiblingc                    r  )Nr>   r#   )ræ   r  r]   r[   r   rÈ   r\   rç   r   r   r]   p  rÜ   zTestNextSibling.setup_methodc                 C   rð   rÐ   )r[   Únext_siblingr\   r   r   r   Ú!test_next_sibling_of_root_is_nonet  rÒ   z1TestNextSibling.test_next_sibling_of_root_is_nonec                 C   óB   | j jd dks
J ‚| j jjd dksJ ‚| j jd dksJ ‚d S )Nr$   r   r?   ú1.1)rÈ   r  rê   r\   r   r   r   Útest_next_siblingw  ó   z!TestNextSibling.test_next_siblingc                 C   óN   | j jjd ks	J ‚| j jdd}|jd ksJ ‚| j jdd}|jd ks%J ‚d S )Nr  r#   rA   )r[   r  r  r   )r   Únested_spanÚ	last_spanr   r   r   Útest_next_sibling_may_not_exist~  ó
   z/TestNextSibling.test_next_sibling_may_not_existc                 C   ó   | j  d¡d dksJ ‚d S )Nr´   r$   r   )rÈ   Úfind_next_siblingr\   r   r   r   Útest_find_next_sibling‡  ó   z&TestNextSibling.test_find_next_siblingc                 C   ó4   |   | j d¡g d¢¡ |   | jjdddg¡ d S )Nr´   )r   r?   rA   r?   r#   )rÔ   rÈ   Úfind_next_siblingsr\   r   r   r   Útest_next_siblingsŠ  ó   ÿz"TestNextSibling.test_next_siblingsc                 C   óv   |   d¡}|jdd}|jjdksJ ‚|jjdksJ ‚|  | d¡dg¡ |jdddks/J ‚|jddd ks9J ‚d S )NúFoo<b>bar</b>bazr6   r!   r   Úbazr5   Únonesuch)r   r   r  rU   rD   r,  r(  ©r   r   rÈ   r   r   r   Ú"test_next_sibling_for_text_element  ó   
z2TestNextSibling.test_next_sibling_for_text_element)r0   r1   r2   r]   r  r   r%  r)  r-  r4  r  r   r   rç   r   r  n  ó    	r  c                       r  )ÚTestPreviousSiblingc                    r  )NrA   r#   )ræ   r7  r]   r[   r   r  r\   rç   r   r   r]     rÜ   z TestPreviousSibling.setup_methodc                 C   rð   rÐ   )r[   Úprevious_siblingr\   r   r   r   Ú%test_previous_sibling_of_root_is_none¡  rÒ   z9TestPreviousSibling.test_previous_sibling_of_root_is_nonec                 C   r  )Nr$   r?   r   z3.1)r  r8  r  r\   r   r   r   Útest_previous_sibling¤  r!  z)TestPreviousSibling.test_previous_siblingc                 C   r"  )Nr  r#   r>   )r[   r  r8  r   )r   r#  Ú
first_spanr   r   r   Ú#test_previous_sibling_may_not_exist«  r&  z7TestPreviousSibling.test_previous_sibling_may_not_existc                 C   r'  )Nr´   r$   r?   )r  Úfind_previous_siblingr\   r   r   r   Útest_find_previous_sibling´  r*  z.TestPreviousSibling.test_find_previous_siblingc                 C   r+  )Nr´   )r?   r   r>   r>   r#   )rÔ   r  Úfind_previous_siblingsr\   r   r   r   Útest_previous_siblings·  r.  z*TestPreviousSibling.test_previous_siblingsc                 C   r/  )Nr0  r1  r!   r   r6   r5   r2  )r   r   r8  rU   rD   r?  r=  r3  r   r   r   Ú&test_previous_sibling_for_text_element½  r5  z:TestPreviousSibling.test_previous_sibling_for_text_element)r0   r1   r2   r]   r9  r:  r<  r>  r@  rA  r  r   r   rç   r   r7  ›  r6  r7  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ej d#d$d%„ d&d%„ g¡d'd(„ ƒZd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Z d;d<„ Z!d=d>„ Z"d?d@„ Z#dAdB„ Z$dCdD„ Z%dEdF„ Z&dGdH„ Z'dIdJ„ Z(dKdL„ Z)dMdN„ Z*dOdP„ Z+dQdR„ Z,dSdT„ Z-dUdV„ Z.dWdX„ Z/dYdZ„ Z0d[d\„ Z1d]d^„ Z2d_S )`ÚTestTreeModificationc                 C   sl   |   d¡}d|jd< | ¡ |  d¡ksJ ‚|jd= | ¡ |  d¡ks$J ‚d|jd< | ¡ |  d¡ks4J ‚d S )	Nz<a id="1"></a>r)   r$   z<a id="2"></a>rH   rF   Úid2z<a id2="foo"></a>)r   r.   r„   Údocument_forr   r   r   r   Útest_attribute_modificationÊ  s   


z0TestTreeModification.test_attribute_modificationc                 C   sl   t  d¡ƒ }| jd|d}t||dƒ}t||dƒ}d|d< |j d|¡ |j d	|¡ |j ¡ d
ks4J ‚d S )Nr  z<body></body>©r¼   r.   Úolzhttp://foo.com/Úhrefr   r   s4   <body><a href="http://foo.com/"></a><ol></ol></body>)r   Úlookupr   r   r  Úinsertrƒ   )r   r¼   r   r.   rG  r   r   r   Útest_new_tag_creationÓ  s   z*TestTreeModification.test_new_tag_creationc                 C   s\   d}|   |¡}|jdd}|j}|jdd |j¡ |j|ks!J ‚| ¡ |  d¡ks,J ‚d S )NzT<p id="1">Don't leave me <b>here</b>.</p>
                <p id="2">Don't leave!</p>r   r#   zD<p id="1">Don't leave me .</p>
<p id="2">Don't leave!<b>here</b></p>)r   r   r   rI   rÌ   r„   rD  )r   Údocr   Úsecond_paraÚboldr   r   r   Ú!test_append_to_contents_moves_tagÝ  s   

ÿz6TestTreeModification.test_append_to_contents_moves_tagc                 C   s0   d}|   |¡}|j}| |j¡}||ksJ ‚d S )Nz<a></a><b><c></c></b>)r   r.   Úreplace_withrg   ©r   r&   r   r.   Únew_ar   r   r   Ú1test_replace_with_returns_thing_that_was_replacedï  s
   
zFTestTreeModification.test_replace_with_returns_thing_that_was_replacedc                 C   s,   d}|   |¡}|j}| ¡ }||ksJ ‚d S )Nú<a><b></b><c></c></a>)r   r.   ÚunwraprQ  r   r   r   Ú+test_unwrap_returns_thing_that_was_replacedö  s
   
z@TestTreeModification.test_unwrap_returns_thing_that_was_replacedc                 C   s”   |   d¡}|j}| ¡  d |jksJ ‚t t¡ | ¡  W d   ƒ n1 s'w   Y  t t¡ | |j	¡ W d   ƒ d S 1 sCw   Y  d S )Nz<a><b>Foo</b></a><c>Bar</c>)
r   r.   ÚextractrÌ   rÁ   rÂ   rÃ   rU  rP  rg   r¬   r   r   r   ÚItest_replace_with_and_unwrap_give_useful_exception_when_tag_has_no_parentý  s   

ÿ"ÿz^TestTreeModification.test_replace_with_and_unwrap_give_useful_exception_when_tag_has_no_parentc                 C   s:   d}|   |¡}|j}|j |¡ | ¡ |  |¡ksJ ‚d S )Nz-<a><b></b><c>Foo<d></d></c></a><a><e></e></a>)r   rg   rP  r„   rD  )r   r&   r   rg   r   r   r   Útest_replace_tag_with_itself  s
   
z1TestTreeModification.test_replace_tag_with_itselfc                 C   sL   d}|   |¡}t t¡ |j |j¡ W d   ƒ d S 1 sw   Y  d S ©Nú<a><b></b></a>)r   rÁ   rÂ   rÃ   r   rP  r.   ©r   r&   r   r   r   r   Ú1test_replace_tag_with_its_parent_raises_exception  s
   
"ÿzFTestTreeModification.test_replace_tag_with_its_parent_raises_exceptionc                 C   sN   d}|   |¡}t t¡ |j d|j¡ W d   ƒ d S 1 s w   Y  d S )Nr[  r   )r   rÁ   rÂ   rÃ   r.   rJ  r\  r   r   r   Ú,test_insert_tag_into_itself_raises_exception  s
   
"ÿzATestTreeModification.test_insert_tag_into_itself_raises_exceptionc           	      C   sŒ   |   d¡}d}|   |¡}| d|¡ |jD ]	}t|tƒrJ ‚qt|jƒ\}}}}d|jks/J ‚d|jks6J ‚d|jks=J ‚d|jksDJ ‚dS )	z”Inserting one BeautifulSoup object into another actually inserts all
        of its children -- you'll never combine BeautifulSoup objects.
        z-<p>And now, a word:</p><p>And we're back.</p>z<p>p2</p><p>p3</p>r   zAnd now, a word:Úp2Úp3zAnd we're back.N)r   rJ  ÚdescendantsÚ
isinstancer   ÚlistÚchildrenr   )	r   r   r&   Ú	to_insertrÄ   Úp1r_  r`  Úp4r   r   r   Ú1test_insert_beautifulsoup_object_inserts_children  s   


zFTestTreeModification.test_insert_beautifulsoup_object_inserts_childrenc                 C   sX   |   d¡}|j}|jd }| dd¡ |j\}}| d¡ | d¡ d|jjks*J ‚d S )Nz<p><a>one</a><b>three</b></p>r   r   Útwor  Úthree)r   r.   rº   rJ  ÚreplaceWithr   r   )r   r   r.   r   ÚleftÚrightr   r   r   Ú3test_replace_with_maintains_next_element_throughout.  s   




zHTestTreeModification.test_replace_with_maintains_next_element_throughoutc                 C   sl   |   d¡}|jdd d¡ |jdd}|j}|j|ksJ ‚|j|ks%J ‚|jj|ks-J ‚|jd ks4J ‚d S )Nz<b>Argh!</b>úArgh!r!   úHooray!)r   r   rP  r   r  rÌ   rê   )r   r   Únew_textr   r   r   r   Útest_replace_final_node=  s   
z,TestTreeModification.test_replace_final_nodec                 C   s˜   |   d¡}|j dd¡ | ¡ |  d¡ksJ ‚|jdd}|jdks$J ‚|jj|ks,J ‚|jdks3J ‚|jj	|ks;J ‚|j	d ksBJ ‚|j|j
ksJJ ‚d S )Nz<a><b>Argh!</b><c></c></a>r   rp  z!<a><b>Argh!Hooray!</b><c></c></a>r!   ro  )r   r   rJ  r„   rD  r   r  rê   r8  r  rg   )r   r   rq  r   r   r   Útest_consecutive_text_nodesG  s   


ÿz0TestTreeModification.test_consecutive_text_nodesc                 C   sT   |   d¡}|j dd¡ |j dd¡ ddg|jjksJ ‚|jjd jdks(J ‚d S )NrH   r   r5   rF   )r   r.   rJ  rº   rê   r   r   r   r   Útest_insert_string\  s
   
z'TestTreeModification.test_insert_stringc                 C   sø   |   ¡ }| jd|d}t||dƒ}| dd¡ |j d|¡ | ¡ |  d¡ks)J ‚|j}|j|ks3J ‚|j	|ks:J ‚|j
dd	}|j|ksGJ ‚|j|ksNJ ‚|j}|j|ksXJ ‚|j	|ks_J ‚|j
dd	}|j|kslJ ‚|j|kssJ ‚|j|kszJ ‚d S )
Nz%<a><b>Find</b><c>lady!</c><d></d></a>rF  Úmagictagr   Úther   z=<a><b>Find</b><magictag>the</magictag><c>lady!</c><d></d></a>ÚFindr!   )r¹   r   r   rJ  r.   r„   rD  r   r  r8  r   rê   r  rg   rÌ   )r   r¼   r   Ú	magic_tagÚb_tagr   Úc_tagrv  r   r   r   Útest_insert_tage  s.   ÿ

ÿz$TestTreeModification.test_insert_tagc                 C   s0   d}|   |¡}|j |j¡ || ¡ ksJ ‚d S rZ  )r   r.   rI   r   r„   ©r   r†   r   r   r   r   Ú*test_append_child_thats_already_at_the_endƒ  ó   
z?TestTreeModification.test_append_child_thats_already_at_the_endc                 C   sJ   d}|   |¡}|j|j|j|j|j|jg}|j |¡ d| 	¡ ks#J ‚d S )Nz1<a><b><c><d><e><f><g></g></f></e></d></c></b></a>z1<a><g></g><f></f><e></e><d></d><c></c><b></b></a>)
r   Úgr“   Úer³   rg   r   r.   Úextendr„   )r   r†   r   rJ   r   r   r   Útest_extend‰  s
   
z TestTreeModification.test_extendÚget_tagsc                 C   s   | S rÐ   r   rs   r   r   r   Ú<lambda>‘  s    zTestTreeModification.<lambda>c                 C   s   | j S rÐ   )rº   rs   r   r   r   r„  ‘  s    c                 C   s`   d}|   |¡}|jddd}|jddd}||ƒ}| |¡ d| ¡ ks&J ‚d| ¡ ks.J ‚d S )NzS<body><div id="d1"><a>1</a><a>2</a><a>3</a><a>4</a></div><div id="d2"></div></body>rv   Úd1r#   Úd2z<div id="d1"></div>z3<div id="d2"><a>1</a><a>2</a><a>3</a><a>4</a></div>)r   r   r  r„   )r   rƒ  r†   r   r…  r†  Útagsr   r   r   Ú&test_extend_with_another_tags_contents  s   

z;TestTreeModification.test_extend_with_another_tags_contentsc                 C   s2   d}|   |¡}|j d|j¡ d| ¡ ksJ ‚d S )Nz<a><b></b><c></c><d></d></a>r   z<a><d></d><b></b><c></c></a>)r   r.   rJ  r³   r„   r|  r   r   r   Ú$test_move_tag_to_beginning_of_parent  s   
z9TestTreeModification.test_move_tag_to_beginning_of_parentc                 C   s.   |   d¡}|j dd¡ t|jƒdksJ ‚d S )Nz<br/>r   ÚContentsz<br>Contents</br>)r   ÚbrrJ  r%   r   r   r   r   Ú&test_insert_works_on_empty_element_tag£  s   
z;TestTreeModification.test_insert_works_on_empty_element_tagc                 C   sò   |   d¡}|j d¡ |j d¡ | ¡ |  d¡ksJ ‚|j |j¡ | ¡ |  d¡ks.J ‚|j}t t¡ | |¡ W d   ƒ n1 sFw   Y  | 	¡  t t¡ | d¡ W d   ƒ n1 sdw   Y  |   d¡}|j | 
d¡¡ d S )	Nr(   ÚBAZÚQUUXzQUUX<a>foo</a>BAZ<b>bar</b>úQUUX<b>bar</b><a>foo</a>BAZÚnopeú<a>r.   )r   r   Úinsert_beforer.   r„   rD  rÁ   rÂ   rÃ   rW  Únew_tag©r   r   r   r   r   r   Útest_insert_before¬  s$   


ÿÿÿ
z'TestTreeModification.test_insert_beforec                 C   sj   |   d¡}|j ddd¡ |j ddd¡ | ¡ |  d¡ks J ‚|j |jd¡ | ¡ |  d¡ks3J ‚d S )Nr(   r  ú rŽ  z$QUUX BAZ<a>foo</a>BAZ QUUX<b>bar</b>ÚFOOz'QUUX BAZ<b>bar</b>FOO<a>foo</a>BAZ QUUX)r   r   r’  r.   r„   rD  r   r   r   r   Útest_insert_multiple_beforeÇ  s   


ÿ
ÿz0TestTreeModification.test_insert_multiple_beforec                 C   sò   |   d¡}|j d¡ |j d¡ | ¡ |  d¡ksJ ‚|j |j¡ | ¡ |  d¡ks.J ‚|j}t t¡ | |¡ W d   ƒ n1 sFw   Y  | 	¡  t t¡ | d¡ W d   ƒ n1 sdw   Y  |   d¡}|j 
| d¡¡ d S )	Nr(   r  rŽ  z<a>foo</a>QUUX<b>bar</b>BAZr  r  r‘  r.   )r   r   Úinsert_afterr.   r„   rD  rÁ   rÂ   rÃ   rW  r’  r“  r”  r   r   r   Útest_insert_afterÔ  s$   


ÿÿÿ
z&TestTreeModification.test_insert_afterc                 C   sj   |   d¡}|j ddd¡ |j ddd¡ | ¡ |  d¡ks J ‚|j |jd¡ | ¡ |  d¡ks3J ‚d S )Nr(   r  r–  rŽ  z$<a>foo</a>QUUX BAZ<b>bar</b>BAZ QUUXzFOO z(QUUX BAZ<b>bar</b><a>foo</a>FOO BAZ QUUX)r   r   r™  r.   r„   rD  r   r   r   r   Útest_insert_multiple_afterî  s   


ÿ
ÿz/TestTreeModification.test_insert_multiple_afterc                 C   óÀ   |   d¡}| d¡}| d¡}t t¡ | |¡ W d   ƒ n1 s$w   Y  t t¡ | |¡ W d   ƒ n1 s>w   Y  t t¡ | |¡ W d   ƒ d S 1 sYw   Y  d S ©Nr  r.   )r   r“  Ú
new_stringrÁ   rÂ   rÃ   r™  ÚNotImplementedError©r   r   rd   r   r   r   r   Ú:test_insert_after_raises_exception_if_after_has_no_meaningú  ó   


ÿÿ"ÿzOTestTreeModification.test_insert_after_raises_exception_if_after_has_no_meaningc                 C   rœ  r  )r   r“  rž  rÁ   rÂ   rÃ   r’  rŸ  r   r   r   r   ÚFtest_insert_before_raises_notimplementederror_if_before_has_no_meaning  r¢  z[TestTreeModification.test_insert_before_raises_notimplementederror_if_before_has_no_meaningc                 C   sv   |   d¡}| d¡\}}| |¡ | ¡ |  d¡ksJ ‚|jd ks#J ‚|j|jks+J ‚|jdks2J ‚|jdks9J ‚d S )Nz;<p>There's <b>no</b> business like <b>show</b> business</p>r   z0<p>There's  business like <b>no</b> business</p>Únoz	 business)	r   r,   rP  r„   rD  rÌ   Úprê   r  )r   r   r¤  Úshowr   r   r   Útest_replace_with  s   ÿ


ÿz&TestTreeModification.test_replace_withc                 C   sÀ   t dd}t t¡ | d¡ W d   ƒ n1 sw   Y  |  d¡j}t t¡ |j |¡ W d   ƒ n1 s;w   Y  t t¡ |j d|d¡ W d   ƒ d S 1 sYw   Y  d S )Nr.   r‰   z
won't workr[  Ústring1Ústring2)r   rÁ   rÂ   rÃ   rP  r   r.   r   )r   Úa_tagr   r   r   Útest_replace_with_errors  s   
ÿÿ"ÿz-TestTreeModification.test_replace_with_errorsc                 C   sœ   d}|   |¡}| d¡}d|_| d¡}| d¡}d}|j ||||¡ | ¡ dks,J ‚|jj|ks4J ‚|jj|ks<J ‚|jj|ksDJ ‚|jj|ksLJ ‚d S )NrT  r³   zText In D Tagr€  r“   zRandom Textz;<a><b></b><d>Text In D Tag</d><e></e>Random Text<f></f></a>)r   r“  r   rg   rP  r„   r   rê   )r   r†   r   Úd_tagÚe_tagÚf_tagÚa_stringr   r   r   Útest_replace_with_multiple-  s   



z/TestTreeModification.test_replace_with_multiplec                 C   ó0   d}|   |¡}|j |j¡ d| ¡ ksJ ‚d S )NrT  z<a><c></c></a>)r   r   rP  rg   r„   r|  r   r   r   Útest_replace_first_child<  r~  z-TestTreeModification.test_replace_first_childc                 C   r±  )NrT  r[  )r   rg   rP  r   r„   r|  r   r   r   Útest_replace_last_childB  r~  z,TestTreeModification.test_replace_last_childc                 C   s  |   d¡}|j}|j}| |¡ | ¡ |  d¡ksJ ‚|jd ks"J ‚|jddjd ks-J ‚|j	d ks4J ‚|j
d ks;J ‚|jd ksBJ ‚|j|jksJJ ‚|j	dksQJ ‚|jj|jksZJ ‚|j
d ksaJ ‚|jdd}|j}|j|ksqJ ‚|j
|ksxJ ‚|j	|ksJ ‚|j|ks†J ‚d S )NzQ<a>We<b>reserve<c>the</c><d>right</d></b></a><e>to<f>refuse</f><g>service</g></e>z-<a>We<f>refuse</f></a><e>to<g>service</g></e>rm  r!   ÚWeÚto)r   r   r“   rP  r„   rD  rÌ   r   rê   r  r  r8  r.   r€  r  )r   r   Ú
remove_tagÚmove_tagÚto_textÚg_tagr   r   r   Útest_nested_tag_replace_withH  s0   ÿ


ÿz1TestTreeModification.test_nested_tag_replace_withc                 C   s6   |   d¡}|j ¡  |jd ksJ ‚|jjdksJ ‚d S )NzI
            <p>Unneeded <em>formatting</em> is unneeded</p>
            zUnneeded formatting is unneeded)r   ÚemrU  r¥  r&   r   r   r   r   Útest_unwrapl  s   

z TestTreeModification.test_unwrapc                 C   sF   |   d¡}|j | d¡¡}| ¡ dksJ ‚| ¡ |  d¡ks!J ‚d S )NzI wish I was bold.r   ú<b>I wish I was bold.</b>)r   r   Úwrapr“  r„   rD  )r   r   r™   r   r   r   Ú	test_wrapt  s   
zTestTreeModification.test_wrapc                 C   s4   |   d¡}|jj |j¡ | ¡ |  d¡ksJ ‚d S )Nz<b></b>I wish I was bold.r½  )r   r   r  r¾  r„   rD  r   r   r   r   Ú%test_wrap_extracts_tag_from_elsewherez  s   
z:TestTreeModification.test_wrap_extracts_tag_from_elsewherec                 C   sH   |   d¡}|jj |j¡ dt|jjƒksJ ‚| ¡ |  d¡ks"J ‚d S )Nz+<b>I like being bold.</b>I wish I was bold.r)   z+<b>I like being bold.I wish I was bold.</b>)r   r   r  r¾  r+   rº   r„   rD  r   r   r   r   Ú&test_wrap_puts_new_contents_at_the_end  s   

ÿz;TestTreeModification.test_wrap_puts_new_contents_at_the_endc                 C   sâ   |   d¡}t|jjƒdksJ ‚|jdd ¡ }| ¡ dksJ ‚| ¡ dks'J ‚t|jjƒdks1J ‚|jd ks8J ‚|jd ks?J ‚|j	j	d ksGJ ‚|jdd	}|jd
d	}|j	|ksZJ ‚|j
|ksaJ ‚|j|kshJ ‚|j|ksoJ ‚d S )NzR<html><body>Some content. <div id="nav">Nav crap</div> More content.</body></html>r;   Únavr#   z6<html><body>Some content.  More content.</body></html>z<div id="nav">Nav crap</div>r)   zSome content. r!   z More content.)r   r+   r  rº   r   rW  r„   rÌ   r  rê   r  r8  )r   r   Ú	extractedÚ	content_1Ú	content_2r   r   r   Útest_extract‡  s"   ÿz!TestTreeModification.test_extractc                 C   sz   |   d¡}|jj}|jj}| d¡}| d¡}|j |¡ |j |¡ | ¡  | ¡  ||jjks3J ‚||jjks;J ‚d S )Nr(   rF   r5   )r   r.   r   r   rž  rI   rW  )r   r   Úfoo_1Úbar_1Úfoo_2Úbar_2r   r   r   Ú4test_extract_distinguishes_between_identical_stringsŸ  s   


zITestTreeModification.test_extract_distinguishes_between_identical_stringsc                    s8   |   d¡‰ ‡ fdd„ˆ  d¡D ƒ dtˆ jƒksJ ‚d S )Nzv
<html>
<head>
<script>foo</script>
</head>
<body>
 <script>bar</script>
 <a></a>
</body>
<script>baz</script>
</html>c                    s   g | ]}ˆ j  ¡ ‘qS r   )ÚscriptrW  )rÞ   rÄ   ©r   r   r   rß   ¼  s    zKTestTreeModification.test_extract_multiples_of_same_tag.<locals>.<listcomp>rÌ  z<body>

<a></a>
</body>)r   r,   r%   r  r\   r   rÍ  r   Ú"test_extract_multiples_of_same_tag°  s   
z7TestTreeModification.test_extract_multiples_of_same_tagc                 C   s.   |   d¡}| d¡ ¡  d | d¡ksJ ‚d S )Nz<html>
<body>hi</body>
</html>r  )r   r   rW  r   r   r   r   ÚBtest_extract_works_when_element_is_surrounded_by_identical_stringsÀ  s
   ÿzWTestTreeModification.test_extract_works_when_element_is_surrounded_by_identical_stringsc                 C   sd   |   d¡}|j}|j ¡  t|jjƒdksJ ‚t|dƒsJ ‚|j}|jdd dt|jƒks0J ‚dS )zTag.clear()z4<p><a>String <em>Italicized</em></a> and another</p>r   rº   T)Ú	decomposeN)r   r.   r¥  Úclearr+   rº   rM   r»  )r   r   r.   r»  r   r   r   Ú
test_clearÉ  s   

zTestTreeModification.test_clearc                 C   s~   |   d¡}| d¡\}}|j}|jj}||||fD ]	}d|jks"J ‚q| ¡  |||fD ]	}d|jks5J ‚q,d|jks=J ‚d S )Nz;<p><a>String <em>Italicized</em></a></p><p>Another para</p>r¥  FT)r   r,   r.   r»  r   Ú
decomposedrÐ  )r   r   rf  r_  r.   r&   rÄ   r   r   r   Útest_decomposeØ  s   
z#TestTreeModification.test_decomposec                 C   sB   |   d¡}d|j_|jjdgksJ ‚d|j_|jjdgksJ ‚dS )zTag.string = 'string'z<a></a> <b><c></c></b>rF   r5   N)r   r.   r   rº   r   r   r   r   r   Útest_string_setè  s
   
z$TestTreeModification.test_string_setc                 C   s,   |   d¡}|jj|j_|j ¡ dksJ ‚d S )Nz<a><b>foo</b><c>bar</c>s   <a><b>bar</b><c>bar</c></a>)r   rg   r   r   r.   rƒ   r   r   r   r   Ú/test_string_set_does_not_affect_original_stringð  s   
zDTestTreeModification.test_string_set_does_not_affect_original_stringc                 C   s0   |   d¡}tdƒ}||j_t|jjtƒsJ ‚d S )NrH   rF   )r   r   r.   r   rb  )r   r   Úcdatar   r   r   Ú)test_set_string_preserves_class_of_stringõ  s   
z>TestTreeModification.test_set_string_preserves_class_of_stringN)3r0   r1   r2   rE  rK  rO  rS  rV  rX  rY  r]  r^  rh  rn  rr  rs  rt  r{  r}  r‚  rÁ   ÚmarkÚparametrizerˆ  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   r   r   rB  È  sb    	


	ÿ

	$	rB  c                   @   s.   e Zd Zej dg d¢¡dd„ ƒZdd„ ZdS )ÚTestDeprecatedArgumentsÚmethod_name)r   r,   r×   rÕ   r÷   rô   r  r  r(  r,  r=  r?  c                 C   s|   |   d¡}t|j|ƒ}tjdd#}|dd |\}|jtks!J ‚t|jƒ}|dks,J ‚W d   ƒ d S 1 s7w   Y  d S )Nz<a>some</a><b>markup</b>T©Úrecordr  ©r&   zOThe 'text' argument to find()-type methods is deprecated. Use 'string' instead.)	r   Úgetattrr   ÚwarningsÚcatch_warningsÚfilenameÚ__file__r%   Úmessage)r   rÜ  r   ÚmethodÚwÚwarningÚmsgr   r   r   Útest_find_type_method_stringþ  s   
	

"ûz4TestDeprecatedArguments.test_find_type_method_stringc                 C   st   t jdd*}tdd}|jdksJ ‚|\}t|jƒ}|jtks"J ‚|dks(J ‚W d   ƒ d S 1 s3w   Y  d S )NTrÝ  r&   rß  zXThe 'text' argument to the SoupStrainer constructor is deprecated. Use 'string' instead.)rá  râ  r   r&   r%   rå  rã  rä  )r   rç  r¢   rè  ré  r   r   r   Ú$test_soupstrainer_constructor_string  s   

"úz<TestDeprecatedArguments.test_soupstrainer_constructor_stringN)r0   r1   r2   rÁ   rÙ  rÚ  rê  rë  r   r   r   r   rÛ  ü  s    ÿ

rÛ  ))r3   Úpdbr   rÁ   r8   rá  Úbs4r   Úbs4.builderr   r   Úbs4.elementr   r   r   r	   r
   r   r   r   r   r   r   r  r   r   r4   rQ   rX   r|   r²   r¾   rÇ   râ   rå   r  r  r  r7  rB  rÛ  r   r   r   r   Ú<module>   s<   
49N 5,2(1--    8