1
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
41 self.parser.setElementClassLookup( Lookup() )
42
44 class LocalElement(etree.ElementBase):
45 pass
46 return LocalElement
47
50
51
52
54 el_class = self._buildElementClass()
55 el_class.i = 1
56 def lookup(*args):
57 if el_class.i == 1:
58 el_class.i = 2
59 return el_class
60 self._setClassLookup(lookup)
61 root = self.XML(xml_str)
62 self.assertEquals(2, el_class.i)
63
65 el_class = self._buildElementClass()
66 el_class.EL = None
67 def lookup(doc, el):
68 if el_class.EL is None:
69 el_class.EL = el
70 return el_class
71 self._setClassLookup(lookup)
72 root = self.XML(xml_str)
73 self.assertNotEquals(None, el_class.EL)
74 self.assertRaises(AssertionError, el_class.EL.getchildren)
75
77 el_class = self._buildElementClass()
78 el_class.TAG = None
79 def lookup(doc, el):
80 if el_class.TAG is None:
81 el_class.TAG = el.tag
82 return el_class
83 self._setClassLookup(lookup)
84 root = self.XML(xml_str)
85 self.assertNotEquals(None, root.TAG)
86 self.assertEquals(root.tag, root.TAG)
87
89 el_class = self._buildElementClass()
90 el_class.TEXT = None
91 def lookup(doc, el):
92 if el_class.TEXT is None:
93 el_class.TEXT = el.text
94 return el_class
95 self._setClassLookup(lookup)
96 root = self.XML(xml_str)
97 self.assertNotEquals(None, root.TEXT)
98 self.assertEquals(root.text, root.TEXT)
99
101 el_class = self._buildElementClass()
102 el_class.TAIL = None
103 def lookup(doc, el):
104 if el_class.TAIL is None:
105 el_class.TAIL = el.tail
106 return el_class
107 self._setClassLookup(lookup)
108 root = self.XML(xml_str)
109 self.assertEquals(root.tail, root.TAIL)
110
112 el_class = self._buildElementClass()
113 el_class.ATTRIB = None
114 def lookup(doc, el):
115 if el_class.ATTRIB is None:
116 el_class.ATTRIB = el[0].attrib
117 return el_class
118 self._setClassLookup(lookup)
119 root = self.XML(xml_str)
120 items1 = root[0].attrib.items()
121 items1.sort()
122 items2 = root.ATTRIB.items()
123 items2.sort()
124 self.assertEquals(items1, items2)
125
127 el_class = self._buildElementClass()
128 el_class.PREFIX = None
129 def lookup(doc, el):
130 if el_class.PREFIX is None:
131 el_class.PREFIX = el.prefix
132 return el_class
133 self._setClassLookup(lookup)
134 root = self.XML(xml_str)
135 self.assertEquals(root.prefix, root.PREFIX)
136
138 el_class = self._buildElementClass()
139 el_class.LINE = None
140 def lookup(doc, el):
141 if el_class.LINE is None:
142 el_class.LINE = el.sourceline
143 return el_class
144 self._setClassLookup(lookup)
145 root = self.XML(xml_str)
146 self.assertEquals(root.sourceline, root.LINE)
147
149 el_class = self._buildElementClass()
150 el_class.CHILD_TAG = None
151 def lookup(doc, el):
152 el_class.CHILD_TAG = el[0].tag
153 return el_class
154 self._setClassLookup(lookup)
155 root = self.XML(xml_str)
156 child_tag = root.CHILD_TAG
157 self.assertNotEquals(None, child_tag)
158 self.assertEquals(root[0].tag, child_tag)
159
161 el_class = self._buildElementClass()
162 el_class.CHILD_TAG = None
163 def lookup(doc, el):
164 if el_class.CHILD_TAG is None:
165 el_class.CHILD_TAG = el[-1].tag
166 return el_class
167 self._setClassLookup(lookup)
168 root = self.XML(xml_str)
169 child_tag = root.CHILD_TAG
170 self.assertNotEquals(None, child_tag)
171 self.assertEquals(root[-1].tag, child_tag)
172
174 el_class = self._buildElementClass()
175 el_class.CHILD_TAGS = None
176 def lookup(doc, el):
177 if el_class.CHILD_TAGS is None:
178 el_class.CHILD_TAGS = [ c.tag for c in el[1:-1] ]
179 return el_class
180 self._setClassLookup(lookup)
181 root = self.XML(xml_str)
182 child_tags = root.CHILD_TAGS
183 self.assertNotEquals(None, child_tags)
184 self.assertEquals([ c.tag for c in root[1:-1] ],
185 child_tags)
186
188 el_class = self._buildElementClass()
189 el_class.LEN = None
190 def lookup(doc, el):
191 if el_class.LEN is None:
192 el_class.LEN = len(el)
193 return el_class
194 self._setClassLookup(lookup)
195 root = self.XML(xml_str)
196 self.assertEquals(1, el_class.LEN)
197
199 el_class = self._buildElementClass()
200 el_class.TRUE = None
201 def lookup(doc, el):
202 if el_class.TRUE is None:
203 el_class.TRUE = bool(el)
204 return el_class
205 self._setClassLookup(lookup)
206 root = self.XML(xml_str)
207 self.assert_(el_class.TRUE)
208
210 el_class = self._buildElementClass()
211 el_class.VAL = None
212 def lookup(doc, el):
213 if el_class.VAL is None:
214 el_class.VAL = el[0].get('a1')
215 return el_class
216 self._setClassLookup(lookup)
217 root = self.XML(xml_str)
218 self.assertNotEquals(None, el_class.VAL)
219 self.assertEquals(root[0].get('a1'), el_class.VAL)
220
222 el_class = self._buildElementClass()
223 default = str(id(el_class))
224 el_class.VAL = None
225 def lookup(doc, el):
226 if el_class.VAL is None:
227 el_class.VAL = el[0].get('unknownattribute', default)
228 return el_class
229 self._setClassLookup(lookup)
230 root = self.XML(xml_str)
231 self.assertEquals(default, el_class.VAL)
232
234 el_class = self._buildElementClass()
235 el_class.CHILD_TAGS = None
236 def lookup(doc, el):
237 if el_class.CHILD_TAGS is None:
238 el_class.CHILD_TAGS = [ c.tag for c in el.getchildren() ]
239 return el_class
240 self._setClassLookup(lookup)
241 root = self.XML(xml_str)
242 child_tags = root.CHILD_TAGS
243 self.assertNotEquals(None, child_tags)
244 self.assertEquals([ c.tag for c in root.getchildren() ],
245 child_tags)
246
248 el_class = self._buildElementClass()
249 el_class.PARENT = None
250 def lookup(doc, el):
251 if el_class.PARENT is None:
252 el_class.PARENT = el[0].getparent().tag
253 return el_class
254 self._setClassLookup(lookup)
255 root = self.XML(xml_str)
256 self.assertEquals(root.tag, root.PARENT)
257
259 el_class = self._buildElementClass()
260 el_class.NEXT = None
261 def lookup(doc, el):
262 if el_class.NEXT is None:
263 el_class.NEXT = el[0][1].getnext().tag
264 return el_class
265 self._setClassLookup(lookup)
266 root = self.XML(xml_str)
267 self.assertNotEquals(None, el_class.NEXT)
268 self.assertEquals(root[0][1].getnext().tag, el_class.NEXT)
269
271 el_class = self._buildElementClass()
272 el_class.PREV = None
273 def lookup(doc, el):
274 if el_class.PREV is None:
275 el_class.PREV = el[0][1].getprevious().tag
276 return el_class
277 self._setClassLookup(lookup)
278 root = self.XML(xml_str)
279 self.assertNotEquals(None, el_class.PREV)
280 self.assertEquals(root[0][1].getprevious().tag, el_class.PREV)
281
282
284 suite = unittest.TestSuite()
285 suite.addTests([unittest.makeSuite(PyClassLookupTestCase)])
286 return suite
287
288 if __name__ == '__main__':
289 print 'to test use test.py %s' % __file__
290