Package lxml :: Package tests :: Module test_pyclasslookup
[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   
 13  from lxml.pyclasslookup import PythonElementClassLookup 
 14   
 15  xml_str = '''\ 
 16  <obj:root xmlns:obj="objectified" xmlns:other="otherNS"> 
 17    <obj:c1 a1="A1" a2="A2" other:a3="A3"> 
 18      <obj:c2>0</obj:c2> 
 19      <obj:c2>1</obj:c2> 
 20      <obj:c2>2</obj:c2> 
 21      <other:c2>3</other:c2> 
 22      <c2>3</c2> 
 23    </obj:c1> 
 24  </obj:root>''' 
 25   
 26   
27 -class PyClassLookupTestCase(HelperTestCase):
28 """Test cases for the lxml.pyclasslookup class lookup mechanism. 29 """ 30 etree = etree 31 parser = etree.XMLParser() 32 Element = parser.makeelement 33
34 - 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_iter_children(self):
249 el_class = self._buildElementClass() 250 el_class.CHILD_TAGS = None 251 def lookup(doc, el): 252 if el_class.CHILD_TAGS is None: 253 el_class.CHILD_TAGS = [ c.tag for c in el ] 254 return el_class
255 self._setClassLookup(lookup) 256 root = self.XML(xml_str) 257 child_tags = root.CHILD_TAGS 258 self.assertNotEquals(None, child_tags) 259 self.assertEquals([ c.tag for c in root.getchildren() ], 260 child_tags) 261
262 - def test_lookup_iterchildren(self):
263 el_class = self._buildElementClass() 264 el_class.CHILD_TAGS = None 265 def lookup(doc, el): 266 if el_class.CHILD_TAGS is None: 267 el_class.CHILD_TAGS = [ c.tag for c in el.iterchildren() ] 268 return el_class
269 self._setClassLookup(lookup) 270 root = self.XML(xml_str) 271 child_tags = root.CHILD_TAGS 272 self.assertNotEquals(None, child_tags) 273 self.assertEquals([ c.tag for c in root.getchildren() ], 274 child_tags) 275
276 - def test_lookup_iterchildren_tag(self):
277 el_class = self._buildElementClass() 278 el_class.CHILD_TAGS = None 279 def lookup(doc, el): 280 if not el_class.CHILD_TAGS: 281 el_class.CHILD_TAGS = [ 282 c.tag for c in el.iterchildren(tag='{objectified}c2') ] 283 return el_class
284 self._setClassLookup(lookup) 285 286 root = self.XML(xml_str) 287 child_tags = root.CHILD_TAGS 288 self.assertNotEquals(None, child_tags) 289 self.assertEquals([], child_tags) 290 291 c1 = root[0] 292 child_tags = root.CHILD_TAGS 293 self.assertNotEquals(None, child_tags) 294 self.assertNotEquals([], child_tags) 295 self.assertEquals( 296 [ c.tag for c in root[0].iterchildren(tag='{objectified}c2') ], 297 child_tags) 298
299 - def test_lookup_getparent(self):
300 el_class = self._buildElementClass() 301 el_class.PARENT = None 302 def lookup(doc, el): 303 if el_class.PARENT is None: 304 el_class.PARENT = el[0].getparent().tag 305 return el_class
306 self._setClassLookup(lookup) 307 root = self.XML(xml_str) 308 self.assertEquals(root.tag, root.PARENT) 309
310 - def test_lookup_getnext(self):
311 el_class = self._buildElementClass() 312 el_class.NEXT = None 313 def lookup(doc, el): 314 if el_class.NEXT is None: 315 el_class.NEXT = el[0][1].getnext().tag 316 return el_class
317 self._setClassLookup(lookup) 318 root = self.XML(xml_str) 319 self.assertNotEquals(None, el_class.NEXT) 320 self.assertEquals(root[0][1].getnext().tag, el_class.NEXT) 321
322 - def test_lookup_getprevious(self):
323 el_class = self._buildElementClass() 324 el_class.PREV = None 325 def lookup(doc, el): 326 if el_class.PREV is None: 327 el_class.PREV = el[0][1].getprevious().tag 328 return el_class
329 self._setClassLookup(lookup) 330 root = self.XML(xml_str) 331 self.assertNotEquals(None, el_class.PREV) 332 self.assertEquals(root[0][1].getprevious().tag, el_class.PREV) 333 334
335 -def test_suite():
336 suite = unittest.TestSuite() 337 suite.addTests([unittest.makeSuite(PyClassLookupTestCase)]) 338 return suite
339 340 if __name__ == '__main__': 341 print 'to test use test.py %s' % __file__ 342