Package lxml :: Package tests :: Module test_sax
[hide private]
[frames] | no frames]

Source Code for Module lxml.tests.test_sax

  1  # -*- coding: utf-8 -*- 
  2   
  3  """ 
  4  Test cases related to SAX I/O 
  5  """ 
  6   
  7  import unittest, sys, os.path 
  8   
  9  this_dir = os.path.dirname(__file__) 
 10  if this_dir not in sys.path: 
 11      sys.path.insert(0, this_dir) # needed for Py3 
 12   
 13  from common_imports import HelperTestCase, doctest, make_doctest, BytesIO, _bytes 
 14  from lxml import sax 
 15  from xml.dom import pulldom 
 16   
17 -class ETreeSaxTestCase(HelperTestCase):
18
19 - def test_etree_sax_simple(self):
20 tree = self.parse('<a>ab<b/>ba</a>') 21 xml_out = self._saxify_serialize(tree) 22 self.assertEqual(_bytes('<a>ab<b/>ba</a>'), 23 xml_out)
24
25 - def test_etree_sax_double(self):
26 tree = self.parse('<a>ab<b>bb</b>ba</a>') 27 xml_out = self._saxify_serialize(tree) 28 self.assertEqual(_bytes('<a>ab<b>bb</b>ba</a>'), 29 xml_out)
30
31 - def test_etree_sax_comment(self):
32 tree = self.parse('<a>ab<!-- TEST -->ba</a>') 33 xml_out = self._saxify_serialize(tree) 34 self.assertEqual(_bytes('<a>abba</a>'), 35 xml_out)
36
37 - def test_etree_sax_pi(self):
38 tree = self.parse('<a>ab<?this and that?>ba</a>') 39 xml_out = self._saxify_serialize(tree) 40 self.assertEqual(_bytes('<a>ab<?this and that?>ba</a>'), 41 xml_out)
42
44 tree = self.parse('<!-- TEST --><a>ab</a>') 45 xml_out = self._saxify_serialize(tree) 46 self.assertEqual(_bytes('<a>ab</a>'), 47 xml_out)
48
49 - def test_etree_sax_pi_root(self):
50 tree = self.parse('<?this and that?><a>ab</a>') 51 xml_out = self._saxify_serialize(tree) 52 self.assertEqual(_bytes('<?this and that?><a>ab</a>'), 53 xml_out)
54
56 tree = self.parse('<a aa="5">ab<b b="5"/>ba</a>') 57 xml_out = self._saxify_serialize(tree) 58 self.assertEqual(_bytes('<a aa="5">ab<b b="5"/>ba</a>'), 59 xml_out)
60
61 - def test_etree_sax_ns1(self):
62 tree = self.parse('<a xmlns="bla">ab<b>bb</b>ba</a>') 63 new_tree = self._saxify_unsaxify(tree) 64 root = new_tree.getroot() 65 self.assertEqual('{bla}a', 66 root.tag) 67 self.assertEqual('{bla}b', 68 root[0].tag)
69
70 - def test_etree_sax_ns2(self):
71 tree = self.parse('<a xmlns="blaA">ab<b:b xmlns:b="blaB">bb</b:b>ba</a>') 72 new_tree = self._saxify_unsaxify(tree) 73 root = new_tree.getroot() 74 self.assertEqual('{blaA}a', 75 root.tag) 76 self.assertEqual('{blaB}b', 77 root[0].tag)
78
79 - def test_sax_to_pulldom(self):
80 tree = self.parse('<a xmlns="blaA">ab<b:b xmlns:b="blaB">bb</b:b>ba</a>') 81 handler = pulldom.SAX2DOM() 82 sax.saxify(tree, handler) 83 dom = handler.document 84 85 self.assertEqual('a', 86 dom.firstChild.localName) 87 self.assertEqual('blaA', 88 dom.firstChild.namespaceURI) 89 90 children = dom.firstChild.childNodes 91 self.assertEqual('ab', 92 children[0].nodeValue) 93 self.assertEqual('blaB', 94 children[1].namespaceURI) 95 self.assertEqual('ba', 96 children[2].nodeValue)
97
98 - def test_element_sax(self):
99 tree = self.parse('<a><b/></a>') 100 a = tree.getroot() 101 b = a[0] 102 103 xml_out = self._saxify_serialize(a) 104 self.assertEqual(_bytes('<a><b/></a>'), 105 xml_out) 106 107 xml_out = self._saxify_serialize(b) 108 self.assertEqual(_bytes('<b/>'), 109 xml_out)
110
111 - def test_element_sax_ns(self):
112 tree = self.parse('<a:a xmlns:a="blaA"><b/></a:a>') 113 a = tree.getroot() 114 b = a[0] 115 116 new_tree = self._saxify_unsaxify(a) 117 root = new_tree.getroot() 118 self.assertEqual('{blaA}a', 119 root.tag) 120 self.assertEqual('b', 121 root[0].tag) 122 123 new_tree = self._saxify_unsaxify(b) 124 root = new_tree.getroot() 125 self.assertEqual('b', 126 root.tag) 127 self.assertEqual(0, 128 len(root))
129
131 handler = sax.ElementTreeContentHandler() 132 handler.startDocument() 133 handler.startPrefixMapping(None, 'blaA') 134 handler.startElementNS(('blaA', 'a'), 'a', {}) 135 handler.startPrefixMapping(None, 'blaB') 136 handler.startElementNS(('blaB', 'b'), 'b', {}) 137 handler.endElementNS( ('blaB', 'b'), 'b') 138 handler.endPrefixMapping(None) 139 handler.startElementNS(('blaA', 'c'), 'c', {}) 140 handler.endElementNS( ('blaA', 'c'), 'c') 141 handler.endElementNS( ('blaA', 'a'), 'a') 142 handler.endPrefixMapping(None) 143 handler.endDocument() 144 145 new_tree = handler.etree 146 root = new_tree.getroot() 147 self.assertEqual('{blaA}a', 148 root.tag) 149 self.assertEqual('{blaB}b', 150 root[0].tag) 151 self.assertEqual('{blaA}c', 152 root[1].tag)
153
155 handler = sax.ElementTreeContentHandler() 156 handler.startDocument() 157 handler.startPrefixMapping(None, 'blaA') 158 handler.startElementNS((None, 'a'), 'a', {}) 159 handler.startPrefixMapping(None, 'blaB') 160 handler.startElementNS((None, 'b'), 'b', {}) 161 handler.endElementNS( (None, 'b'), 'b') 162 handler.endPrefixMapping(None) 163 handler.startElementNS((None, 'c'), 'c', {}) 164 handler.endElementNS( (None, 'c'), 'c') 165 handler.endElementNS( (None, 'a'), 'a') 166 handler.endPrefixMapping(None) 167 handler.endDocument() 168 169 new_tree = handler.etree 170 root = new_tree.getroot() 171 self.assertEqual('{blaA}a', 172 root.tag) 173 self.assertEqual('{blaB}b', 174 root[0].tag) 175 self.assertEqual('{blaA}c', 176 root[1].tag)
177
179 handler = sax.ElementTreeContentHandler() 180 handler.startDocument() 181 handler.startPrefixMapping('ns', 'blaA') 182 handler.startElementNS(('blaA', 'a'), 'ns:a', {}) 183 handler.startPrefixMapping('ns', 'blaB') 184 handler.startElementNS(('blaB', 'b'), 'ns:b', {}) 185 handler.endElementNS( ('blaB', 'b'), 'ns:b') 186 handler.endPrefixMapping('ns') 187 handler.startElementNS(('blaA', 'c'), 'ns:c', {}) 188 handler.endElementNS( ('blaA', 'c'), 'ns:c') 189 handler.endElementNS( ('blaA', 'a'), 'ns:a') 190 handler.endPrefixMapping('ns') 191 handler.endDocument() 192 193 new_tree = handler.etree 194 root = new_tree.getroot() 195 self.assertEqual('{blaA}a', 196 root.tag) 197 self.assertEqual('{blaB}b', 198 root[0].tag) 199 self.assertEqual('{blaA}c', 200 root[1].tag)
201
202 - def test_etree_sax_no_ns(self):
203 handler = sax.ElementTreeContentHandler() 204 handler.startDocument() 205 handler.startElement('a', {}) 206 handler.startElement('b', {}) 207 handler.endElement('b') 208 handler.startElement('c') # with empty attributes 209 handler.endElement('c') 210 handler.endElement('a') 211 handler.endDocument() 212 213 new_tree = handler.etree 214 root = new_tree.getroot() 215 self.assertEqual('a', root.tag) 216 self.assertEqual('b', root[0].tag) 217 self.assertEqual('c', root[1].tag)
218
220 handler = sax.ElementTreeContentHandler() 221 handler.startDocument() 222 handler.startElement('a', {"attr_a1": "a1"}) 223 handler.startElement('b', {"attr_b1": "b1"}) 224 handler.endElement('b') 225 handler.endElement('a') 226 handler.endDocument() 227 228 new_tree = handler.etree 229 root = new_tree.getroot() 230 self.assertEqual('a', root.tag) 231 self.assertEqual('b', root[0].tag) 232 self.assertEqual('a1', root.attrib["attr_a1"]) 233 self.assertEqual('b1', root[0].attrib["attr_b1"])
234
236 handler = sax.ElementTreeContentHandler() 237 handler.startDocument() 238 239 self.assertRaises(ValueError, 240 handler.startElement, 241 'a', {"blaA:attr_a1": "a1"} 242 )
243
244 - def test_etree_sax_error(self):
245 handler = sax.ElementTreeContentHandler() 246 handler.startDocument() 247 handler.startElement('a') 248 self.assertRaises(sax.SaxError, handler.endElement, 'b')
249
250 - def test_etree_sax_error2(self):
251 handler = sax.ElementTreeContentHandler() 252 handler.startDocument() 253 handler.startElement('a') 254 handler.startElement('b') 255 self.assertRaises(sax.SaxError, handler.endElement, 'a')
256
257 - def _saxify_unsaxify(self, saxifiable):
258 handler = sax.ElementTreeContentHandler() 259 sax.ElementTreeProducer(saxifiable, handler).saxify() 260 return handler.etree
261
262 - def _saxify_serialize(self, tree):
263 new_tree = self._saxify_unsaxify(tree) 264 f = BytesIO() 265 new_tree.write(f) 266 return f.getvalue().replace(_bytes('\n'), _bytes(''))
267 268
269 -def test_suite():
270 suite = unittest.TestSuite() 271 suite.addTests([unittest.makeSuite(ETreeSaxTestCase)]) 272 suite.addTests( 273 [make_doctest('../../../doc/sax.txt')]) 274 return suite
275 276 if __name__ == '__main__': 277 print('to test use test.py %s' % __file__) 278