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

Source Code for Module lxml.tests.test_classlookup

  1  # -*- coding: utf-8 -*- 
  2   
  3  """ 
  4  Tests specific to the extended etree API 
  5   
  6  Tests that apply to the general ElementTree API should go into 
  7  test_elementtree 
  8  """ 
  9   
 10   
 11  import unittest, doctest, operator 
 12   
 13  from common_imports import etree, StringIO, HelperTestCase, fileInTestDir 
 14  from common_imports import SillyFileLike, canonicalize 
 15   
 16  xml_str = '''\ 
 17  <root xmlns="myNS" xmlns:other="otherNS"> 
 18    <c1 a1="A1" a2="A2" other:a3="A3"> 
 19      <c2 a1="C2">0</c2> 
 20      <c2>1</c2> 
 21      <other:c2>2</other:c2> 
 22    </c1> 
 23  </root>''' 
 24   
25 -class ClassLookupTestCase(HelperTestCase):
26 """Test cases for lxml.elementlib.classlookup 27 """ 28 etree = etree 29
30 - def tearDown(self):
32
33 - def test_namespace_lookup(self):
34 class TestElement(etree.ElementBase): 35 FIND_ME = "namespace class"
36 37 lookup = etree.ElementNamespaceClassLookup() 38 etree.setElementClassLookup(lookup) 39 40 ns = lookup.get_namespace("myNS") 41 ns[None] = TestElement 42 43 root = etree.XML(xml_str) 44 self.assertEquals(root.FIND_ME, 45 TestElement.FIND_ME) 46 self.assertEquals(root[0].FIND_ME, 47 TestElement.FIND_ME) 48 self.assertFalse(hasattr(root[0][-1], 'FIND_ME'))
49
50 - def test_default_class_lookup(self):
51 class TestElement(etree.ElementBase): 52 FIND_ME = "default element"
53 class TestComment(etree.CommentBase): 54 FIND_ME = "default comment" 55 class TestPI(etree.PIBase): 56 FIND_ME = "default pi" 57 58 parser = etree.XMLParser() 59 60 lookup = etree.ElementDefaultClassLookup( 61 element=TestElement, comment=TestComment, pi=TestPI) 62 parser.setElementClassLookup(lookup) 63 64 root = etree.XML("""<?xml version='1.0'?> 65 <root> 66 <?myPI?> 67 <!-- hi --> 68 </root> 69 """, parser) 70 71 self.assertEquals("default element", root.FIND_ME) 72 self.assertEquals("default pi", root[0].FIND_ME) 73 self.assertEquals("default comment", root[1].FIND_ME) 74
75 - def test_attribute_based_lookup(self):
76 class TestElement(etree.ElementBase): 77 FIND_ME = "attribute_based"
78 79 class_dict = {"A1" : TestElement} 80 81 lookup = etree.AttributeBasedElementClassLookup( 82 "a1", class_dict) 83 etree.setElementClassLookup(lookup) 84 85 root = etree.XML(xml_str) 86 self.assertFalse(hasattr(root, 'FIND_ME')) 87 self.assertEquals(root[0].FIND_ME, 88 TestElement.FIND_ME) 89 self.assertFalse(hasattr(root[0][0], 'FIND_ME')) 90
91 - def test_custom_lookup(self):
92 class TestElement(etree.ElementBase): 93 FIND_ME = "custom"
94 95 class MyLookup(etree.CustomElementClassLookup): 96 def lookup(self, t, d, ns, name): 97 if name == 'c1': 98 return TestElement 99 100 etree.setElementClassLookup( MyLookup() ) 101 102 root = etree.XML(xml_str) 103 self.assertFalse(hasattr(root, 'FIND_ME')) 104 self.assertEquals(root[0].FIND_ME, 105 TestElement.FIND_ME) 106 self.assertFalse(hasattr(root[0][1], 'FIND_ME')) 107
108 - def test_custom_lookup_ns_fallback(self):
109 class TestElement1(etree.ElementBase): 110 FIND_ME = "custom"
111 112 class TestElement2(etree.ElementBase): 113 FIND_ME = "nsclasses" 114 115 class MyLookup(etree.CustomElementClassLookup): 116 def lookup(self, t, d, ns, name): 117 if name == 'c1': 118 return TestElement1 119 120 lookup = etree.ElementNamespaceClassLookup( MyLookup() ) 121 etree.setElementClassLookup(lookup) 122 123 ns = lookup.get_namespace("otherNS") 124 ns[None] = TestElement2 125 126 root = etree.XML(xml_str) 127 self.assertFalse(hasattr(root, 'FIND_ME')) 128 self.assertEquals(root[0].FIND_ME, 129 TestElement1.FIND_ME) 130 self.assertFalse(hasattr(root[0][1], 'FIND_ME')) 131 self.assertEquals(root[0][-1].FIND_ME, 132 TestElement2.FIND_ME) 133
134 - def test_parser_based_lookup(self):
135 class TestElement(etree.ElementBase): 136 FIND_ME = "parser_based"
137 138 lookup = etree.ParserBasedElementClassLookup() 139 etree.setElementClassLookup(lookup) 140 141 class MyLookup(etree.CustomElementClassLookup): 142 def lookup(self, t, d, ns, name): 143 return TestElement 144 145 parser = etree.XMLParser() 146 parser.setElementClassLookup( MyLookup() ) 147 148 root = etree.parse(StringIO(xml_str), parser).getroot() 149 self.assertEquals(root.FIND_ME, 150 TestElement.FIND_ME) 151 self.assertEquals(root[0].FIND_ME, 152 TestElement.FIND_ME) 153 154 root = etree.parse(StringIO(xml_str)).getroot() 155 self.assertFalse(hasattr(root, 'FIND_ME')) 156 self.assertFalse(hasattr(root[0], 'FIND_ME')) 157 158
159 -def test_suite():
160 suite = unittest.TestSuite() 161 suite.addTests([unittest.makeSuite(ClassLookupTestCase)]) 162 return suite
163 164 if __name__ == '__main__': 165 print 'to test use test.py %s' % __file__ 166