summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/beautifulsoup/tests/test_tree.py126
1 files changed, 121 insertions, 5 deletions
diff --git a/src/beautifulsoup/tests/test_tree.py b/src/beautifulsoup/tests/test_tree.py
index c937d8e..31d5dc2 100644
--- a/src/beautifulsoup/tests/test_tree.py
+++ b/src/beautifulsoup/tests/test_tree.py
@@ -288,13 +288,18 @@ class TestParentOperations(TreeTest):
self.assertEquals(parents, ['bottom', 'middle', 'top'])
-class TestNextOperations(TreeTest):
+class ProximityTest(TreeTest):
+
+ def setUp(self):
+ super(TreeTest, self).setUp()
+ self.tree = self.soup(
+ '<html id="start"><head></head><body><b id="1">One</b><b id="2">Two</b><b id="3">Three</b></body></html>')
- MARKUP = '<html id="start"><head></head><body><b id="1">One</b><b id="2">Two</b><b id="3">Three</b></body></html>'
+
+class TestNextOperations(ProximityTest):
def setUp(self):
super(TestNextOperations, self).setUp()
- self.tree = self.soup(self.MARKUP)
self.start = self.tree.b
def test_next(self):
@@ -336,11 +341,10 @@ class TestNextOperations(TreeTest):
# should just stop.
-class TestPreviousOperations(TreeTest):
+class TestPreviousOperations(ProximityTest):
def setUp(self):
super(TestPreviousOperations, self).setUp()
- self.tree = self.soup(TestNextOperations.MARKUP)
self.end = self.tree.find(text="Three")
def test_previous(self):
@@ -392,6 +396,118 @@ class TestPreviousOperations(TreeTest):
# Again, we shouldn't be returning None.
+class SiblingTest(TreeTest):
+
+ def setUp(self):
+ super(SiblingTest, self).setUp()
+ markup = '''<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>'''
+ # All that whitespace looks good but makes the tests more
+ # difficult. Get rid of it.
+ markup = re.compile("\n\s*").sub("", markup)
+ self.tree = self.soup(markup)
+
+
+class TestNextSibling(SiblingTest):
+
+ def setUp(self):
+ super(TestNextSibling, self).setUp()
+ self.start = self.tree.find(id="1")
+
+ def test_next_sibling_of_root_is_none(self):
+ self.assertEquals(self.tree.nextSibling, None)
+
+ def test_next_sibling(self):
+ self.assertEquals(self.start.nextSibling['id'], '2')
+ self.assertEquals(self.start.nextSibling.nextSibling['id'], '3')
+
+ # Note the difference between nextSibling and next.
+ self.assertEquals(self.start.next['id'], '1.1')
+
+ def test_next_sibling_may_not_exist(self):
+ self.assertEquals(self.tree.html.nextSibling, None)
+
+ nested_span = self.tree.find(id="1.1")
+ self.assertEquals(nested_span.nextSibling, None)
+
+ last_span = self.tree.find(id="4")
+ self.assertEquals(last_span.nextSibling, None)
+
+ def test_find_next_sibling(self):
+ self.assertEquals(self.start.findNextSibling('span')['id'], '2')
+
+ def test_next_siblings(self):
+ self.assertSelectsIDs(self.start.findNextSiblings("span"),
+ ['2', '3', '4'])
+
+ self.assertSelectsIDs(self.start.findNextSiblings(id='3'), ['3'])
+
+ def test_next_sibling_for_text_element(self):
+ soup = self.soup("Foo<b>bar</b>baz")
+ start = soup.find(text="Foo")
+ self.assertEquals(start.nextSibling.name, 'b')
+ self.assertEquals(start.nextSibling.nextSibling, 'baz')
+
+ self.assertSelects(start.findNextSiblings('b'), ['bar'])
+ self.assertEquals(start.findNextSibling(text="baz"), "baz")
+ self.assertEquals(start.findNextSibling(text="nonesuch"), None)
+
+
+class TestPreviousSibling(SiblingTest):
+
+ def setUp(self):
+ super(TestPreviousSibling, self).setUp()
+ self.end = self.tree.find(id="4")
+
+ def test_previous_sibling_of_root_is_none(self):
+ self.assertEquals(self.tree.previousSibling, None)
+
+ def test_previous_sibling(self):
+ self.assertEquals(self.end.previousSibling['id'], '3')
+ self.assertEquals(self.end.previousSibling.previousSibling['id'], '2')
+
+ # Note the difference between previousSibling and previous.
+ self.assertEquals(self.end.previous['id'], '3.1')
+
+ def test_previous_sibling_may_not_exist(self):
+ self.assertEquals(self.tree.html.previousSibling, None)
+
+ nested_span = self.tree.find(id="1.1")
+ self.assertEquals(nested_span.previousSibling, None)
+
+ first_span = self.tree.find(id="1")
+ self.assertEquals(first_span.previousSibling, None)
+
+ def test_find_previous_sibling(self):
+ self.assertEquals(self.end.findPreviousSibling('span')['id'], '3')
+
+ def test_previous_siblings(self):
+ self.assertSelectsIDs(self.end.findPreviousSiblings("span"),
+ ['3', '2', '1'])
+
+ self.assertSelectsIDs(self.end.findPreviousSiblings(id='1'), ['1'])
+
+ def test_previous_sibling_for_text_element(self):
+ soup = self.soup("Foo<b>bar</b>baz")
+ start = soup.find(text="baz")
+ self.assertEquals(start.previousSibling.name, 'b')
+ self.assertEquals(start.previousSibling.previousSibling, 'Foo')
+
+ self.assertSelects(start.findPreviousSiblings('b'), ['bar'])
+ self.assertEquals(start.findPreviousSibling(text="Foo"), "Foo")
+ self.assertEquals(start.findPreviousSibling(text="nonesuch"), None)
+
+
class TestElementObjects(SoupTest):
"""Test various features of element objects."""