Mercurial > cpython-lru_cache-weakref
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 |
| 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() |
