1
2
3 """
4 Tests for the ElementPath implementation.
5 """
6
7 from __future__ import absolute_import
8
9 import unittest
10 from copy import deepcopy
11 from .common_imports import etree, HelperTestCase
12
13
16
19
24
25
27 etree = etree
28 from lxml import _elementpath
29
31 self._elementpath._cache.clear()
32 el = self.etree.XML(b'<a><b><c/><c/></b></a>')
33 self.assertFalse(self._elementpath._cache)
34
35 self.assertTrue(el.findall('b/c'))
36 self.assertEqual(1, len(self._elementpath._cache))
37 self.assertTrue(el.findall('b/c'))
38 self.assertEqual(1, len(self._elementpath._cache))
39 self.assertFalse(el.findall('xxx'))
40 self.assertEqual(2, len(self._elementpath._cache))
41 self.assertFalse(el.findall('xxx'))
42 self.assertEqual(2, len(self._elementpath._cache))
43 self.assertTrue(el.findall('b/c'))
44 self.assertEqual(2, len(self._elementpath._cache))
45
48
50 assert_tokens = self._assert_tokens
51 assert_tokens(
52 [('/', '')],
53 '/',
54 )
55 assert_tokens(
56 [('.', ''), ('/', ''), ('', 'a'), ('/', ''), ('', 'b'), ('/', ''), ('', 'c')],
57 './a/b/c',
58 )
59 assert_tokens(
60 [('/', ''), ('', 'a'), ('/', ''), ('', 'b'), ('/', ''), ('', 'c')],
61 '/a/b/c',
62 )
63 assert_tokens(
64 [('/', ''), ('', '{nsx}a'), ('/', ''), ('', '{nsy}b'), ('/', ''), ('', 'c')],
65 '/x:a/y:b/c',
66 {'x': 'nsx', 'y': 'nsy'},
67 )
68 assert_tokens(
69 [('/', ''), ('', '{nsx}a'), ('/', ''), ('', '{nsy}b'), ('/', ''), ('', '{nsnone}c')],
70 '/x:a/y:b/c',
71 {'x': 'nsx', 'y': 'nsy', None: 'nsnone'},
72 )
73
75 assert_tokens = self._assert_tokens
76 assert_tokens(
77 [('', 'a'), ('[', ''), ('', 'b'), (']', '')],
78 'a[b]',
79 )
80 assert_tokens(
81 [('', 'a'), ('[', ''), ('', 'b'), ('=', ''), ('"abc"', ''), (']', '')],
82 'a[b="abc"]',
83 )
84 assert_tokens(
85 [('', 'a'), ('[', ''), ('.', ''), ('', ''), ('=', ''), ('', ''), ('"abc"', ''), (']', '')],
86 'a[. = "abc"]',
87 )
88
90 """
91 Test find methods (including xpath syntax).
92 Originally copied from 'selftest.py'.
93 """
94 elem = etree.XML("""
95 <body>
96 <tag class='a'>text</tag>
97 <tag class='b' />
98 <section>
99 <tag class='b' id='inner'>subtext</tag>
100 </section>
101 </body>
102 """)
103
104 self.assertEqual(elem.find("tag").tag,
105 'tag')
106 self.assertEqual(etree.ElementTree(elem).find("tag").tag,
107 'tag')
108 self.assertEqual(elem.find("section/tag").tag,
109 'tag')
110 self.assertEqual(etree.ElementTree(elem).find("section/tag").tag,
111 'tag')
112
113 self.assertEqual(elem.findtext("tag"),
114 'text')
115 self.assertEqual(elem.findtext("tog"),
116 None)
117 self.assertEqual(elem.findtext("tog", "default"),
118 'default')
119 self.assertEqual(etree.ElementTree(elem).findtext("tag"),
120 'text')
121 self.assertEqual(elem.findtext("section/tag"),
122 'subtext')
123 self.assertEqual(etree.ElementTree(elem).findtext("section/tag"),
124 'subtext')
125
126 self.assertEqual(summarize_list(elem.findall("tag")),
127 ['tag', 'tag'])
128 self.assertEqual(summarize_list(elem.findall("*")),
129 ['tag', 'tag', 'section'])
130 self.assertEqual(summarize_list(elem.findall(".//tag")),
131 ['tag', 'tag', 'tag'])
132 self.assertEqual(summarize_list(elem.findall("section/tag")),
133 ['tag'])
134 self.assertEqual(summarize_list(elem.findall("section//tag")),
135 ['tag'])
136
137 self.assertEqual(summarize_list(elem.findall("section/*")),
138 ['tag'])
139 self.assertEqual(summarize_list(elem.findall("section//*")),
140 ['tag'])
141 self.assertEqual(summarize_list(elem.findall("section/.//*")),
142 ['tag'])
143 self.assertEqual(summarize_list(elem.findall("*/*")),
144 ['tag'])
145 self.assertEqual(summarize_list(elem.findall("*//*")),
146 ['tag'])
147 self.assertEqual(summarize_list(elem.findall("*/tag")),
148 ['tag'])
149 self.assertEqual(summarize_list(elem.findall("*/./tag")),
150 ['tag'])
151 self.assertEqual(summarize_list(elem.findall("./tag")),
152 ['tag', 'tag'])
153 self.assertEqual(summarize_list(elem.findall(".//tag")),
154 ['tag', 'tag', 'tag'])
155 self.assertEqual(summarize_list(elem.findall("././tag")),
156 ['tag', 'tag'])
157
158 self.assertEqual(summarize_list(elem.findall(".//tag[@class]")),
159 ['tag', 'tag', 'tag'])
160 self.assertEqual(summarize_list(elem.findall(".//tag[ @class]")),
161 ['tag', 'tag', 'tag'])
162 self.assertEqual(summarize_list(elem.findall(".//tag[@class ]")),
163 ['tag', 'tag', 'tag'])
164 self.assertEqual(summarize_list(elem.findall(".//tag[ @class ]")),
165 ['tag', 'tag', 'tag'])
166 self.assertEqual(summarize_list(elem.findall(".//tag[@class='a']")),
167 ['tag'])
168 self.assertEqual(summarize_list(elem.findall('.//tag[@class="a"]')),
169 ['tag'])
170 self.assertEqual(summarize_list(elem.findall(".//tag[@class='b']")),
171 ['tag', 'tag'])
172 self.assertEqual(summarize_list(elem.findall('.//tag[@class="b"]')),
173 ['tag', 'tag'])
174 self.assertEqual(summarize_list(elem.findall('.//tag[@class = "b"]')),
175 ['tag', 'tag'])
176 self.assertEqual(summarize_list(elem.findall(".//tag[@id]")),
177 ['tag'])
178 self.assertEqual(summarize_list(elem.findall(".//tag[@class][@id]")),
179 ['tag'])
180 self.assertEqual(summarize_list(elem.findall(".//section[tag]")),
181 ['section'])
182 self.assertEqual(summarize_list(elem.findall(".//section[element]")),
183 [])
184
185 self.assertEqual(summarize_list(elem.findall(".//section[tag='subtext']")),
186 ['section'])
187 self.assertEqual(summarize_list(elem.findall(".//section[tag ='subtext']")),
188 ['section'])
189 self.assertEqual(summarize_list(elem.findall(".//section[tag= 'subtext']")),
190 ['section'])
191 self.assertEqual(summarize_list(elem.findall(".//section[tag = 'subtext']")),
192 ['section'])
193 self.assertEqual(summarize_list(elem.findall(".//section[ tag = 'subtext' ]")),
194 ['section'])
195 self.assertEqual(summarize_list(elem.findall(".//tag[.='subtext']")),
196 ['tag'])
197 self.assertEqual(summarize_list(elem.findall(".//tag[. ='subtext']")),
198 ['tag'])
199 self.assertEqual(summarize_list(elem.findall('.//tag[.= "subtext"]')),
200 ['tag'])
201 self.assertEqual(summarize_list(elem.findall(".//tag[. = 'subtext']")),
202 ['tag'])
203 self.assertEqual(summarize_list(elem.findall(".//tag[. = 'subtext ']")),
204 [])
205 self.assertEqual(summarize_list(elem.findall(".//tag[.= ' subtext']")),
206 [])
207
208 self.assertEqual(summarize_list(elem.findall("../tag")),
209 [])
210 self.assertEqual(summarize_list(elem.findall("section/../tag")),
211 ['tag', 'tag'])
212 self.assertEqual(summarize_list(etree.ElementTree(elem).findall("./tag")),
213 ['tag', 'tag'])
214
215
216
217 self.assertEqual(summarize_list(etree.ElementTree(elem).findall("/tag")),
218 ['tag', 'tag'])
219
220
221 elem[1] = deepcopy(elem[2])
222 self.assertEqual(summarize_list(elem.findall(".//section[tag = 'subtext']")),
223 ['section', 'section'])
224 self.assertEqual(summarize_list(elem.findall(".//tag[. = 'subtext']")),
225 ['tag', 'tag'])
226 self.assertEqual(summarize_list(elem.findall(".//tag[@class][@id]")),
227 ['tag', 'tag'])
228
229
230
231
232
233
234
236 suite = unittest.TestSuite()
237 suite.addTests([unittest.makeSuite(EtreeElementPathTestCase)])
238
239 return suite
240
241
242 if __name__ == '__main__':
243 print('to test use test.py %s' % __file__)
244