1   
  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)  
 12   
 13  from common_imports import HelperTestCase, make_doctest, BytesIO, _bytes 
 14  from lxml import sax 
 15  from xml.dom import pulldom 
 16   
 17   
 19   
 21          tree = self.parse('<a>ab<b/>ba</a>') 
 22          xml_out = self._saxify_serialize(tree) 
 23          self.assertEqual(_bytes('<a>ab<b/>ba</a>'), 
 24                            xml_out) 
  25   
 27          tree = self.parse('<a>ab<b>bb</b>ba</a>') 
 28          xml_out = self._saxify_serialize(tree) 
 29          self.assertEqual(_bytes('<a>ab<b>bb</b>ba</a>'), 
 30                            xml_out) 
  31   
 37   
 39          tree = self.parse('<a>ab<?this and that?>ba</a>') 
 40          xml_out = self._saxify_serialize(tree) 
 41          self.assertEqual(_bytes('<a>ab<?this and that?>ba</a>'), 
 42                            xml_out) 
  43   
 49   
 51          tree = self.parse('<?this and that?><a>ab</a>') 
 52          xml_out = self._saxify_serialize(tree) 
 53          self.assertEqual(_bytes('<?this and that?><a>ab</a>'), 
 54                            xml_out) 
  55   
 57          tree = self.parse('<a aa="5">ab<b b="5"/>ba</a>') 
 58          xml_out = self._saxify_serialize(tree) 
 59          self.assertEqual(_bytes('<a aa="5">ab<b b="5"/>ba</a>'), 
 60                            xml_out) 
  61   
 70   
 72          tree = self.parse('<a xmlns="blaA">ab<b:b xmlns:b="blaB">bb</b:b>ba</a>') 
 73          new_tree = self._saxify_unsaxify(tree) 
 74          root = new_tree.getroot() 
 75          self.assertEqual('{blaA}a', 
 76                           root.tag) 
 77          self.assertEqual('{blaB}b', 
 78                           root[0].tag) 
  79   
 81          tree = self.parse('<a xmlns="blaA">ab<b:b xmlns:b="blaB">bb</b:b>ba</a>') 
 82          handler = pulldom.SAX2DOM() 
 83          sax.saxify(tree, handler) 
 84          dom = handler.document 
 85   
 86          self.assertEqual('a', 
 87                           dom.firstChild.localName) 
 88          self.assertEqual('blaA', 
 89                           dom.firstChild.namespaceURI) 
 90   
 91          children = dom.firstChild.childNodes 
 92          self.assertEqual('ab', 
 93                           children[0].nodeValue) 
 94          self.assertEqual('blaB', 
 95                           children[1].namespaceURI) 
 96          self.assertEqual('ba', 
 97                           children[2].nodeValue) 
  98   
111   
130   
132          handler = sax.ElementTreeContentHandler() 
133          handler.startDocument() 
134          handler.startPrefixMapping(None, 'blaA') 
135          handler.startElementNS(('blaA', 'a'), 'a', {}) 
136          handler.startPrefixMapping(None, 'blaB') 
137          handler.startElementNS(('blaB', 'b'), 'b', {}) 
138          handler.endElementNS(  ('blaB', 'b'), 'b') 
139          handler.endPrefixMapping(None) 
140          handler.startElementNS(('blaA', 'c'), 'c', {}) 
141          handler.endElementNS(  ('blaA', 'c'), 'c') 
142          handler.endElementNS(  ('blaA', 'a'), 'a') 
143          handler.endPrefixMapping(None) 
144          handler.endDocument() 
145   
146          new_tree = handler.etree 
147          root = new_tree.getroot() 
148          self.assertEqual('{blaA}a', 
149                           root.tag) 
150          self.assertEqual('{blaB}b', 
151                           root[0].tag) 
152          self.assertEqual('{blaA}c', 
153                           root[1].tag) 
 154   
156          handler = sax.ElementTreeContentHandler() 
157          handler.startDocument() 
158          handler.startPrefixMapping(None, 'blaA') 
159          handler.startElementNS((None, 'a'), 'a', {}) 
160          handler.startPrefixMapping(None, 'blaB') 
161          handler.startElementNS((None, 'b'), 'b', {}) 
162          handler.endElementNS(  (None, 'b'), 'b') 
163          handler.endPrefixMapping(None) 
164          handler.startElementNS((None, 'c'), 'c', {}) 
165          handler.endElementNS(  (None, 'c'), 'c') 
166          handler.endElementNS(  (None, 'a'), 'a') 
167          handler.endPrefixMapping(None) 
168          handler.endDocument() 
169   
170          new_tree = handler.etree 
171          root = new_tree.getroot() 
172          self.assertEqual('{blaA}a', 
173                           root.tag) 
174          self.assertEqual('{blaB}b', 
175                           root[0].tag) 
176          self.assertEqual('{blaA}c', 
177                           root[1].tag) 
 178   
180          handler = sax.ElementTreeContentHandler() 
181          handler.startDocument() 
182          handler.startPrefixMapping('ns', 'blaA') 
183          handler.startElementNS(('blaA', 'a'), 'ns:a', {}) 
184          handler.startPrefixMapping('ns', 'blaB') 
185          handler.startElementNS(('blaB', 'b'), 'ns:b', {}) 
186          handler.endElementNS(  ('blaB', 'b'), 'ns:b') 
187          handler.endPrefixMapping('ns') 
188          handler.startElementNS(('blaA', 'c'), 'ns:c', {}) 
189          handler.endElementNS(  ('blaA', 'c'), 'ns:c') 
190          handler.endElementNS(  ('blaA', 'a'), 'ns:a') 
191          handler.endPrefixMapping('ns') 
192          handler.endDocument() 
193   
194          new_tree = handler.etree 
195          root = new_tree.getroot() 
196          self.assertEqual('{blaA}a', 
197                           root.tag) 
198          self.assertEqual('{blaB}b', 
199                           root[0].tag) 
200          self.assertEqual('{blaA}c', 
201                           root[1].tag) 
 202   
219   
235   
244   
250   
257   
262   
 268   
269   
271      suite = unittest.TestSuite() 
272      suite.addTests([unittest.makeSuite(ETreeSaxTestCase)]) 
273      suite.addTests( 
274          [make_doctest('../../../doc/sax.txt')]) 
275      return suite 
 276   
277   
278  if __name__ == '__main__': 
279      print('to test use test.py %s' % __file__) 
280