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

Source Code for Module lxml.tests.test_elementtree

   1  # -*- coding: utf-8 -*- 
   2   
   3  """ 
   4  Tests for the ElementTree API 
   5   
   6  Only test cases that apply equally well to etree and ElementTree 
   7  belong here. Note that there is a second test module called test_io.py 
   8  for IO related test cases. 
   9  """ 
  10   
  11  import unittest 
  12  import os, re, tempfile, copy, operator, gc, sys 
  13   
  14  this_dir = os.path.dirname(__file__) 
  15  if this_dir not in sys.path: 
  16      sys.path.insert(0, this_dir) # needed for Py3 
  17   
  18  from common_imports import StringIO, BytesIO, etree, ElementTree, cElementTree 
  19  from common_imports import fileInTestDir, canonicalize, HelperTestCase 
  20  from common_imports import _str, _bytes 
  21   
  22  if cElementTree is not None: 
  23      if tuple([int(n) for n in 
  24                getattr(cElementTree, "VERSION", "0.0").split(".")]) <= (1,0,7): 
  25          cElementTree = None 
  26   
  27  try: 
  28      reversed 
  29  except NameError: 
  30      # Python 2.3 
31 - def reversed(seq):
32 seq = list(seq)[::-1] 33 return seq
34
35 -class ETreeTestCaseBase(HelperTestCase):
36 etree = None 37
38 - def test_element(self):
39 for i in range(10): 40 e = self.etree.Element('foo') 41 self.assertEquals(e.tag, 'foo') 42 self.assertEquals(e.text, None) 43 self.assertEquals(e.tail, None)
44
45 - def test_simple(self):
46 Element = self.etree.Element 47 48 root = Element('root') 49 root.append(Element('one')) 50 root.append(Element('two')) 51 root.append(Element('three')) 52 self.assertEquals(3, len(root)) 53 self.assertEquals('one', root[0].tag) 54 self.assertEquals('two', root[1].tag) 55 self.assertEquals('three', root[2].tag) 56 self.assertRaises(IndexError, operator.getitem, root, 3)
57 58 # test weird dictionary interaction leading to segfault previously
60 root = self.etree.Element('root') 61 self.assertEquals(root.tag, "root") 62 add = self.etree.ElementTree(file=BytesIO('<foo>Foo</foo>')) 63 self.assertEquals(add.getroot().tag, "foo") 64 self.assertEquals(add.getroot().text, "Foo") 65 root.append(self.etree.Element('baz')) 66 self.assertEquals(root.tag, "root") 67 self.assertEquals(root[0].tag, "baz")
68
69 - def test_subelement(self):
70 Element = self.etree.Element 71 SubElement = self.etree.SubElement 72 73 root = Element('root') 74 SubElement(root, 'one') 75 SubElement(root, 'two') 76 SubElement(root, 'three') 77 self.assertEquals(3, len(root)) 78 self.assertEquals('one', root[0].tag) 79 self.assertEquals('two', root[1].tag) 80 self.assertEquals('three', root[2].tag)
81
82 - def test_element_contains(self):
83 Element = self.etree.Element 84 SubElement = self.etree.SubElement 85 86 root1 = Element('root') 87 SubElement(root1, 'one') 88 self.assert_(root1[0] in root1) 89 90 root2 = Element('root') 91 SubElement(root2, 'two') 92 SubElement(root2, 'three') 93 self.assert_(root2[0] in root2) 94 self.assert_(root2[1] in root2) 95 96 self.assertFalse(root1[0] in root2) 97 self.assertFalse(root2[0] in root1) 98 self.assertFalse(None in root2)
99
101 ElementTree = self.etree.ElementTree 102 103 f = BytesIO('<doc>Test<one>One</one></doc>') 104 doc = ElementTree(file=f) 105 root = doc.getroot() 106 self.assertEquals(1, len(root)) 107 self.assertEquals('one', root[0].tag) 108 self.assertRaises(IndexError, operator.getitem, root, 1)
109
111 ElementTree = self.etree.ElementTree 112 113 f = BytesIO('<doc><one>One</one><two>Two</two>hm<three>Three</three></doc>') 114 doc = ElementTree(file=f) 115 root = doc.getroot() 116 self.assertEquals(3, len(root)) 117 self.assertEquals('one', root[0].tag) 118 self.assertEquals('two', root[1].tag) 119 self.assertEquals('three', root[2].tag)
120
122 ElementTree = self.etree.ElementTree 123 124 f = BytesIO('<doc>Test</doc>') 125 doc = ElementTree(file=f) 126 root = doc.getroot() 127 self.assertEquals(0, len(root))
128
130 Element = self.etree.Element 131 SubElement = self.etree.SubElement 132 a = Element('a') 133 b = SubElement(a, 'b') 134 c = SubElement(a, 'c') 135 d = SubElement(a, 'd') 136 self.assertEquals(d, a[-1]) 137 self.assertEquals(c, a[-2]) 138 self.assertEquals(b, a[-3]) 139 self.assertRaises(IndexError, operator.getitem, a, -4) 140 a[-1] = e = Element('e') 141 self.assertEquals(e, a[-1]) 142 del a[-1] 143 self.assertEquals(2, len(a))
144
145 - def test_elementtree(self):
146 ElementTree = self.etree.ElementTree 147 148 f = BytesIO('<doc><one>One</one><two>Two</two></doc>') 149 doc = ElementTree(file=f) 150 root = doc.getroot() 151 self.assertEquals(2, len(root)) 152 self.assertEquals('one', root[0].tag) 153 self.assertEquals('two', root[1].tag)
154
155 - def test_text(self):
156 ElementTree = self.etree.ElementTree 157 158 f = BytesIO('<doc>This is a text</doc>') 159 doc = ElementTree(file=f) 160 root = doc.getroot() 161 self.assertEquals('This is a text', root.text)
162
163 - def test_text_empty(self):
164 ElementTree = self.etree.ElementTree 165 166 f = BytesIO('<doc></doc>') 167 doc = ElementTree(file=f) 168 root = doc.getroot() 169 self.assertEquals(None, root.text)
170
171 - def test_text_other(self):
172 ElementTree = self.etree.ElementTree 173 174 f = BytesIO('<doc><one>One</one></doc>') 175 doc = ElementTree(file=f) 176 root = doc.getroot() 177 self.assertEquals(None, root.text) 178 self.assertEquals('One', root[0].text)
179
180 - def test_text_escape_in(self):
181 ElementTree = self.etree.ElementTree 182 183 f = BytesIO('<doc>This is &gt; than a text</doc>') 184 doc = ElementTree(file=f) 185 root = doc.getroot() 186 self.assertEquals('This is > than a text', root.text)
187
188 - def test_text_escape_out(self):
189 Element = self.etree.Element 190 191 a = Element("a") 192 a.text = "<>&" 193 self.assertXML(_bytes('<a>&lt;&gt;&amp;</a>'), 194 a)
195
196 - def test_text_escape_tostring(self):
197 tostring = self.etree.tostring 198 Element = self.etree.Element 199 200 a = Element("a") 201 a.text = "<>&" 202 self.assertEquals(_bytes('<a>&lt;&gt;&amp;</a>'), 203 tostring(a))
204
205 - def test_text_str_subclass(self):
206 Element = self.etree.Element 207 208 class strTest(str): 209 pass
210 211 a = Element("a") 212 a.text = strTest("text") 213 self.assertXML(_bytes('<a>text</a>'), 214 a)
215
216 - def test_tail(self):
217 ElementTree = self.etree.ElementTree 218 219 f = BytesIO('<doc>This is <i>mixed</i> content.</doc>') 220 doc = ElementTree(file=f) 221 root = doc.getroot() 222 self.assertEquals(1, len(root)) 223 self.assertEquals('This is ', root.text) 224 self.assertEquals(None, root.tail) 225 self.assertEquals('mixed', root[0].text) 226 self.assertEquals(' content.', root[0].tail)
227
228 - def test_tail_str_subclass(self):
229 Element = self.etree.Element 230 SubElement = self.etree.SubElement 231 232 class strTest(str): 233 pass
234 235 a = Element("a") 236 SubElement(a, "t").tail = strTest("tail") 237 self.assertXML(_bytes('<a><t></t>tail</a>'), 238 a) 239
240 - def _test_del_tail(self):
241 # this is discouraged for ET compat, should not be tested... 242 XML = self.etree.XML 243 244 root = XML(_bytes('<doc>This is <i>mixed</i> content.</doc>')) 245 self.assertEquals(1, len(root)) 246 self.assertEquals('This is ', root.text) 247 self.assertEquals(None, root.tail) 248 self.assertEquals('mixed', root[0].text) 249 self.assertEquals(' content.', root[0].tail) 250 251 del root[0].tail 252 253 self.assertEquals(1, len(root)) 254 self.assertEquals('This is ', root.text) 255 self.assertEquals(None, root.tail) 256 self.assertEquals('mixed', root[0].text) 257 self.assertEquals(None, root[0].tail) 258 259 root[0].tail = "TAIL" 260 261 self.assertEquals(1, len(root)) 262 self.assertEquals('This is ', root.text) 263 self.assertEquals(None, root.tail) 264 self.assertEquals('mixed', root[0].text) 265 self.assertEquals('TAIL', root[0].tail)
266
267 - def test_ElementTree(self):
268 Element = self.etree.Element 269 ElementTree = self.etree.ElementTree 270 271 el = Element('hoi') 272 doc = ElementTree(el) 273 root = doc.getroot() 274 self.assertEquals(None, root.text) 275 self.assertEquals('hoi', root.tag)
276
277 - def test_attributes(self):
278 ElementTree = self.etree.ElementTree 279 280 f = BytesIO('<doc one="One" two="Two"/>') 281 doc = ElementTree(file=f) 282 root = doc.getroot() 283 self.assertEquals('One', root.attrib['one']) 284 self.assertEquals('Two', root.attrib['two']) 285 self.assertRaises(KeyError, operator.getitem, root.attrib, 'three')
286
287 - def test_attributes2(self):
288 ElementTree = self.etree.ElementTree 289 290 f = BytesIO('<doc one="One" two="Two"/>') 291 doc = ElementTree(file=f) 292 root = doc.getroot() 293 self.assertEquals('One', root.attrib.get('one')) 294 self.assertEquals('Two', root.attrib.get('two')) 295 self.assertEquals(None, root.attrib.get('three')) 296 self.assertEquals('foo', root.attrib.get('three', 'foo'))
297
298 - def test_attributes3(self):
299 ElementTree = self.etree.ElementTree 300 301 f = BytesIO('<doc one="One" two="Two"/>') 302 doc = ElementTree(file=f) 303 root = doc.getroot() 304 self.assertEquals('One', root.get('one')) 305 self.assertEquals('Two', root.get('two')) 306 self.assertEquals(None, root.get('three')) 307 self.assertEquals('foo', root.get('three', 'foo'))
308
309 - def test_attrib_clear(self):
310 XML = self.etree.XML 311 312 root = XML(_bytes('<doc one="One" two="Two"/>')) 313 self.assertEquals('One', root.get('one')) 314 self.assertEquals('Two', root.get('two')) 315 root.attrib.clear() 316 self.assertEquals(None, root.get('one')) 317 self.assertEquals(None, root.get('two'))
318
319 - def test_attrib_set_clear(self):
320 Element = self.etree.Element 321 322 root = Element("root", one="One") 323 root.set("two", "Two") 324 self.assertEquals('One', root.get('one')) 325 self.assertEquals('Two', root.get('two')) 326 root.attrib.clear() 327 self.assertEquals(None, root.get('one')) 328 self.assertEquals(None, root.get('two'))
329
330 - def test_attrib_ns_clear(self):
331 Element = self.etree.Element 332 SubElement = self.etree.SubElement 333 334 attribNS = '{http://foo/bar}x' 335 336 parent = Element('parent') 337 parent.set(attribNS, 'a') 338 child = SubElement(parent, 'child') 339 child.set(attribNS, 'b') 340 341 self.assertEquals('a', parent.get(attribNS)) 342 self.assertEquals('b', child.get(attribNS)) 343 344 parent.clear() 345 self.assertEquals(None, parent.get(attribNS)) 346 self.assertEquals('b', child.get(attribNS))
347
348 - def test_attrib_pop(self):
349 ElementTree = self.etree.ElementTree 350 351 f = BytesIO('<doc one="One" two="Two"/>') 352 doc = ElementTree(file=f) 353 root = doc.getroot() 354 self.assertEquals('One', root.attrib['one']) 355 self.assertEquals('Two', root.attrib['two']) 356 357 self.assertEquals('One', root.attrib.pop('one')) 358 359 self.assertEquals(None, root.attrib.get('one')) 360 self.assertEquals('Two', root.attrib['two'])
361
362 - def test_attrib_pop_unknown(self):
363 root = self.etree.XML(_bytes('<doc one="One" two="Two"/>')) 364 self.assertRaises(KeyError, root.attrib.pop, 'NONE') 365 366 self.assertEquals('One', root.attrib['one']) 367 self.assertEquals('Two', root.attrib['two'])
368
369 - def test_attrib_pop_default(self):
370 root = self.etree.XML(_bytes('<doc one="One" two="Two"/>')) 371 self.assertEquals('Three', root.attrib.pop('three', 'Three'))
372
373 - def test_attrib_pop_empty_default(self):
374 root = self.etree.XML(_bytes('<doc/>')) 375 self.assertEquals('Three', root.attrib.pop('three', 'Three'))
376
377 - def test_attrib_pop_invalid_args(self):
378 root = self.etree.XML(_bytes('<doc one="One" two="Two"/>')) 379 self.assertRaises(TypeError, root.attrib.pop, 'One', None, None)
380
381 - def test_attribute_update_dict(self):
382 XML = self.etree.XML 383 384 root = XML(_bytes('<doc alpha="Alpha" beta="Beta"/>')) 385 items = list(root.attrib.items()) 386 items.sort() 387 self.assertEquals( 388 [('alpha', 'Alpha'), ('beta', 'Beta')], 389 items) 390 391 root.attrib.update({'alpha' : 'test', 'gamma' : 'Gamma'}) 392 393 items = list(root.attrib.items()) 394 items.sort() 395 self.assertEquals( 396 [('alpha', 'test'), ('beta', 'Beta'), ('gamma', 'Gamma')], 397 items)
398
399 - def test_attribute_update_sequence(self):
400 XML = self.etree.XML 401 402 root = XML(_bytes('<doc alpha="Alpha" beta="Beta"/>')) 403 items = list(root.attrib.items()) 404 items.sort() 405 self.assertEquals( 406 [('alpha', 'Alpha'), ('beta', 'Beta')], 407 items) 408 409 root.attrib.update({'alpha' : 'test', 'gamma' : 'Gamma'}.items()) 410 411 items = list(root.attrib.items()) 412 items.sort() 413 self.assertEquals( 414 [('alpha', 'test'), ('beta', 'Beta'), ('gamma', 'Gamma')], 415 items)
416
417 - def test_attribute_update_iter(self):
418 XML = self.etree.XML 419 420 root = XML(_bytes('<doc alpha="Alpha" beta="Beta"/>')) 421 items = list(root.attrib.items()) 422 items.sort() 423 self.assertEquals( 424 [('alpha', 'Alpha'), ('beta', 'Beta')], 425 items) 426 427 root.attrib.update({'alpha' : 'test', 'gamma' : 'Gamma'}.items()) 428 429 items = list(root.attrib.items()) 430 items.sort() 431 self.assertEquals( 432 [('alpha', 'test'), ('beta', 'Beta'), ('gamma', 'Gamma')], 433 items)
434
435 - def test_attribute_keys(self):
436 XML = self.etree.XML 437 438 root = XML(_bytes('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>')) 439 keys = root.attrib.keys() 440 keys.sort() 441 self.assertEquals(['alpha', 'beta', 'gamma'], keys)
442
443 - def test_attribute_keys2(self):
444 XML = self.etree.XML 445 446 root = XML(_bytes('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>')) 447 keys = root.keys() 448 keys.sort() 449 self.assertEquals(['alpha', 'beta', 'gamma'], keys)
450
451 - def test_attribute_items2(self):
452 XML = self.etree.XML 453 454 root = XML(_bytes('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>')) 455 items = list(root.items()) 456 items.sort() 457 self.assertEquals( 458 [('alpha','Alpha'), ('beta','Beta'), ('gamma','Gamma')], 459 items)
460
461 - def test_attribute_keys_ns(self):
462 XML = self.etree.XML 463 464 root = XML(_bytes('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />')) 465 keys = root.keys() 466 keys.sort() 467 self.assertEquals(['bar', '{http://ns.codespeak.net/test}baz'], 468 keys)
469
470 - def test_attribute_values(self):
471 XML = self.etree.XML 472 473 root = XML(_bytes('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>')) 474 values = root.attrib.values() 475 values.sort() 476 self.assertEquals(['Alpha', 'Beta', 'Gamma'], values)
477
478 - def test_attribute_values_ns(self):
479 XML = self.etree.XML 480 481 root = XML(_bytes('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />')) 482 values = root.attrib.values() 483 values.sort() 484 self.assertEquals( 485 ['Bar', 'Baz'], values)
486
487 - def test_attribute_items(self):
488 XML = self.etree.XML 489 490 root = XML(_bytes('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>')) 491 items = list(root.attrib.items()) 492 items.sort() 493 self.assertEquals([ 494 ('alpha', 'Alpha'), 495 ('beta', 'Beta'), 496 ('gamma', 'Gamma'), 497 ], 498 items)
499
500 - def test_attribute_items_ns(self):
501 XML = self.etree.XML 502 503 root = XML(_bytes('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />')) 504 items = list(root.attrib.items()) 505 items.sort() 506 self.assertEquals( 507 [('bar', 'Bar'), ('{http://ns.codespeak.net/test}baz', 'Baz')], 508 items)
509
510 - def test_attribute_str(self):
511 XML = self.etree.XML 512 513 expected = "{'{http://ns.codespeak.net/test}baz': 'Baz', 'bar': 'Bar'}" 514 alternative = "{'bar': 'Bar', '{http://ns.codespeak.net/test}baz': 'Baz'}" 515 516 root = XML(_bytes('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />')) 517 try: 518 self.assertEquals(expected, str(root.attrib)) 519 except AssertionError: 520 self.assertEquals(alternative, str(root.attrib))
521
522 - def test_attribute_has_key(self):
523 XML = self.etree.XML 524 525 root = XML(_bytes('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />')) 526 self.assertEquals( 527 True, root.attrib.has_key('bar')) 528 self.assertEquals( 529 False, root.attrib.has_key('baz')) 530 self.assertEquals( 531 False, root.attrib.has_key('hah')) 532 self.assertEquals( 533 True, 534 root.attrib.has_key('{http://ns.codespeak.net/test}baz'))
535
536 - def test_attribute_contains(self):
537 XML = self.etree.XML 538 539 root = XML(_bytes('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />')) 540 self.assertEquals( 541 True, 'bar' in root.attrib) 542 self.assertEquals( 543 False, 'baz' in root.attrib) 544 self.assertEquals( 545 False, 'hah' in root.attrib) 546 self.assertEquals( 547 True, 548 '{http://ns.codespeak.net/test}baz' in root.attrib)
549
550 - def test_attribute_set(self):
551 Element = self.etree.Element 552 553 root = Element("root") 554 root.set("attr", "TEST") 555 self.assertEquals("TEST", root.get("attr"))
556
557 - def test_XML(self):
558 XML = self.etree.XML 559 560 root = XML(_bytes('<doc>This is a text.</doc>')) 561 self.assertEquals(0, len(root)) 562 self.assertEquals('This is a text.', root.text)
563
564 - def test_XMLID(self):
565 XMLID = self.etree.XMLID 566 XML = self.etree.XML 567 xml_text = _bytes(''' 568 <document> 569 <h1 id="chapter1">...</h1> 570 <p id="note1" class="note">...</p> 571 <p>Regular paragraph.</p> 572 <p xml:id="xmlid">XML:ID paragraph.</p> 573 <p id="warn1" class="warning">...</p> 574 </document> 575 ''') 576 577 root, dic = XMLID(xml_text) 578 root2 = XML(xml_text) 579 self.assertEquals(self._writeElement(root), 580 self._writeElement(root2)) 581 expected = { 582 "chapter1" : root[0], 583 "note1" : root[1], 584 "warn1" : root[4] 585 } 586 self.assertEquals(dic, expected)
587
588 - def test_fromstring(self):
589 fromstring = self.etree.fromstring 590 591 root = fromstring('<doc>This is a text.</doc>') 592 self.assertEquals(0, len(root)) 593 self.assertEquals('This is a text.', root.text)
594
595 - def test_fromstringlist(self):
596 fromstringlist = self.etree.fromstringlist 597 598 root = fromstringlist(["<do", "c>T", "hi", "s is", 599 " a text.<", "/doc", ">"]) 600 self.assertEquals(0, len(root)) 601 self.assertEquals('This is a text.', root.text)
602
603 - def test_fromstringlist_characters(self):
604 fromstringlist = self.etree.fromstringlist 605 606 root = fromstringlist(list('<doc>This is a text.</doc>')) 607 self.assertEquals(0, len(root)) 608 self.assertEquals('This is a text.', root.text)
609
610 - def test_fromstringlist_single(self):
611 fromstringlist = self.etree.fromstringlist 612 613 root = fromstringlist(['<doc>This is a text.</doc>']) 614 self.assertEquals(0, len(root)) 615 self.assertEquals('This is a text.', root.text)
616
617 - def test_iselement(self):
618 iselement = self.etree.iselement 619 Element = self.etree.Element 620 ElementTree = self.etree.ElementTree 621 XML = self.etree.XML 622 Comment = self.etree.Comment 623 ProcessingInstruction = self.etree.ProcessingInstruction 624 625 el = Element('hoi') 626 self.assert_(iselement(el)) 627 628 el2 = XML(_bytes('<foo/>')) 629 self.assert_(iselement(el2)) 630 631 tree = ElementTree(element=Element('dag')) 632 self.assert_(not iselement(tree)) 633 self.assert_(iselement(tree.getroot())) 634 635 c = Comment('test') 636 self.assert_(iselement(c)) 637 638 p = ProcessingInstruction("test", "some text") 639 self.assert_(iselement(p))
640
641 - def test_iteration(self):
642 XML = self.etree.XML 643 644 root = XML(_bytes('<doc><one/><two>Two</two>Hm<three/></doc>')) 645 result = [] 646 for el in root: 647 result.append(el.tag) 648 self.assertEquals(['one', 'two', 'three'], result)
649
650 - def test_iteration_empty(self):
651 XML = self.etree.XML 652 653 root = XML(_bytes('<doc></doc>')) 654 result = [] 655 for el in root: 656 result.append(el.tag) 657 self.assertEquals([], result)
658
659 - def test_iteration_text_only(self):
660 XML = self.etree.XML 661 662 root = XML(_bytes('<doc>Text</doc>')) 663 result = [] 664 for el in root: 665 result.append(el.tag) 666 self.assertEquals([], result)
667
668 - def test_iteration_crash(self):
669 # this would cause a crash in the past 670 fromstring = self.etree.fromstring 671 root = etree.fromstring('<html><p></p>x</html>') 672 for elem in root: 673 elem.tail = ''
674
675 - def test_iteration_reversed(self):
676 XML = self.etree.XML 677 root = XML(_bytes('<doc><one/><two>Two</two>Hm<three/></doc>')) 678 result = [] 679 for el in reversed(root): 680 result.append(el.tag) 681 self.assertEquals(['three', 'two', 'one'], result)
682
683 - def test_iteration_subelement(self):
684 XML = self.etree.XML 685 686 root = XML(_bytes('<doc><one/><two>Two</two>Hm<three/></doc>')) 687 result = [] 688 add = True 689 for el in root: 690 result.append(el.tag) 691 if add: 692 self.etree.SubElement(root, 'four') 693 add = False 694 self.assertEquals(['one', 'two', 'three', 'four'], result)
695
696 - def test_iteration_del_child(self):
697 XML = self.etree.XML 698 699 root = XML(_bytes('<doc><one/><two>Two</two>Hm<three/></doc>')) 700 result = [] 701 for el in root: 702 result.append(el.tag) 703 del root[-1] 704 self.assertEquals(['one', 'two'], result)
705
706 - def test_iteration_double(self):
707 XML = self.etree.XML 708 709 root = XML(_bytes('<doc><one/><two/></doc>')) 710 result = [] 711 for el0 in root: 712 result.append(el0.tag) 713 for el1 in root: 714 result.append(el1.tag) 715 self.assertEquals(['one','one', 'two', 'two', 'one', 'two'], result)
716
717 - def test_attribute_iterator(self):
718 XML = self.etree.XML 719 720 root = XML(_bytes('<doc alpha="Alpha" beta="Beta" gamma="Gamma" />')) 721 result = [] 722 for key in root.attrib: 723 result.append(key) 724 result.sort() 725 self.assertEquals(['alpha', 'beta', 'gamma'], result)
726
727 - def test_itertext(self):
728 # ET 1.3+ 729 XML = self.etree.XML 730 root = XML(_bytes("<root>RTEXT<a></a>ATAIL<b/><c>CTEXT</c>CTAIL</root>")) 731 732 text = list(root.itertext()) 733 self.assertEquals(["RTEXT", "ATAIL", "CTEXT", "CTAIL"], 734 text)
735
736 - def test_itertext_child(self):
737 # ET 1.3+ 738 XML = self.etree.XML 739 root = XML(_bytes("<root>RTEXT<a></a>ATAIL<b/><c>CTEXT</c>CTAIL</root>")) 740 741 text = list(root[2].itertext()) 742 self.assertEquals(["CTEXT"], 743 text)
744
745 - def test_findall(self):
746 XML = self.etree.XML 747 root = XML(_bytes('<a><b><c/></b><b/><c><b/></c></a>')) 748 self.assertEquals(len(list(root.findall("c"))), 1) 749 self.assertEquals(len(list(root.findall(".//c"))), 2) 750 self.assertEquals(len(list(root.findall(".//b"))), 3) 751 self.assertEquals(len(list(root.findall(".//b"))[0]), 1) 752 self.assertEquals(len(list(root.findall(".//b"))[1]), 0) 753 self.assertEquals(len(list(root.findall(".//b"))[2]), 0)
754
755 - def test_findall_ns(self):
756 XML = self.etree.XML 757 root = XML(_bytes('<a xmlns:x="X" xmlns:y="Y"><x:b><c/></x:b><b/><c><x:b/><b/></c><b/></a>')) 758 self.assertEquals(len(list(root.findall(".//{X}b"))), 2) 759 self.assertEquals(len(list(root.findall(".//b"))), 3) 760 self.assertEquals(len(list(root.findall("b"))), 2)
761
762 - def test_element_with_attributes_keywords(self):
763 Element = self.etree.Element 764 765 el = Element('tag', foo='Foo', bar='Bar') 766 self.assertEquals('Foo', el.attrib['foo']) 767 self.assertEquals('Bar', el.attrib['bar'])
768
769 - def test_element_with_attributes(self):
770 Element = self.etree.Element 771 772 el = Element('tag', {'foo':'Foo', 'bar':'Bar'}) 773 self.assertEquals('Foo', el.attrib['foo']) 774 self.assertEquals('Bar', el.attrib['bar'])
775
776 - def test_element_with_attributes_ns(self):
777 Element = self.etree.Element 778 779 el = Element('tag', {'{ns1}foo':'Foo', '{ns2}bar':'Bar'}) 780 self.assertEquals('Foo', el.attrib['{ns1}foo']) 781 self.assertEquals('Bar', el.attrib['{ns2}bar'])
782
783 - def test_subelement_with_attributes(self):
784 Element = self.etree.Element 785 SubElement = self.etree.SubElement 786 787 el = Element('tag') 788 SubElement(el, 'foo', {'foo':'Foo'}, baz="Baz") 789 self.assertEquals("Baz", el[0].attrib['baz']) 790 self.assertEquals('Foo', el[0].attrib['foo'])
791
792 - def test_subelement_with_attributes_ns(self):
793 Element = self.etree.Element 794 SubElement = self.etree.SubElement 795 796 el = Element('tag') 797 SubElement(el, 'foo', {'{ns1}foo':'Foo', '{ns2}bar':'Bar'}) 798 self.assertEquals('Foo', el[0].attrib['{ns1}foo']) 799 self.assertEquals('Bar', el[0].attrib['{ns2}bar'])
800
801 - def test_write(self):
802 ElementTree = self.etree.ElementTree 803 XML = self.etree.XML 804 805 for i in range(10): 806 f = BytesIO() 807 root = XML(_bytes('<doc%s>This is a test.</doc%s>' % (i, i))) 808 tree = ElementTree(element=root) 809 tree.write(f) 810 data = f.getvalue() 811 self.assertEquals( 812 _bytes('<doc%s>This is a test.</doc%s>' % (i, i)), 813 canonicalize(data))
814
815 - def test_write_method_html(self):
816 ElementTree = self.etree.ElementTree 817 Element = self.etree.Element 818 SubElement = self.etree.SubElement 819 820 html = Element('html') 821 body = SubElement(html, 'body') 822 p = SubElement(body, 'p') 823 p.text = "html" 824 SubElement(p, 'br').tail = "test" 825 826 tree = ElementTree(element=html) 827 f = BytesIO() 828 tree.write(f, method="html") 829 data = f.getvalue().replace(_bytes('\n'),_bytes('')) 830 831 self.assertEquals(_bytes('<html><body><p>html<br>test</p></body></html>'), 832 data)
833
834 - def test_write_method_text(self):
835 ElementTree = self.etree.ElementTree 836 Element = self.etree.Element 837 SubElement = self.etree.SubElement 838 839 a = Element('a') 840 a.text = "A" 841 a.tail = "tail" 842 b = SubElement(a, 'b') 843 b.text = "B" 844 b.tail = "TAIL" 845 c = SubElement(a, 'c') 846 c.text = "C" 847 848 tree = ElementTree(element=a) 849 f = BytesIO() 850 tree.write(f, method="text") 851 data = f.getvalue() 852 853 self.assertEquals(_bytes('ABTAILCtail'), 854 data)
855
856 - def test_write_fail(self):
857 ElementTree = self.etree.ElementTree 858 XML = self.etree.XML 859 860 tree = ElementTree( XML(_bytes('<doc>This is a test.</doc>')) ) 861 self.assertRaises(IOError, tree.write, 862 "definitely////\\-\\nonexisting\\-\\////FILE")
863 864 # this could trigger a crash, apparently because the document 865 # reference was prematurely garbage collected
866 - def test_crash(self):
867 Element = self.etree.Element 868 869 element = Element('tag') 870 for i in range(10): 871 element.attrib['key'] = 'value' 872 value = element.attrib['key'] 873 self.assertEquals(value, 'value')
874 875 # from doctest; for some reason this caused crashes too
876 - def test_write_ElementTreeDoctest(self):
877 Element = self.etree.Element 878 ElementTree = self.etree.ElementTree 879 880 f = BytesIO() 881 for i in range(10): 882 element = Element('tag%s' % i) 883 self._check_element(element) 884 tree = ElementTree(element) 885 tree.write(f) 886 self._check_element_tree(tree)
887
888 - def test_subelement_reference(self):
889 Element = self.etree.Element 890 SubElement = self.etree.SubElement 891 892 el = Element('foo') 893 el2 = SubElement(el, 'bar') 894 el3 = SubElement(el2, 'baz') 895 896 al = Element('foo2') 897 al2 = SubElement(al, 'bar2') 898 al3 = SubElement(al2, 'baz2') 899 900 # now move al2 into el 901 el.append(al2) 902 903 # now change al3 directly 904 al3.text = 'baz2-modified' 905 906 # it should have changed through this route too 907 self.assertEquals( 908 'baz2-modified', 909 el[1][0].text)
910
911 - def test_set_text(self):
912 Element = self.etree.Element 913 SubElement = self.etree.SubElement 914 915 a = Element('a') 916 b = SubElement(a, 'b') 917 a.text = 'hoi' 918 self.assertEquals( 919 'hoi', 920 a.text) 921 self.assertEquals( 922 'b', 923 a[0].tag)
924
925 - def test_set_text2(self):
926 Element = self.etree.Element 927 SubElement = self.etree.SubElement 928 929 a = Element('a') 930 a.text = 'hoi' 931 b = SubElement(a ,'b') 932 self.assertEquals( 933 'hoi', 934 a.text) 935 self.assertEquals( 936 'b', 937 a[0].tag)
938
939 - def test_set_text_none(self):
940 Element = self.etree.Element 941 942 a = Element('a') 943 944 a.text = 'foo' 945 a.text = None 946 947 self.assertEquals( 948 None, 949 a.text) 950 self.assertXML(_bytes('<a></a>'), a)
951
952 - def test_set_text_empty(self):
953 Element = self.etree.Element 954 955 a = Element('a') 956 self.assertEquals(None, a.text) 957 958 a.text = '' 959 self.assertEquals('', a.text) 960 self.assertXML(_bytes('<a></a>'), a)
961
962 - def test_tail1(self):
963 Element = self.etree.Element 964 SubElement = self.etree.SubElement 965 966 a = Element('a') 967 a.tail = 'dag' 968 self.assertEquals('dag', 969 a.tail) 970 b = SubElement(a, 'b') 971 b.tail = 'hoi' 972 self.assertEquals('hoi', 973 b.tail) 974 self.assertEquals('dag', 975 a.tail)
976
977 - def test_tail_append(self):
978 Element = self.etree.Element 979 980 a = Element('a') 981 b = Element('b') 982 b.tail = 'b_tail' 983 a.append(b) 984 self.assertEquals('b_tail', 985 b.tail)
986
987 - def test_tail_set_twice(self):
988 Element = self.etree.Element 989 SubElement = self.etree.SubElement 990 991 a = Element('a') 992 b = SubElement(a, 'b') 993 b.tail = 'foo' 994 b.tail = 'bar' 995 self.assertEquals('bar', 996 b.tail) 997 self.assertXML(_bytes('<a><b></b>bar</a>'), a)
998
999 - def test_tail_set_none(self):
1000 Element = self.etree.Element 1001 a = Element('a') 1002 a.tail = 'foo' 1003 a.tail = None 1004 self.assertEquals( 1005 None, 1006 a.tail) 1007 self.assertXML(_bytes('<a></a>'), a)
1008
1009 - def test_extend(self):
1010 root = self.etree.Element('foo') 1011 for i in range(3): 1012 element = self.etree.SubElement(root, 'a%s' % i) 1013 element.text = "text%d" % i 1014 element.tail = "tail%d" % i 1015 1016 elements = [] 1017 for i in range(3): 1018 new_element = self.etree.Element("test%s" % i) 1019 new_element.text = "TEXT%s" % i 1020 new_element.tail = "TAIL%s" % i 1021 elements.append(new_element) 1022 1023 root.extend(elements) 1024 1025 self.assertEquals( 1026 ["a0", "a1", "a2", "test0", "test1", "test2"], 1027 [ el.tag for el in root ]) 1028 self.assertEquals( 1029 ["text0", "text1", "text2", "TEXT0", "TEXT1", "TEXT2"], 1030 [ el.text for el in root ]) 1031 self.assertEquals( 1032 ["tail0", "tail1", "tail2", "TAIL0", "TAIL1", "TAIL2"], 1033 [ el.tail for el in root ])
1034
1035 - def test_comment(self):
1036 Element = self.etree.Element 1037 SubElement = self.etree.SubElement 1038 Comment = self.etree.Comment 1039 1040 a = Element('a') 1041 a.append(Comment('foo')) 1042 self.assertEquals(a[0].tag, Comment) 1043 self.assertEquals(a[0].text, 'foo')
1044 1045 # ElementTree < 1.3 adds whitespace around comments
1046 - def test_comment_text(self):
1047 Element = self.etree.Element 1048 SubElement = self.etree.SubElement 1049 Comment = self.etree.Comment 1050 tostring = self.etree.tostring 1051 1052 a = Element('a') 1053 a.append(Comment('foo')) 1054 self.assertEquals(a[0].text, 'foo') 1055 1056 self.assertEquals( 1057 _bytes('<a><!--foo--></a>'), 1058 tostring(a)) 1059 1060 a[0].text = "TEST" 1061 self.assertEquals(a[0].text, 'TEST') 1062 1063 self.assertEquals( 1064 _bytes('<a><!--TEST--></a>'), 1065 tostring(a))
1066 1067 # ElementTree < 1.3 adds whitespace around comments
1068 - def test_comment_whitespace(self):
1069 Element = self.etree.Element 1070 SubElement = self.etree.SubElement 1071 Comment = self.etree.Comment 1072 tostring = self.etree.tostring 1073 1074 a = Element('a') 1075 a.append(Comment(' foo ')) 1076 self.assertEquals(a[0].text, ' foo ') 1077 self.assertEquals( 1078 _bytes('<a><!-- foo --></a>'), 1079 tostring(a))
1080
1081 - def test_comment_nonsense(self):
1082 Comment = self.etree.Comment 1083 c = Comment('foo') 1084 self.assertEquals({}, c.attrib) 1085 self.assertEquals([], list(c.keys())) 1086 self.assertEquals([], list(c.items())) 1087 self.assertEquals(None, c.get('hoi')) 1088 self.assertEquals(0, len(c)) 1089 # should not iterate 1090 for i in c: 1091 pass
1092
1093 - def test_pi(self):
1094 # lxml.etree separates target and text 1095 Element = self.etree.Element 1096 SubElement = self.etree.SubElement 1097 ProcessingInstruction = self.etree.ProcessingInstruction 1098 1099 a = Element('a') 1100 a.append(ProcessingInstruction('foo', 'some more text')) 1101 self.assertEquals(a[0].tag, ProcessingInstruction) 1102 self.assertXML(_bytes("<a><?foo some more text?></a>"), 1103 a)
1104
1105 - def test_processinginstruction(self):
1106 # lxml.etree separates target and text 1107 Element = self.etree.Element 1108 SubElement = self.etree.SubElement 1109 ProcessingInstruction = self.etree.PI 1110 1111 a = Element('a') 1112 a.append(ProcessingInstruction('foo', 'some more text')) 1113 self.assertEquals(a[0].tag, ProcessingInstruction) 1114 self.assertXML(_bytes("<a><?foo some more text?></a>"), 1115 a)
1116
1117 - def test_pi_nonsense(self):
1118 ProcessingInstruction = self.etree.ProcessingInstruction 1119 pi = ProcessingInstruction('foo') 1120 self.assertEquals({}, pi.attrib) 1121 self.assertEquals([], list(pi.keys())) 1122 self.assertEquals([], list(pi.items())) 1123 self.assertEquals(None, pi.get('hoi')) 1124 self.assertEquals(0, len(pi)) 1125 # should not iterate 1126 for i in pi: 1127 pass
1128
1129 - def test_setitem(self):
1130 Element = self.etree.Element 1131 SubElement = self.etree.SubElement 1132 1133 a = Element('a') 1134 b = SubElement(a, 'b') 1135 c = Element('c') 1136 a[0] = c 1137 self.assertEquals( 1138 c, 1139 a[0]) 1140 self.assertXML(_bytes('<a><c></c></a>'), 1141 a) 1142 self.assertXML(_bytes('<b></b>'), 1143 b)
1144
1145 - def test_setitem2(self):
1146 Element = self.etree.Element 1147 SubElement = self.etree.SubElement 1148 1149 a = Element('a') 1150 for i in range(5): 1151 b = SubElement(a, 'b%s' % i) 1152 c = SubElement(b, 'c') 1153 for i in range(5): 1154 d = Element('d') 1155 e = SubElement(d, 'e') 1156 a[i] = d 1157 self.assertXML( 1158 _bytes('<a><d><e></e></d><d><e></e></d><d><e></e></d><d><e></e></d><d><e></e></d></a>'), 1159 a) 1160 self.assertXML(_bytes('<c></c>'), 1161 c)
1162
1163 - def test_setitem_replace(self):
1164 Element = self.etree.Element 1165 SubElement = self.etree.SubElement 1166 1167 a = Element('a') 1168 SubElement(a, 'b') 1169 d = Element('d') 1170 a[0] = d 1171 self.assertXML(_bytes('<a><d></d></a>'), a)
1172
1173 - def test_setitem_indexerror(self):
1174 Element = self.etree.Element 1175 SubElement = self.etree.SubElement 1176 1177 a = Element('a') 1178 b = SubElement(a, 'b') 1179 1180 self.assertRaises(IndexError, operator.setitem, a, 1, Element('c'))
1181
1182 - def test_setitem_tail(self):
1183 Element = self.etree.Element 1184 SubElement = self.etree.SubElement 1185 1186 a = Element('a') 1187 b = SubElement(a, 'b') 1188 b.tail = 'B2' 1189 c = Element('c') 1190 c.tail = 'C2' 1191 1192 a[0] = c 1193 self.assertXML( 1194 _bytes('<a><c></c>C2</a>'), 1195 a)
1196
1197 - def test_tag_write(self):
1198 Element = self.etree.Element 1199 SubElement = self.etree.SubElement 1200 1201 a = Element('a') 1202 b = SubElement(a, 'b') 1203 1204 a.tag = 'c' 1205 1206 self.assertEquals( 1207 'c', 1208 a.tag) 1209 1210 self.assertXML( 1211 _bytes('<c><b></b></c>'), 1212 a)
1213
1214 - def test_tag_reset_ns(self):
1215 Element = self.etree.Element 1216 SubElement = self.etree.SubElement 1217 tostring = self.etree.tostring 1218 1219 a = Element('{a}a') 1220 b1 = SubElement(a, '{a}b') 1221 b2 = SubElement(a, '{b}b') 1222 1223 self.assertEquals('{a}b', b1.tag) 1224 1225 b1.tag = 'c' 1226 1227 # can't use C14N here! 1228 self.assertEquals('c', b1.tag) 1229 self.assertEquals(_bytes('<c'), tostring(b1)[:2]) 1230 self.assert_(_bytes('<c') in tostring(a))
1231
1232 - def test_tag_reset_root_ns(self):
1233 Element = self.etree.Element 1234 SubElement = self.etree.SubElement 1235 tostring = self.etree.tostring 1236 1237 a = Element('{a}a') 1238 b1 = SubElement(a, '{a}b') 1239 b2 = SubElement(a, '{b}b') 1240 1241 a.tag = 'c' 1242 1243 self.assertEquals( 1244 'c', 1245 a.tag) 1246 1247 # can't use C14N here! 1248 self.assertEquals('c', a.tag) 1249 self.assertEquals(_bytes('<c'), tostring(a)[:2])
1250
1251 - def test_tag_str_subclass(self):
1252 Element = self.etree.Element 1253 1254 class strTest(str): 1255 pass
1256 1257 a = Element("a") 1258 a.tag = strTest("TAG") 1259 self.assertXML(_bytes('<TAG></TAG>'), 1260 a) 1261
1262 - def test_delitem(self):
1263 Element = self.etree.Element 1264 SubElement = self.etree.SubElement 1265 1266 a = Element('a') 1267 b = SubElement(a, 'b') 1268 c = SubElement(a, 'c') 1269 d = SubElement(a, 'd') 1270 1271 del a[1] 1272 self.assertXML( 1273 _bytes('<a><b></b><d></d></a>'), 1274 a) 1275 1276 del a[0] 1277 self.assertXML( 1278 _bytes('<a><d></d></a>'), 1279 a) 1280 1281 del a[0] 1282 self.assertXML( 1283 _bytes('<a></a>'), 1284 a) 1285 # move deleted element into other tree afterwards 1286 other = Element('other') 1287 other.append(c) 1288 self.assertXML( 1289 _bytes('<other><c></c></other>'), 1290 other)
1291
1292 - def test_del_insert(self):
1293 Element = self.etree.Element 1294 SubElement = self.etree.SubElement 1295 1296 a = Element('a') 1297 b = SubElement(a, 'b') 1298 bs = SubElement(b, 'bs') 1299 c = SubElement(a, 'c') 1300 cs = SubElement(c, 'cs') 1301 1302 el = a[0] 1303 self.assertXML( 1304 _bytes('<a><b><bs></bs></b><c><cs></cs></c></a>'), 1305 a) 1306 self.assertXML(_bytes('<b><bs></bs></b>'), b) 1307 self.assertXML(_bytes('<c><cs></cs></c>'), c) 1308 1309 del a[0] 1310 self.assertXML( 1311 _bytes('<a><c><cs></cs></c></a>'), 1312 a) 1313 self.assertXML(_bytes('<b><bs></bs></b>'), b) 1314 self.assertXML(_bytes('<c><cs></cs></c>'), c) 1315 1316 a.insert(0, el) 1317 self.assertXML( 1318 _bytes('<a><b><bs></bs></b><c><cs></cs></c></a>'), 1319 a) 1320 self.assertXML(_bytes('<b><bs></bs></b>'), b) 1321 self.assertXML(_bytes('<c><cs></cs></c>'), c)
1322
1323 - def test_del_setitem(self):
1324 Element = self.etree.Element 1325 SubElement = self.etree.SubElement 1326 1327 a = Element('a') 1328 b = SubElement(a, 'b') 1329 bs = SubElement(b, 'bs') 1330 c = SubElement(a, 'c') 1331 cs = SubElement(c, 'cs') 1332 1333 el = a[0] 1334 del a[0] 1335 a[0] = el 1336 self.assertXML( 1337 _bytes('<a><b><bs></bs></b></a>'), 1338 a) 1339 self.assertXML(_bytes('<b><bs></bs></b>'), b) 1340 self.assertXML(_bytes('<c><cs></cs></c>'), c)
1341
1342 - def test_del_setslice(self):
1343 Element = self.etree.Element 1344 SubElement = self.etree.SubElement 1345 1346 a = Element('a') 1347 b = SubElement(a, 'b') 1348 bs = SubElement(b, 'bs') 1349 c = SubElement(a, 'c') 1350 cs = SubElement(c, 'cs') 1351 1352 el = a[0] 1353 del a[0] 1354 a[0:0] = [el] 1355 self.assertXML( 1356 _bytes('<a><b><bs></bs></b><c><cs></cs></c></a>'), 1357 a) 1358 self.assertXML(_bytes('<b><bs></bs></b>'), b) 1359 self.assertXML(_bytes('<c><cs></cs></c>'), c)
1360
1361 - def test_replace_slice_tail(self):
1362 XML = self.etree.XML 1363 a = XML(_bytes('<a><b></b>B2<c></c>C2</a>')) 1364 b, c = a 1365 1366 a[:] = [] 1367 1368 self.assertEquals("B2", b.tail) 1369 self.assertEquals("C2", c.tail)
1370
1371 - def test_delitem_tail(self):
1372 ElementTree = self.etree.ElementTree 1373 f = BytesIO('<a><b></b>B2<c></c>C2</a>') 1374 doc = ElementTree(file=f) 1375 a = doc.getroot() 1376 del a[0] 1377 self.assertXML( 1378 _bytes('<a><c></c>C2</a>'), 1379 a)
1380
1381 - def test_clear(self):
1382 Element = self.etree.Element 1383 1384 a = Element('a') 1385 a.text = 'foo' 1386 a.tail = 'bar' 1387 a.set('hoi', 'dag') 1388 a.clear() 1389 self.assertEquals(None, a.text) 1390 self.assertEquals(None, a.tail) 1391 self.assertEquals(None, a.get('hoi')) 1392 self.assertEquals('a', a.tag)
1393
1394 - def test_clear_sub(self):
1395 Element = self.etree.Element 1396 SubElement = self.etree.SubElement 1397 1398 a = Element('a') 1399 a.text = 'foo' 1400 a.tail = 'bar' 1401 a.set('hoi', 'dag') 1402 b = SubElement(a, 'b') 1403 c = SubElement(b, 'c') 1404 a.clear() 1405 self.assertEquals(None, a.text) 1406 self.assertEquals(None, a.tail) 1407 self.assertEquals(None, a.get('hoi')) 1408 self.assertEquals('a', a.tag) 1409 self.assertEquals(0, len(a)) 1410 self.assertXML(_bytes('<a></a>'), 1411 a) 1412 self.assertXML(_bytes('<b><c></c></b>'), 1413 b)
1414
1415 - def test_clear_tail(self):
1416 ElementTree = self.etree.ElementTree 1417 f = BytesIO('<a><b></b>B2<c></c>C2</a>') 1418 doc = ElementTree(file=f) 1419 a = doc.getroot() 1420 a.clear() 1421 self.assertXML( 1422 _bytes('<a></a>'), 1423 a)
1424
1425 - def test_insert(self):
1426 Element = self.etree.Element 1427 SubElement = self.etree.SubElement 1428 1429 a = Element('a') 1430 b = SubElement(a, 'b') 1431 c = SubElement(a, 'c') 1432 d = Element('d') 1433 a.insert(0, d) 1434 1435 self.assertEquals( 1436 d, 1437 a[0]) 1438 1439 self.assertXML( 1440 _bytes('<a><d></d><b></b><c></c></a>'), 1441 a) 1442 1443 e = Element('e') 1444 a.insert(2, e) 1445 self.assertEquals( 1446 e, 1447 a[2]) 1448 self.assertXML( 1449 _bytes('<a><d></d><b></b><e></e><c></c></a>'), 1450 a)
1451
1452 - def test_insert_beyond_index(self):
1453 Element = self.etree.Element 1454 SubElement = self.etree.SubElement 1455 1456 a = Element('a') 1457 b = SubElement(a, 'b') 1458 c = Element('c') 1459 1460 a.insert(2, c) 1461 self.assertEquals( 1462 c, 1463 a[1]) 1464 self.assertXML( 1465 _bytes('<a><b></b><c></c></a>'), 1466 a)
1467
1468 - def test_insert_negative(self):
1469 Element = self.etree.Element 1470 SubElement = self.etree.SubElement 1471 1472 a = Element('a') 1473 b = SubElement(a, 'b') 1474 c = SubElement(a, 'c') 1475 1476 d = Element('d') 1477 a.insert(-1, d) 1478 self.assertEquals( 1479 d, 1480 a[-2]) 1481 self.assertXML( 1482 _bytes('<a><b></b><d></d><c></c></a>'), 1483 a)
1484
1485 - def test_insert_tail(self):
1486 Element = self.etree.Element 1487 SubElement = self.etree.SubElement 1488 1489 a = Element('a') 1490 b = SubElement(a, 'b') 1491 1492 c = Element('c') 1493 c.tail = 'C2' 1494 1495 a.insert(0, c) 1496 self.assertXML( 1497 _bytes('<a><c></c>C2<b></b></a>'), 1498 a)
1499
1500 - def test_remove(self):
1501 Element = self.etree.Element 1502 SubElement = self.etree.SubElement 1503 1504 a = Element('a') 1505 b = SubElement(a, 'b') 1506 c = SubElement(a, 'c') 1507 1508 a.remove(b) 1509 self.assertEquals( 1510 c, 1511 a[0]) 1512 self.assertXML( 1513 _bytes('<a><c></c></a>'), 1514 a)
1515
1516 - def test_remove_ns(self):
1517 Element = self.etree.Element 1518 SubElement = self.etree.SubElement 1519 1520 a = Element('{http://test}a') 1521 b = SubElement(a, '{http://test}b') 1522 c = SubElement(a, '{http://test}c') 1523 1524 a.remove(b) 1525 self.assertXML( 1526 _bytes('<ns0:a xmlns:ns0="http://test"><ns0:c></ns0:c></ns0:a>'), 1527 a) 1528 self.assertXML( 1529 _bytes('<ns0:b xmlns:ns0="http://test"></ns0:b>'), 1530 b)
1531
1532 - def test_remove_nonexisting(self):
1533 Element = self.etree.Element 1534 SubElement = self.etree.SubElement 1535 1536 a = Element('a') 1537 b = SubElement(a, 'b') 1538 c = SubElement(a, 'c') 1539 d = Element('d') 1540 self.assertRaises( 1541 ValueError, a.remove, d)
1542
1543 - def test_remove_tail(self):
1544 Element = self.etree.Element 1545 SubElement = self.etree.SubElement 1546 1547 a = Element('a') 1548 b = SubElement(a, 'b') 1549 b.tail = 'b2' 1550 a.remove(b) 1551 self.assertXML( 1552 _bytes('<a></a>'), 1553 a) 1554 self.assertEquals('b2', b.tail)
1555
1556 - def _test_getchildren(self):
1557 Element = self.etree.Element 1558 SubElement = self.etree.SubElement 1559 1560 a = Element('a') 1561 b = SubElement(a, 'b') 1562 c = SubElement(a, 'c') 1563 d = SubElement(b, 'd') 1564 e = SubElement(c, 'e') 1565 self.assertXML( 1566 _bytes('<a><b><d></d></b><c><e></e></c></a>'), 1567 a) 1568 self.assertEquals( 1569 [b, c], 1570 a.getchildren()) 1571 self.assertEquals( 1572 [d], 1573 b.getchildren()) 1574 self.assertEquals( 1575 [], 1576 d.getchildren())
1577
1578 - def test_makeelement(self):
1579 Element = self.etree.Element 1580 1581 a = Element('a') 1582 b = a.makeelement('c', {'hoi':'dag'}) 1583 self.assertXML( 1584 _bytes('<c hoi="dag"></c>'), 1585 b)
1586
1587 - def test_iter(self):
1588 Element = self.etree.Element 1589 SubElement = self.etree.SubElement 1590 1591 a = Element('a') 1592 b = SubElement(a, 'b') 1593 c = SubElement(a, 'c') 1594 d = SubElement(b, 'd') 1595 e = SubElement(c, 'e') 1596 1597 self.assertEquals( 1598 [a, b, d, c, e], 1599 list(a.iter())) 1600 self.assertEquals( 1601 [d], 1602 list(d.iter()))
1603
1604 - def test_getiterator(self):
1605 Element = self.etree.Element 1606 SubElement = self.etree.SubElement 1607 1608 a = Element('a') 1609 b = SubElement(a, 'b') 1610 c = SubElement(a, 'c') 1611 d = SubElement(b, 'd') 1612 e = SubElement(c, 'e') 1613 1614 self.assertEquals( 1615 [a, b, d, c, e], 1616 list(a.getiterator())) 1617 self.assertEquals( 1618 [d], 1619 list(d.getiterator()))
1620
1621 - def test_getiterator_empty(self):
1622 Element = self.etree.Element 1623 SubElement = self.etree.SubElement 1624 1625 a = Element('a') 1626 b = SubElement(a, 'b') 1627 c = SubElement(a, 'c') 1628 d = SubElement(b, 'd') 1629 e = SubElement(c, 'e') 1630 1631 self.assertEquals( 1632 [], 1633 list(a.getiterator('none'))) 1634 self.assertEquals( 1635 [], 1636 list(e.getiterator('none'))) 1637 self.assertEquals( 1638 [e], 1639 list(e.getiterator()))
1640
1641 - def test_getiterator_filter(self):
1642 Element = self.etree.Element 1643 SubElement = self.etree.SubElement 1644 1645 a = Element('a') 1646 b = SubElement(a, 'b') 1647 c = SubElement(a, 'c') 1648 d = SubElement(b, 'd') 1649 e = SubElement(c, 'e') 1650 1651 self.assertEquals( 1652 [a], 1653 list(a.getiterator('a'))) 1654 a2 = SubElement(e, 'a') 1655 self.assertEquals( 1656 [a, a2], 1657 list(a.getiterator('a'))) 1658 self.assertEquals( 1659 [a2], 1660 list(c.getiterator('a')))
1661
1662 - def test_getiterator_filter_all(self):
1663 Element = self.etree.Element 1664 SubElement = self.etree.SubElement 1665 1666 a = Element('a') 1667 b = SubElement(a, 'b') 1668 c = SubElement(a, 'c') 1669 d = SubElement(b, 'd') 1670 e = SubElement(c, 'e') 1671 1672 self.assertEquals( 1673 [a, b, d, c, e], 1674 list(a.getiterator('*')))
1675
1676 - def test_getiterator_filter_comment(self):
1677 Element = self.etree.Element 1678 Comment = self.etree.Comment 1679 SubElement = self.etree.SubElement 1680 1681 a = Element('a') 1682 b = SubElement(a, 'b') 1683 comment_b = Comment("TEST-b") 1684 b.append(comment_b) 1685 1686 self.assertEquals( 1687 [comment_b], 1688 list(a.getiterator(Comment))) 1689 1690 comment_a = Comment("TEST-a") 1691 a.append(comment_a) 1692 1693 self.assertEquals( 1694 [comment_b, comment_a], 1695 list(a.getiterator(Comment))) 1696 1697 self.assertEquals( 1698 [comment_b], 1699 list(b.getiterator(Comment)))
1700
1701 - def test_getiterator_filter_pi(self):
1702 Element = self.etree.Element 1703 PI = self.etree.ProcessingInstruction 1704 SubElement = self.etree.SubElement 1705 1706 a = Element('a') 1707 b = SubElement(a, 'b') 1708 pi_b = PI("TEST-b") 1709 b.append(pi_b) 1710 1711 self.assertEquals( 1712 [pi_b], 1713 list(a.getiterator(PI))) 1714 1715 pi_a = PI("TEST-a") 1716 a.append(pi_a) 1717 1718 self.assertEquals( 1719 [pi_b, pi_a], 1720 list(a.getiterator(PI))) 1721 1722 self.assertEquals( 1723 [pi_b], 1724 list(b.getiterator(PI)))
1725
1726 - def test_getiterator_with_text(self):
1727 Element = self.etree.Element 1728 SubElement = self.etree.SubElement 1729 1730 a = Element('a') 1731 a.text = 'a' 1732 b = SubElement(a, 'b') 1733 b.text = 'b' 1734 b.tail = 'b1' 1735 c = SubElement(a, 'c') 1736 c.text = 'c' 1737 c.tail = 'c1' 1738 d = SubElement(b, 'd') 1739 c.text = 'd' 1740 c.tail = 'd1' 1741 e = SubElement(c, 'e') 1742 e.text = 'e' 1743 e.tail = 'e1' 1744 1745 self.assertEquals( 1746 [a, b, d, c, e], 1747 list(a.getiterator()))
1748 #self.assertEquals( 1749 # [d], 1750 # list(d.getiterator())) 1751
1752 - def test_getiterator_filter_with_text(self):
1753 Element = self.etree.Element 1754 SubElement = self.etree.SubElement 1755 1756 a = Element('a') 1757 a.text = 'a' 1758 b = SubElement(a, 'b') 1759 b.text = 'b' 1760 b.tail = 'b1' 1761 c = SubElement(a, 'c') 1762 c.text = 'c' 1763 c.tail = 'c1' 1764 d = SubElement(b, 'd') 1765 c.text = 'd' 1766 c.tail = 'd1' 1767 e = SubElement(c, 'e') 1768 e.text = 'e' 1769 e.tail = 'e1' 1770 1771 self.assertEquals( 1772 [a], 1773 list(a.getiterator('a'))) 1774 a2 = SubElement(e, 'a') 1775 self.assertEquals( 1776 [a, a2], 1777 list(a.getiterator('a'))) 1778 self.assertEquals( 1779 [a2], 1780 list(e.getiterator('a')))
1781
1782 - def test_attribute_manipulation(self):
1783 Element = self.etree.Element 1784 1785 a = Element('a') 1786 a.attrib['foo'] = 'Foo' 1787 a.attrib['bar'] = 'Bar' 1788 self.assertEquals('Foo', a.attrib['foo']) 1789 del a.attrib['foo'] 1790 self.assertRaises(KeyError, operator.getitem, a.attrib, 'foo')
1791
1792 - def test_getslice(self):
1793 Element = self.etree.Element 1794 SubElement = self.etree.SubElement 1795 1796 a = Element('a') 1797 b = SubElement(a, 'b') 1798 c = SubElement(a, 'c') 1799 d = SubElement(a, 'd') 1800 1801 self.assertEquals( 1802 [b, c], 1803 a[0:2]) 1804 self.assertEquals( 1805 [b, c, d], 1806 a[:]) 1807 self.assertEquals( 1808 [b, c, d], 1809 a[:10]) 1810 self.assertEquals( 1811 [b], 1812 a[0:1]) 1813 self.assertEquals( 1814 [], 1815 a[10:12])
1816
1817 - def test_getslice_negative(self):
1818 Element = self.etree.Element 1819 SubElement = self.etree.SubElement 1820 1821 a = Element('a') 1822 b = SubElement(a, 'b') 1823 c = SubElement(a, 'c') 1824 d = SubElement(a, 'd') 1825 1826 self.assertEquals( 1827 [d], 1828 a[-1:]) 1829 self.assertEquals( 1830 [c, d], 1831 a[-2:]) 1832 self.assertEquals( 1833 [c], 1834 a[-2:-1]) 1835 self.assertEquals( 1836 [b, c], 1837 a[-3:-1]) 1838 self.assertEquals( 1839 [b, c], 1840 a[-3:2])
1841
1842 - def test_getslice_step(self):
1843 Element = self.etree.Element 1844 SubElement = self.etree.SubElement 1845 1846 a = Element('a') 1847 b = SubElement(a, 'b') 1848 c = SubElement(a, 'c') 1849 d = SubElement(a, 'd') 1850 e = SubElement(a, 'e') 1851 1852 self.assertEquals( 1853 [e,d,c,b], 1854 a[::-1]) 1855 self.assertEquals( 1856 [b,d], 1857 a[::2]) 1858 self.assertEquals( 1859 [e,c], 1860 a[::-2]) 1861 self.assertEquals( 1862 [d,c], 1863 a[-2:0:-1]) 1864 self.assertEquals( 1865 [e], 1866 a[:1:-2])
1867
1868 - def test_getslice_text(self):
1869 ElementTree = self.etree.ElementTree 1870 1871 f = BytesIO('<a><b>B</b>B1<c>C</c>C1</a>') 1872 doc = ElementTree(file=f) 1873 a = doc.getroot() 1874 b = a[0] 1875 c = a[1] 1876 self.assertEquals( 1877 [b, c], 1878 a[:]) 1879 self.assertEquals( 1880 [b], 1881 a[0:1]) 1882 self.assertEquals( 1883 [c], 1884 a[1:])
1885
1886 - def test_comment_getitem_getslice(self):
1887 Element = self.etree.Element 1888 Comment = self.etree.Comment 1889 SubElement = self.etree.SubElement 1890 1891 a = Element('a') 1892 b = SubElement(a, 'b') 1893 foo = Comment('foo') 1894 a.append(foo) 1895 c = SubElement(a, 'c') 1896 self.assertEquals( 1897 [b, foo, c], 1898 a[:]) 1899 self.assertEquals( 1900 foo, 1901 a[1]) 1902 a[1] = new = Element('new') 1903 self.assertEquals( 1904 new, 1905 a[1]) 1906 self.assertXML( 1907 _bytes('<a><b></b><new></new><c></c></a>'), 1908 a)
1909
1910 - def test_delslice(self):
1911 Element = self.etree.Element 1912 SubElement = self.etree.SubElement 1913 1914 a = Element('a') 1915 b = SubElement(a, 'b') 1916 c = SubElement(a, 'c') 1917 d = SubElement(a, 'd') 1918 e = SubElement(a, 'e') 1919 1920 del a[1:3] 1921 self.assertEquals( 1922 [b, e], 1923 list(a))
1924
1925 - def test_delslice_negative1(self):
1926 Element = self.etree.Element 1927 SubElement = self.etree.SubElement 1928 1929 a = Element('a') 1930 b = SubElement(a, 'b') 1931 c = SubElement(a, 'c') 1932 d = SubElement(a, 'd') 1933 e = SubElement(a, 'e') 1934 1935 del a[1:-1] 1936 self.assertEquals( 1937 [b, e], 1938 list(a))
1939
1940 - def test_delslice_negative2(self):
1941 Element = self.etree.Element 1942 SubElement = self.etree.SubElement 1943 1944 a = Element('a') 1945 b = SubElement(a, 'b') 1946 c = SubElement(a, 'c') 1947 d = SubElement(a, 'd') 1948 e = SubElement(a, 'e') 1949 1950 del a[-3:-1] 1951 self.assertEquals( 1952 [b, e], 1953 list(a))
1954
1955 - def test_delslice_step(self):
1956 Element = self.etree.Element 1957 SubElement = self.etree.SubElement 1958 1959 a = Element('a') 1960 b = SubElement(a, 'b') 1961 c = SubElement(a, 'c') 1962 d = SubElement(a, 'd') 1963 e = SubElement(a, 'e') 1964 1965 del a[1::2] 1966 self.assertEquals( 1967 [b, d], 1968 list(a))
1969
1970 - def test_delslice_step_negative(self):
1971 Element = self.etree.Element 1972 SubElement = self.etree.SubElement 1973 1974 a = Element('a') 1975 b = SubElement(a, 'b') 1976 c = SubElement(a, 'c') 1977 d = SubElement(a, 'd') 1978 e = SubElement(a, 'e') 1979 1980 del a[::-1] 1981 self.assertEquals( 1982 [], 1983 list(a))
1984
1985 - def test_delslice_step_negative2(self):
1986 Element = self.etree.Element 1987 SubElement = self.etree.SubElement 1988 1989 a = Element('a') 1990 b = SubElement(a, 'b') 1991 c = SubElement(a, 'c') 1992 d = SubElement(a, 'd') 1993 e = SubElement(a, 'e') 1994 1995 del a[::-2] 1996 self.assertEquals( 1997 [b, d], 1998 list(a))
1999
2000 - def test_delslice_child_tail(self):
2001 ElementTree = self.etree.ElementTree 2002 f = BytesIO('<a><b></b>B2<c></c>C2<d></d>D2<e></e>E2</a>') 2003 doc = ElementTree(file=f) 2004 a = doc.getroot() 2005 del a[1:3] 2006 self.assertXML( 2007 _bytes('<a><b></b>B2<e></e>E2</a>'), 2008 a)
2009
2010 - def test_delslice_tail(self):
2011 XML = self.etree.XML 2012 a = XML(_bytes('<a><b></b>B2<c></c>C2</a>')) 2013 b, c = a 2014 2015 del a[:] 2016 2017 self.assertEquals("B2", b.tail) 2018 self.assertEquals("C2", c.tail)
2019
2020 - def test_delslice_memory(self):
2021 # this could trigger a crash 2022 Element = self.etree.Element 2023 SubElement = self.etree.SubElement 2024 a = Element('a') 2025 b = SubElement(a, 'b') 2026 c = SubElement(b, 'c') 2027 del b # no more reference to b 2028 del a[:] 2029 self.assertEquals('c', c.tag)
2030
2031 - def test_setslice(self):
2032 Element = self.etree.Element 2033 SubElement = self.etree.SubElement 2034 2035 a = Element('a') 2036 b = SubElement(a, 'b') 2037 c = SubElement(a, 'c') 2038 d = SubElement(a, 'd') 2039 2040 e = Element('e') 2041 f = Element('f') 2042 g = Element('g') 2043 2044 s = [e, f, g] 2045 a[1:2] = s 2046 self.assertEquals( 2047 [b, e, f, g, d], 2048 list(a))
2049
2050 - def test_setslice_all(self):
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 2058 e = Element('e') 2059 f = Element('f') 2060 g = Element('g') 2061 2062 s = [e, f, g] 2063 a[:] = s 2064 self.assertEquals( 2065 [e, f, g], 2066 list(a))
2067
2068 - def test_setslice_all_empty(self):
2069 Element = self.etree.Element 2070 SubElement = self.etree.SubElement 2071 2072 a = Element('a') 2073 2074 e = Element('e') 2075 f = Element('f') 2076 g = Element('g') 2077 2078 s = [e, f, g] 2079 a[:] = s 2080 self.assertEquals( 2081 [e, f, g], 2082 list(a))
2083
2084 - def test_setslice_all_replace(self):
2085 Element = self.etree.Element 2086 SubElement = self.etree.SubElement 2087 2088 a = Element('a') 2089 b = SubElement(a, 'b') 2090 c = SubElement(a, 'c') 2091 d = SubElement(a, 'd') 2092 2093 s = [b, c, d] 2094 a[:] = s 2095 self.assertEquals( 2096 [b, c, d], 2097 list(a))
2098
2099 - def test_setslice_all_replace_reversed(self):
2100 Element = self.etree.Element 2101 SubElement = self.etree.SubElement 2102 2103 a = Element('a') 2104 b = SubElement(a, 'b') 2105 c = SubElement(a, 'c') 2106 d = SubElement(a, 'd') 2107 2108 s = [d, c, b] 2109 a[:] = s 2110 self.assertEquals( 2111 [d, c, b], 2112 list(a))
2113
2114 - def test_setslice_all_replace_reversed_ns1(self):
2115 Element = self.etree.Element 2116 SubElement = self.etree.SubElement 2117 2118 a = Element('{ns}a') 2119 b = SubElement(a, '{ns}b', {'{ns1}a1': 'test'}) 2120 c = SubElement(a, '{ns}c', {'{ns2}a2': 'test'}) 2121 d = SubElement(a, '{ns}d', {'{ns3}a3': 'test'}) 2122 2123 s = [d, c, b] 2124 a[:] = s 2125 self.assertEquals( 2126 [d, c, b], 2127 list(a)) 2128 self.assertEquals( 2129 ['{ns}d', '{ns}c', '{ns}b'], 2130 [ child.tag for child in a ]) 2131 2132 self.assertEquals( 2133 [['{ns3}a3'], ['{ns2}a2'], ['{ns1}a1']], 2134 [ child.attrib.keys() for child in a ])
2135
2136 - def test_setslice_all_replace_reversed_ns2(self):
2137 Element = self.etree.Element 2138 SubElement = self.etree.SubElement 2139 2140 a = Element('{ns}a') 2141 b = SubElement(a, '{ns1}b', {'{ns}a1': 'test'}) 2142 c = SubElement(a, '{ns2}c', {'{ns}a2': 'test'}) 2143 d = SubElement(a, '{ns3}d', {'{ns}a3': 'test'}) 2144 2145 s = [d, c, b] 2146 a[:] = s 2147 self.assertEquals( 2148 [d, c, b], 2149 list(a)) 2150 self.assertEquals( 2151 ['{ns3}d', '{ns2}c', '{ns1}b'], 2152 [ child.tag for child in a ]) 2153 2154 self.assertEquals( 2155 [['{ns}a3'], ['{ns}a2'], ['{ns}a1']], 2156 [ child.attrib.keys() for child in a ])
2157
2158 - def test_setslice_end(self):
2159 Element = self.etree.Element 2160 SubElement = self.etree.SubElement 2161 2162 a = Element('a') 2163 b = SubElement(a, 'b') 2164 c = SubElement(a, 'c') 2165 2166 e = Element('e') 2167 f = Element('f') 2168 g = Element('g') 2169 h = Element('h') 2170 2171 s = [e, f] 2172 a[99:] = s 2173 self.assertEquals( 2174 [a, b, e, f], 2175 list(a)) 2176 2177 s = [g, h] 2178 a[:0] = s 2179 self.assertEquals( 2180 [g, h, a, b, e, f], 2181 list(a))
2182
2183 - def test_setslice_single(self):
2184 Element = self.etree.Element 2185 SubElement = self.etree.SubElement 2186 2187 a = Element('a') 2188 b = SubElement(a, 'b') 2189 c = SubElement(a, 'c') 2190 2191 e = Element('e') 2192 f = Element('f') 2193 2194 s = [e] 2195 a[0:1] = s 2196 self.assertEquals( 2197 [e, c], 2198 list(a)) 2199 2200 s = [f] 2201 a[1:2] = s 2202 self.assertEquals( 2203 [e, f], 2204 list(a))
2205
2206 - def test_setslice_tail(self):
2207 ElementTree = self.etree.ElementTree 2208 Element = self.etree.Element 2209 f = BytesIO('<a><b></b>B2<c></c>C2<d></d>D2<e></e>E2</a>') 2210 doc = ElementTree(file=f) 2211 a = doc.getroot() 2212 x = Element('x') 2213 y = Element('y') 2214 z = Element('z') 2215 x.tail = 'X2' 2216 y.tail = 'Y2' 2217 z.tail = 'Z2' 2218 a[1:3] = [x, y, z] 2219 self.assertXML( 2220 _bytes('<a><b></b>B2<x></x>X2<y></y>Y2<z></z>Z2<e></e>E2</a>'), 2221 a)
2222
2223 - def test_setslice_negative(self):
2224 Element = self.etree.Element 2225 SubElement = self.etree.SubElement 2226 2227 a = Element('a') 2228 b = SubElement(a, 'b') 2229 c = SubElement(a, 'c') 2230 d = SubElement(a, 'd') 2231 2232 x = Element('x') 2233 y = Element('y') 2234 2235 a[1:-1] = [x, y] 2236 self.assertEquals( 2237 [b, x, y, d], 2238 list(a))
2239
2240 - def test_setslice_negative2(self):
2241 Element = self.etree.Element 2242 SubElement = self.etree.SubElement 2243 2244 a = Element('a') 2245 b = SubElement(a, 'b') 2246 c = SubElement(a, 'c') 2247 d = SubElement(a, 'd') 2248 2249 x = Element('x') 2250 y = Element('y') 2251 2252 a[1:-2] = [x, y] 2253 self.assertEquals( 2254 [b, x, y, c, d], 2255 list(a))
2256
2257 - def test_setslice_end(self):
2258 Element = self.etree.Element 2259 SubElement = self.etree.SubElement 2260 2261 a = Element('a') 2262 b = SubElement(a, 'b') 2263 c = SubElement(a, 'c') 2264 d = SubElement(a, 'd') 2265 2266 e = Element('e') 2267 f = Element('f') 2268 g = Element('g') 2269 2270 s = [e, f, g] 2271 a[3:] = s 2272 self.assertEquals( 2273 [b, c, d, e, f, g], 2274 list(a))
2275
2276 - def test_setslice_empty(self):
2277 Element = self.etree.Element 2278 2279 a = Element('a') 2280 2281 b = Element('b') 2282 c = Element('c') 2283 2284 a[:] = [b, c] 2285 self.assertEquals( 2286 [b, c], 2287 list(a))
2288
2289 - def test_tail_elementtree_root(self):
2290 Element = self.etree.Element 2291 ElementTree = self.etree.ElementTree 2292 2293 a = Element('a') 2294 a.tail = 'A2' 2295 t = ElementTree(element=a) 2296 self.assertEquals('A2', 2297 a.tail)
2298
2299 - def test_elementtree_getiterator(self):
2300 Element = self.etree.Element 2301 SubElement = self.etree.SubElement 2302 ElementTree = self.etree.ElementTree 2303 2304 a = Element('a') 2305 b = SubElement(a, 'b') 2306 c = SubElement(a, 'c') 2307 d = SubElement(b, 'd') 2308 e = SubElement(c, 'e') 2309 t = ElementTree(element=a) 2310 2311 self.assertEquals( 2312 [a, b, d, c, e], 2313 list(t.getiterator()))
2314
2315 - def test_elementtree_getiterator_filter(self):
2316 Element = self.etree.Element 2317 SubElement = self.etree.SubElement 2318 ElementTree = self.etree.ElementTree 2319 a = Element('a') 2320 b = SubElement(a, 'b') 2321 c = SubElement(a, 'c') 2322 d = SubElement(b, 'd') 2323 e = SubElement(c, 'e') 2324 t = ElementTree(element=a) 2325 2326 self.assertEquals( 2327 [a], 2328 list(t.getiterator('a'))) 2329 a2 = SubElement(e, 'a') 2330 self.assertEquals( 2331 [a, a2], 2332 list(t.getiterator('a')))
2333
2334 - def test_ns_access(self):
2335 ElementTree = self.etree.ElementTree 2336 ns = 'http://xml.infrae.com/1' 2337 f = BytesIO('<x:a xmlns:x="%s"><x:b></x:b></x:a>' % ns) 2338 t = ElementTree(file=f) 2339 a = t.getroot() 2340 self.assertEquals('{%s}a' % ns, 2341 a.tag) 2342 self.assertEquals('{%s}b' % ns, 2343 a[0].tag)
2344
2345 - def test_ns_access2(self):
2346 ElementTree = self.etree.ElementTree 2347 ns = 'http://xml.infrae.com/1' 2348 ns2 = 'http://xml.infrae.com/2' 2349 f = BytesIO('<x:a xmlns:x="%s" xmlns:y="%s"><x:b></x:b><y:b></y:b></x:a>' % (ns, ns2)) 2350 t = ElementTree(file=f) 2351 a = t.getroot() 2352 self.assertEquals('{%s}a' % ns, 2353 a.tag) 2354 self.assertEquals('{%s}b' % ns, 2355 a[0].tag) 2356 self.assertEquals('{%s}b' % ns2, 2357 a[1].tag)
2358
2359 - def test_ns_setting(self):
2360 Element = self.etree.Element 2361 SubElement = self.etree.SubElement 2362 ns = 'http://xml.infrae.com/1' 2363 ns2 = 'http://xml.infrae.com/2' 2364 a = Element('{%s}a' % ns) 2365 b = SubElement(a, '{%s}b' % ns2) 2366 c = SubElement(a, '{%s}c' % ns) 2367 self.assertEquals('{%s}a' % ns, 2368 a.tag) 2369 self.assertEquals('{%s}b' % ns2, 2370 b.tag) 2371 self.assertEquals('{%s}c' % ns, 2372 c.tag) 2373 self.assertEquals('{%s}a' % ns, 2374 a.tag) 2375 self.assertEquals('{%s}b' % ns2, 2376 b.tag) 2377 self.assertEquals('{%s}c' % ns, 2378 c.tag)
2379
2380 - def test_ns_tag_parse(self):
2381 Element = self.etree.Element 2382 SubElement = self.etree.SubElement 2383 ElementTree = self.etree.ElementTree 2384 2385 ns = 'http://xml.infrae.com/1' 2386 ns2 = 'http://xml.infrae.com/2' 2387 f = BytesIO('<a xmlns="%s" xmlns:x="%s"><x:b></x:b><b></b></a>' % (ns, ns2)) 2388 t = ElementTree(file=f) 2389 2390 a = t.getroot() 2391 self.assertEquals('{%s}a' % ns, 2392 a.tag) 2393 self.assertEquals('{%s}b' % ns2, 2394 a[0].tag) 2395 self.assertEquals('{%s}b' % ns, 2396 a[1].tag)
2397
2398 - def test_ns_attr(self):
2399 Element = self.etree.Element 2400 ns = 'http://xml.infrae.com/1' 2401 ns2 = 'http://xml.infrae.com/2' 2402 a = Element('a') 2403 a.set('{%s}foo' % ns, 'Foo') 2404 a.set('{%s}bar' % ns2, 'Bar') 2405 self.assertEquals( 2406 'Foo', 2407 a.get('{%s}foo' % ns)) 2408 self.assertEquals( 2409 'Bar', 2410 a.get('{%s}bar' % ns2)) 2411 try: 2412 self.assertXML( 2413 _bytes('<a xmlns:ns0="%s" xmlns:ns1="%s" ns0:foo="Foo" ns1:bar="Bar"></a>' % (ns, ns2)), 2414 a) 2415 except AssertionError: 2416 self.assertXML( 2417 _bytes('<a xmlns:ns0="%s" xmlns:ns1="%s" ns1:foo="Foo" ns0:bar="Bar"></a>' % (ns2, ns)), 2418 a)
2419
2420 - def test_ns_move(self):
2421 Element = self.etree.Element 2422 one = self.etree.fromstring( 2423 _bytes('<foo><bar xmlns:ns="http://a.b.c"><ns:baz/></bar></foo>')) 2424 baz = one[0][0] 2425 2426 two = Element('root') 2427 two.append(baz) 2428 # removing the originating document could cause a crash/error before 2429 # as namespace is not moved along with it 2430 del one, baz 2431 self.assertEquals('{http://a.b.c}baz', two[0].tag)
2432
2433 - def test_ns_decl_tostring(self):
2434 tostring = self.etree.tostring 2435 root = self.etree.XML( 2436 _bytes('<foo><bar xmlns:ns="http://a.b.c"><ns:baz/></bar></foo>')) 2437 baz = root[0][0] 2438 2439 nsdecl = re.findall(_bytes("xmlns(?::[a-z0-9]+)?=[\"']([^\"']+)[\"']"), 2440 tostring(baz)) 2441 self.assertEquals([_bytes("http://a.b.c")], nsdecl)
2442
2443 - def test_ns_decl_tostring_default(self):
2444 tostring = self.etree.tostring 2445 root = self.etree.XML( 2446 _bytes('<foo><bar xmlns="http://a.b.c"><baz/></bar></foo>')) 2447 baz = root[0][0] 2448 2449 nsdecl = re.findall(_bytes("xmlns(?::[a-z0-9]+)?=[\"']([^\"']+)[\"']"), 2450 tostring(baz)) 2451 self.assertEquals([_bytes("http://a.b.c")], nsdecl)
2452
2453 - def test_ns_decl_tostring_root(self):
2454 tostring = self.etree.tostring 2455 root = self.etree.XML( 2456 _bytes('<foo xmlns:ns="http://a.b.c"><bar><ns:baz/></bar></foo>')) 2457 baz = root[0][0] 2458 2459 nsdecl = re.findall(_bytes("xmlns(?::[a-z0-9]+)?=[\"']([^\"']+)[\"']"), 2460 tostring(baz)) 2461 2462 self.assertEquals([_bytes("http://a.b.c")], nsdecl)
2463
2464 - def test_ns_decl_tostring_element(self):
2465 Element = self.etree.Element 2466 SubElement = self.etree.SubElement 2467 2468 root = Element("foo") 2469 bar = SubElement(root, "{http://a.b.c}bar") 2470 baz = SubElement(bar, "{http://a.b.c}baz") 2471 2472 nsdecl = re.findall(_bytes("xmlns(?::[a-z0-9]+)?=[\"']([^\"']+)[\"']"), 2473 self.etree.tostring(baz)) 2474 2475 self.assertEquals([_bytes("http://a.b.c")], nsdecl)
2476
2477 - def test_attribute_xmlns_move(self):
2478 Element = self.etree.Element 2479 2480 root = Element('element') 2481 2482 subelement = Element('subelement', 2483 {"{http://www.w3.org/XML/1998/namespace}id": "foo"}) 2484 self.assertEquals(1, len(subelement.attrib)) 2485 self.assertEquals( 2486 "foo", 2487 subelement.get("{http://www.w3.org/XML/1998/namespace}id")) 2488 2489 root.append(subelement) 2490 self.assertEquals(1, len(subelement.attrib)) 2491 self.assertEquals( 2492 list({"{http://www.w3.org/XML/1998/namespace}id" : "foo"}.items()), 2493 list(subelement.attrib.items())) 2494 self.assertEquals( 2495 "foo", 2496 subelement.get("{http://www.w3.org/XML/1998/namespace}id"))
2497
2498 - def test_namespaces_after_serialize(self):
2499 parse = self.etree.parse 2500 tostring = self.etree.tostring 2501 2502 ns_href = "http://a.b.c" 2503 one = parse( 2504 BytesIO('<foo><bar xmlns:ns="%s"><ns:baz/></bar></foo>' % ns_href)) 2505 baz = one.getroot()[0][0] 2506 2507 parsed = parse(BytesIO( tostring(baz) )).getroot() 2508 self.assertEquals('{%s}baz' % ns_href, parsed.tag)
2509
2510 - def test_tostring(self):
2511 tostring = self.etree.tostring 2512 Element = self.etree.Element 2513 SubElement = self.etree.SubElement 2514 2515 a = Element('a') 2516 b = SubElement(a, 'b') 2517 c = SubElement(a, 'c') 2518 2519 self.assertEquals(_bytes('<a><b></b><c></c></a>'), 2520 canonicalize(tostring(a)))
2521
2522 - def test_tostring_element(self):
2523 tostring = self.etree.tostring 2524 Element = self.etree.Element 2525 SubElement = self.etree.SubElement 2526 2527 a = Element('a') 2528 b = SubElement(a, 'b') 2529 c = SubElement(a, 'c') 2530 d = SubElement(c, 'd') 2531 self.assertEquals(_bytes('<b></b>'), 2532 canonicalize(tostring(b))) 2533 self.assertEquals(_bytes('<c><d></d></c>'), 2534 canonicalize(tostring(c)))
2535
2536 - def test_tostring_element_tail(self):
2537 tostring = self.etree.tostring 2538 Element = self.etree.Element 2539 SubElement = self.etree.SubElement 2540 2541 a = Element('a') 2542 b = SubElement(a, 'b') 2543 c = SubElement(a, 'c') 2544 d = SubElement(c, 'd') 2545 b.tail = 'Foo' 2546 2547 self.assert_(tostring(b) == _bytes('<b/>Foo') or 2548 tostring(b) == _bytes('<b />Foo'))
2549
2550 - def test_tostring_method_html(self):
2551 tostring = self.etree.tostring 2552 Element = self.etree.Element 2553 SubElement = self.etree.SubElement 2554 2555 html = Element('html') 2556 body = SubElement(html, 'body') 2557 p = SubElement(body, 'p') 2558 p.text = "html" 2559 SubElement(p, 'br').tail = "test" 2560 2561 self.assertEquals(_bytes('<html><body><p>html<br>test</p></body></html>'), 2562 tostring(html, method="html"))
2563
2564 - def test_tostring_method_text(self):
2565 tostring = self.etree.tostring 2566 Element = self.etree.Element 2567 SubElement = self.etree.SubElement 2568 2569 a = Element('a') 2570 a.text = "A" 2571 a.tail = "tail" 2572 b = SubElement(a, 'b') 2573 b.text = "B" 2574 b.tail = "TAIL" 2575 c = SubElement(a, 'c') 2576 c.text = "C" 2577 2578 self.assertEquals(_bytes('ABTAILCtail'), 2579 tostring(a, method="text"))
2580
2581 - def test_iterparse(self):
2582 iterparse = self.etree.iterparse 2583 f = BytesIO('<a><b></b><c/></a>') 2584 2585 iterator = iterparse(f) 2586 self.assertEquals(None, 2587 iterator.root) 2588 events = list(iterator) 2589 root = iterator.root 2590 self.assertEquals( 2591 [('end', root[0]), ('end', root[1]), ('end', root)], 2592 events)
2593
2594 - def test_iterparse_file(self):
2595 iterparse = self.etree.iterparse 2596 iterator = iterparse(fileInTestDir("test.xml")) 2597 self.assertEquals(None, 2598 iterator.root) 2599 events = list(iterator) 2600 root = iterator.root 2601 self.assertEquals( 2602 [('end', root[0]), ('end', root)], 2603 events)
2604
2605 - def test_iterparse_start(self):
2606 iterparse = self.etree.iterparse 2607 f = BytesIO('<a><b></b><c/></a>') 2608 2609 iterator = iterparse(f, events=('start',)) 2610 events = list(iterator) 2611 root = iterator.root 2612 self.assertEquals( 2613 [('start', root), ('start', root[0]), ('start', root[1])], 2614 events)
2615
2616 - def test_iterparse_start_end(self):
2617 iterparse = self.etree.iterparse 2618 f = BytesIO('<a><b></b><c/></a>') 2619 2620 iterator = iterparse(f, events=('start','end')) 2621 events = list(iterator) 2622 root = iterator.root 2623 self.assertEquals( 2624 [('start', root), ('start', root[0]), ('end', root[0]), 2625 ('start', root[1]), ('end', root[1]), ('end', root)], 2626 events)
2627
2628 - def test_iterparse_clear(self):
2629 iterparse = self.etree.iterparse 2630 f = BytesIO('<a><b></b><c/></a>') 2631 2632 iterator = iterparse(f) 2633 for event, elem in iterator: 2634 elem.clear() 2635 2636 root = iterator.root 2637 self.assertEquals(0, 2638 len(root))
2639
2640 - def test_iterparse_large(self):
2641 iterparse = self.etree.iterparse 2642 CHILD_COUNT = 12345 2643 f = BytesIO('<a>%s</a>' % ('<b>test</b>'*CHILD_COUNT)) 2644 2645 i = 0 2646 for key in iterparse(f): 2647 event, element = key 2648 i += 1 2649 self.assertEquals(i, CHILD_COUNT + 1)
2650
2651 - def test_iterparse_attrib_ns(self):
2652 iterparse = self.etree.iterparse 2653 f = BytesIO('<a xmlns="http://ns1/"><b><c xmlns="http://ns2/"/></b></a>') 2654 2655 attr_name = '{http://testns/}bla' 2656 events = [] 2657 iterator = iterparse(f, events=('start','end','start-ns','end-ns')) 2658 for event, elem in iterator: 2659 events.append(event) 2660 if event == 'start': 2661 if elem.tag != '{http://ns1/}a': 2662 elem.set(attr_name, 'value') 2663 2664 self.assertEquals( 2665 ['start-ns', 'start', 'start', 'start-ns', 'start', 2666 'end', 'end-ns', 'end', 'end', 'end-ns'], 2667 events) 2668 2669 root = iterator.root 2670 self.assertEquals( 2671 None, 2672 root.get(attr_name)) 2673 self.assertEquals( 2674 'value', 2675 root[0].get(attr_name))
2676
2677 - def test_iterparse_getiterator(self):
2678 iterparse = self.etree.iterparse 2679 f = BytesIO('<a><b><d/></b><c/></a>') 2680 2681 counts = [] 2682 for event, elem in iterparse(f): 2683 counts.append(len(list(elem.getiterator()))) 2684 self.assertEquals( 2685 [1,2,1,4], 2686 counts)
2687
2688 - def test_iterparse_move_elements(self):
2689 iterparse = self.etree.iterparse 2690 f = BytesIO('<a><b><d/></b><c/></a>') 2691 2692 for event, node in etree.iterparse(f): pass 2693 2694 root = etree.Element('new_root', {}) 2695 root[:] = node[:] 2696 2697 self.assertEquals( 2698 ['b', 'c'], 2699 [ el.tag for el in root ])
2700
2701 - def test_iterparse_cdata(self):
2702 tostring = self.etree.tostring 2703 f = BytesIO('<root><![CDATA[test]]></root>') 2704 context = self.etree.iterparse(f) 2705 content = [ el.text for event,el in context ] 2706 2707 self.assertEquals(['test'], content) 2708 self.assertEquals(_bytes('<root>test</root>'), 2709 tostring(context.root))
2710
2711 - def test_parse_file(self):
2712 parse = self.etree.parse 2713 # from file 2714 tree = parse(fileInTestDir('test.xml')) 2715 self.assertXML( 2716 _bytes('<a><b></b></a>'), 2717 tree.getroot())
2718
2719 - def test_parse_file_nonexistent(self):
2720 parse = self.etree.parse 2721 self.assertRaises(IOError, parse, fileInTestDir('notthere.xml'))
2722
2723 - def test_parse_error_none(self):
2724 parse = self.etree.parse 2725 self.assertRaises(TypeError, parse, None)
2726
2727 - def test_parse_error(self):
2728 # ET < 1.3 raises ExpatError 2729 parse = self.etree.parse 2730 f = BytesIO('<a><b></c></b></a>') 2731 self.assertRaises(SyntaxError, parse, f) 2732 f.close()
2733
2734 - def test_parse_error_from_file(self):
2735 parse = self.etree.parse 2736 # from file 2737 f = open(fileInTestDir('test_broken.xml'), 'rb') 2738 self.assertRaises(SyntaxError, parse, f) 2739 f.close()
2740
2741 - def test_parse_file_object(self):
2742 parse = self.etree.parse 2743 # from file object 2744 f = open(fileInTestDir('test.xml'), 'rb') 2745 tree = parse(f) 2746 f.close() 2747 self.assertXML( 2748 _bytes('<a><b></b></a>'), 2749 tree.getroot())
2750
2751 - def test_parse_stringio(self):
2752 parse = self.etree.parse 2753 f = BytesIO('<a><b></b></a>') 2754 tree = parse(f) 2755 f.close() 2756 self.assertXML( 2757 _bytes('<a><b></b></a>'), 2758 tree.getroot() 2759 )
2760
2761 - def test_parse_cdata(self):
2762 tostring = self.etree.tostring 2763 root = self.etree.XML(_bytes('<root><![CDATA[test]]></root>')) 2764 2765 self.assertEquals('test', root.text) 2766 self.assertEquals(_bytes('<root>test</root>'), 2767 tostring(root))
2768
2769 - def test_parse_with_encoding(self):
2770 # this can fail in libxml2 <= 2.6.22 2771 parse = self.etree.parse 2772 tree = parse(BytesIO('<?xml version="1.0" encoding="ascii"?><html/>')) 2773 self.assertXML(_bytes('<html></html>'), 2774 tree.getroot())
2775
2776 - def test_encoding(self):
2777 Element = self.etree.Element 2778 2779 a = Element('a') 2780 a.text = _str('Søk på nettet') 2781 self.assertXML( 2782 _str('<a>Søk på nettet</a>').encode('UTF-8'), 2783 a, 'utf-8')
2784
2785 - def test_encoding_exact(self):
2786 ElementTree = self.etree.ElementTree 2787 Element = self.etree.Element 2788 2789 a = Element('a') 2790 a.text = _str('Søk på nettet') 2791 2792 f = BytesIO() 2793 tree = ElementTree(element=a) 2794 tree.write(f, encoding='utf-8') 2795 self.assertEquals(_str('<a>Søk på nettet</a>').encode('UTF-8'), 2796 f.getvalue().replace(_bytes('\n'),_bytes('')))
2797
2798 - def test_parse_file_encoding(self):
2799 parse = self.etree.parse 2800 # from file 2801 tree = parse(fileInTestDir('test-string.xml')) 2802 self.assertXML( 2803 _str('<a>Søk på nettet</a>').encode('UTF-8'), 2804 tree.getroot(), 'UTF-8')
2805
2806 - def test_parse_file_object_encoding(self):
2807 parse = self.etree.parse 2808 # from file object 2809 f = open(fileInTestDir('test-string.xml'), 'rb') 2810 tree = parse(f) 2811 f.close() 2812 self.assertXML( 2813 _str('<a>Søk på nettet</a>').encode('UTF-8'), 2814 tree.getroot(), 'UTF-8')
2815
2816 - def test_encoding_8bit_latin1(self):
2817 ElementTree = self.etree.ElementTree 2818 Element = self.etree.Element 2819 2820 a = Element('a') 2821 a.text = _str('Søk på nettet') 2822 2823 f = BytesIO() 2824 tree = ElementTree(element=a) 2825 tree.write(f, encoding='iso-8859-1') 2826 result = f.getvalue() 2827 declaration = _bytes("<?xml version=\'1.0\' encoding=\'iso-8859-1\'?>") 2828 self.assertEncodingDeclaration(result, _bytes('iso-8859-1')) 2829 result = result.split(_bytes('?>'), 1)[-1].replace(_bytes('\n'),_bytes('')) 2830 self.assertEquals(_str('<a>Søk på nettet</a>').encode('iso-8859-1'), 2831 result)
2832
2833 - def test_parse_encoding_8bit_explicit(self):
2834 XMLParser = self.etree.XMLParser 2835 2836 text = _str('Søk på nettet') 2837 xml_latin1 = (_str('<a>%s</a>') % text).encode('iso-8859-1') 2838 2839 self.assertRaises(self.etree.ParseError, 2840 self.etree.parse, 2841 BytesIO(xml_latin1)) 2842 2843 tree = self.etree.parse(BytesIO(xml_latin1), 2844 XMLParser(encoding="iso-8859-1")) 2845 a = tree.getroot() 2846 self.assertEquals(a.text, text)
2847
2848 - def test_parse_encoding_8bit_override(self):
2849 XMLParser = self.etree.XMLParser 2850 2851 text = _str('Søk på nettet') 2852 wrong_declaration = _str("<?xml version='1.0' encoding='UTF-8'?>") 2853 xml_latin1 = (_str('%s<a>%s</a>') % (wrong_declaration, text) 2854 ).encode('iso-8859-1') 2855 2856 self.assertRaises(self.etree.ParseError, 2857 self.etree.parse, 2858 BytesIO(xml_latin1)) 2859 2860 tree = self.etree.parse(BytesIO(xml_latin1), 2861 XMLParser(encoding="iso-8859-1")) 2862 a = tree.getroot() 2863 self.assertEquals(a.text, text)
2864
2865 - def _test_wrong_unicode_encoding(self):
2866 # raise error on wrong encoding declaration in unicode strings 2867 XML = self.etree.XML 2868 test_utf = (_str('<?xml version="1.0" encoding="iso-8859-1"?>') + 2869 _str('<a>Søk på nettet</a>')) 2870 self.assertRaises(SyntaxError, XML, test_utf)
2871
2872 - def test_encoding_write_default_encoding(self):
2873 ElementTree = self.etree.ElementTree 2874 Element = self.etree.Element 2875 2876 a = Element('a') 2877 a.text = _str('Søk på nettet') 2878 2879 f = BytesIO() 2880 tree = ElementTree(element=a) 2881 tree.write(f) 2882 data = f.getvalue().replace(_bytes('\n'),_bytes('')) 2883 self.assertEquals( 2884 _str('<a>Søk på nettet</a>').encode('ASCII', 'xmlcharrefreplace'), 2885 data)
2886
2887 - def test_encoding_tostring(self):
2888 Element = self.etree.Element 2889 tostring = self.etree.tostring 2890 2891 a = Element('a') 2892 a.text = _str('Søk på nettet') 2893 self.assertEquals(_str('<a>Søk på nettet</a>').encode('UTF-8'), 2894 tostring(a, encoding='utf-8'))
2895
2896 - def test_encoding_tostring_unknown(self):
2897 Element = self.etree.Element 2898 tostring = self.etree.tostring 2899 2900 a = Element('a') 2901 a.text = _str('Søk på nettet') 2902 self.assertRaises(LookupError, tostring, a, 2903 encoding='Invalid Encoding')
2904
2905 - def test_encoding_tostring_sub(self):
2906 Element = self.etree.Element 2907 SubElement = self.etree.SubElement 2908 tostring = self.etree.tostring 2909 2910 a = Element('a') 2911 b = SubElement(a, 'b') 2912 b.text = _str('Søk på nettet') 2913 self.assertEquals(_str('<b>Søk på nettet</b>').encode('UTF-8'), 2914 tostring(b, encoding='utf-8'))
2915
2916 - def test_encoding_tostring_sub_tail(self):
2917 Element = self.etree.Element 2918 SubElement = self.etree.SubElement 2919 tostring = self.etree.tostring 2920 2921 a = Element('a') 2922 b = SubElement(a, 'b') 2923 b.text = _str('Søk på nettet') 2924 b.tail = _str('Søk') 2925 self.assertEquals(_str('<b>Søk på nettet</b>Søk').encode('UTF-8'), 2926 tostring(b, encoding='utf-8'))
2927
2928 - def test_encoding_tostring_default_encoding(self):
2929 Element = self.etree.Element 2930 SubElement = self.etree.SubElement 2931 tostring = self.etree.tostring 2932 2933 a = Element('a') 2934 a.text = _str('Søk på nettet') 2935 2936 expected = _bytes('<a>S&#248;k p&#229; nettet</a>') 2937 self.assertEquals( 2938 expected, 2939 tostring(a))
2940
2941 - def test_encoding_sub_tostring_default_encoding(self):
2942 Element = self.etree.Element 2943 SubElement = self.etree.SubElement 2944 tostring = self.etree.tostring 2945 2946 a = Element('a') 2947 b = SubElement(a, 'b') 2948 b.text = _str('Søk på nettet') 2949 2950 expected = _bytes('<b>S&#248;k p&#229; nettet</b>') 2951 self.assertEquals( 2952 expected, 2953 tostring(b))
2954
2955 - def test_encoding_8bit_xml(self):
2956 utext = _str('Søk på nettet') 2957 uxml = _str('<p>%s</p>') % utext 2958 prologue = _bytes('<?xml version="1.0" encoding="iso-8859-1" ?>') 2959 isoxml = prologue + uxml.encode('iso-8859-1') 2960 tree = self.etree.XML(isoxml) 2961 self.assertEquals(utext, tree.text)
2962
2963 - def test_encoding_utf8_bom(self):
2964 utext = _str('Søk på nettet') 2965 uxml = (_str('<?xml version="1.0" encoding="UTF-8"?>') + 2966 _str('<p>%s</p>') % utext) 2967 bom = _bytes('\\xEF\\xBB\\xBF').decode("unicode_escape").encode("latin1") 2968 xml = bom + uxml.encode("utf-8") 2969 tree = etree.XML(xml) 2970 self.assertEquals(utext, tree.text)
2971
2972 - def test_encoding_8bit_parse_stringio(self):
2973 utext = _str('Søk på nettet') 2974 uxml = _str('<p>%s</p>') % utext 2975 prologue = _bytes('<?xml version="1.0" encoding="iso-8859-1" ?>') 2976 isoxml = prologue + uxml.encode('iso-8859-1') 2977 el = self.etree.parse(BytesIO(isoxml)).getroot() 2978 self.assertEquals(utext, el.text)
2979
2980 - def test_deepcopy_elementtree(self):
2981 Element = self.etree.Element 2982 ElementTree = self.etree.ElementTree 2983 2984 a = Element('a') 2985 a.text = "Foo" 2986 atree = ElementTree(a) 2987 2988 btree = copy.deepcopy(atree) 2989 self.assertEqual("Foo", atree.getroot().text) 2990 self.assertEqual("Foo", btree.getroot().text) 2991 self.assertFalse(btree is atree) 2992 self.assertFalse(btree.getroot() is atree.getroot())
2993
2994 - def test_deepcopy(self):
2995 Element = self.etree.Element 2996 2997 a = Element('a') 2998 a.text = 'Foo' 2999 3000 b = copy.deepcopy(a) 3001 self.assertEquals('Foo', b.text) 3002 3003 b.text = 'Bar' 3004 self.assertEquals('Bar', b.text) 3005 self.assertEquals('Foo', a.text) 3006 3007 del a 3008 self.assertEquals('Bar', b.text)
3009
3010 - def test_deepcopy_tail(self):
3011 Element = self.etree.Element 3012 3013 a = Element('a') 3014 a.tail = 'Foo' 3015 3016 b = copy.deepcopy(a) 3017 self.assertEquals('Foo', b.tail) 3018 3019 b.tail = 'Bar' 3020 self.assertEquals('Bar', b.tail) 3021 self.assertEquals('Foo', a.tail) 3022 3023 del a 3024 self.assertEquals('Bar', b.tail)
3025
3026 - def test_deepcopy_subelement(self):
3027 Element = self.etree.Element 3028 SubElement = self.etree.SubElement 3029 3030 root = Element('root') 3031 a = SubElement(root, 'a') 3032 a.text = 'FooText' 3033 a.tail = 'FooTail' 3034 3035 b = copy.deepcopy(a) 3036 self.assertEquals('FooText', b.text) 3037 self.assertEquals('FooTail', b.tail) 3038 3039 b.text = 'BarText' 3040 b.tail = 'BarTail' 3041 self.assertEquals('BarTail', b.tail) 3042 self.assertEquals('FooTail', a.tail) 3043 self.assertEquals('BarText', b.text) 3044 self.assertEquals('FooText', a.text) 3045 3046 del a 3047 self.assertEquals('BarTail', b.tail) 3048 self.assertEquals('BarText', b.text)
3049
3050 - def test_deepcopy_namespaces(self):
3051 root = self.etree.XML(_bytes('''<doc xmlns="dns" xmlns:t="tns"> 3052 <parent><node t:foo="bar" /></parent> 3053 </doc>''')) 3054 self.assertEquals( 3055 root[0][0].get('{tns}foo'), 3056 copy.deepcopy(root[0])[0].get('{tns}foo') ) 3057 self.assertEquals( 3058 root[0][0].get('{tns}foo'), 3059 copy.deepcopy(root[0][0]).get('{tns}foo') )
3060
3061 - def test_deepcopy_append(self):
3062 # previously caused a crash 3063 Element = self.etree.Element 3064 tostring = self.etree.tostring 3065 3066 a = Element('a') 3067 b = copy.deepcopy(a) 3068 a.append( Element('C') ) 3069 b.append( Element('X') ) 3070 3071 self.assertEquals(_bytes('<a><C/></a>'), 3072 tostring(a).replace(_bytes(' '), _bytes(''))) 3073 self.assertEquals(_bytes('<a><X/></a>'), 3074 tostring(b).replace(_bytes(' '), _bytes('')))
3075
3076 - def test_deepcopy_comment(self):
3077 # previously caused a crash 3078 # not supported by ET < 1.3! 3079 Comment = self.etree.Comment 3080 3081 a = Comment("ONE") 3082 b = copy.deepcopy(a) 3083 b.text = "ANOTHER" 3084 3085 self.assertEquals('ONE', a.text) 3086 self.assertEquals('ANOTHER', b.text)
3087
3088 - def test_shallowcopy(self):
3089 Element = self.etree.Element 3090 3091 a = Element('a') 3092 a.text = 'Foo' 3093 3094 b = copy.copy(a) 3095 self.assertEquals('Foo', b.text) 3096 3097 b.text = 'Bar' 3098 self.assertEquals('Bar', b.text) 3099 self.assertEquals('Foo', a.text)
3100 # XXX ElementTree will share nodes, but lxml.etree won't.. 3101
3102 - def test_shallowcopy_elementtree(self):
3103 Element = self.etree.Element 3104 ElementTree = self.etree.ElementTree 3105 3106 a = Element('a') 3107 a.text = 'Foo' 3108 atree = ElementTree(a) 3109 3110 btree = copy.copy(atree) 3111 self.assertFalse(btree is atree) 3112 self.assert_(btree.getroot() is atree.getroot()) 3113 self.assertEquals('Foo', atree.getroot().text)
3114
3115 - def _test_element_boolean(self):
3116 # deprecated as of ET 1.3/lxml 2.0 3117 etree = self.etree 3118 e = etree.Element('foo') 3119 self.assertEquals(False, bool(e)) 3120 etree.SubElement(e, 'bar') 3121 self.assertEquals(True, bool(e)) 3122 e = etree.Element('foo') 3123 e.text = 'hey' 3124 self.assertEquals(False, bool(e)) 3125 e = etree.Element('foo') 3126 e.tail = 'bar' 3127 self.assertEquals(False, bool(e)) 3128 e = etree.Element('foo') 3129 e.set('bar', 'Bar') 3130 self.assertEquals(False, bool(e))
3131
3132 - def test_multiple_elementrees(self):
3133 etree = self.etree 3134 3135 a = etree.Element('a') 3136 b = etree.SubElement(a, 'b') 3137 3138 t = etree.ElementTree(a) 3139 self.assertEquals(self._rootstring(t), _bytes('<a><b/></a>')) 3140 3141 t1 = etree.ElementTree(a) 3142 self.assertEquals(self._rootstring(t1), _bytes('<a><b/></a>')) 3143 self.assertEquals(self._rootstring(t), _bytes('<a><b/></a>')) 3144 3145 t2 = etree.ElementTree(b) 3146 self.assertEquals(self._rootstring(t2), _bytes('<b/>')) 3147 self.assertEquals(self._rootstring(t1), _bytes('<a><b/></a>')) 3148 self.assertEquals(self._rootstring(t), _bytes('<a><b/></a>'))
3149
3150 - def test_qname(self):
3151 etree = self.etree 3152 qname = etree.QName('myns', 'a') 3153 a1 = etree.Element(qname) 3154 a2 = etree.SubElement(a1, qname) 3155 self.assertEquals(a1.tag, "{myns}a") 3156 self.assertEquals(a2.tag, "{myns}a")
3157
3158 - def test_qname_cmp(self):
3159 etree = self.etree 3160 qname1 = etree.QName('myns', 'a') 3161 qname2 = etree.QName('myns', 'a') 3162 self.assertEquals(qname1, "{myns}a") 3163 self.assertEquals("{myns}a", qname2) 3164 self.assertEquals(qname1, qname1) 3165 self.assertEquals(qname1, qname2)
3166
3167 - def test_qname_attribute_getset(self):
3168 etree = self.etree 3169 qname = etree.QName('myns', 'a') 3170 3171 a = etree.Element(qname) 3172 a.set(qname, "value") 3173 3174 self.assertEquals(a.get(qname), "value") 3175 self.assertEquals(a.get("{myns}a"), "value")
3176
3177 - def test_qname_attrib(self):
3178 etree = self.etree 3179 qname = etree.QName('myns', 'a') 3180 3181 a = etree.Element(qname) 3182 a.attrib[qname] = "value" 3183 3184 self.assertEquals(a.attrib[qname], "value") 3185 self.assertEquals(a.attrib.get(qname), "value") 3186 3187 self.assertEquals(a.attrib["{myns}a"], "value") 3188 self.assertEquals(a.attrib.get("{myns}a"), "value")
3189
3190 - def test_qname_attribute_resolve(self):
3191 etree = self.etree 3192 qname = etree.QName('http://myns', 'a') 3193 a = etree.Element(qname) 3194 a.set(qname, qname) 3195 3196 self.assertXML( 3197 _bytes('<ns0:a xmlns:ns0="http://myns" ns0:a="ns0:a"></ns0:a>'), 3198 a)
3199
3200 - def test_qname_attribute_resolve_new(self):
3201 etree = self.etree 3202 qname = etree.QName('http://myns', 'a') 3203 a = etree.Element('a') 3204 a.set('a', qname) 3205 3206 self.assertXML( 3207 _bytes('<a xmlns:ns0="http://myns" a="ns0:a"></a>'), 3208 a)
3209
3210 - def test_qname_attrib_resolve(self):
3211 etree = self.etree 3212 qname = etree.QName('http://myns', 'a') 3213 a = etree.Element(qname) 3214 a.attrib[qname] = qname 3215 3216 self.assertXML( 3217 _bytes('<ns0:a xmlns:ns0="http://myns" ns0:a="ns0:a"></ns0:a>'), 3218 a)
3219
3220 - def test_parser_version(self):
3221 etree = self.etree 3222 parser = etree.XMLParser() 3223 if hasattr(parser, "version"): 3224 # ElementTree 1.3+, cET 3225 self.assert_(re.match("[^ ]+ [0-9.]+", parser.version))
3226 3227 # feed parser interface 3228
3229 - def test_feed_parser(self):
3230 parser = self.etree.XMLParser() 3231 3232 parser.feed('<?xml version=') 3233 parser.feed('"1.0"?><ro') 3234 parser.feed('ot><') 3235 parser.feed('a test="works"/') 3236 parser.feed('></root') 3237 parser.feed('>') 3238 3239 root = parser.close() 3240 3241 self.assertEquals(root.tag, "root") 3242 self.assertEquals(root[0].tag, "a") 3243 self.assertEquals(root[0].get("test"), "works")
3244
3245 - def test_feed_parser_error_close_empty(self):
3246 ParseError = self.etree.ParseError 3247 parser = self.etree.XMLParser() 3248 self.assertRaises(ParseError, parser.close)
3249
3250 - def test_feed_parser_error_close_incomplete(self):
3251 ParseError = self.etree.ParseError 3252 parser = self.etree.XMLParser() 3253 3254 parser.feed('<?xml version=') 3255 parser.feed('"1.0"?><ro') 3256 3257 self.assertRaises(ParseError, parser.close)
3258
3259 - def test_feed_parser_error_broken(self):
3260 ParseError = self.etree.ParseError 3261 parser = self.etree.XMLParser() 3262 3263 parser.feed('<?xml version=') 3264 parser.feed('"1.0"?><ro') 3265 try: 3266 parser.feed('<><><><><><><') 3267 except ParseError: 3268 # can raise, but not required before close() 3269 pass 3270 3271 self.assertRaises(ParseError, parser.close)
3272
3273 - def test_feed_parser_error_position(self):
3274 ParseError = self.etree.ParseError 3275 parser = self.etree.XMLParser() 3276 try: 3277 parser.close() 3278 except ParseError: 3279 e = sys.exc_info()[1] 3280 self.assertNotEquals(None, e.code) 3281 self.assertNotEquals(0, e.code) 3282 self.assert_(isinstance(e.position, tuple)) 3283 self.assert_(e.position >= (0, 0))
3284 3285 # parser target interface 3286
3287 - def test_parser_target_tag(self):
3288 assertEquals = self.assertEquals 3289 assertFalse = self.assertFalse 3290 3291 events = [] 3292 class Target(object): 3293 def start(self, tag, attrib): 3294 events.append("start") 3295 assertFalse(attrib) 3296 assertEquals("TAG", tag)
3297 def end(self, tag): 3298 events.append("end") 3299 assertEquals("TAG", tag) 3300 def close(self): 3301 return "DONE" 3302 3303 parser = self.etree.XMLParser(target=Target()) 3304 3305 parser.feed("<TAG/>") 3306 done = parser.close() 3307 3308 self.assertEquals("DONE", done) 3309 self.assertEquals(["start", "end"], events) 3310
3311 - def test_elementtree_parser_target(self):
3312 assertEquals = self.assertEquals 3313 assertFalse = self.assertFalse 3314 Element = self.etree.Element 3315 3316 events = [] 3317 class Target(object): 3318 def start(self, tag, attrib): 3319 events.append("start") 3320 assertFalse(attrib) 3321 assertEquals("TAG", tag)
3322 def end(self, tag): 3323 events.append("end") 3324 assertEquals("TAG", tag) 3325 def close(self): 3326 return Element("DONE") 3327 3328 parser = self.etree.XMLParser(target=Target()) 3329 tree = self.etree.ElementTree() 3330 tree.parse(BytesIO("<TAG/>"), parser=parser) 3331 3332 self.assertEquals("DONE", tree.getroot().tag) 3333 self.assertEquals(["start", "end"], events) 3334
3335 - def test_parser_target_attrib(self):
3336 assertEquals = self.assertEquals 3337 3338 events = [] 3339 class Target(object): 3340 def start(self, tag, attrib): 3341 events.append("start-" + tag) 3342 for name, value in attrib.items(): 3343 assertEquals(tag + name, value)
3344 def end(self, tag): 3345 events.append("end-" + tag) 3346 def close(self): 3347 return "DONE" 3348 3349 parser = self.etree.XMLParser(target=Target()) 3350 3351 parser.feed('<root a="roota" b="rootb"><sub c="subc"/></root>') 3352 done = parser.close() 3353 3354 self.assertEquals("DONE", done) 3355 self.assertEquals(["start-root", "start-sub", "end-sub", "end-root"], 3356 events) 3357
3358 - def test_parser_target_data(self):
3359 events = [] 3360 class Target(object): 3361 def start(self, tag, attrib): 3362 events.append("start-" + tag)
3363 def end(self, tag): 3364 events.append("end-" + tag) 3365 def data(self, data): 3366 events.append("data-" + data) 3367 def close(self): 3368 return "DONE" 3369 3370 parser = self.etree.XMLParser(target=Target()) 3371 3372 parser.feed('<root>A<sub/>B</root>') 3373 done = parser.close() 3374 3375 self.assertEquals("DONE", done) 3376 self.assertEquals(["start-root", "data-A", "start-sub", 3377 "end-sub", "data-B", "end-root"], 3378 events) 3379
3380 - def test_parser_target_entity(self):
3381 events = [] 3382 class Target(object): 3383 def __init__(self): 3384 self._data = []
3385 def _flush_data(self): 3386 if self._data: 3387 events.append("data-" + ''.join(self._data)) 3388 del self._data[:] 3389 def start(self, tag, attrib): 3390 self._flush_data() 3391 events.append("start-" + tag) 3392 def end(self, tag): 3393 self._flush_data() 3394 events.append("end-" + tag) 3395 def data(self, data): 3396 self._data.append(data) 3397 def close(self): 3398 self._flush_data() 3399 return "DONE" 3400 3401 parser = self.etree.XMLParser(target=Target()) 3402 3403 dtd = ''' 3404 <!DOCTYPE root [ 3405 <!ELEMENT root (sub*)> 3406 <!ELEMENT sub (#PCDATA)> 3407 <!ENTITY ent "an entity"> 3408 ]> 3409 ''' 3410 parser.feed(dtd+'<root><sub/><sub>this is &ent;</sub><sub/></root>') 3411 done = parser.close() 3412 3413 self.assertEquals("DONE", done) 3414 self.assertEquals(["start-root", "start-sub", "end-sub", "start-sub", 3415 "data-this is an entity", 3416 "end-sub", "start-sub", "end-sub", "end-root"], 3417 events) 3418
3419 - def test_parser_target_entity_unknown(self):
3420 events = [] 3421 class Target(object): 3422 def __init__(self): 3423 self._data = []
3424 def _flush_data(self): 3425 if self._data: 3426 events.append("data-" + ''.join(self._data)) 3427 del self._data[:] 3428 def start(self, tag, attrib): 3429 self._flush_data() 3430 events.append("start-" + tag) 3431 def end(self, tag): 3432 self._flush_data() 3433 events.append("end-" + tag) 3434 def data(self, data): 3435 self._data.append(data) 3436 def close(self): 3437 self._flush_data() 3438 return "DONE" 3439 3440 parser = self.etree.XMLParser(target=Target()) 3441 3442 def feed(): 3443 parser.feed('<root><sub/><sub>some &ent;</sub><sub/></root>') 3444 parser.close() 3445 3446 self.assertRaises(self.etree.ParseError, feed) 3447
3448 - def test_treebuilder(self):
3449 builder = self.etree.TreeBuilder() 3450 el = builder.start("root", {'a':'A', 'b':'B'}) 3451 self.assertEquals("root", el.tag) 3452 self.assertEquals({'a':'A', 'b':'B'}, el.attrib) 3453 builder.data("ROOTTEXT") 3454 el = builder.start("child", {'x':'X', 'y':'Y'}) 3455 self.assertEquals("child", el.tag) 3456 self.assertEquals({'x':'X', 'y':'Y'}, el.attrib) 3457 builder.data("CHILDTEXT") 3458 el = builder.end("child") 3459 self.assertEquals("child", el.tag) 3460 self.assertEquals({'x':'X', 'y':'Y'}, el.attrib) 3461 self.assertEquals("CHILDTEXT", el.text) 3462 self.assertEquals(None, el.tail) 3463 builder.data("CHILDTAIL") 3464 root = builder.end("root") 3465 3466 self.assertEquals("root", root.tag) 3467 self.assertEquals("ROOTTEXT", root.text) 3468 self.assertEquals("CHILDTEXT", root[0].text) 3469 self.assertEquals("CHILDTAIL", root[0].tail)
3470
3471 - def test_treebuilder_target(self):
3472 parser = self.etree.XMLParser(target=self.etree.TreeBuilder()) 3473 parser.feed('<root>ROOTTEXT<child>CHILDTEXT</child>CHILDTAIL</root>') 3474 root = parser.close() 3475 3476 self.assertEquals("root", root.tag) 3477 self.assertEquals("ROOTTEXT", root.text) 3478 self.assertEquals("CHILDTEXT", root[0].text) 3479 self.assertEquals("CHILDTAIL", root[0].tail)
3480 3481 # helper methods 3482
3483 - def _writeElement(self, element, encoding='us-ascii'):
3484 """Write out element for comparison. 3485 """ 3486 data = self.etree.tostring(element, encoding=encoding) 3487 if encoding != 'us-ascii': 3488 data = data.decode(encoding) 3489 return canonicalize(data)
3490
3491 - def _writeElementFile(self, element, encoding='us-ascii'):
3492 """Write out element for comparison, using real file. 3493 """ 3494 ElementTree = self.etree.ElementTree 3495 handle, filename = tempfile.mkstemp() 3496 try: 3497 f = open(filename, 'wb') 3498 tree = ElementTree(element=element) 3499 tree.write(f, encoding=encoding) 3500 f.close() 3501 f = open(filename, 'rb') 3502 data = f.read() 3503 f.close() 3504 finally: 3505 os.close(handle) 3506 os.remove(filename) 3507 if encoding != 'us-ascii': 3508 data = data.decode(encoding) 3509 return canonicalize(data)
3510
3511 - def assertXML(self, expected, element, encoding='us-ascii'):
3512 """Writes element out and checks whether it is expected. 3513 3514 Does this two ways; once using BytesIO, once using a real file. 3515 """ 3516 self.assertEquals(expected, self._writeElement(element, encoding)) 3517 self.assertEquals(expected, self._writeElementFile(element, encoding))
3518
3519 - def assertEncodingDeclaration(self, result, encoding):
3520 "Checks if the result XML byte string specifies the encoding." 3521 has_encoding = re.compile(r"<\?xml[^>]+ encoding=[\"']([^\"']+)[\"']").match 3522 self.assert_(has_encoding(result)) 3523 result_encoding = has_encoding(result).group(1) 3524 self.assertEquals(result_encoding.upper(), encoding.upper())
3525
3526 - def _rootstring(self, tree):
3527 return self.etree.tostring(tree.getroot()).replace( 3528 _bytes(' '), _bytes('')).replace(_bytes('\n'), _bytes(''))
3529
3530 - def _check_element_tree(self, tree):
3531 self._check_element(tree.getroot())
3532
3533 - def _check_element(self, element):
3534 self.assert_(hasattr(element, 'tag')) 3535 self.assert_(hasattr(element, 'attrib')) 3536 self.assert_(hasattr(element, 'text')) 3537 self.assert_(hasattr(element, 'tail')) 3538 self._check_string(element.tag) 3539 self._check_mapping(element.attrib) 3540 if element.text != None: 3541 self._check_string(element.text) 3542 if element.tail != None: 3543 self._check_string(element.tail)
3544
3545 - def _check_string(self, string):
3546 len(string) 3547 for char in string: 3548 self.assertEquals(1, len(char)) 3549 new_string = string + "" 3550 new_string = string + " " 3551 string[:0]
3552
3553 - def _check_mapping(self, mapping):
3554 len(mapping) 3555 keys = mapping.keys() 3556 values = mapping.values() 3557 items = mapping.items() 3558 for key in keys: 3559 item = mapping[key] 3560 mapping["key"] = "value" 3561 self.assertEquals("value", mapping["key"])
3562 3563 3564 if etree:
3565 - class ETreeTestCase(ETreeTestCaseBase):
3566 etree = etree
3567 3568 if ElementTree:
3569 - class ElementTreeTestCase(ETreeTestCaseBase):
3570 etree = ElementTree
3571 3572 if cElementTree:
3573 - class CElementTreeTestCase(ETreeTestCaseBase):
3574 etree = cElementTree
3575
3576 -def test_suite():
3577 suite = unittest.TestSuite() 3578 if etree: 3579 suite.addTests([unittest.makeSuite(ETreeTestCase)]) 3580 if ElementTree: 3581 suite.addTests([unittest.makeSuite(ElementTreeTestCase)]) 3582 if cElementTree: 3583 suite.addTests([unittest.makeSuite(CElementTreeTestCase)]) 3584 return suite
3585 3586 if __name__ == '__main__': 3587 print('to test use test.py %s' % __file__) 3588