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):
31 etree.setElementClassLookup() 32 etree.Namespace("myNS").clear() 33 etree.Namespace("otherNS").clear()
34
35 - def test_namespace_lookup(self):
36 class TestElement(etree.ElementBase): 37 FIND_ME = "namespace class"
38 39 ns = etree.Namespace("myNS") 40 ns[None] = TestElement 41 42 lookup = etree.ElementNamespaceClassLookup() 43 etree.setElementClassLookup(lookup) 44 45 root = etree.XML(xml_str) 46 self.assertEquals(root.FIND_ME, 47 TestElement.FIND_ME) 48 self.assertEquals(root[0].FIND_ME, 49 TestElement.FIND_ME) 50 self.assertFalse(hasattr(root[0][-1], 'FIND_ME'))
51
52 - def test_default_class_lookup(self):
53 class TestElement(etree.ElementBase): 54 FIND_ME = "default element"
55 class TestComment(etree.CommentBase): 56 FIND_ME = "default comment" 57 class TestPI(etree.PIBase): 58 FIND_ME = "default pi" 59 60 parser = etree.XMLParser() 61 62 lookup = etree.ElementDefaultClassLookup( 63 element=TestElement, comment=TestComment, pi=TestPI) 64 parser.setElementClassLookup(lookup) 65 66 root = etree.XML("""<?xml version='1.0'?> 67 <root> 68 <?myPI?> 69 <!-- hi --> 70 </root> 71 """, parser) 72 73 self.assertEquals("default element", root.FIND_ME) 74 self.assertEquals("default pi", root[0].FIND_ME) 75 self.assertEquals("default comment", root[1].FIND_ME) 76
77 - def test_default_class_lookup_is_not_nslookup(self):
78 class TestElement(etree.ElementBase): 79 FIND_ME = "namespace class"
80 81 ns = etree.Namespace("myNS") 82 ns[None] = TestElement 83 84 lookup = etree.ElementDefaultClassLookup() 85 etree.setElementClassLookup(lookup) 86 87 root = etree.XML(xml_str) 88 self.assertFalse(hasattr(root, 'FIND_ME')) 89 self.assertFalse(hasattr(root[0][-1], 'FIND_ME')) 90
91 - def test_attribute_based_lookup(self):
92 class TestElement(etree.ElementBase): 93 FIND_ME = "attribute_based"
94 95 class_dict = {"A1" : TestElement} 96 97 lookup = etree.AttributeBasedElementClassLookup( 98 "a1", class_dict) 99 etree.setElementClassLookup(lookup) 100 101 root = etree.XML(xml_str) 102 self.assertFalse(hasattr(root, 'FIND_ME')) 103 self.assertEquals(root[0].FIND_ME, 104 TestElement.FIND_ME) 105 self.assertFalse(hasattr(root[0][0], 'FIND_ME')) 106
107 - def test_custom_lookup(self):
108 class TestElement(etree.ElementBase): 109 FIND_ME = "custom"
110 111 class MyLookup(etree.CustomElementClassLookup): 112 def lookup(self, t, d, ns, name): 113 if name == 'c1': 114 return TestElement 115 116 etree.setElementClassLookup( MyLookup() ) 117 118 root = etree.XML(xml_str) 119 self.assertFalse(hasattr(root, 'FIND_ME')) 120 self.assertEquals(root[0].FIND_ME, 121 TestElement.FIND_ME) 122 self.assertFalse(hasattr(root[0][1], 'FIND_ME')) 123
124 - def test_custom_lookup_ns_fallback(self):
125 class TestElement1(etree.ElementBase): 126 FIND_ME = "custom"
127 128 class TestElement2(etree.ElementBase): 129 FIND_ME = "nsclasses" 130 131 class MyLookup(etree.CustomElementClassLookup): 132 def lookup(self, t, d, ns, name): 133 if name == 'c1': 134 return TestElement1 135 136 ns = etree.Namespace("otherNS") 137 ns[None] = TestElement2 138 139 lookup = etree.ElementNamespaceClassLookup( MyLookup() ) 140 etree.setElementClassLookup(lookup) 141 142 root = etree.XML(xml_str) 143 self.assertFalse(hasattr(root, 'FIND_ME')) 144 self.assertEquals(root[0].FIND_ME, 145 TestElement1.FIND_ME) 146 self.assertFalse(hasattr(root[0][1], 'FIND_ME')) 147 self.assertEquals(root[0][-1].FIND_ME, 148 TestElement2.FIND_ME) 149
150 - def test_parser_based_lookup(self):
151 class TestElement(etree.ElementBase): 152 FIND_ME = "parser_based"
153 154 lookup = etree.ParserBasedElementClassLookup() 155 etree.setElementClassLookup(lookup) 156 157 class MyLookup(etree.CustomElementClassLookup): 158 def lookup(self, t, d, ns, name): 159 return TestElement 160 161 parser = etree.XMLParser() 162 parser.setElementClassLookup( MyLookup() ) 163 164 root = etree.parse(StringIO(xml_str), parser).getroot() 165 self.assertEquals(root.FIND_ME, 166 TestElement.FIND_ME) 167 self.assertEquals(root[0].FIND_ME, 168 TestElement.FIND_ME) 169 170 root = etree.parse(StringIO(xml_str)).getroot() 171 self.assertFalse(hasattr(root, 'FIND_ME')) 172 self.assertFalse(hasattr(root[0], 'FIND_ME')) 173 174
175 -def test_suite():
176 suite = unittest.TestSuite() 177 suite.addTests([unittest.makeSuite(ClassLookupTestCase)]) 178 return suite
179 180 if __name__ == '__main__': 181 unittest.main() 182