Mercurial > cpython-lru_cache-weakref
annotate Lib/test/test_pulldom.py @ 79691:05c8928362ee
Merge __next__ method link fixes with 3.3.
| author | Ezio Melotti <ezio.melotti@gmail.com> |
|---|---|
| date | Fri, 12 Oct 2012 13:46:37 +0300 |
| parents | aa000dd4287f |
| children |
| 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() |
