Package lxml :: Package tests :: Module test_etree
[frames] | no frames]

Source Code for Module lxml.tests.test_etree

   1  # -*- coding: utf-8 -*- 
   2   
   3  """ 
   4  Tests specific to the extended etree API 
   5   
   6  Tests that apply to the general ElementTree API should go into 
   7  test_elementtree 
   8  """ 
   9   
  10   
  11  import unittest, copy, sys, operator 
  12   
  13  from common_imports import etree, StringIO, HelperTestCase, fileInTestDir 
  14  from common_imports import SillyFileLike, canonicalize, doctest 
  15   
  16  print 
  17  print "TESTED VERSION:", etree.__version__ 
  18  print "    Python:           ", sys.version_info 
  19  print "    lxml.etree:       ", etree.LXML_VERSION 
  20  print "    libxml used:      ", etree.LIBXML_VERSION 
  21  print "    libxml compiled:  ", etree.LIBXML_COMPILED_VERSION 
  22  print "    libxslt used:     ", etree.LIBXSLT_VERSION 
  23  print "    libxslt compiled: ", etree.LIBXSLT_COMPILED_VERSION 
  24  print 
  25   
  26  try: 
  27      sorted 
  28  except NameError: 
  29      # Python 2.3 
30 - def sorted(seq):
31 seq = list(seq) 32 seq.sort() 33 return seq
34
35 -class ETreeOnlyTestCase(HelperTestCase):
36 """Tests only for etree, not ElementTree""" 37 etree = etree 38
39 - def test_version(self):
40 self.assert_(isinstance(etree.__version__, str)) 41 self.assert_(isinstance(etree.LXML_VERSION, tuple)) 42 self.assertEqual(len(etree.LXML_VERSION), 4) 43 self.assert_(isinstance(etree.LXML_VERSION[0], int)) 44 self.assert_(isinstance(etree.LXML_VERSION[1], int)) 45 self.assert_(isinstance(etree.LXML_VERSION[2], int)) 46 self.assert_(isinstance(etree.LXML_VERSION[3], int)) 47 self.assert_(etree.__version__.startswith( 48 str(etree.LXML_VERSION[0])))
49
50 - def test_c_api(self):
51 if hasattr(self.etree, '__pyx_capi__'): 52 # newer Pyrex compatible C-API 53 self.assert_(isinstance(self.etree.__pyx_capi__, dict)) 54 self.assert_(len(self.etree.__pyx_capi__) > 0) 55 else: 56 # older C-API mechanism 57 self.assert_(hasattr(self.etree, '_import_c_api'))
58
59 - def test_element_names(self):
60 Element = self.etree.Element 61 el = Element('name') 62 self.assertEquals(el.tag, 'name') 63 el = Element('{}name') 64 self.assertEquals(el.tag, 'name')
65
66 - def test_element_name_empty(self):
67 Element = self.etree.Element 68 el = Element('name') 69 self.assertRaises(ValueError, Element, '{}') 70 self.assertRaises(ValueError, setattr, el, 'tag', '{}') 71 72 self.assertRaises(ValueError, Element, '{test}') 73 self.assertRaises(ValueError, setattr, el, 'tag', '{test}')
74
75 - def test_element_name_colon(self):
76 Element = self.etree.Element 77 self.assertRaises(ValueError, Element, 'p:name') 78 self.assertRaises(ValueError, Element, '{test}p:name') 79 80 el = Element('name') 81 self.assertRaises(ValueError, setattr, el, 'tag', 'p:name')
82
83 - def test_element_name_quote(self):
84 Element = self.etree.Element 85 self.assertRaises(ValueError, Element, "p'name") 86 self.assertRaises(ValueError, Element, 'p"name') 87 88 self.assertRaises(ValueError, Element, "{test}p'name") 89 self.assertRaises(ValueError, Element, '{test}p"name') 90 91 el = Element('name') 92 self.assertRaises(ValueError, setattr, el, 'tag', "p'name") 93 self.assertRaises(ValueError, setattr, el, 'tag', 'p"name')
94
95 - def test_element_name_space(self):
96 Element = self.etree.Element 97 self.assertRaises(ValueError, Element, ' name ') 98 self.assertRaises(ValueError, Element, 'na me') 99 self.assertRaises(ValueError, Element, '{test} name') 100 101 el = Element('name') 102 self.assertRaises(ValueError, setattr, el, 'tag', ' name ')
103
104 - def test_subelement_name_empty(self):
105 Element = self.etree.Element 106 SubElement = self.etree.SubElement 107 108 el = Element('name') 109 self.assertRaises(ValueError, SubElement, el, '{}') 110 self.assertRaises(ValueError, SubElement, el, '{test}')
111
112 - def test_subelement_name_colon(self):
113 Element = self.etree.Element 114 SubElement = self.etree.SubElement 115 116 el = Element('name') 117 self.assertRaises(ValueError, SubElement, el, 'p:name') 118 self.assertRaises(ValueError, SubElement, el, '{test}p:name')
119
120 - def test_subelement_name_quote(self):
121 Element = self.etree.Element 122 SubElement = self.etree.SubElement 123 124 el = Element('name') 125 self.assertRaises(ValueError, SubElement, el, "p'name") 126 self.assertRaises(ValueError, SubElement, el, "{test}p'name") 127 128 self.assertRaises(ValueError, SubElement, el, 'p"name') 129 self.assertRaises(ValueError, SubElement, el, '{test}p"name')
130
131 - def test_subelement_name_space(self):
132 Element = self.etree.Element 133 SubElement = self.etree.SubElement 134 135 el = Element('name') 136 self.assertRaises(ValueError, SubElement, el, ' name ') 137 self.assertRaises(ValueError, SubElement, el, 'na me') 138 self.assertRaises(ValueError, SubElement, el, '{test} name')
139
140 - def test_qname_empty(self):
141 QName = self.etree.QName 142 self.assertRaises(ValueError, QName, '') 143 self.assertRaises(ValueError, QName, 'test', '')
144
145 - def test_qname_colon(self):
146 QName = self.etree.QName 147 self.assertRaises(ValueError, QName, 'p:name') 148 self.assertRaises(ValueError, QName, 'test', 'p:name')
149
150 - def test_qname_space(self):
151 QName = self.etree.QName 152 self.assertRaises(ValueError, QName, ' name ') 153 self.assertRaises(ValueError, QName, 'na me') 154 self.assertRaises(ValueError, QName, 'test', ' name')
155
156 - def test_qname_text_resolve(self):
157 # ET doesn't resove QNames as text values 158 etree = self.etree 159 qname = etree.QName('http://myns', 'a') 160 a = etree.Element(qname, nsmap={'p' : 'http://myns'}) 161 a.text = qname 162 163 self.assertEquals("p:a", a.text)
164
165 - def test_attribute_set(self):
166 Element = self.etree.Element 167 root = Element("root") 168 root.set("attr", "TEST") 169 self.assertEquals("TEST", root.get("attr"))
170
171 - def test_attribute_set_invalid(self):
172 # ElementTree accepts arbitrary attribute values 173 # lxml.etree allows only strings 174 Element = self.etree.Element 175 root = Element("root") 176 self.assertRaises(TypeError, root.set, "newattr", 5) 177 self.assertRaises(TypeError, root.set, "newattr", None)
178
179 - def test_attrib_pop(self):
180 ElementTree = self.etree.ElementTree 181 182 f = StringIO('<doc one="One" two="Two"/>') 183 doc = ElementTree(file=f) 184 root = doc.getroot() 185 self.assertEquals('One', root.attrib['one']) 186 self.assertEquals('Two', root.attrib['two']) 187 188 self.assertEquals('One', root.attrib.pop('one')) 189 190 self.assertEquals(None, root.attrib.get('one')) 191 self.assertEquals('Two', root.attrib['two'])
192
193 - def test_attrib_pop_unknown(self):
194 root = self.etree.XML('<doc one="One" two="Two"/>') 195 self.assertRaises(KeyError, root.attrib.pop, 'NONE') 196 197 self.assertEquals('One', root.attrib['one']) 198 self.assertEquals('Two', root.attrib['two'])
199
200 - def test_attrib_pop_default(self):
201 root = self.etree.XML('<doc one="One" two="Two"/>') 202 self.assertEquals('Three', root.attrib.pop('three', 'Three'))
203
205 root = self.etree.XML('<doc/>') 206 self.assertEquals('Three', root.attrib.pop('three', 'Three'))
207
209 root = self.etree.XML('<doc one="One" two="Two"/>') 210 self.assertRaises(TypeError, root.attrib.pop, 'One', None, None)
211
212 - def test_pi(self):
213 # lxml.etree separates target and text 214 Element = self.etree.Element 215 SubElement = self.etree.SubElement 216 ProcessingInstruction = self.etree.ProcessingInstruction 217 218 a = Element('a') 219 a.append(ProcessingInstruction('foo', 'some more text')) 220 self.assertEquals(a[0].target, 'foo') 221 self.assertEquals(a[0].text, 'some more text')
222
223 - def test_pi_parse(self):
224 XML = self.etree.XML 225 root = XML("<test><?mypi my test ?></test>") 226 self.assertEquals(root[0].target, "mypi") 227 self.assertEquals(root[0].text, "my test ")
228
229 - def test_deepcopy_pi(self):
230 # previously caused a crash 231 ProcessingInstruction = self.etree.ProcessingInstruction 232 233 a = ProcessingInstruction("PI", "ONE") 234 b = copy.deepcopy(a) 235 b.text = "ANOTHER" 236 237 self.assertEquals('ONE', a.text) 238 self.assertEquals('ANOTHER', b.text)
239
240 - def test_deepcopy_comment(self):
241 # previously caused a crash 242 # not supported by ET! 243 Comment = self.etree.Comment 244 245 a = Comment("ONE") 246 b = copy.deepcopy(a) 247 b.text = "ANOTHER" 248 249 self.assertEquals('ONE', a.text) 250 self.assertEquals('ANOTHER', b.text)
251
252 - def test_attribute_set(self):
253 # ElementTree accepts arbitrary attribute values 254 # lxml.etree allows only strings 255 Element = self.etree.Element 256 257 root = Element("root") 258 root.set("attr", "TEST") 259 self.assertEquals("TEST", root.get("attr")) 260 self.assertRaises(TypeError, root.set, "newattr", 5)
261
262 - def test_parse_error(self):
263 # ET raises ExpatError 264 parse = self.etree.parse 265 # from StringIO 266 f = StringIO('<a><b></c></b></a>') 267 self.assertRaises(SyntaxError, parse, f) 268 f.close()
269
270 - def test_parse_remove_comments(self):
271 fromstring = self.etree.fromstring 272 tostring = self.etree.tostring 273 XMLParser = self.etree.XMLParser 274 275 xml = '<a><!--A--><b><!-- B --><c/></b><!--C--></a>' 276 parser = XMLParser(remove_comments=True) 277 root = fromstring(xml, parser) 278 self.assertEquals( 279 '<a><b><c/></b></a>', 280 tostring(root))
281
282 - def test_parse_remove_pis(self):
283 parse = self.etree.parse 284 tostring = self.etree.tostring 285 XMLParser = self.etree.XMLParser 286 287 xml = '<?test?><a><?A?><b><?B?><c/></b><?C?></a><?tail?>' 288 289 f = StringIO(xml) 290 tree = parse(f) 291 self.assertEquals( 292 xml, 293 tostring(tree)) 294 295 parser = XMLParser(remove_pis=True) 296 tree = parse(f, parser) 297 self.assertEquals( 298 '<a><b><c/></b></a>', 299 tostring(tree))
300
302 # ET raises IOError only 303 parse = self.etree.parse 304 self.assertRaises(TypeError, parse, 'notthere.xml', object())
305
306 - def test_parse_error_logging(self):
307 parse = self.etree.parse 308 # from StringIO 309 f = StringIO('<a><b></c></b></a>') 310 self.etree.clearErrorLog() 311 try: 312 parse(f) 313 logs = None 314 except SyntaxError, e: 315 logs = e.error_log 316 f.close() 317 self.assert_([ log for log in logs 318 if 'mismatch' in log.message ]) 319 self.assert_([ log for log in logs 320 if 'PARSER' in log.domain_name]) 321 self.assert_([ log for log in logs 322 if 'TAG_NAME_MISMATCH' in log.type_name ]) 323 self.assert_([ log for log in logs 324 if 1 == log.line ]) 325 self.assert_([ log for log in logs 326 if 15 == log.column ])
327
328 - def test_parse_error_from_file(self):
329 parse = self.etree.parse 330 # from file 331 f = open(fileInTestDir('test_broken.xml'), 'r') 332 self.assertRaises(SyntaxError, parse, f) 333 f.close()
334
335 - def test_iterparse_comments(self):
336 # ET removes comments 337 iterparse = self.etree.iterparse 338 tostring = self.etree.tostring 339 340 f = StringIO('<a><!--A--><b><!-- B --><c/></b><!--C--></a>') 341 events = list(iterparse(f)) 342 root = events[-1][1] 343 self.assertEquals(3, len(events)) 344 self.assertEquals( 345 '<a><!--A--><b><!-- B --><c/></b><!--C--></a>', 346 tostring(root))
347
349 iterparse = self.etree.iterparse 350 tostring = self.etree.tostring 351 352 f = StringIO('<a><!--A--><b><!-- B --><c/></b><!--C--></a>') 353 events = list(iterparse(f, remove_comments=True)) 354 root = events[-1][1] 355 self.assertEquals( 356 '<a><b><c/></b></a>', 357 tostring(root))
358
359 - def test_iterparse_broken(self):
360 iterparse = self.etree.iterparse 361 f = StringIO('<a><b><c/></a>') 362 # ET raises ExpatError, lxml raises XMLSyntaxError 363 self.assertRaises(self.etree.XMLSyntaxError, list, iterparse(f))
364
365 - def test_iterparse_strip(self):
366 iterparse = self.etree.iterparse 367 f = StringIO(""" 368 <a> \n \n <b> b test </b> \n 369 370 \n\t <c> \n </c> </a> \n """) 371 iterator = iterparse(f, remove_blank_text=True) 372 text = [ (element.text, element.tail) 373 for event, element in iterator ] 374 self.assertEquals( 375 [(" b test ", None), (" \n ", None), (None, None)], 376 text)
377
378 - def test_iterparse_tag(self):
379 iterparse = self.etree.iterparse 380 f = StringIO('<a><b><d/></b><c/></a>') 381 382 iterator = iterparse(f, tag="b", events=('start', 'end')) 383 events = list(iterator) 384 root = iterator.root 385 self.assertEquals( 386 [('start', root[0]), ('end', root[0])], 387 events)
388
389 - def test_iterparse_tag_all(self):
390 iterparse = self.etree.iterparse 391 f = StringIO('<a><b><d/></b><c/></a>') 392 393 iterator = iterparse(f, tag="*", events=('start', 'end')) 394 events = list(iterator) 395 self.assertEquals( 396 8, 397 len(events))
398
400 text = u'Søk på nettet' 401 wrong_declaration = "<?xml version='1.0' encoding='UTF-8'?>" 402 xml_latin1 = (u'%s<a>%s</a>' % (wrong_declaration, text) 403 ).encode('iso-8859-1') 404 405 self.assertRaises(self.etree.ParseError, 406 list, self.etree.iterparse(StringIO(xml_latin1))) 407 408 iterator = self.etree.iterparse(StringIO(xml_latin1), 409 encoding="iso-8859-1") 410 self.assertEquals(1, len(list(iterator))) 411 412 a = iterator.root 413 self.assertEquals(a.text, text)
414
416 self.assertRaises( 417 LookupError, self.etree.XMLParser, encoding="hopefully unknown")
418
419 - def test_iterwalk_tag(self):
420 iterwalk = self.etree.iterwalk 421 root = self.etree.XML('<a><b><d/></b><c/></a>') 422 423 iterator = iterwalk(root, tag="b", events=('start', 'end')) 424 events = list(iterator) 425 self.assertEquals( 426 [('start', root[0]), ('end', root[0])], 427 events)
428
429 - def test_iterwalk_tag_all(self):
430 iterwalk = self.etree.iterwalk 431 root = self.etree.XML('<a><b><d/></b><c/></a>') 432 433 iterator = iterwalk(root, tag="*", events=('start', 'end')) 434 events = list(iterator) 435 self.assertEquals( 436 8, 437 len(events))
438
439 - def test_iterwalk(self):
440 iterwalk = self.etree.iterwalk 441 root = self.etree.XML('<a><b></b><c/></a>') 442 443 events = list(iterwalk(root)) 444 self.assertEquals( 445 [('end', root[0]), ('end', root[1]), ('end', root)], 446 events)
447
448 - def test_iterwalk_start(self):
449 iterwalk = self.etree.iterwalk 450 root = self.etree.XML('<a><b></b><c/></a>') 451 452 iterator = iterwalk(root, events=('start',)) 453 events = list(iterator) 454 self.assertEquals( 455 [('start', root), ('start', root[0]), ('start', root[1])], 456 events)
457
458 - def test_iterwalk_start_end(self):
459 iterwalk = self.etree.iterwalk 460 root = self.etree.XML('<a><b></b><c/></a>') 461 462 iterator = iterwalk(root, events=('start','end')) 463 events = list(iterator) 464 self.assertEquals( 465 [('start', root), ('start', root[0]), ('end', root[0]), 466 ('start', root[1]), ('end', root[1]), ('end', root)], 467 events)
468
469 - def test_iterwalk_clear(self):
470 iterwalk = self.etree.iterwalk 471 root = self.etree.XML('<a><b></b><c/></a>') 472 473 iterator = iterwalk(root) 474 for event, elem in iterator: 475 elem.clear() 476 477 self.assertEquals(0, 478 len(root))
479
480 - def test_iterwalk_attrib_ns(self):
481 iterwalk = self.etree.iterwalk 482 root = self.etree.XML('<a xmlns="ns1"><b><c xmlns="ns2"/></b></a>') 483 484 attr_name = '{testns}bla' 485 events = [] 486 iterator = iterwalk(root, events=('start','end','start-ns','end-ns')) 487 for event, elem in iterator: 488 events.append(event) 489 if event == 'start': 490 if elem.tag != '{ns1}a': 491 elem.set(attr_name, 'value') 492 493 self.assertEquals( 494 ['start-ns', 'start', 'start', 'start-ns', 'start', 495 'end', 'end-ns', 'end', 'end', 'end-ns'], 496 events) 497 498 self.assertEquals( 499 None, 500 root.get(attr_name)) 501 self.assertEquals( 502 'value', 503 root[0].get(attr_name))
504
505 - def test_iterwalk_getiterator(self):
506 iterwalk = self.etree.iterwalk 507 root = self.etree.XML('<a><b><d/></b><c/></a>') 508 509 counts = [] 510 for event, elem in iterwalk(root): 511 counts.append(len(list(elem.getiterator()))) 512 self.assertEquals( 513 [1,2,1,4], 514 counts)
515
516 - def test_resolve_string_dtd(self):
517 parse = self.etree.parse 518 parser = self.etree.XMLParser(dtd_validation=True) 519 assertEqual = self.assertEqual 520 test_url = u"__nosuch.dtd" 521 522 class MyResolver(self.etree.Resolver): 523 def resolve(self, url, id, context): 524 assertEqual(url, test_url) 525 return self.resolve_string( 526 u'''<!ENTITY myentity "%s"> 527 <!ELEMENT doc ANY>''' % url, context)
528 529 parser.resolvers.add(MyResolver()) 530 531 xml = u'<!DOCTYPE doc SYSTEM "%s"><doc>&myentity;</doc>' % test_url 532 tree = parse(StringIO(xml), parser) 533 root = tree.getroot() 534 self.assertEquals(root.text, test_url) 535
536 - def test_resolve_filename_dtd(self):
537 parse = self.etree.parse 538 parser = self.etree.XMLParser(attribute_defaults=True) 539 assertEqual = self.assertEqual 540 test_url = u"__nosuch.dtd" 541 542 class MyResolver(self.etree.Resolver): 543 def resolve(self, url, id, context): 544 assertEqual(url, test_url) 545 return self.resolve_filename( 546 fileInTestDir('test.dtd'), context)
547 548 parser.resolvers.add(MyResolver()) 549 550 xml = u'<!DOCTYPE a SYSTEM "%s"><a><b/></a>' % test_url 551 tree = parse(StringIO(xml), parser) 552 root = tree.getroot() 553 self.assertEquals( 554 root.attrib, {'default': 'valueA'}) 555 self.assertEquals( 556 root[0].attrib, {'default': 'valueB'}) 557
558 - def test_resolve_empty(self):
559 parse = self.etree.parse 560 parser = self.etree.XMLParser(load_dtd=True) 561 assertEqual = self.assertEqual 562 test_url = u"__nosuch.dtd" 563 564 class check(object): 565 resolved = False
566 567 class MyResolver(self.etree.Resolver): 568 def resolve(self, url, id, context): 569 assertEqual(url, test_url) 570 check.resolved = True 571 return self.resolve_empty(context) 572 573 parser.resolvers.add(MyResolver()) 574 575 xml = u'<!DOCTYPE doc SYSTEM "%s"><doc>&myentity;</doc>' % test_url 576 self.assertRaises(etree.XMLSyntaxError, parse, StringIO(xml), parser) 577 self.assert_(check.resolved) 578
579 - def test_resolve_error(self):
580 parse = self.etree.parse 581 parser = self.etree.XMLParser(dtd_validation=True) 582 test_url = u"__nosuch.dtd" 583 584 class _LocalException(Exception): 585 pass
586 587 class MyResolver(self.etree.Resolver): 588 def resolve(self, url, id, context): 589 raise _LocalException 590 591 parser.resolvers.add(MyResolver()) 592 593 xml = u'<!DOCTYPE doc SYSTEM "test"><doc>&myentity;</doc>' 594 self.assertRaises(_LocalException, parse, StringIO(xml), parser) 595 596 if etree.LIBXML_VERSION > (2,6,20):
597 - def test_entity_parse(self):
598 parse = self.etree.parse 599 tostring = self.etree.tostring 600 parser = self.etree.XMLParser(resolve_entities=False) 601 Entity = self.etree.Entity 602 603 xml = '<!DOCTYPE doc SYSTEM "test"><doc>&myentity;</doc>' 604 tree = parse(StringIO(xml), parser) 605 root = tree.getroot() 606 self.assertEquals(root[0].tag, Entity) 607 self.assertEquals(root[0].text, "&myentity;") 608 self.assertEquals(root[0].tail, None) 609 self.assertEquals(root[0].name, "myentity") 610 611 self.assertEquals('<doc>&myentity;</doc>', 612 tostring(root))
613
614 - def test_entity_append(self):
615 Entity = self.etree.Entity 616 Element = self.etree.Element 617 tostring = self.etree.tostring 618 619 root = Element("root") 620 root.append( Entity("test") ) 621 622 self.assertEquals(root[0].tag, Entity) 623 self.assertEquals(root[0].text, "&test;") 624 self.assertEquals(root[0].tail, None) 625 self.assertEquals(root[0].name, "test") 626 627 self.assertEquals('<root>&test;</root>', 628 tostring(root))
629
630 - def test_entity_values(self):
631 Entity = self.etree.Entity 632 self.assertEquals(Entity("test").text, '&test;') 633 self.assertEquals(Entity("#17683").text, '&#17683;') 634 self.assertEquals(Entity("#x1768").text, '&#x1768;') 635 self.assertEquals(Entity("#x98AF").text, '&#x98AF;')
636
637 - def test_entity_error(self):
638 Entity = self.etree.Entity 639 self.assertRaises(ValueError, Entity, 'a b c') 640 self.assertRaises(ValueError, Entity, 'a,b') 641 self.assertRaises(AssertionError, Entity, 'a\0b') 642 self.assertRaises(ValueError, Entity, '#abc') 643 self.assertRaises(ValueError, Entity, '#xxyz')
644 645 # TypeError in etree, AssertionError in ElementTree;
646 - def test_setitem_assert(self):
647 Element = self.etree.Element 648 SubElement = self.etree.SubElement 649 650 a = Element('a') 651 b = SubElement(a, 'b') 652 653 self.assertRaises(TypeError, 654 a.__setitem__, 0, 'foo')
655
656 - def test_append_None(self):
657 # raises AssertionError in ElementTree 658 Element = self.etree.Element 659 self.assertRaises(TypeError, Element('a').append, None)
660
661 - def test_addnext(self):
662 Element = self.etree.Element 663 SubElement = self.etree.SubElement 664 root = Element('root') 665 SubElement(root, 'a') 666 SubElement(root, 'b') 667 668 self.assertEquals(['a', 'b'], 669 [c.tag for c in root]) 670 root[1].addnext(root[0]) 671 self.assertEquals(['b', 'a'], 672 [c.tag for c in root])
673
674 - def test_addprevious(self):
675 Element = self.etree.Element 676 SubElement = self.etree.SubElement 677 root = Element('root') 678 SubElement(root, 'a') 679 SubElement(root, 'b') 680 681 self.assertEquals(['a', 'b'], 682 [c.tag for c in root]) 683 root[0].addprevious(root[1]) 684 self.assertEquals(['b', 'a'], 685 [c.tag for c in root])
686
687 - def test_addnext_root(self):
688 Element = self.etree.Element 689 a = Element('a') 690 b = Element('b') 691 self.assertRaises(TypeError, a.addnext, b)
692
693 - def test_addnext_root(self):
694 Element = self.etree.Element 695 a = Element('a') 696 b = Element('b') 697 self.assertRaises(TypeError, a.addnext, b)
698
699 - def test_addprevious_pi(self):
700 Element = self.etree.Element 701 SubElement = self.etree.SubElement 702 PI = self.etree.PI 703 root = Element('root') 704 SubElement(root, 'a') 705 pi = PI('TARGET', 'TEXT') 706 pi.tail = "TAIL" 707 708 self.assertEquals('<root><a></a></root>', 709 self._writeElement(root)) 710 root[0].addprevious(pi) 711 self.assertEquals('<root><?TARGET TEXT?>TAIL<a></a></root>', 712 self._writeElement(root))
713
714 - def test_addprevious_root_pi(self):
715 Element = self.etree.Element 716 PI = self.etree.PI 717 root = Element('root') 718 pi = PI('TARGET', 'TEXT') 719 pi.tail = "TAIL" 720 721 self.assertEquals('<root></root>', 722 self._writeElement(root)) 723 root.addprevious(pi) 724 self.assertEquals('<?TARGET TEXT?>\n<root></root>', 725 self._writeElement(root))
726
727 - def test_addnext_pi(self):
728 Element = self.etree.Element 729 SubElement = self.etree.SubElement 730 PI = self.etree.PI 731 root = Element('root') 732 SubElement(root, 'a') 733 pi = PI('TARGET', 'TEXT') 734 pi.tail = "TAIL" 735 736 self.assertEquals('<root><a></a></root>', 737 self._writeElement(root)) 738 root[0].addnext(pi) 739 self.assertEquals('<root><a></a><?TARGET TEXT?>TAIL</root>', 740 self._writeElement(root))
741
742 - def test_addnext_root_pi(self):
743 Element = self.etree.Element 744 PI = self.etree.PI 745 root = Element('root') 746 pi = PI('TARGET', 'TEXT') 747 pi.tail = "TAIL" 748 749 self.assertEquals('<root></root>', 750 self._writeElement(root)) 751 root.addnext(pi) 752 self.assertEquals('<root></root>\n<?TARGET TEXT?>', 753 self._writeElement(root))
754
755 - def test_addnext_comment(self):
756 Element = self.etree.Element 757 SubElement = self.etree.SubElement 758 Comment = self.etree.Comment 759 root = Element('root') 760 SubElement(root, 'a') 761 comment = Comment('TEXT ') 762 comment.tail = "TAIL" 763 764 self.assertEquals('<root><a></a></root>', 765 self._writeElement(root)) 766 root[0].addnext(comment) 767 self.assertEquals('<root><a></a><!--TEXT -->TAIL</root>', 768 self._writeElement(root))
769
770 - def test_addnext_root_comment(self):
771 Element = self.etree.Element 772 Comment = self.etree.Comment 773 root = Element('root') 774 comment = Comment('TEXT ') 775 comment.tail = "TAIL" 776 777 self.assertEquals('<root></root>', 778 self._writeElement(root)) 779 root.addnext(comment) 780 self.assertEquals('<root></root>\n<!--TEXT -->', 781 self._writeElement(root))
782
783 - def test_addprevious_comment(self):
784 Element = self.etree.Element 785 SubElement = self.etree.SubElement 786 Comment = self.etree.Comment 787 root = Element('root') 788 SubElement(root, 'a') 789 comment = Comment('TEXT ') 790 comment.tail = "TAIL" 791 792 self.assertEquals('<root><a></a></root>', 793 self._writeElement(root)) 794 root[0].addprevious(comment) 795 self.assertEquals('<root><!--TEXT -->TAIL<a></a></root>', 796 self._writeElement(root))
797
798 - def test_addprevious_root_comment(self):
799 Element = self.etree.Element 800 Comment = self.etree.Comment 801 root = Element('root') 802 comment = Comment('TEXT ') 803 comment.tail = "TAIL" 804 805 self.assertEquals('<root></root>', 806 self._writeElement(root)) 807 root.addprevious(comment) 808 self.assertEquals('<!--TEXT -->\n<root></root>', 809 self._writeElement(root))
810 811 # ET's Elements have items() and key(), but not values()
812 - def test_attribute_values(self):
813 XML = self.etree.XML 814 815 root = XML('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>') 816 values = root.values() 817 values.sort() 818 self.assertEquals(['Alpha', 'Beta', 'Gamma'], values)
819 820 # gives error in ElementTree
821 - def test_comment_empty(self):
822 Element = self.etree.Element 823 Comment = self.etree.Comment 824 825 a = Element('a') 826 a.append(Comment()) 827 self.assertEquals( 828 '<a><!----></a>', 829 self._writeElement(a))
830 831 # ElementTree ignores comments
832 - def test_comment_parse_empty(self):
833 ElementTree = self.etree.ElementTree 834 tostring = self.etree.tostring 835 836 xml = '<a><b/><!----><c/></a>' 837 f = StringIO(xml) 838 doc = ElementTree(file=f) 839 a = doc.getroot() 840 self.assertEquals( 841 '', 842 a[1].text) 843 self.assertEquals( 844 xml, 845 tostring(a))
846 847 # ElementTree ignores comments
848 - def test_comment_no_proxy_yet(self):
849 ElementTree = self.etree.ElementTree 850 851 f = StringIO('<a><b></b><!-- hoi --><c></c></a>') 852 doc = ElementTree(file=f) 853 a = doc.getroot() 854 self.assertEquals( 855 ' hoi ', 856 a[1].text)
857 858 # ElementTree adds whitespace around comments
859 - def test_comment_text(self):
860 Element = self.etree.Element 861 Comment = self.etree.Comment 862 tostring = self.etree.tostring 863 864 a = Element('a') 865 a.append(Comment('foo')) 866 self.assertEquals( 867 '<a><!--foo--></a>', 868 tostring(a)) 869 870 a[0].text = "TEST" 871 self.assertEquals( 872 '<a><!--TEST--></a>', 873 tostring(a))
874 875 # ElementTree adds whitespace around comments
876 - def test_comment_whitespace(self):
877 Element = self.etree.Element 878 Comment = self.etree.Comment 879 tostring = self.etree.tostring 880 881 a = Element('a') 882 a.append(Comment(' foo ')) 883 self.assertEquals( 884 '<a><!-- foo --></a>', 885 tostring(a))
886 887 # does not raise an exception in ElementTree
888 - def test_comment_immutable(self):
889 Element = self.etree.Element 890 Comment = self.etree.Comment 891 892 c = Comment() 893 el = Element('myel') 894 895 self.assertRaises(TypeError, c.append, el) 896 self.assertRaises(TypeError, c.insert, 0, el) 897 self.assertRaises(TypeError, c.set, "myattr", "test")
898 899 # test weird dictionary interaction leading to segfault previously
900 - def test_weird_dict_interaction(self):
901 root = self.etree.Element('root') 902 add = self.etree.ElementTree(file=StringIO('<foo>Foo</foo>')) 903 root.append(self.etree.Element('baz'))
904 905 # test passing 'None' to dump
906 - def test_dump_none(self):
907 self.assertRaises(TypeError, etree.dump, None)
908
909 - def test_prefix(self):
910 ElementTree = self.etree.ElementTree 911 912 f = StringIO('<a xmlns:foo="http://www.infrae.com/ns/1"><foo:b/></a>') 913 doc = ElementTree(file=f) 914 a = doc.getroot() 915 self.assertEquals( 916 None, 917 a.prefix) 918 self.assertEquals( 919 'foo', 920 a[0].prefix)
921
922 - def test_prefix_default_ns(self):
923 ElementTree = self.etree.ElementTree 924 925 f = StringIO('<a xmlns="http://www.infrae.com/ns/1"><b/></a>') 926 doc = ElementTree(file=f) 927 a = doc.getroot() 928 self.assertEquals( 929 None, 930 a.prefix) 931 self.assertEquals( 932 None, 933 a[0].prefix)
934
935 - def test_getparent(self):
936 Element = self.etree.Element 937 SubElement = self.etree.SubElement 938 939 a = Element('a') 940 b = SubElement(a, 'b') 941 c = SubElement(a, 'c') 942 d = SubElement(b, 'd') 943 self.assertEquals( 944 None, 945 a.getparent()) 946 self.assertEquals( 947 a, 948 b.getparent()) 949 self.assertEquals( 950 b.getparent(), 951 c.getparent()) 952 self.assertEquals( 953 b, 954 d.getparent())
955
956 - def test_iterchildren(self):
957 XML = self.etree.XML 958 959 root = XML('<doc><one/><two>Two</two>Hm<three/></doc>') 960 result = [] 961 for el in root.iterchildren(): 962 result.append(el.tag) 963 self.assertEquals(['one', 'two', 'three'], result)
964
965 - def test_iterchildren_reversed(self):
966 XML = self.etree.XML 967 968 root = XML('<doc><one/><two>Two</two>Hm<three/></doc>') 969 result = [] 970 for el in root.iterchildren(reversed=True): 971 result.append(el.tag) 972 self.assertEquals(['three', 'two', 'one'], result)
973
974 - def test_iterchildren_tag(self):
975 XML = self.etree.XML 976 977 root = XML('<doc><one/><two>Two</two>Hm<two>Bla</two></doc>') 978 result = [] 979 for el in root.iterchildren(tag='two'): 980 result.append(el.text) 981 self.assertEquals(['Two', 'Bla'], result)
982
983 - def test_iterchildren_tag_reversed(self):
984 XML = self.etree.XML 985 986 root = XML('<doc><one/><two>Two</two>Hm<two>Bla</two></doc>') 987 result = [] 988 for el in root.iterchildren(reversed=True, tag='two'): 989 result.append(el.text) 990 self.assertEquals(['Bla', 'Two'], result)
991
992 - def test_iterancestors(self):
993 Element = self.etree.Element 994 SubElement = self.etree.SubElement 995 996 a = Element('a') 997 b = SubElement(a, 'b') 998 c = SubElement(a, 'c') 999 d = SubElement(b, 'd') 1000 self.assertEquals( 1001 [], 1002 list(a.iterancestors())) 1003 self.assertEquals( 1004 [a], 1005 list(b.iterancestors())) 1006 self.assertEquals( 1007 a, 1008 c.iterancestors().next()) 1009 self.assertEquals( 1010 [b, a], 1011 list(d.iterancestors()))
1012
1013 - def test_iterancestors_tag(self):
1014 Element = self.etree.Element 1015 SubElement = self.etree.SubElement 1016 1017 a = Element('a') 1018 b = SubElement(a, 'b') 1019 c = SubElement(a, 'c') 1020 d = SubElement(b, 'd') 1021 self.assertEquals( 1022 [a], 1023 list(d.iterancestors(tag='a')))
1024
1025 - def test_iterdescendants(self):
1026 Element = self.etree.Element 1027 SubElement = self.etree.SubElement 1028 1029 a = Element('a') 1030 b = SubElement(a, 'b') 1031 c = SubElement(a, 'c') 1032 d = SubElement(b, 'd') 1033 e = SubElement(c, 'e') 1034 1035 self.assertEquals( 1036 [b, d, c, e], 1037 list(a.iterdescendants())) 1038 self.assertEquals( 1039 [], 1040 list(d.iterdescendants()))
1041
1042 - def test_iterdescendants_tag(self):
1043 Element = self.etree.Element 1044 SubElement = self.etree.SubElement 1045 1046 a = Element('a') 1047 b = SubElement(a, 'b') 1048 c = SubElement(a, 'c') 1049 d = SubElement(b, 'd') 1050 e = SubElement(c, 'e') 1051 1052 self.assertEquals( 1053 [], 1054 list(a.iterdescendants('a'))) 1055 a2 = SubElement(e, 'a') 1056 self.assertEquals( 1057 [a2], 1058 list(a.iterdescendants('a'))) 1059 self.assertEquals( 1060 [a2], 1061 list(c.iterdescendants('a')))
1062
1063 - def test_getroottree(self):
1064 Element = self.etree.Element 1065 SubElement = self.etree.SubElement 1066 1067 a = Element('a') 1068 b = SubElement(a, 'b') 1069 c = SubElement(a, 'c') 1070 d = SubElement(b, 'd') 1071 self.assertEquals( 1072 a, 1073 a.getroottree().getroot()) 1074 self.assertEquals( 1075 a, 1076 b.getroottree().getroot()) 1077 self.assertEquals( 1078 a, 1079 d.getroottree().getroot())
1080
1081 - def test_getnext(self):
1082 Element = self.etree.Element 1083 SubElement = self.etree.SubElement 1084 1085 a = Element('a') 1086 b = SubElement(a, 'b') 1087 c = SubElement(a, 'c') 1088 self.assertEquals( 1089 None, 1090 a.getnext()) 1091 self.assertEquals( 1092 c, 1093 b.getnext()) 1094 self.assertEquals( 1095 None, 1096 c.getnext())
1097
1098 - def test_getprevious(self):
1099 Element = self.etree.Element 1100 SubElement = self.etree.SubElement 1101 1102 a = Element('a') 1103 b = SubElement(a, 'b') 1104 c = SubElement(a, 'c') 1105 d = SubElement(b, 'd') 1106 self.assertEquals( 1107 None, 1108 a.getprevious()) 1109 self.assertEquals( 1110 b, 1111 c.getprevious()) 1112 self.assertEquals( 1113 None, 1114 b.getprevious())
1115
1116 - def test_itersiblings(self):
1117 Element = self.etree.Element 1118 SubElement = self.etree.SubElement 1119 1120 a = Element('a') 1121 b = SubElement(a, 'b') 1122 c = SubElement(a, 'c') 1123 d = SubElement(b, 'd') 1124 self.assertEquals( 1125 [], 1126 list(a.itersiblings())) 1127 self.assertEquals( 1128 [c], 1129 list(b.itersiblings())) 1130 self.assertEquals( 1131 c, 1132 b.itersiblings().next()) 1133 self.assertEquals( 1134 [], 1135 list(c.itersiblings())) 1136 self.assertEquals( 1137 [b], 1138 list(c.itersiblings(preceding=True))) 1139 self.assertEquals( 1140 [], 1141 list(b.itersiblings(preceding=True)))
1142
1143 - def test_itersiblings_tag(self):
1144 Element = self.etree.Element 1145 SubElement = self.etree.SubElement 1146 1147 a = Element('a') 1148 b = SubElement(a, 'b') 1149 c = SubElement(a, 'c') 1150 d = SubElement(b, 'd') 1151 self.assertEquals( 1152 [], 1153 list(a.itersiblings(tag='XXX'))) 1154 self.assertEquals( 1155 [c], 1156 list(b.itersiblings(tag='c'))) 1157 self.assertEquals( 1158 [b], 1159 list(c.itersiblings(preceding=True, tag='b'))) 1160 self.assertEquals( 1161 [], 1162 list(c.itersiblings(preceding=True, tag='c')))
1163
1164 - def test_parseid(self):
1165 parseid = self.etree.parseid 1166 XML = self.etree.XML 1167 xml_text = ''' 1168 <!DOCTYPE document [ 1169 <!ELEMENT document (h1,p)*> 1170 <!ELEMENT h1 (#PCDATA)> 1171 <!ATTLIST h1 myid ID #REQUIRED> 1172 <!ELEMENT p (#PCDATA)> 1173 <!ATTLIST p someid ID #REQUIRED> 1174 ]> 1175 <document> 1176 <h1 myid="chapter1">...</h1> 1177 <p id="note1" class="note">...</p> 1178 <p>Regular paragraph.</p> 1179 <p xml:id="xmlid">XML:ID paragraph.</p> 1180 <p someid="warn1" class="warning">...</p> 1181 </document> 1182 ''' 1183 1184 tree, dic = parseid(StringIO(xml_text)) 1185 root = tree.getroot() 1186 root2 = XML(xml_text) 1187 self.assertEquals(self._writeElement(root), 1188 self._writeElement(root2)) 1189 expected = { 1190 "chapter1" : root[0], 1191 "xmlid" : root[3], 1192 "warn1" : root[4] 1193 } 1194 self.assert_("chapter1" in dic) 1195 self.assert_("warn1" in dic) 1196 self.assert_("xmlid" in dic) 1197 self._checkIDDict(dic, expected)
1198
1199 - def test_XMLDTDID(self):
1200 XMLDTDID = self.etree.XMLDTDID 1201 XML = self.etree.XML 1202 xml_text = ''' 1203 <!DOCTYPE document [ 1204 <!ELEMENT document (h1,p)*> 1205 <!ELEMENT h1 (#PCDATA)> 1206 <!ATTLIST h1 myid ID #REQUIRED> 1207 <!ELEMENT p (#PCDATA)> 1208 <!ATTLIST p someid ID #REQUIRED> 1209 ]> 1210 <document> 1211 <h1 myid="chapter1">...</h1> 1212 <p id="note1" class="note">...</p> 1213 <p>Regular paragraph.</p> 1214 <p xml:id="xmlid">XML:ID paragraph.</p> 1215 <p someid="warn1" class="warning">...</p> 1216 </document> 1217 ''' 1218 1219 root, dic = XMLDTDID(xml_text) 1220 root2 = XML(xml_text) 1221 self.assertEquals(self._writeElement(root), 1222 self._writeElement(root2)) 1223 expected = { 1224 "chapter1" : root[0], 1225 "xmlid" : root[3], 1226 "warn1" : root[4] 1227 } 1228 self.assert_("chapter1" in dic) 1229 self.assert_("warn1" in dic) 1230 self.assert_("xmlid" in dic) 1231 self._checkIDDict(dic, expected)
1232
1233 - def test_XMLDTDID_empty(self):
1234 XMLDTDID = self.etree.XMLDTDID 1235 XML = self.etree.XML 1236 xml_text = ''' 1237 <document> 1238 <h1 myid="chapter1">...</h1> 1239 <p id="note1" class="note">...</p> 1240 <p>Regular paragraph.</p> 1241 <p someid="warn1" class="warning">...</p> 1242 </document> 1243 ''' 1244 1245 root, dic = XMLDTDID(xml_text) 1246 root2 = XML(xml_text) 1247 self.assertEquals(self._writeElement(root), 1248 self._writeElement(root2)) 1249 expected = {} 1250 self._checkIDDict(dic, expected)
1251
1252 - def _checkIDDict(self, dic, expected):
1253 self.assertEquals(dic, expected) 1254 self.assertEquals(len(dic), 1255 len(expected)) 1256 self.assertEquals(sorted(dic.items()), 1257 sorted(expected.items())) 1258 self.assertEquals(sorted(dic.iteritems()), 1259 sorted(expected.iteritems())) 1260 self.assertEquals(sorted(dic.keys()), 1261 sorted(expected.keys())) 1262 self.assertEquals(sorted(dic.iterkeys()), 1263 sorted(expected.iterkeys())) 1264 self.assertEquals(sorted(dic.values()), 1265 sorted(expected.values())) 1266 self.assertEquals(sorted(dic.itervalues()), 1267 sorted(expected.itervalues()))
1268
1269 - def test_namespaces(self):
1270 etree = self.etree 1271 1272 r = {'foo': 'http://ns.infrae.com/foo'} 1273 e = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r) 1274 self.assertEquals( 1275 'foo', 1276 e.prefix) 1277 self.assertEquals( 1278 '<foo:bar xmlns:foo="http://ns.infrae.com/foo"></foo:bar>', 1279 self._writeElement(e))
1280
1281 - def test_namespaces_default(self):
1282 etree = self.etree 1283 1284 r = {None: 'http://ns.infrae.com/foo'} 1285 e = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r) 1286 self.assertEquals( 1287 None, 1288 e.prefix) 1289 self.assertEquals( 1290 '{http://ns.infrae.com/foo}bar', 1291 e.tag) 1292 self.assertEquals( 1293 '<bar xmlns="http://ns.infrae.com/foo"></bar>', 1294 self._writeElement(e))
1295
1296 - def test_namespaces_default_and_attr(self):
1297 etree = self.etree 1298 1299 r = {None: 'http://ns.infrae.com/foo', 1300 'hoi': 'http://ns.infrae.com/hoi'} 1301 e = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r) 1302 e.set('{http://ns.infrae.com/hoi}test', 'value') 1303 self.assertEquals( 1304 '<bar xmlns="http://ns.infrae.com/foo" xmlns:hoi="http://ns.infrae.com/hoi" hoi:test="value"></bar>', 1305 self._writeElement(e))
1306
1307 - def test_namespaces_elementtree(self):
1308 etree = self.etree 1309 r = {None: 'http://ns.infrae.com/foo', 1310 'hoi': 'http://ns.infrae.com/hoi'} 1311 e = etree.Element('{http://ns.infrae.com/foo}z', nsmap=r) 1312 tree = etree.ElementTree(element=e) 1313 etree.SubElement(e, '{http://ns.infrae.com/hoi}x') 1314 self.assertEquals( 1315 '<z xmlns="http://ns.infrae.com/foo" xmlns:hoi="http://ns.infrae.com/hoi"><hoi:x></hoi:x></z>', 1316 self._writeElement(e))
1317
1318 - def test_namespaces_default_copy_element(self):
1319 etree = self.etree 1320 1321 r = {None: 'http://ns.infrae.com/foo'} 1322 e1 = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r) 1323 e2 = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r) 1324 1325 e1.append(e2) 1326 1327 self.assertEquals( 1328 None, 1329 e1.prefix) 1330 self.assertEquals( 1331 None, 1332 e1[0].prefix) 1333 self.assertEquals( 1334 '{http://ns.infrae.com/foo}bar', 1335 e1.tag) 1336 self.assertEquals( 1337 '{http://ns.infrae.com/foo}bar', 1338 e1[0].tag)
1339
1340 - def test_namespaces_copy_element(self):
1341 etree = self.etree 1342 1343 r = {None: 'http://ns.infrae.com/BAR'} 1344 e1 = etree.Element('{http://ns.infrae.com/BAR}bar', nsmap=r) 1345 e2 = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r) 1346 1347 e1.append(e2) 1348 1349 self.assertEquals( 1350 None, 1351 e1.prefix) 1352 self.assertNotEquals( 1353 None, 1354 e2.prefix) 1355 self.assertEquals( 1356 '{http://ns.infrae.com/BAR}bar', 1357 e1.tag) 1358 self.assertEquals( 1359 '{http://ns.infrae.com/foo}bar', 1360 e2.tag)
1361
1362 - def test_namespaces_reuse_after_move(self):
1363 ns_href = "http://a.b.c" 1364 one = self.etree.fromstring( 1365 '<foo><bar xmlns:ns="%s"><ns:baz/></bar></foo>' % ns_href) 1366 baz = one[0][0] 1367 1368 two = self.etree.fromstring( 1369 '<root xmlns:ns="%s"/>' % ns_href) 1370 two.append(baz) 1371 del one # make sure the source document is deallocated 1372 1373 self.assertEquals('{%s}baz' % ns_href, baz.tag) 1374 self.assertEquals( 1375 '<root xmlns:ns="%s"><ns:baz/></root>' % ns_href, 1376 self.etree.tostring(two))
1377
1378 - def test_namespaces_after_serialize(self):
1379 parse = self.etree.parse 1380 tostring = self.etree.tostring 1381 1382 ns_href = "http://a.b.c" 1383 one = parse( 1384 StringIO('<foo><bar xmlns:ns="%s"><ns:baz/></bar></foo>' % ns_href)) 1385 baz = one.getroot()[0][0] 1386 1387 parsed = parse(StringIO( tostring(baz) )).getroot() 1388 self.assertEquals('{%s}baz' % ns_href, parsed.tag)
1389
1390 - def test_element_nsmap(self):
1391 etree = self.etree 1392 1393 r = {None: 'http://ns.infrae.com/foo', 1394 'hoi': 'http://ns.infrae.com/hoi'} 1395 e = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r) 1396 self.assertEquals( 1397 r, 1398 e.nsmap)
1399
1400 - def test_subelement_nsmap(self):
1401 etree = self.etree 1402 1403 re = {None: 'http://ns.infrae.com/foo', 1404 'hoi': 'http://ns.infrae.com/hoi'} 1405 e = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=re) 1406 1407 rs = {None: 'http://ns.infrae.com/honk', 1408 'top': 'http://ns.infrae.com/top'} 1409 s = etree.SubElement(e, '{http://ns.infrae.com/honk}bar', nsmap=rs) 1410 1411 r = re.copy() 1412 r.update(rs) 1413 self.assertEquals( 1414 re, 1415 e.nsmap) 1416 self.assertEquals( 1417 r, 1418 s.nsmap)
1419
1420 - def test_getiterator_filter_namespace(self):
1421 Element = self.etree.Element 1422 SubElement = self.etree.SubElement 1423 1424 a = Element('{a}a') 1425 b = SubElement(a, '{a}b') 1426 c = SubElement(a, '{a}c') 1427 d = SubElement(b, '{b}d') 1428 e = SubElement(c, '{a}e') 1429 f = SubElement(c, '{b}f') 1430 1431 self.assertEquals( 1432 [a], 1433 list(a.getiterator('{a}a'))) 1434 self.assertEquals( 1435 [], 1436 list(a.getiterator('{b}a'))) 1437 self.assertEquals( 1438 [], 1439 list(a.getiterator('a'))) 1440 self.assertEquals( 1441 [f], 1442 list(c.getiterator('{b}*'))) 1443 self.assertEquals( 1444 [d, f], 1445 list(a.getiterator('{b}*')))
1446
1447 - def test_getiterator_filter_entities(self):
1448 Element = self.etree.Element 1449 Entity = self.etree.Entity 1450 SubElement = self.etree.SubElement 1451 1452 a = Element('a') 1453 b = SubElement(a, 'b') 1454 entity_b = Entity("TEST-b") 1455 b.append(entity_b) 1456 1457 self.assertEquals( 1458 [entity_b], 1459 list(a.getiterator(Entity))) 1460 1461 entity_a = Entity("TEST-a") 1462 a.append(entity_a) 1463 1464 self.assertEquals( 1465 [entity_b, entity_a], 1466 list(a.getiterator(Entity))) 1467 1468 self.assertEquals( 1469 [entity_b], 1470 list(b.getiterator(Entity)))
1471
1472 - def test_getiterator_filter_element(self):
1473 Element = self.etree.Element 1474 Comment = self.etree.Comment 1475 PI = self.etree.PI 1476 SubElement = self.etree.SubElement 1477 1478 a = Element('a') 1479 b = SubElement(a, 'b') 1480 a.append(Comment("test")) 1481 a.append(PI("pi", "content")) 1482 c = SubElement(a, 'c') 1483 1484 self.assertEquals( 1485 [a, b, c], 1486 list(a.getiterator(Element)))
1487
1488 - def test_getiterator_filter_all_comment_pi(self):
1489 # ElementTree iterates over everything here 1490 Element = self.etree.Element 1491 Comment = self.etree.Comment 1492 PI = self.etree.PI 1493 SubElement = self.etree.SubElement 1494 1495 a = Element('a') 1496 b = SubElement(a, 'b') 1497 a.append(Comment("test")) 1498 a.append(PI("pi", "content")) 1499 c = SubElement(a, 'c') 1500 1501 self.assertEquals( 1502 [a, b, c], 1503 list(a.getiterator('*')))
1504
1505 - def test_itertext(self):
1506 # ET 1.3+ 1507 XML = self.etree.XML 1508 root = XML("<root>RTEXT<a></a>ATAIL<b/><c>CTEXT</c>CTAIL</root>") 1509 1510 text = list(root.itertext()) 1511 self.assertEquals(["RTEXT", "ATAIL", "CTEXT", "CTAIL"], 1512 text)
1513
1514 - def test_itertext_child(self):
1515 # ET 1.3+ 1516 XML = self.etree.XML 1517 root = XML("<root>RTEXT<a></a>ATAIL<b/><c>CTEXT</c>CTAIL</root>") 1518 1519 text = list(root[2].itertext()) 1520 self.assertEquals(["CTEXT"], 1521 text)
1522
1523 - def test_elementtree_find_qname(self):
1524 XML = self.etree.XML 1525 ElementTree = self.etree.ElementTree 1526 QName = self.etree.QName 1527 tree = ElementTree(XML('<a><b><c/></b><b/><c><b/></c></a>')) 1528 self.assertEquals(tree.find(QName("c")), tree.getroot()[2])
1529
1530 - def test_elementtree_findall_qname(self):
1531 XML = self.etree.XML 1532 ElementTree = self.etree.ElementTree 1533 QName = self.etree.QName 1534 tree = ElementTree(XML('<a><b><c/></b><b/><c><b/></c></a>')) 1535 self.assertEquals(len(list(tree.findall(QName("c")))), 1)
1536
1537 - def test_elementtree_findall_ns_qname(self):
1538 XML = self.etree.XML 1539 ElementTree = self.etree.ElementTree 1540 QName = self.etree.QName 1541 tree = ElementTree(XML( 1542 '<a xmlns:x="X" xmlns:y="Y"><x:b><c/></x:b><b/><c><x:b/><b/></c><b/></a>')) 1543 self.assertEquals(len(list(tree.findall(QName("b")))), 2) 1544 self.assertEquals(len(list(tree.findall(QName("X", "b")))), 1)
1545
1546 - def test_findall_ns(self):
1547 XML = self.etree.XML 1548 root = XML('<a xmlns:x="X" xmlns:y="Y"><x:b><c/></x:b><b/><c><x:b/><b/></c><b/></a>') 1549 self.assertEquals(len(root.findall(".//{X}b")), 2) 1550 self.assertEquals(len(root.findall(".//{X}*")), 2) 1551 self.assertEquals(len(root.findall(".//b")), 3)
1552
1553 - def test_index(self):
1554 etree = self.etree 1555 e = etree.Element('foo') 1556 for i in range(10): 1557 etree.SubElement(e, 'a%s' % i) 1558 for i in range(10): 1559 self.assertEquals( 1560 i, 1561 e.index(e[i])) 1562 self.assertEquals( 1563 3, e.index(e[3], 3)) 1564 self.assertRaises( 1565 ValueError, e.index, e[3], 4) 1566 self.assertRaises( 1567 ValueError, e.index, e[3], 0, 2) 1568 self.assertRaises( 1569 ValueError, e.index, e[8], 0, -3) 1570 self.assertRaises( 1571 ValueError, e.index, e[8], -5, -3) 1572 self.assertEquals( 1573 8, e.index(e[8], 0, -1)) 1574 self.assertEquals( 1575 8, e.index(e[8], -12, -1)) 1576 self.assertEquals( 1577 0, e.index(e[0], -12, -1))
1578
1579 - def test_replace(self):
1580 etree = self.etree 1581 e = etree.Element('foo') 1582 for i in range(10): 1583 el = etree.SubElement(e, 'a%s' % i) 1584 el.text = "text%d" % i 1585 el.tail = "tail%d" % i 1586 1587 child0 = e[0] 1588 child1 = e[1] 1589 child2 = e[2] 1590 1591 e.replace(e[0], e[1]) 1592 self.assertEquals( 1593 9, len(e)) 1594 self.assertEquals( 1595 child1, e[0]) 1596 self.assertEquals( 1597 child1.text, "text1") 1598 self.assertEquals( 1599 child1.tail, "tail1") 1600 self.assertEquals( 1601 child0.tail, "tail0") 1602 self.assertEquals( 1603 child2, e[1]) 1604 1605 e.replace(e[-1], e[0]) 1606 self.assertEquals( 1607 child1, e[-1]) 1608 self.assertEquals( 1609 child1.text, "text1") 1610 self.assertEquals( 1611 child1.tail, "tail1") 1612 self.assertEquals( 1613 child2, e[0])
1614
1615 - def test_replace_new(self):
1616 etree = self.etree 1617 e = etree.Element('foo') 1618 for i in range(10): 1619 etree.SubElement(e, 'a%s' % i) 1620 1621 new_element = etree.Element("test") 1622 new_element.text = "TESTTEXT" 1623 new_element.tail = "TESTTAIL" 1624 child1 = e[1] 1625 e.replace(e[0], new_element) 1626 self.assertEquals( 1627 new_element, e[0]) 1628 self.assertEquals( 1629 "TESTTEXT", 1630 e[0].text) 1631 self.assertEquals( 1632 "TESTTAIL", 1633 e[0].tail) 1634 self.assertEquals( 1635 child1, e[1])
1636
1637 - def test_setslice_all_empty_reversed(self):
1638 Element = self.etree.Element 1639 SubElement = self.etree.SubElement 1640 1641 a = Element('a') 1642 1643 e = Element('e') 1644 f = Element('f') 1645 g = Element('g') 1646 1647 s = [e, f, g] 1648 a[::-1] = s 1649 self.assertEquals( 1650 [g, f, e], 1651 list(a))
1652
1653 - def test_setslice_step(self):
1654 Element = self.etree.Element 1655 SubElement = self.etree.SubElement 1656 1657 a = Element('a') 1658 b = SubElement(a, 'b') 1659 c = SubElement(a, 'c') 1660 d = SubElement(a, 'd') 1661 e = SubElement(a, 'e') 1662 1663 x = Element('x') 1664 y = Element('y') 1665 1666 a[1::2] = [x, y] 1667 self.assertEquals( 1668 [b, x, d, y], 1669 list(a))
1670
1671 - def test_setslice_step_negative(self):
1672 Element = self.etree.Element 1673 SubElement = self.etree.SubElement 1674 1675 a = Element('a') 1676 b = SubElement(a, 'b') 1677 c = SubElement(a, 'c') 1678 d = SubElement(a, 'd') 1679 e = SubElement(a, 'e') 1680 1681 x = Element('x') 1682 y = Element('y') 1683 1684 a[1::-1] = [x, y] 1685 self.assertEquals( 1686 [y, x, d, e], 1687 list(a))
1688
1689 - def test_setslice_step_negative2(self):
1690 Element = self.etree.Element 1691 SubElement = self.etree.SubElement 1692 1693 a = Element('a') 1694 b = SubElement(a, 'b') 1695 c = SubElement(a, 'c') 1696 d = SubElement(a, 'd') 1697 e = SubElement(a, 'e') 1698 1699 x = Element('x') 1700 y = Element('y') 1701 1702 a[::-2] = [x, y] 1703 self.assertEquals( 1704 [b, y, d, x], 1705 list(a))
1706
1707 - def test_setslice_step_overrun(self):
1708 Element = self.etree.Element 1709 SubElement = self.etree.SubElement 1710 try: 1711 slice 1712 except NameError: 1713 print "slice() not found" 1714 return 1715 1716 a = Element('a') 1717 b = SubElement(a, 'b') 1718 c = SubElement(a, 'c') 1719 d = SubElement(a, 'd') 1720 e = SubElement(a, 'e') 1721 1722 x = Element('x') 1723 y = Element('y') 1724 z = Element('z') 1725 1726 self.assertRaises( 1727 ValueError, 1728 operator.setitem, a, slice(1,None,2), [x, y, z]) 1729 1730 self.assertEquals( 1731 [b, c, d, e], 1732 list(a))
1733
1734 - def test_extend(self):
1735 etree = self.etree 1736 root = etree.Element('foo') 1737 for i in range(3): 1738 element = etree.SubElement(root, 'a%s' % i) 1739 element.text = "text%d" % i 1740 element.tail = "tail%d" % i 1741 1742 elements = [] 1743 for i in range(3): 1744 new_element = etree.Element("test%s" % i) 1745 new_element.text = "TEXT%s" % i 1746 new_element.tail = "TAIL%s" % i 1747 elements.append(new_element) 1748 1749 root.extend(elements) 1750 1751 self.assertEquals( 1752 ["a0", "a1", "a2", "test0", "test1", "test2"], 1753 [ el.tag for el in root ]) 1754 self.assertEquals( 1755 ["text0", "text1", "text2", "TEXT0", "TEXT1", "TEXT2"], 1756 [ el.text for el in root ]) 1757 self.assertEquals( 1758 ["tail0", "tail1", "tail2", "TAIL0", "TAIL1", "TAIL2"], 1759 [ el.tail for el in root ])
1760
1761 - def test_sourceline_XML(self):
1762 XML = self.etree.XML 1763 root = XML('''<?xml version="1.0"?> 1764 <root><test> 1765 1766 <bla/></test> 1767 </root> 1768 ''') 1769 1770 self.assertEquals( 1771 [2, 2, 4], 1772 [ el.sourceline for el in root.getiterator() ])
1773
1774 - def test_sourceline_parse(self):
1775 parse = self.etree.parse 1776 tree = parse(fileInTestDir('include/test_xinclude.xml')) 1777 1778 self.assertEquals( 1779 [1, 2, 3], 1780 [ el.sourceline for el in tree.getiterator() ])
1781
1782 - def test_sourceline_iterparse_end(self):
1783 iterparse = self.etree.iterparse 1784 lines = [ el.sourceline for (event, el) in 1785 iterparse(fileInTestDir('include/test_xinclude.xml')) ] 1786 1787 self.assertEquals( 1788 [2, 3, 1], 1789 lines)
1790
1791 - def test_sourceline_iterparse_start(self):
1792 iterparse = self.etree.iterparse 1793 lines = [ el.sourceline for (event, el) in 1794 iterparse(fileInTestDir('include/test_xinclude.xml'), 1795 events=("start",)) ] 1796 1797 self.assertEquals( 1798 [1, 2, 3], 1799 lines)
1800
1801 - def test_sourceline_element(self):
1802 Element = self.etree.Element 1803 SubElement = self.etree.SubElement 1804 el = Element("test") 1805 self.assertEquals(None, el.sourceline) 1806 1807 child = SubElement(el, "test") 1808 self.assertEquals(None, el.sourceline) 1809 self.assertEquals(None, child.sourceline)
1810
1811 - def test_XML_base_url_docinfo(self):
1812 etree = self.etree 1813 root = etree.XML("<root/>", base_url="http://no/such/url") 1814 docinfo = root.getroottree().docinfo 1815 self.assertEquals(docinfo.URL, "http://no/such/url")
1816
1817 - def test_parse_stringio_base_url(self):
1818 etree = self.etree 1819 tree = etree.parse(StringIO("<root/>"), base_url="http://no/such/url") 1820 docinfo = tree.docinfo 1821 self.assertEquals(docinfo.URL, "http://no/such/url")
1822
1823 - def test_parse_base_url_docinfo(self):
1824 etree = self.etree 1825 tree = etree.parse(fileInTestDir('include/test_xinclude.xml'), 1826 base_url="http://no/such/url") 1827 docinfo = tree.docinfo 1828 self.assertEquals(docinfo.URL, "http://no/such/url")
1829
1830 - def test_HTML_base_url_docinfo(self):
1831 etree = self.etree 1832 root = etree.HTML("<html/>", base_url="http://no/such/url") 1833 docinfo = root.getroottree().docinfo 1834 self.assertEquals(docinfo.URL, "http://no/such/url")
1835
1836 - def test_docinfo_public(self):
1837 etree = self.etree 1838 xml_header = '<?xml version="1.0" encoding="ascii"?>' 1839 pub_id = "-//W3C//DTD XHTML 1.0 Transitional//EN" 1840 sys_id = "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 1841 doctype_string = '<!DOCTYPE html PUBLIC "%s" "%s">' % (pub_id, sys_id) 1842 1843 xml = xml_header + doctype_string + '<html><body></body></html>' 1844 1845 tree = etree.parse(StringIO(xml)) 1846 docinfo = tree.docinfo 1847 self.assertEquals(docinfo.encoding, "ascii") 1848 self.assertEquals(docinfo.xml_version, "1.0") 1849 self.assertEquals(docinfo.public_id, pub_id) 1850 self.assertEquals(docinfo.system_url, sys_id) 1851 self.assertEquals(docinfo.root_name, 'html') 1852 self.assertEquals(docinfo.doctype, doctype_string)
1853
1854 - def test_docinfo_system(self):
1855 etree = self.etree 1856 xml_header = '<?xml version="1.0" encoding="UTF-8"?>' 1857 sys_id = "some.dtd" 1858 doctype_string = '<!DOCTYPE html SYSTEM "%s">' % sys_id 1859 xml = xml_header + doctype_string + '<html><body></body></html>' 1860 1861 tree = etree.parse(StringIO(xml)) 1862 docinfo = tree.docinfo 1863 self.assertEquals(docinfo.encoding, "UTF-8") 1864 self.assertEquals(docinfo.xml_version, "1.0") 1865 self.assertEquals(docinfo.public_id, None) 1866 self.assertEquals(docinfo.system_url, sys_id) 1867 self.assertEquals(docinfo.root_name, 'html') 1868 self.assertEquals(docinfo.doctype, doctype_string)
1869
1870 - def test_docinfo_empty(self):
1871 etree = self.etree 1872 xml = '<html><body></body></html>' 1873 tree = etree.parse(StringIO(xml)) 1874 docinfo = tree.docinfo 1875 self.assertEquals(docinfo.encoding, None) 1876 self.assertEquals(docinfo.xml_version, "1.0") 1877 self.assertEquals(docinfo.public_id, None) 1878 self.assertEquals(docinfo.system_url, None) 1879 self.assertEquals(docinfo.root_name, 'html') 1880 self.assertEquals(docinfo.doctype, '')
1881
1882 - def test_dtd_io(self):
1883 # check that DTDs that go in also go back out 1884 xml = '''\ 1885 <!DOCTYPE test SYSTEM "test.dtd" [ 1886 <!ENTITY entity "tasty"> 1887 <!ELEMENT test (a)> 1888 <!ELEMENT a (#PCDATA)> 1889 ]> 1890 <test><a>test-test</a></test>\ 1891 ''' 1892 tree = self.etree.parse(StringIO(xml)) 1893 self.assertEqual(self.etree.tostring(tree).replace(" ", ""), 1894 xml.replace(" ", ""))
1895
1896 - def test_byte_zero(self):
1897 Element = self.etree.Element 1898 1899 a = Element('a') 1900 self.assertRaises(AssertionError, setattr, a, "text", 'ha\0ho') 1901 self.assertRaises(AssertionError, setattr, a, "tail", 'ha\0ho') 1902 1903 self.assertRaises(AssertionError, Element, 'ha\0ho')
1904
1905 - def test_unicode_byte_zero(self):
1906 Element = self.etree.Element 1907 1908 a = Element('a') 1909 self.assertRaises(AssertionError, setattr, a, "text", u'ha\0ho') 1910 self.assertRaises(AssertionError, setattr, a, "tail", u'ha\0ho') 1911 1912 self.assertRaises(AssertionError, Element, u'ha\0ho')
1913
1914 - def test_byte_invalid(self):
1915 Element = self.etree.Element 1916 1917 a = Element('a') 1918 self.assertRaises(AssertionError, setattr, a, "text", 'ha\x07ho') 1919 self.assertRaises(AssertionError, setattr, a, "text", 'ha\x02ho') 1920 1921 self.assertRaises(AssertionError, setattr, a, "tail", 'ha\x07ho') 1922 self.assertRaises(AssertionError, setattr, a, "tail", 'ha\x02ho') 1923 1924 self.assertRaises(AssertionError, Element, 'ha\x07ho') 1925 self.assertRaises(AssertionError, Element, 'ha\x02ho')
1926
1927 - def test_unicode_byte_invalid(self):
1928 Element = self.etree.Element 1929 1930 a = Element('a') 1931 self.assertRaises(AssertionError, setattr, a, "text", u'ha\x07ho') 1932 self.assertRaises(AssertionError, setattr, a, "text", u'ha\x02ho') 1933 1934 self.assertRaises(AssertionError, setattr, a, "tail", u'ha\x07ho') 1935 self.assertRaises(AssertionError, setattr, a, "tail", u'ha\x02ho') 1936 1937 self.assertRaises(AssertionError, Element, u'ha\x07ho') 1938 self.assertRaises(AssertionError, Element, u'ha\x02ho')
1939
1940 - def test_encoding_tostring_utf16(self):
1941 # ElementTree fails to serialize this 1942 tostring = self.etree.tostring 1943 Element = self.etree.Element 1944 SubElement = self.etree.SubElement 1945 1946 a = Element('a') 1947 b = SubElement(a, 'b') 1948 c = SubElement(a, 'c') 1949 1950 result = unicode(tostring(a, encoding='UTF-16'), 'UTF-16') 1951 self.assertEquals('<a><b></b><c></c></a>', 1952 canonicalize(result))
1953
1954 - def test_tostring_none(self):
1955 # ElementTree raises an AssertionError here 1956 tostring = self.etree.tostring 1957 self.assertRaises(TypeError, self.etree.tostring, None)
1958
1959 - def test_tostring_pretty(self):
1960 tostring = self.etree.tostring 1961 Element = self.etree.Element 1962 SubElement = self.etree.SubElement 1963 1964 a = Element('a') 1965 b = SubElement(a, 'b') 1966 c = SubElement(a, 'c') 1967 1968 result = tostring(a) 1969 self.assertEquals(result, "<a><b/><c/></a>") 1970 1971 result = tostring(a, pretty_print=False) 1972 self.assertEquals(result, "<a><b/><c/></a>") 1973 1974 result = tostring(a, pretty_print=True) 1975 self.assertEquals(result, "<a>\n <b/>\n <c/>\n</a>\n")
1976
1977 - def test_tostring_with_tail(self):
1978 tostring = self.etree.tostring 1979 Element = self.etree.Element 1980 SubElement = self.etree.SubElement 1981 1982 a = Element('a') 1983 a.tail = "aTAIL" 1984 b = SubElement(a, 'b') 1985 b.tail = "bTAIL" 1986 c = SubElement(a, 'c') 1987 1988 result = tostring(a) 1989 self.assertEquals(result, "<a><b/>bTAIL<c/></a>aTAIL") 1990 1991 result = tostring(a, with_tail=False) 1992 self.assertEquals(result, "<a><b/>bTAIL<c/></a>") 1993 1994 result = tostring(a, with_tail=True) 1995 self.assertEquals(result, "<a><b/>bTAIL<c/></a>aTAIL")
1996
1997 - def test_tostring_method_text_encoding(self):
1998 tostring = self.etree.tostring 1999 Element = self.etree.Element 2000 SubElement = self.etree.SubElement 2001 2002 a = Element('a') 2003 a.text = "A" 2004 a.tail = "tail" 2005 b = SubElement(a, 'b') 2006 b.text = "B" 2007 b.tail = u"Søk på nettet" 2008 c = SubElement(a, 'c') 2009 c.text = "C" 2010 2011 result = tostring(a, method="text", encoding="UTF-16") 2012 2013 self.assertEquals(u'ABSøk på nettetCtail'.encode("UTF-16"), 2014 result)
2015
2016 - def test_tounicode(self):
2017 tounicode = self.etree.tounicode 2018 Element = self.etree.Element 2019 SubElement = self.etree.SubElement 2020 2021 a = Element('a') 2022 b = SubElement(a, 'b') 2023 c = SubElement(a, 'c') 2024 2025 self.assert_(isinstance(tounicode(a), unicode)) 2026 self.assertEquals('<a><b></b><c></c></a>', 2027 canonicalize(tounicode(a)))
2028
2029 - def test_tounicode_element(self):
2030 tounicode = self.etree.tounicode 2031 Element = self.etree.Element 2032 SubElement = self.etree.SubElement 2033 2034 a = Element('a') 2035 b = SubElement(a, 'b') 2036 c = SubElement(a, 'c') 2037 d = SubElement(c, 'd') 2038 self.assert_(isinstance(tounicode(b), unicode)) 2039 self.assert_(isinstance(tounicode(c), unicode)) 2040 self.assertEquals('<b></b>', 2041 canonicalize(tounicode(b))) 2042 self.assertEquals('<c><d></d></c>', 2043 canonicalize(tounicode(c)))
2044
2045 - def test_tounicode_none(self):
2046 tounicode = self.etree.tounicode 2047 self.assertRaises(TypeError, self.etree.tounicode, None)
2048
2049 - def test_tounicode_element_tail(self):
2050 tounicode = self.etree.tounicode 2051 Element = self.etree.Element 2052 SubElement = self.etree.SubElement 2053 2054 a = Element('a') 2055 b = SubElement(a, 'b') 2056 c = SubElement(a, 'c') 2057 d = SubElement(c, 'd') 2058 b.tail = 'Foo' 2059 2060 self.assert_(isinstance(tounicode(b), unicode)) 2061 self.assert_(tounicode(b) == '<b/>Foo' or 2062 tounicode(b) == '<b />Foo')
2063
2064 - def test_tounicode_pretty(self):
2065 tounicode = self.etree.tounicode 2066 Element = self.etree.Element 2067 SubElement = self.etree.SubElement 2068 2069 a = Element('a') 2070 b = SubElement(a, 'b') 2071 c = SubElement(a, 'c') 2072 2073 result = tounicode(a) 2074 self.assertEquals(result, "<a><b/><c/></a>") 2075 2076 result = tounicode(a, pretty_print=False) 2077 self.assertEquals(result, "<a><b/><c/></a>") 2078 2079 result = tounicode(a, pretty_print=True) 2080 self.assertEquals(result, "<a>\n <b/>\n <c/>\n</a>\n")
2081
2082 - def test_tostring_unicode(self):
2083 tostring = self.etree.tostring 2084 Element = self.etree.Element 2085 SubElement = self.etree.SubElement 2086 2087 a = Element('a') 2088 b = SubElement(a, 'b') 2089 c = SubElement(a, 'c') 2090 2091 self.assert_(isinstance(tostring(a, encoding=unicode), unicode)) 2092 self.assertEquals('<a><b></b><c></c></a>', 2093 canonicalize(tostring(a, encoding=unicode)))
2094
2095 - def test_tostring_unicode_element(self):
2096 tostring = self.etree.tostring 2097 Element = self.etree.Element 2098 SubElement = self.etree.SubElement 2099 2100 a = Element('a') 2101 b = SubElement(a, 'b') 2102 c = SubElement(a, 'c') 2103 d = SubElement(c, 'd') 2104 self.assert_(isinstance(tostring(b, encoding=unicode), unicode)) 2105 self.assert_(isinstance(tostring(c, encoding=unicode), unicode)) 2106 self.assertEquals('<b></b>', 2107 canonicalize(tostring(b, encoding=unicode))) 2108 self.assertEquals('<c><d></d></c>', 2109 canonicalize(tostring(c, encoding=unicode)))
2110
2111 - def test_tostring_unicode_none(self):
2112 tostring = self.etree.tostring 2113 self.assertRaises(TypeError, self.etree.tostring, 2114 None, encoding=unicode)
2115
2116 - def test_tostring_unicode_element_tail(self):
2117 tostring = self.etree.tostring 2118 Element = self.etree.Element 2119 SubElement = self.etree.SubElement 2120 2121 a = Element('a') 2122 b = SubElement(a, 'b') 2123 c = SubElement(a, 'c') 2124 d = SubElement(c, 'd') 2125 b.tail = 'Foo' 2126 2127 self.assert_(isinstance(tostring(b, encoding=unicode), unicode)) 2128 self.assert_(tostring(b, encoding=unicode) == '<b/>Foo' or 2129 tostring(b, encoding=unicode) == '<b />Foo')
2130
2131 - def test_tostring_unicode_pretty(self):
2132 tostring = self.etree.tostring 2133 Element = self.etree.Element 2134 SubElement = self.etree.SubElement 2135 2136 a = Element('a') 2137 b = SubElement(a, 'b') 2138 c = SubElement(a, 'c') 2139 2140 result = tostring(a, encoding=unicode) 2141 self.assertEquals(result, "<a><b/><c/></a>") 2142 2143 result = tostring(a, encoding=unicode, pretty_print=False) 2144 self.assertEquals(result, "<a><b/><c/></a>") 2145 2146 result = tostring(a, encoding=unicode, pretty_print=True) 2147 self.assertEquals(result, "<a>\n <b/>\n <c/>\n</a>\n")
2148 2149 # helper methods 2150
2151 - def _writeElement(self, element, encoding='us-ascii'):
2152 """Write out element for comparison. 2153 """ 2154 ElementTree = self.etree.ElementTree 2155 f = StringIO() 2156 tree = ElementTree(element=element) 2157 tree.write(f, encoding=encoding) 2158 data = f.getvalue() 2159 return canonicalize(data)
2160 2161
2162 -class XIncludeTestCase(HelperTestCase):
2163 - def test_xinclude_text(self):
2164 filename = fileInTestDir('test_broken.xml') 2165 root = etree.XML('''\ 2166 <doc xmlns:xi="http://www.w3.org/2001/XInclude"> 2167 <xi:include href="%s" parse="text"/> 2168 </doc> 2169 ''' % filename) 2170 old_text = root.text 2171 content = open(filename).read() 2172 old_tail = root[0].tail 2173 2174 self.include( etree.ElementTree(root) ) 2175 self.assertEquals(old_text + content + old_tail, 2176 root.text)
2177
2178 - def test_xinclude(self):
2179 tree = etree.parse(fileInTestDir('include/test_xinclude.xml')) 2180 self.assertNotEquals( 2181 'a', 2182 tree.getroot()[1].tag) 2183 # process xincludes 2184 self.include( tree ) 2185 # check whether we find it replaced with included data 2186 self.assertEquals( 2187 'a', 2188 tree.getroot()[1].tag)
2189
2190 -class ETreeXIncludeTestCase(XIncludeTestCase):
2191 - def include(self, tree):
2192 tree.xinclude()
2193 2194
2195 -class ElementIncludeTestCase(XIncludeTestCase):
2196 from lxml import ElementInclude
2197 - def include(self, tree):
2198 self.ElementInclude.include(tree.getroot())
2199 2200
2201 -class ETreeC14NTestCase(HelperTestCase):
2202 - def test_c14n(self):
2203 tree = self.parse('<a><b/></a>') 2204 f = StringIO() 2205 tree.write_c14n(f) 2206 s = f.getvalue() 2207 self.assertEquals('<a><b></b></a>', 2208 s)
2209
2210 -def test_suite():
2211 suite = unittest.TestSuite() 2212 suite.addTests([unittest.makeSuite(ETreeOnlyTestCase)]) 2213 suite.addTests([unittest.makeSuite(ETreeXIncludeTestCase)]) 2214 suite.addTests([unittest.makeSuite(ElementIncludeTestCase)]) 2215 suite.addTests([unittest.makeSuite(ETreeC14NTestCase)]) 2216 suite.addTests( 2217 [doctest.DocFileSuite('../../../doc/tutorial.txt')]) 2218 suite.addTests( 2219 [doctest.DocFileSuite('../../../doc/api.txt')]) 2220 suite.addTests( 2221 [doctest.DocFileSuite('../../../doc/parsing.txt')]) 2222 suite.addTests( 2223 [doctest.DocFileSuite('../../../doc/resolvers.txt')]) 2224 return suite
2225 2226 if __name__ == '__main__': 2227 print 'to test use test.py %s' % __file__ 2228