annotate Lib/test/test_pulldom.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents aa000dd4287f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
68211
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1 import io
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
2 import unittest
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
3 import sys
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
4 import xml.sax
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
5
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
6 from xml.sax.xmlreader import AttributesImpl
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
7 from xml.dom import pulldom
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
8
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
9 from test.support import run_unittest, findfile
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
10
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
11
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
12 tstfile = findfile("test.xml", subdir="xmltestdata")
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
13
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
14 # A handy XML snippet, containing attributes, a namespace prefix, and a
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
15 # self-closing tag:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
16 SMALL_SAMPLE = """<?xml version="1.0"?>
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
17 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:xdc="http://www.xml.com/books">
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
18 <!-- A comment -->
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
19 <title>Introduction to XSL</title>
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
20 <hr/>
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
21 <p><xdc:author xdc:attrib="prefixed attribute" attrib="other attrib">A. Namespace</xdc:author></p>
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
22 </html>"""
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
23
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
24
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
25 class PullDOMTestCase(unittest.TestCase):
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
26
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
27 def test_parse(self):
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
28 """Minimal test of DOMEventStream.parse()"""
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
29
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
30 # This just tests that parsing from a stream works. Actual parser
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
31 # semantics are tested using parseString with a more focused XML
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
32 # fragment.
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
33
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
34 # Test with a filename:
68556
aa000dd4287f Close a stream properly in test.test_pulldom.
Brett Cannon <brett@python.org>
parents: 68211
diff changeset
35 handler = pulldom.parse(tstfile)
aa000dd4287f Close a stream properly in test.test_pulldom.
Brett Cannon <brett@python.org>
parents: 68211
diff changeset
36 self.addCleanup(handler.stream.close)
aa000dd4287f Close a stream properly in test.test_pulldom.
Brett Cannon <brett@python.org>
parents: 68211
diff changeset
37 list(handler)
68211
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
38
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
39 # Test with a file object:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
40 with open(tstfile, "rb") as fin:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
41 list(pulldom.parse(fin))
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
42
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
43 def test_parse_semantics(self):
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
44 """Test DOMEventStream parsing semantics."""
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
45
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
46 items = pulldom.parseString(SMALL_SAMPLE)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
47 evt, node = next(items)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
48 # Just check the node is a Document:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
49 self.assertTrue(hasattr(node, "createElement"))
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
50 self.assertEqual(pulldom.START_DOCUMENT, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
51 evt, node = next(items)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
52 self.assertEqual(pulldom.START_ELEMENT, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
53 self.assertEqual("html", node.tagName)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
54 self.assertEqual(2, len(node.attributes))
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
55 self.assertEqual(node.attributes.getNamedItem("xmlns:xdc").value,
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
56 "http://www.xml.com/books")
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
57 evt, node = next(items)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
58 self.assertEqual(pulldom.CHARACTERS, evt) # Line break
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
59 evt, node = next(items)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
60 # XXX - A comment should be reported here!
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
61 # self.assertEqual(pulldom.COMMENT, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
62 # Line break after swallowed comment:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
63 self.assertEqual(pulldom.CHARACTERS, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
64 evt, node = next(items)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
65 self.assertEqual("title", node.tagName)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
66 title_node = node
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
67 evt, node = next(items)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
68 self.assertEqual(pulldom.CHARACTERS, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
69 self.assertEqual("Introduction to XSL", node.data)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
70 evt, node = next(items)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
71 self.assertEqual(pulldom.END_ELEMENT, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
72 self.assertEqual("title", node.tagName)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
73 self.assertTrue(title_node is node)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
74 evt, node = next(items)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
75 self.assertEqual(pulldom.CHARACTERS, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
76 evt, node = next(items)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
77 self.assertEqual(pulldom.START_ELEMENT, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
78 self.assertEqual("hr", node.tagName)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
79 evt, node = next(items)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
80 self.assertEqual(pulldom.END_ELEMENT, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
81 self.assertEqual("hr", node.tagName)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
82 evt, node = next(items)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
83 self.assertEqual(pulldom.CHARACTERS, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
84 evt, node = next(items)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
85 self.assertEqual(pulldom.START_ELEMENT, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
86 self.assertEqual("p", node.tagName)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
87 evt, node = next(items)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
88 self.assertEqual(pulldom.START_ELEMENT, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
89 self.assertEqual("xdc:author", node.tagName)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
90 evt, node = next(items)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
91 self.assertEqual(pulldom.CHARACTERS, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
92 evt, node = next(items)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
93 self.assertEqual(pulldom.END_ELEMENT, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
94 self.assertEqual("xdc:author", node.tagName)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
95 evt, node = next(items)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
96 self.assertEqual(pulldom.END_ELEMENT, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
97 evt, node = next(items)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
98 self.assertEqual(pulldom.CHARACTERS, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
99 evt, node = next(items)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
100 self.assertEqual(pulldom.END_ELEMENT, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
101 # XXX No END_DOCUMENT item is ever obtained:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
102 #evt, node = next(items)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
103 #self.assertEqual(pulldom.END_DOCUMENT, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
104
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
105 def test_expandItem(self):
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
106 """Ensure expandItem works as expected."""
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
107 items = pulldom.parseString(SMALL_SAMPLE)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
108 # Loop through the nodes until we get to a "title" start tag:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
109 for evt, item in items:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
110 if evt == pulldom.START_ELEMENT and item.tagName == "title":
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
111 items.expandNode(item)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
112 self.assertEqual(1, len(item.childNodes))
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
113 break
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
114 else:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
115 self.fail("No \"title\" element detected in SMALL_SAMPLE!")
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
116 # Loop until we get to the next start-element:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
117 for evt, node in items:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
118 if evt == pulldom.START_ELEMENT:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
119 break
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
120 self.assertEqual("hr", node.tagName,
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
121 "expandNode did not leave DOMEventStream in the correct state.")
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
122 # Attempt to expand a standalone element:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
123 items.expandNode(node)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
124 self.assertEqual(next(items)[0], pulldom.CHARACTERS)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
125 evt, node = next(items)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
126 self.assertEqual(node.tagName, "p")
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
127 items.expandNode(node)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
128 next(items) # Skip character data
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
129 evt, node = next(items)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
130 self.assertEqual(node.tagName, "html")
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
131 with self.assertRaises(StopIteration):
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
132 next(items)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
133 items.clear()
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
134 self.assertIsNone(items.parser)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
135 self.assertIsNone(items.stream)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
136
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
137 @unittest.expectedFailure
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
138 def test_comment(self):
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
139 """PullDOM does not receive "comment" events."""
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
140 items = pulldom.parseString(SMALL_SAMPLE)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
141 for evt, _ in items:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
142 if evt == pulldom.COMMENT:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
143 break
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
144 else:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
145 self.fail("No comment was encountered")
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
146
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
147 @unittest.expectedFailure
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
148 def test_end_document(self):
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
149 """PullDOM does not receive "end-document" events."""
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
150 items = pulldom.parseString(SMALL_SAMPLE)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
151 # Read all of the nodes up to and including </html>:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
152 for evt, node in items:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
153 if evt == pulldom.END_ELEMENT and node.tagName == "html":
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
154 break
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
155 try:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
156 # Assert that the next node is END_DOCUMENT:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
157 evt, node = next(items)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
158 self.assertEqual(pulldom.END_DOCUMENT, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
159 except StopIteration:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
160 self.fail(
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
161 "Ran out of events, but should have received END_DOCUMENT")
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
162
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
163
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
164 class ThoroughTestCase(unittest.TestCase):
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
165 """Test the hard-to-reach parts of pulldom."""
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
166
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
167 def test_thorough_parse(self):
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
168 """Test some of the hard-to-reach parts of PullDOM."""
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
169 self._test_thorough(pulldom.parse(None, parser=SAXExerciser()))
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
170
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
171 @unittest.expectedFailure
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
172 def test_sax2dom_fail(self):
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
173 """SAX2DOM can"t handle a PI before the root element."""
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
174 pd = SAX2DOMTestHelper(None, SAXExerciser(), 12)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
175 self._test_thorough(pd)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
176
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
177 def test_thorough_sax2dom(self):
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
178 """Test some of the hard-to-reach parts of SAX2DOM."""
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
179 pd = SAX2DOMTestHelper(None, SAX2DOMExerciser(), 12)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
180 self._test_thorough(pd, False)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
181
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
182 def _test_thorough(self, pd, before_root=True):
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
183 """Test some of the hard-to-reach parts of the parser, using a mock
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
184 parser."""
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
185
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
186 evt, node = next(pd)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
187 self.assertEqual(pulldom.START_DOCUMENT, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
188 # Just check the node is a Document:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
189 self.assertTrue(hasattr(node, "createElement"))
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
190
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
191 if before_root:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
192 evt, node = next(pd)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
193 self.assertEqual(pulldom.COMMENT, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
194 self.assertEqual("a comment", node.data)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
195 evt, node = next(pd)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
196 self.assertEqual(pulldom.PROCESSING_INSTRUCTION, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
197 self.assertEqual("target", node.target)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
198 self.assertEqual("data", node.data)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
199
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
200 evt, node = next(pd)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
201 self.assertEqual(pulldom.START_ELEMENT, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
202 self.assertEqual("html", node.tagName)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
203
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
204 evt, node = next(pd)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
205 self.assertEqual(pulldom.COMMENT, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
206 self.assertEqual("a comment", node.data)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
207 evt, node = next(pd)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
208 self.assertEqual(pulldom.PROCESSING_INSTRUCTION, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
209 self.assertEqual("target", node.target)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
210 self.assertEqual("data", node.data)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
211
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
212 evt, node = next(pd)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
213 self.assertEqual(pulldom.START_ELEMENT, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
214 self.assertEqual("p", node.tagName)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
215
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
216 evt, node = next(pd)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
217 self.assertEqual(pulldom.CHARACTERS, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
218 self.assertEqual("text", node.data)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
219 evt, node = next(pd)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
220 self.assertEqual(pulldom.END_ELEMENT, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
221 self.assertEqual("p", node.tagName)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
222 evt, node = next(pd)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
223 self.assertEqual(pulldom.END_ELEMENT, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
224 self.assertEqual("html", node.tagName)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
225 evt, node = next(pd)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
226 self.assertEqual(pulldom.END_DOCUMENT, evt)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
227
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
228
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
229 class SAXExerciser(object):
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
230 """A fake sax parser that calls some of the harder-to-reach sax methods to
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
231 ensure it emits the correct events"""
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
232
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
233 def setContentHandler(self, handler):
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
234 self._handler = handler
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
235
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
236 def parse(self, _):
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
237 h = self._handler
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
238 h.startDocument()
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
239
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
240 # The next two items ensure that items preceding the first
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
241 # start_element are properly stored and emitted:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
242 h.comment("a comment")
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
243 h.processingInstruction("target", "data")
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
244
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
245 h.startElement("html", AttributesImpl({}))
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
246
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
247 h.comment("a comment")
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
248 h.processingInstruction("target", "data")
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
249
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
250 h.startElement("p", AttributesImpl({"class": "paraclass"}))
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
251 h.characters("text")
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
252 h.endElement("p")
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
253 h.endElement("html")
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
254 h.endDocument()
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
255
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
256 def stub(self, *args, **kwargs):
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
257 """Stub method. Does nothing."""
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
258 pass
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
259 setProperty = stub
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
260 setFeature = stub
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
261
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
262
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
263 class SAX2DOMExerciser(SAXExerciser):
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
264 """The same as SAXExerciser, but without the processing instruction and
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
265 comment before the root element, because S2D can"t handle it"""
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
266
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
267 def parse(self, _):
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
268 h = self._handler
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
269 h.startDocument()
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
270 h.startElement("html", AttributesImpl({}))
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
271 h.comment("a comment")
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
272 h.processingInstruction("target", "data")
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
273 h.startElement("p", AttributesImpl({"class": "paraclass"}))
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
274 h.characters("text")
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
275 h.endElement("p")
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
276 h.endElement("html")
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
277 h.endDocument()
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
278
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
279
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
280 class SAX2DOMTestHelper(pulldom.DOMEventStream):
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
281 """Allows us to drive SAX2DOM from a DOMEventStream."""
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
282
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
283 def reset(self):
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
284 self.pulldom = pulldom.SAX2DOM()
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
285 # This content handler relies on namespace support
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
286 self.parser.setFeature(xml.sax.handler.feature_namespaces, 1)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
287 self.parser.setContentHandler(self.pulldom)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
288
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
289
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
290 class SAX2DOMTestCase(unittest.TestCase):
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
291
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
292 def confirm(self, test, testname="Test"):
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
293 self.assertTrue(test, testname)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
294
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
295 def test_basic(self):
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
296 """Ensure SAX2DOM can parse from a stream."""
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
297 with io.StringIO(SMALL_SAMPLE) as fin:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
298 sd = SAX2DOMTestHelper(fin, xml.sax.make_parser(),
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
299 len(SMALL_SAMPLE))
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
300 for evt, node in sd:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
301 if evt == pulldom.START_ELEMENT and node.tagName == "html":
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
302 break
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
303 # Because the buffer is the same length as the XML, all the
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
304 # nodes should have been parsed and added:
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
305 self.assertGreater(len(node.childNodes), 0)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
306
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
307 def testSAX2DOM(self):
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
308 """Ensure SAX2DOM expands nodes as expected."""
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
309 sax2dom = pulldom.SAX2DOM()
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
310 sax2dom.startDocument()
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
311 sax2dom.startElement("doc", {})
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
312 sax2dom.characters("text")
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
313 sax2dom.startElement("subelm", {})
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
314 sax2dom.characters("text")
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
315 sax2dom.endElement("subelm")
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
316 sax2dom.characters("text")
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
317 sax2dom.endElement("doc")
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
318 sax2dom.endDocument()
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
319
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
320 doc = sax2dom.document
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
321 root = doc.documentElement
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
322 (text1, elm1, text2) = root.childNodes
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
323 text3 = elm1.childNodes[0]
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
324
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
325 self.assertIsNone(text1.previousSibling)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
326 self.assertIs(text1.nextSibling, elm1)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
327 self.assertIs(elm1.previousSibling, text1)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
328 self.assertIs(elm1.nextSibling, text2)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
329 self.assertIs(text2.previousSibling, elm1)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
330 self.assertIsNone(text2.nextSibling)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
331 self.assertIsNone(text3.previousSibling)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
332 self.assertIsNone(text3.nextSibling)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
333
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
334 self.assertIs(root.parentNode, doc)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
335 self.assertIs(text1.parentNode, root)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
336 self.assertIs(elm1.parentNode, root)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
337 self.assertIs(text2.parentNode, root)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
338 self.assertIs(text3.parentNode, elm1)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
339 doc.unlink()
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
340
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
341
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
342 def test_main():
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
343 run_unittest(PullDOMTestCase, ThoroughTestCase, SAX2DOMTestCase)
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
344
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
345
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
346 if __name__ == "__main__":
6b12d2b68f25 add tests for xml.pulldom #9373
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
347 test_main()