U
¯Dx`j³ ã @ sÎ d Z dZddlZddlZddlZddlZddlmZ ddlmZ ddl m
Z
mZmZm
Z
mZmZmZmZmZ ddlmZ eZdZG d d
„ d
ejƒZG dd„ deƒZG d
d„ deƒZG dd„ deƒZdd„ ZdS )zHelper classes for tests.ÚMITé N)ÚTestCase)Ú
BeautifulSoup) ÚCharsetMetaAttributeValueÚCommentÚContentMetaAttributeValueÚDoctypeÚPYTHON_SPECIFIC_ENCODINGSÚSoupStrainerÚScriptÚ
StylesheetÚTag)ÚHTMLParserTreeBuilderu-
A bare string
A tag
A tag that supposedly has contents.
AT&T
This numeric entity is missing the final semicolon:
a
This document contains (do you see it?)
The doctype is invalid because it contains extra whitespace
That boolean attribute had no value
Here's a nonexistent entity: foo; (do you see it?)
This document ends before the entity finishes: >
Paragraphs shouldn't contain block display elements, but this one does:
you see?
Multiple values for the same attribute.
Here's a nested table:
This tag contains nothing but whitespace:
This p tag is cut off by
the end of the blockquote tag
This table contains bare markup
This document contains a surprise doctype
Tag name contains Unicode characters
c @ sD e Zd Zedd„ ƒZdd„ Zdd„ Zddd „Zd
d„ Zdd
d„Z dS )ÚSoupTestc C s t S ©N)Údefault_builder©Úself© r ú2/tmp/pip-target-zr53vnty/lib/python/bs4/testing.pyr C s zSoupTest.default_builderc K s" | d| j¡}t|fd|i|—ŽS )z*Build a Beautiful Soup object from markup.Úbuilder)Úpopr r )r ÚmarkupÚkwargsr r r r ÚsoupG s z
SoupTest.soupc K s | j f |Ž |¡S )z[Turn an HTML fragment into a document.
The details depend on the builder.
)r Ztest_fragment_to_document)r r r r r r Údocument_forL s zSoupTest.document_forNc C st | j }t||d}|d kr|}| | ¡ | |¡¡ tdd„ t|j ¡ ƒD ƒƒsTt ‚| |j
gdd„ |jD ƒ¡ d S )N)r c s s | ]}|d kV qdS )r Nr )Ú.0Úvr r r Ú a s z,SoupTest.assertSoupEquals..c S s g | ]
}|j ‘qS r )Úname)r Úxr r r Ú
f s z-SoupTest.assertSoupEquals..)r r ÚassertEqualÚdecoder ÚallÚlistZopen_tag_counterÚvaluesÚAssertionErrorZ
ROOT_TAG_NAMEZtagStack)r Zto_parseZcompare_parsed_tor Úobjr r r ÚassertSoupEqualsS s ÿzSoupTest.assertSoupEqualsc C s8 d}|j D ](}|r.| ||j¡ | ||j¡ |}q
dS )zyEnsure that next_element and previous_element are properly
set for all descendants of the given element.
N)Zdescendantsr" Únext_elementÚprevious_element)r ÚelementZearlierÚer r r ÚassertConnectednessi s
zSoupTest.assertConnectednessFc C sþ d}|j dkrh|jdks,td ||jd¡ƒ‚|jdksJtd ||jd¡ƒ‚|jdkshtd ||jd¡ƒ‚d}d}d}t|jƒd }|jD ]Ä}d}|dkr|j dk rÈ|j|ksÆtd ||j|¡ƒ‚|j|ksätd ||j|¡ƒ‚|jdksÈtd ||jd¡ƒ‚nÂ|j|j|d ks:td ||j|j|d ¡ƒ‚|j|d j|ksxtd
|j|d |j|d j|¡ƒ‚|dk rÈ|j|ks¨td ||j||j j¡ƒ‚|j|ksÈtd ||j|¡ƒ‚t |t
ƒr|jr| |d
¡}|jdkstd
||jd¡ƒ‚|dk r|}n|}||krF|jdksFtd
||jd¡ƒ‚|d7 }qˆ|dk r^|n|}|dkrp|}|sö|dk rö|}|dkr´|jdksòtd ||jd¡ƒ‚qòn4|jdk rè|j|jksòtd ||j|j¡ƒ‚qò|j }q„dS |S dS )z.Ensure proper linkage throughout the document.Nz3Bad previous_element
NODE: {}
PREV: {}
EXPECTED: {}z3Bad previous_sibling
NODE: {}
PREV: {}
EXPECTED: {}z/Bad next_sibling
NODE: {}
NEXT: {}
EXPECTED: {}r é z/Bad next_element
NODE: {}
NEXT: {}
EXPECTED: {}z2Bad previous_sibling
NODE: {}
PREV {}
EXPECTED: {}z1Bad previous_sibling
NODE: {}
PREV {}
EXPECTED {}z-Bad next_sibling
NODE: {}
NEXT {}
EXPECTED {}z=Bad previous_element
NODE: {}
PREV {}
EXPECTED {}
CONTENTS {}z-Bad next_element
NODE: {}
NEXT {}
EXPECTED {}T)Úparentr+ r' ÚformatZprevious_siblingZnext_siblingÚlenÚcontentsr* Ú
isinstancer
Úlinkage_validator) r ÚelZ_recursive_callZ
descendantÚidxÚchildZ
last_childZlast_idxÚtargetr r r r5 t s
ÿÿ ÿÿ ÿÿ
ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ
ÿÿ ÿÿ ÿÿ
ÿÿ
ÿÿ ÿÿ
zSoupTest.linkage_validator)N)F)
Ú__name__Ú
__module__Ú__qualname__Úpropertyr r r r) r. r5 r r r r r A s
r c @ s
e Zd ZdZdd„ Zdd„ Zdd„ Zdd „ Zddd„Zd
d„ Z dd„ Z
dd„ Zdd„ Zdd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Z d=d>„ Z!d?d@„ Z"dAdB„ Z#dCdD„ Z$dEdF„ Z%dGdH„ Z&dIdJ„ Z'dKdL„ Z(dMdN„ Z)dOd„ ZdPdQ„ Z*dRdS„ Z+dTdU„ Z,dVdW„ Z-dXdY„ Z.dZd[„ Z/d\d]„ Z0d^d_„ Z1d`da„ Z2dbdc„ Z3ddde„ Z4dfdg„ Z5dhdi„ Z6djdk„ Z7dldm„ Z8dndo„ Z9dpdq„ Z:drds„ Z;dtdu„ Z