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