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

Source Code for Module lxml.tests.test_pyclasslookup

  1  # -*- coding: utf-8 -*- 
  2   
  3  """ 
  4  Tests specific to the Python based class lookup. 
  5  """ 
  6   
  7   
  8  import unittest, operator 
  9   
 10  from common_imports import etree, StringIO, HelperTestCase, fileInTestDir 
 11  from common_imports import SillyFileLike, canonicalize, doctest 
 12  from common_imports import itemgetter 
 13   
 14  from lxml.pyclasslookup import PythonElementClassLookup 
 15   
 16  xml_str = '''\ 
 17  <obj:root xmlns:obj="objectified" xmlns:other="otherNS"> 
 18    <obj:c1 a1="A1" a2="A2" other:a3="A3"> 
 19      <obj:c2>0</obj:c2> 
 20      <obj:c2>1</obj:c2> 
 21      <obj:c2>2</obj:c2> 
 22      <other:c2>3</other:c2> 
 23      <c2>3</c2> 
 24    </obj:c1> 
 25  </obj:root>''' 
 26   
 27   
28 -class PyClassLookupTestCase(HelperTestCase):
29 """Test cases for the lxml.pyclasslookup class lookup mechanism. 30 """ 31 etree = etree 32 parser = etree.XMLParser() 33 Element = parser.makeelement 34
35 - def tearDown(self):
37
38 - def _setClassLookup(self, lookup_function):
39 class Lookup(PythonElementClassLookup): 40 def lookup(self, *args): 41 return lookup_function(*args)
42 self.parser.setElementClassLookup( Lookup() ) 43
44 - def _buildElementClass(self):
45 class LocalElement(etree.ElementBase): 46 pass
47 return LocalElement 48
49 - def XML(self, xml):
50 return self.etree.XML(xml, self.parser)
51 52 # --- Test cases 53
54 - def test_lookup(self):
55 el_class = self._buildElementClass() 56 el_class.i = 1 57 def lookup(*args): 58 if el_class.i == 1: 59 el_class.i = 2 60 return el_class
61 self._setClassLookup(lookup) 62 root = self.XML(xml_str) 63 self.assertEquals(2, el_class.i) 64
65 - def test_lookup_keep_ref_assertion(self):
66 el_class = self._buildElementClass() 67 el_class.EL = None 68 def lookup(doc, el): 69 if el_class.EL is None: 70 el_class.EL = el 71 return el_class
72 self._setClassLookup(lookup) 73 root = self.XML(xml_str) 74 self.assertNotEquals(None, el_class.EL) 75 self.assertRaises(AssertionError, el_class.EL.getchildren) 76
77 - def test_lookup_tag(self):
78 el_class = self._buildElementClass() 79 el_class.TAG = None 80 def lookup(doc, el): 81 if el_class.TAG is None: 82 el_class.TAG = el.tag 83 return el_class
84 self._setClassLookup(lookup) 85 root = self.XML(xml_str) 86 self.assertNotEquals(None, root.TAG) 87 self.assertEquals(root.tag, root.TAG) 88
89 - def test_lookup_text(self):
90 el_class = self._buildElementClass() 91 el_class.TEXT = None 92 def lookup(doc, el): 93 if el_class.TEXT is None: 94 el_class.TEXT = el.text 95 return el_class
96 self._setClassLookup(lookup) 97 root = self.XML(xml_str) 98 self.assertNotEquals(None, root.TEXT) 99 self.assertEquals(root.text, root.TEXT) 100
101 - def test_lookup_tail(self):
102 el_class = self._buildElementClass() 103 el_class.TAIL = None 104 def lookup(doc, el): 105 if el_class.TAIL is None: 106 el_class.TAIL = el.tail 107 return el_class
108 self._setClassLookup(lookup) 109 root = self.XML(xml_str) 110 self.assertEquals(root.tail, root.TAIL) 111
112 - def test_lookup_attrib(self):
113 el_class = self._buildElementClass() 114 el_class.ATTRIB = None 115 def lookup(doc, el): 116 if el_class.ATTRIB is None: 117 el_class.ATTRIB = el[0].attrib 118 return el_class
119 self._setClassLookup(lookup) 120 root = self.XML(xml_str) 121 items1 = root[0].attrib.items() 122 items1.sort() 123 items2 = root.ATTRIB.items() 124 items2.sort() 125 self.assertEquals(items1, items2) 126
127 - def test_lookup_prefix(self):
128 el_class = self._buildElementClass() 129 el_class.PREFIX = None 130 def lookup(doc, el): 131 if el_class.PREFIX is None: 132 el_class.PREFIX = el.prefix 133 return el_class
134 self._setClassLookup(lookup) 135 root = self.XML(xml_str) 136 self.assertEquals(root.prefix, root.PREFIX) 137
138 - def test_lookup_sourceline(self):
139 el_class = self._buildElementClass() 140 el_class.LINE = None 141 def lookup(doc, el): 142 if el_class.LINE is None: 143 el_class.LINE = el.sourceline 144 return el_class
145 self._setClassLookup(lookup) 146 root = self.XML(xml_str) 147 self.assertEquals(root.sourceline, root.LINE) 148
149 - def test_lookup_getitem(self):
150 el_class = self._buildElementClass() 151 el_class.CHILD_TAG = None 152 def lookup(doc, el): 153 el_class.CHILD_TAG = el[0].tag 154 return el_class
155 self._setClassLookup(lookup) 156 root = self.XML(xml_str) 157 child_tag = root.CHILD_TAG 158 self.assertNotEquals(None, child_tag) 159 self.assertEquals(root[0].tag, child_tag) 160
161 - def test_lookup_getitem_neg(self):
162 el_class = self._buildElementClass() 163 el_class.CHILD_TAG = None 164 def lookup(doc, el): 165 if el_class.CHILD_TAG is None: 166 el_class.CHILD_TAG = el[-1].tag 167 return el_class
168 self._setClassLookup(lookup) 169 root = self.XML(xml_str) 170 child_tag = root.CHILD_TAG 171 self.assertNotEquals(None, child_tag) 172 self.assertEquals(root[-1].tag, child_tag) 173
174 - def test_lookup_getslice(self):
175 el_class = self._buildElementClass() 176 el_class.CHILD_TAGS = None 177 def lookup(doc, el): 178 if el_class.CHILD_TAGS is None: 179 el_class.CHILD_TAGS = [ c.tag for c in el[1:-1] ] 180 return el_class
181 self._setClassLookup(lookup) 182 root = self.XML(xml_str) 183 child_tags = root.CHILD_TAGS 184 self.assertNotEquals(None, child_tags) 185 self.assertEquals([ c.tag for c in root[1:-1] ], 186 child_tags) 187
188 - def test_lookup_len(self):
189 el_class = self._buildElementClass() 190 el_class.LEN = None 191 def lookup(doc, el): 192 if el_class.LEN is None: 193 el_class.LEN = len(el) 194 return el_class
195 self._setClassLookup(lookup) 196 root = self.XML(xml_str) 197 self.assertEquals(1, el_class.LEN) 198
199 - def test_lookup_bool(self):
200 el_class = self._buildElementClass() 201 el_class.TRUE = None 202 def lookup(doc, el): 203 if el_class.TRUE is None: 204 el_class.TRUE = bool(el) 205 return el_class
206 self._setClassLookup(lookup) 207 root = self.XML(xml_str) 208 self.assert_(el_class.TRUE) 209
210 - def test_lookup_get(self):
211 el_class = self._buildElementClass() 212 el_class.VAL = None 213 def lookup(doc, el): 214 if el_class.VAL is None: 215 el_class.VAL = el[0].get('a1') 216 return el_class
217 self._setClassLookup(lookup) 218 root = self.XML(xml_str) 219 self.assertNotEquals(None, el_class.VAL) 220 self.assertEquals(root[0].get('a1'), el_class.VAL) 221
222 - def test_lookup_get_default(self):
223 el_class = self._buildElementClass() 224 default = str(id(el_class)) 225 el_class.VAL = None 226 def lookup(doc, el): 227 if el_class.VAL is None: 228 el_class.VAL = el[0].get('unknownattribute', default) 229 return el_class
230 self._setClassLookup(lookup) 231 root = self.XML(xml_str) 232 self.assertEquals(default, el_class.VAL) 233
234 - def test_lookup_getchildren(self):
235 el_class = self._buildElementClass() 236 el_class.CHILD_TAGS = None 237 def lookup(doc, el): 238 if el_class.CHILD_TAGS is None: 239 el_class.CHILD_TAGS = [ c.tag for c in el.getchildren() ] 240 return el_class
241 self._setClassLookup(lookup) 242 root = self.XML(xml_str) 243 child_tags = root.CHILD_TAGS 244 self.assertNotEquals(None, child_tags) 245 self.assertEquals([ c.tag for c in root.getchildren() ], 246 child_tags) 247
248 - def test_lookup_getparent(self):
249 el_class = self._buildElementClass() 250 el_class.PARENT = None 251 def lookup(doc, el): 252 if el_class.PARENT is None: 253 el_class.PARENT = el[0].getparent().tag 254 return el_class
255 self._setClassLookup(lookup) 256 root = self.XML(xml_str) 257 self.assertEquals(root.tag, root.PARENT) 258
259 - def test_lookup_getnext(self):
260 el_class = self._buildElementClass() 261 el_class.NEXT = None 262 def lookup(doc, el): 263 if el_class.NEXT is None: 264 el_class.NEXT = el[0][1].getnext().tag 265 return el_class
266 self._setClassLookup(lookup) 267 root = self.XML(xml_str) 268 self.assertNotEquals(None, el_class.NEXT) 269 self.assertEquals(root[0][1].getnext().tag, el_class.NEXT) 270
271 - def test_lookup_getprevious(self):
272 el_class = self._buildElementClass() 273 el_class.PREV = None 274 def lookup(doc, el): 275 if el_class.PREV is None: 276 el_class.PREV = el[0][1].getprevious().tag 277 return el_class
278 self._setClassLookup(lookup) 279 root = self.XML(xml_str) 280 self.assertNotEquals(None, el_class.PREV) 281 self.assertEquals(root[0][1].getprevious().tag, el_class.PREV) 282 283
284 -def test_suite():
285 suite = unittest.TestSuite() 286 suite.addTests([unittest.makeSuite(PyClassLookupTestCase)]) 287 return suite
288 289 if __name__ == '__main__': 290 unittest.main() 291