1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
"""Test class selectors."""
from .. import util
from soupsieve import SelectorSyntaxError
class TestClass(util.TestCase):
"""Test class selectors."""
MARKUP = """
<div>
<p>Some text <span id="1" class="foo"> in a paragraph</span>.
<a id="2" class="bar" href="http://google.com">Link</a>
</p>
</div>
"""
# Browsers normally replace NULL with `\uFFFD`, but some of the parsers
# we test just strip out NULL, so we will simulate and just insert `\uFFFD` directly
# to ensure consistent behavior in our tests across parsers.
MARKUP_NULL = """
<div>
<p>Some text <span id="1" class="foo\ufffd"> in a paragraph</span>.
<a id="2" class="\ufffdbar" href="http://google.com">Link</a>
</p>
</div>
"""
def test_class(self):
"""Test class."""
self.assert_selector(
self.MARKUP,
".foo",
["1"],
flags=util.HTML
)
def test_type_and_class(self):
"""Test type and class."""
self.assert_selector(
self.MARKUP,
"a.bar",
["2"],
flags=util.HTML
)
def test_type_and_class_escaped_null(self):
"""Test type and class with an escaped null character."""
self.assert_selector(
self.MARKUP_NULL,
r"a.\0 bar",
["2"],
flags=util.HTML
)
def test_type_and_class_escaped_eof(self):
"""Test type and class with an escaped EOF."""
self.assert_selector(
self.MARKUP_NULL,
"span.foo\\",
["1"],
flags=util.HTML
)
def test_malformed_class(self):
"""Test malformed class."""
# Malformed class
self.assert_raises('td.+#some-id', SelectorSyntaxError)
def test_class_xhtml(self):
"""Test tag and class with XHTML since internally classes are stored different for XML."""
self.assert_selector(
self.wrap_xhtml(self.MARKUP),
".foo",
["1"],
flags=util.XHTML
)
def test_multiple_classes(self):
"""Test multiple classes."""
markup = """
<div>
<p>Some text <span id="1" class="foo"> in a paragraph</span>.
<a id="2" class="bar" href="http://google.com">Link</a>
<a id="3" class="foo" href="http://google.com">Link</a>
<a id="4" class="foo bar" href="http://google.com">Link</a>
</p>
</div>
"""
self.assert_selector(
markup,
"a.foo.bar",
["4"],
flags=util.HTML
)
def test_malformed_pseudo_class(self):
"""Test malformed class."""
# Malformed pseudo-class
self.assert_raises('td:#id', SelectorSyntaxError)
|